Пример #1
0
def main():
    # Дано:
    # коволюм 0.0010838
    piston = {
        'коволюм': 0,
        'показатель адиабаты': 1.4,
        'координата слева': 0,
        'координата справа': 0.1,
        'скорость лев гран': 0,
        'скорость прав гран': 0
    }

    geom = {
        'координата слева': 0,
        'координата справа': 2,
        'диаметр слева': 0.025,
        'диаметр справа': 0.025,
        'количество ячеек': 100
    }

    gas = {'пистон': piston}

    param_piston = {'B': 1.19e9, 'Ck': 1.73, 'ro0': 920}

    r = 0.5  # Число Куранта
    m = 0.05  # Масса снаряда
    eks = 0.001  # Эксцентреситет - отклонение координаты поршня от длины ствола

    # Создание слоя
    layer = IdPistLayer(param_piston, gas, 'пистон', geom, get_x_v_left,
                        get_x_v_right, get_flux_left, get_flux_right, func_in,
                        m)

    time_arr = [0]  # Список времени для графика
    V_arr = [0]  # Список скорости для графика
    x_arr = [layer.x[-1]]  # Список координаты для графика

    while (geom['координата справа'] - layer.x[-1]) >= eks:
        tau = r * layer.time_step()  # Вычисление шага по времени
        layer1 = layer.euler_step(layer, tau)  # Шаг по времени
        layer = layer1
        time_arr.append(
            layer.time
        )  # Добавление текущего шага по времени в список для графика
        V_arr.append(
            layer.V[-1]
        )  # Добавление текущей скорости поршня в список для графика
        x_arr.append(
            layer.x[-1]
        )  # Добавление текущей координаты поршня в список для графика

    print('Время вылета:', time_arr[-1], 'с')
    print('Скорость вылета:', V_arr[-1], 'м/с')

    plot_one(time_arr, V_arr, 'График скорости поршня от времени', 'Время',
             'Скорость')
    plot_one(x_arr, V_arr, 'График скорости поршня от координаты',
             'Координата', 'Скорость')
    plot_one(time_arr, x_arr, 'График координаты поршня от времени', 'Время',
             'Координата')
Пример #2
0
def main():
    # Дано:
    air1 = {
        'коволюм': 0,
        'показатель адиабаты': 1.4,
        'координата слева': -1,
        'координата справа': 1,
        'скорость лев гран': 0,
        'скорость прав гран': 0
    }

    geom = {
        'координата слева': -10,
        'координата справа': 10,
        'диаметр слева': 0.1,
        'диаметр справа': 0.1,
        'количество ячеек': 100
    }

    gas = {'воздух1': air1}

    r = 0.1  # Число Куранта
    m = 0

    # Создание ячейки и слоя
    layer = PnLayer(gas, 'воздух1', geom, get_x_v_left, get_x_v_right,
                    get_flux_left, get_flux_right, func_in, m)

    time_arr = [0]  # Список времени для графика

    while time_arr[-1] <= 0.5:
        tau = r * layer.time_step()  # Вычисление шага по времени
        layer1 = layer.euler_step(layer, tau)  # Шаг по времени
        layer = layer1
        time_arr.append(
            layer.time
        )  # Добавление текущего шага по времени в список для графика

    xr = np.roll(layer.x, -1)
    xc = ((xr + layer.x) / 2)[:-1]

    plot_one(xc, layer.q[0], 'Распределение плотности', 'Координата',
             'Плотность')
    plot_one(xc, layer.q[1] / layer.q[0], 'Распределение скорости',
             'Координата', 'Скорость')
    plot_one(xc, layer.p, 'Распределение давления', 'Координата', 'Давление')
Пример #3
0
def main():
    # Дано:
    # коволюм 0.0010838
    air1 = {'коволюм': 0.0010838,
            'показатель адиабаты': 1.4,
            'координата слева': -0.5,
            'координата справа': 0,
            'скорость лев гран': 0,
            'скорость прав гран': 0}

    geom = {'координата слева': -2,
            'координата справа': 0,
            'диаметр слева': 0.025,
            'диаметр справа': 0.025,
            'количество ячеек': 200}

    gas = {'воздух1': air1}

    r = 0.5                         # Число Куранта
    m = 0.1                        # Масса снаряда
    eks = 0.001                     # Эксцентреситет - отклонение координаты поршня от длины ствола

    # Создание слоя
    layer = PnLayer(gas, 'воздух1', geom, get_x_v_left, get_x_v_right, get_flux_left, get_flux_right, func_in, m)

    time_arr = [0]              # Список времени для графика
    V_arr = [0]                 # Список скорости для графика
    x_arr = [layer.x[0]]           # Список координаты для графика

    while (abs(geom['координата слева']) - abs(layer.x[0])) >= eks:
        tau = r * layer.time_step()     # Вычисление шага по времени
        layer1 = layer.euler_step(layer, tau)    # Шаг по времени
        layer = layer1
        time_arr.append(layer.time)         # Добавление текущего шага по времени в список для графика
        V_arr.append(layer.V[0])           # Добавление текущей скорости поршня в список для графика
        x_arr.append(layer.x[0])           # Добавление текущей координаты поршня в список для графика

    print('Время вылета:', time_arr[-1], 'с')
    print('Скорость вылета:', layer.V[0], 'м/с')

    plot_one(time_arr, V_arr, 'График скорости поршня от времени', 'Время', 'Скорость')
    plot_one(x_arr, V_arr, 'График скорости поршня от координаты', 'Координата', 'Скорость')
    plot_one(time_arr, x_arr, 'График координаты поршня от времени', 'Время', 'Координата')
Пример #4
0
def main():
    layers = []
    for i in range(len(solver['grids'])):
        if solver['grids'][i]['type'] == 'gas':
            layers.append(pn_create_layer(i))
        elif solver['grids'][i]['type'] == 'powder':
            layers.append(ov_create_layer(i))

    time_arr = [0]  # Список времени для графика
    V_arr = [0]  # Список скорости для графика
    x_arr = [layers[-1].x[-1]]  # Список координаты для графика

    while (solver['borders'][-1]['x'] - layers[-1].x[-1]) >= 0.001:
        tau_arr = [l.time_step() for l in layers]
        tau = solver['courant_number'] * min(
            tau_arr)  # Вычисление шага по времени
        layer1 = layer.euler_step(layer, tau, p_right=p_atm)  # Шаг по времени
        layer = layer1
        time_arr.append(
            layer.time
        )  # Добавление текущего шага по времени в список для графика
        V_arr.append(
            layer.V[-1]
        )  # Добавление текущей скорости поршня в список для графика
        x_arr.append(
            layer.x[-1]
        )  # Добавление текущей координаты поршня в список для графика

    print('Время вылета:', time_arr[-1], 'с')
    print('Скорость вылета:', V_arr[-1], 'м/с')

    plot_one(time_arr, V_arr, 'График скорости поршня от времени', 'Время',
             'Скорость')
    plot_one(x_arr, V_arr, 'График скорости поршня от координаты',
             'Координата', 'Скорость')
    plot_one(time_arr, x_arr, 'График координаты поршня от времени', 'Время',
             'Координата')
Пример #5
0
def main():
    # Дано:
    powd = {
        'коволюм': 0.0010838,
        'показатель адиабаты': 1.4,
        'координата слева': 0,
        'координата справа': 0.25,
        'скорость лев гран': 0,
        'скорость прав гран': 0,
        'nu': 1,
        'давление форсирования': 0
    }

    air = {
        'коволюм': 0.0010838,
        'показатель адиабаты': 1.4,
        'координата слева': 0.25,
        'координата справа': 0.5,
        'скорость лев гран': 0,
        'скорость прав гран': 0,
        'nu': 1
    }

    geom = {
        'координата слева': 0,
        'координата справа': 2,
        'диаметр слева': 0.025,
        'диаметр справа': 0.025,
        'количество ячеек': 100
    }

    gas = {'гпс': powd, 'газ': air}

    a = {
        'I_k': 1.257,
        'T_1': 2795.0,
        'Z_k': 1.536,
        'alpha_k': 1.0838,
        'etta': 0.231,
        'f': 1.009,
        'k_1': 0.7185,
        'k_2': 0.5386,
        'k_f': 0.0003,
        'k_l': 0.0016,
        'lambda_1': 0.2049,
        'lambda_2': -0.8977,
        'name': 'порох',
        'ro': 1.575
    }

    dict_powder = {'порох': a}

    r = 0.3  # Число Куранта
    m = 1  # Масса снаряда
    m1 = 1
    eks = 0.001  # Эксцентреситет - отклонение координаты поршня от длины ствола

    # Создание слоя
    layer_powd = OvLayer(gas, 'гпс', geom, dict_powder, 'порох',
                         get_x_v_left_powd, get_x_v_right_powd,
                         get_flux_left_powd, get_flux_right_powd, func_in_powd,
                         m1)

    layer_gas = PnLayer(gas, 'газ', geom, get_x_v_left_gas, get_x_v_right_gas,
                        get_flux_left_gas, get_flux_right_gas, func_in_gas, m)

    time_arr = [0]  # Список времени для графика
    V_arr = [0]  # Список скорости для графика
    x_arr = [layer_gas.x[-1]]  # Список координаты для графика

    while (geom['координата справа'] - layer_gas.x[-1]) >= eks:
        tau = r * min(layer_powd.time_step(),
                      layer_gas.time_step())  # Вычисление шага по времени

        layer_powd1 = layer_powd.euler_step(layer_powd, tau, 0,
                                            layer_gas.p[0])  # Шаг по времени
        layer_powd = layer_powd1

        layer_gas1 = layer_gas.euler_step(layer_gas, tau, layer_powd.p[-1],
                                          101325)  # Шаг по времени
        layer_gas = layer_gas1

        time_arr.append(
            layer_powd.time
        )  # Добавление текущего шага по времени в список для графика
        V_arr.append(
            layer_powd.V[-1]
        )  # Добавление текущей скорости поршня в список для графика
        x_arr.append(
            layer_powd.x[-1]
        )  # Добавление текущей координаты поршня в список для графика

    print('Время вылета:', time_arr[-1], 'с')
    print('Скорость вылета:', V_arr[-1], 'м/с')

    plot_one(time_arr, V_arr, 'График скорости поршня от времени', 'Время',
             'Скорость')
    plot_one(x_arr, V_arr, 'График скорости поршня от координаты',
             'Координата', 'Скорость')
    plot_one(time_arr, x_arr, 'График координаты поршня от времени', 'Время',
             'Координата')
Пример #6
0
def main():
    # Дано:
    gps = {
        'коволюм': 0.0010838,
        'показатель адиабаты': 1.27,
        'координата слева': 0,
        'координата справа': 0.762,
        'скорость лев гран': 0,
        'скорость прав гран': 0,
        'nu': 0.9,
        'давление форсирования': 13.79e6
    }

    geom = {
        'координата слева': 0,
        'координата справа': 5.08,
        'диаметр слева': 0.132,
        'диаметр справа': 0.132,
        'количество ячеек': 200
    }

    gas = {'гпс': gps}

    a = {
        'I_k': 0.312799,
        'T_1': 2795.0,
        'Z_k': 1.536,
        'alpha_k': 1.0838,
        'etta': 0.231,
        'f': 1.009,
        'k_1': 0.7185,
        'k_2': 0.5386,
        'k_f': 0.0003,
        'k_l': 0.0016,
        'lambda_1': 0.2049,
        'lambda_2': -0.8977,
        'name': 'порох',
        'ro': 1.575
    }

    dict_powder = {'порох': a}

    r = 0.3  # Число Куранта
    m = 45.359  # Масса снаряда
    eks = 0.001  # Эксцентреситет - отклонение координаты поршня от длины ствола

    # Создание слоя
    layer = OvLayer(gas, 'гпс', geom, dict_powder, 'порох', get_x_v_left,
                    get_x_v_right, get_flux_left, get_flux_right, func_in, m)

    time_arr = [0]  # Список времени для графика
    V_arr = [0]  # Список скорости для графика
    x_arr = [layer.x[-1]]  # Список координаты для графика
    p_arr = [layer.p[-1]]  # Список давления на дно снаряда для графика
    z_arr = [0]  # Список z для графика
    psi_arr = [layer.powd.psi(layer.z[-1])]  # Список psi для графика

    while (geom['координата справа'] - layer.x[-1]) >= eks:
        tau = r * layer.time_step()  # Вычисление шага по времени
        layer1 = layer.euler_step(layer, tau, 0, 101325)  # Шаг по времени
        layer = layer1
        time_arr.append(
            layer.time
        )  # Добавление текущего шага по времени в список для графика
        V_arr.append(
            layer.V[-1]
        )  # Добавление текущей скорости поршня в список для графика
        x_arr.append(
            layer.x[-1]
        )  # Добавление текущей координаты поршня в список для графика
        p_arr.append(
            layer.p[-1]
        )  # Добавление текущего давления на дно снаряда я в список для графика
        z_arr.append(
            layer.q[3][-1] /
            layer.q[0][-1])  # Добавление текущего z в список для графика
        psi_arr.append(layer.powd.psi(
            layer.q[3][-1] /
            layer.q[0][-1]))  # Добавление текущего psi в список для графика

    print('Время вылета:', time_arr[-1], 'с')
    print('Скорость вылета:', V_arr[-1], 'м/с')

    plot_one(time_arr, V_arr, 'График скорости поршня от времени', 'Время',
             'Скорость')
    plot_one(time_arr, p_arr, 'График давления на дно снаряда от времени',
             'Время', 'Давление')
    plot_one(time_arr, x_arr, 'График координаты поршня от времени', 'Время',
             'Координата')
    plot_one(time_arr, z_arr, 'График z от времени', 'Время', 'z')
    plot_one(time_arr, psi_arr, 'График psi от времени', 'Время', 'psi')