def test_case_maker_phi_oxi():
    phi = [0.5 + rand(), 2, 1]
    oxidizer = [0.2 + rand() / 5, 1, 1]
    P = [rand(), 100, 1]
    T = [500 * rand(), 1000, 1]
    mix_params = ('phi_oxi', phi, oxidizer)
    conditions = {
        'Parameters': [P, T, mix_params, 'log'],
        'Mixture': [{
            'H2': 1
        }, {
            'N2': 1
        }, {
            'O2': 1
        }, 'phi_oxi'],
        'Files': [cf.model_folder('grimech30.cti'), None]
    }
    paramlist = cf.case_maker(conditions)
    case = paramlist[0]
    mixture = case[2]

    nptest.assert_allclose(case[:2], [P[0], T[0]])
    nptest.assert_allclose(mixture['O2'], oxidizer[0])
    nptest.assert_allclose(1, mixture['H2'] + mixture['O2'] + mixture['N2'])
    nptest.assert_allclose(phi[0], mixture['H2'] / mixture['O2'] * 0.5)
    assert all([x >= 0 for k, x in mixture.items()])
def test_case_maker_oxi_dil():
    oxi = [rand() / 2, 1, 1]
    dil = [rand() / 2, 1, 1]
    P = [rand(), 100, 1]
    T = [500 * rand(), 1000, 1]
    mix_params = ('oxi_dil', oxi, dil)
    conditions = {
        'Parameters': [P, T, mix_params, 'log'],
        'Mixture': [{
            'H2': 1
        }, {
            'N2': 1
        }, {
            'O2': 1
        }, 'oxi_dil'],
        'Files': [cf.model_folder('grimech30.cti'), None]
    }
    paramlist = cf.case_maker(conditions)
    case = paramlist[0]
    mixture = case[2]
    print(mixture)

    nptest.assert_allclose(case[:2], [P[0], T[0]])
    assert all([x >= 0 for k, x in mixture.items()])
    nptest.assert_allclose(1, mixture['H2'] + mixture['O2'] + mixture['N2'])
    nptest.assert_allclose(dil[0], mixture['N2'])
    nptest.assert_allclose(oxi[0], mixture['O2'])
def test_multi_f_o():
    phi = [0.3 + rand(), 2, 1]
    fuel = [0.2 + rand() / 5, 1, 1]
    P = [rand(), 100, 1]
    T = [500 * rand(), 1000, 1]
    mix_params = ('phi_fuel', phi, fuel)

    conditions = {
        'Parameters': [P, T, mix_params, 'log'],
        'Mixture': [{
            'H2': .3,
            'CO': 0.7
        }, {
            'N2': 0.5,
            'HE': 0.5
        }, {
            'O2': 0.95,
            'AR': 0.05
        }, 'phi_fuel'],
        'Files': [cf.model_folder('grimech30.cti'), None]
    }
    paramlist = cf.case_maker(conditions)
    case = paramlist[0]
    mixture = case[2]

    nptest.assert_allclose(case[:2], [P[0], T[0]])
    nptest.assert_allclose(mixture['H2'] + mixture['CO'], fuel[0])
    nptest.assert_allclose(
        1, mixture['H2'] + mixture['O2'] + mixture['N2'] + mixture['AR'] +
        mixture['CO'] + mixture['HE'])
    nptest.assert_allclose(phi[0], (mixture['H2'] + mixture['CO']) /
                           mixture['O2'] * 0.5)
    nptest.assert_allclose(0.3 / 0.7, mixture['H2'] / mixture['CO'])
    nptest.assert_allclose(0.95 / 0.05, mixture['O2'] / mixture['AR'])
    assert all([x >= 0 for k, x in mixture.items()])
def run_flame_simulation(mech, arrtype, pres, temp, fue, oxi, dilu, mix_params,
                         safi, par, Mingrid, Mul_soret, Loglevel):
    """
    Takes information from initializer and runs necessary functions to perform
    a one-dimensional simulation. Simulation results will be saved if booleans
    are set to True.

    Parameters
    ----------
    mech : str
        A .cti mechanism file containing all reaction and species information.
    arrtype : str
        Defines the scale that conditions are in. Either linear or logarithmic
    pres : list
        A list of pressure conditions to test over [initial, final, number of points].
    temp : list
        A list of temperature conditions to test over [initial, final, number of points].
    fue : str or list
        As a string the variable represents a single species of fuel being used.
        As a list the variable represents multicomponent fuel species
        followed by the percentage to the total fuel [Component1, % of total, ...]
    oxi : str or list
        As a string the variable represents a single species of oxidizer being used.
        As a list the variable represents multicomponent oxidizer species
        followed by the percentage to the total oxidizer [Component1, % of total, ...]
    dilu : str or list
        As a string the variable represents a single species of diluent being used.
        As a list the variable represents multicomponent diluent species
        followed by the percentage to the total diluent [Component1, % of total, ...]
    mix_params : list
        A list of the two mixture parameters and mixtrue type used in creating
        a mixture.
    safi : boolean
        If true simulation conditions and ranking results will be saved.
    par : bool
        If true, run simulations in paralle
    Mingrid: int
        Number of points to be solved in the simulation
    Mul_soret : boolean
        Multicomponent diffuction and Soret effect are calculated if true
    Loglevel : int
        A number from 1 to 10. The larger the number the more information that
        is printed during the simulation to the user.

    Returns
    -------
    None.

    """
    mechan = cf.model_folder(mech)
    condi = initialization(mechan, arrtype, pres, temp, fue, oxi, dilu,
                           mix_params, Mingrid, Mul_soret, Loglevel)
    paralist = cf.case_maker(condi)
    simtime = run_simulations(condi, paralist, par)
    flame_info, flame_info_unfiltered, sim_info = load_filter_flame_info(condi)
    siminfo = [simtime, sim_info[0], simtime + sim_info[1]]
    if safi:
        file_saving(condi, flame_info, paralist, siminfo)
def test_mixture_percentage():
    phi = [0.3 + rand(), 2, 1]
    fuel = [0.2 + rand() / 5, 1, 1]
    P = [rand(), 100, 1]
    T = [500 * rand(), 1000, 1]
    mix_params = ('phi_fuel', phi, fuel)

    multif = {'H2': .3, 'CO': 0.7}
    singlf = {'H2': 1}

    list_conditions = {
        'Parameters': [P, T, mix_params, 'log'],
        'Mixture': [multif, {
            'N2': 1
        }, {
            'O2': 1
        }, 'phi_fuel'],
        'Files': [cf.model_folder('grimech30.cti'), None]
    }
    stri_conditions = {
        'Parameters': [P, T, mix_params, 'log'],
        'Mixture': [singlf, {
            'N2': 1
        }, {
            'O2': 1
        }, 'phi_fuel'],
        'Files': [cf.model_folder('grimech30.cti'), None]
    }
    list_paramlist = cf.case_maker(list_conditions)
    list_case = list_paramlist[0]
    list_mixture = list_case[2]
    stri_paramlist = cf.case_maker(stri_conditions)
    stri_case = stri_paramlist[0]
    stri_mixture = stri_case[2]

    lst_comp = cf.mixture_percentage(multif, list_mixture)
    str_comp = cf.mixture_percentage(singlf, stri_mixture)

    nptest.assert_allclose(list_case[:2], [P[0], T[0]])
    nptest.assert_allclose(stri_case[:2], [P[0], T[0]])
    nptest.assert_allclose(lst_comp, fuel[0])
    nptest.assert_allclose(str_comp, fuel[0])
    assert all([x >= 0 for k, x in list_mixture.items()])
    assert all([x >= 0 for k, x in stri_mixture.items()])