Example #1
0
def fit_fun4tst(wchr):
    try:
        solver = wchr_to_solver(wchr)
        vars = [-9999, -9998, -9997, -9996, -9995, rnd.random() * 2000]
        layers = []
        l_max = solver['geom'][-1][0] + l_max_mini
        for i in range(len(solver['grids'])):
            if solver['grids'][i]['type'] == 'gas':
                layers.append(pn_create_layer(i, solver))
            elif solver['grids'][i]['type'] == 'powder':
                layers.append(ov_create_layer(i, solver))
            elif solver['grids'][i]['type'] == 'piston':
                layers.append(el_pist_create_layer(i, solver))

        v = wchr['vec_param'] - 0.5
        res = -sum(v * v)
        time.sleep(1 + rnd.random() * 2)
        # return rnd.choice(vars)+1000
        return res
    except Exception as e:
        return -9990
Example #2
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, 'График координаты поршня от времени', 'Время',
             'Координата')
Example #3
0
def main():
    start_time = time.time()
    layers = []
    for i in range(len(solver['grids'])):
        if solver['grids'][i]['type'] == 'gas':
            layers.append(
                pn_create_layer(solver['grids'][i], Tube([-1, 100],
                                                         [0.1, 0.1])))
        elif solver['grids'][i]['type'] == 'powder':
            layers.append(ov_create_layer(i, solver))
        elif solver['grids'][i]['type'] == 'piston':
            layers.append(el_pist_create_layer(i, solver))

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

    ind = 0

    while True:
        if (solver['geom'][-1][0] - layers[-1].x[-1]) <= 0.001:
            break
        if (Vmax - layers[-1].V[-1]) > 20:
            print('Замедляется')
            break
        if layers[0].time >= 0.1:
            print('Истекло время')
            break
        if pmax > 2e+9:
            print('Превысило давление')
            break
        # if (layers[-1].x[-1] - 5) >= 0.001:
        #     print('Вылетел из 15 метрового ствола')
        #     break

        layers1 = []
        tau_arr = [l.time_step() for l in layers]
        tau = solver['courant_number'] * min(
            tau_arr)  # Вычисление шага по времени

        for i in range(len(layers)):
            if len(layers) == 1:
                layers1.append(layers[i].euler_step(layers, i, tau,
                                                    flag='one'))
            elif i == 0:
                layers1.append(layers[i].euler_step(layers,
                                                    i,
                                                    tau,
                                                    flag='left'))
                # layers[i] = layers1[i]
            elif i != 0 and i != (len(layers) - 1):
                layers1.append(layers[i].euler_step(layers,
                                                    i,
                                                    tau,
                                                    flag='inter'))
                # layers[i] = layers1[i]
            elif i == (len(layers) - 1):
                if ind % 500 == 0:
                    layers1.append(layers[i].euler_step(layers,
                                                        i,
                                                        tau,
                                                        flag='right'))
                else:
                    layers1.append(layers[i].euler_step(layers,
                                                        i,
                                                        tau,
                                                        flag='right'))

        results.append(layers)
        layers = layers1

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

        x_c_arr = np.vstack([x_c_arr, layers[-1].x_c])
        p_arr = np.vstack([p_arr, layers[-1].p])

        if layers[-1].V[-1] > Vmax:
            Vmax = layers[-1].V[-1]
        pmax = max([max(layer.p) for layer in layers])

        ind += 1
        if ind % 500 == 0:
            ro, u, e, z = layers[0].get_param(layers[0].q)
            print(layers[-1].time, Vmax, layers[0].V[-1], u[-1])
            # print(layers[1].p[-1])

    print("--- %s seconds ---" % (time.time() - start_time))

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

    plot_one(time_arr, V_arr, 'График скорости снаряда от времени', 'Время',
             'Скорость')
    plot_one(x_arr, V_arr, 'График скорости снаряда от времени', 'Координата',
             'Скорость')
    plot_one(time_arr, p_arr, 'График давления на дно снаряда от времени',
             'Время', 'Давление')
    plot_contours(x_c_arr, x_c_arr[0], time_arr, p_arr,
                  'Распределение давления', 'Координата', 'Время')
    plot_3d(x_c_arr, x_c_arr[0], time_arr, p_arr,
            'Распределение давления на дно снаряда', 'Координата', 'Время')
Example #4
0
def fitness_foo(wchr):
    try:
        solver = wchr_to_solver(wchr)
        start_time = time.time()
        layers = []
        l_max = solver['geom'][-1][0] + l_max_mini
        for i in range(len(solver['grids'])):
            if solver['grids'][i]['type'] == 'gas':
                layers.append(pn_create_layer(i, solver))
            elif solver['grids'][i]['type'] == 'powder':
                layers.append(ov_create_layer(i, solver))
            elif solver['grids'][i]['type'] == 'piston':
                layers.append(el_pist_create_layer(i, solver))

        Vmax = 0
        pmax = 0

        while True:
            if l_max < layers[-1].x[-1]:
                break
            if (Vmax - layers[-1].V[-1]) > 20:
                break
            if layers[0].time >= time_max:
                return -9999
            if pmax > 7e+8:
                return -9998
            if time.time() - start_time > time_max_calc:
                return -9997
            if (time_v0 < layers[0].time) and (layers[-1].V[-1] < 1E-4):
                return -9995

            layers1 = []
            tau_arr = [l.time_step() for l in layers]
            tau = solver['courant_number'] * min(
                tau_arr)  # Вычисление шага по времени

            for i in range(len(layers)):
                if len(layers) == 1:
                    layers1.append(layers[i].euler_step(layers,
                                                        i,
                                                        tau,
                                                        flag='one'))
                elif i == 0:
                    layers1.append(layers[i].euler_step(layers,
                                                        i,
                                                        tau,
                                                        flag='left'))
                    # layers[i] = layers1[i]
                elif i != 0 and i != (len(layers) - 1):
                    layers1.append(layers[i].euler_step(layers,
                                                        i,
                                                        tau,
                                                        flag='inter'))
                    # layers[i] = layers1[i]
                elif i == (len(layers) - 1):
                    layers1.append(layers[i].euler_step(layers,
                                                        i,
                                                        tau,
                                                        flag='right'))

            layers = layers1

            if layers[-1].V[-1] > Vmax:
                Vmax = layers[-1].V[-1]
            pmax = max([max(layer.p) for layer in layers])

        fitness = Vmax - shtraf(pmax)
        return fitness
    except Exception as e:
        return -9996
Example #5
0
def main(par_dict, only1 = False):
    tube = get_tube(par_dict)

    solv_dict1, x_r1 = get_gas_grid_and_rborder(par_dict['gas_1'], tube, 0)
    solv_dict2, x_r2 = get_gas_grid_and_rborder(par_dict['gas_2'], tube, x_r1)


    lr1 = pn_create_layer(solv_dict1, tube)
    lr2 = pn_create_layer(solv_dict2, tube)

    layers = [lr1, lr2]
    start_time = time.time()

    l_max = par_dict['l_0']
    courant_number = par_dict['courant_number']

    m2 = par_dict['m_elem']
    l_min = x_r2 - x_r1
    m1 = par_dict['m_1']
    l_ignite = par_dict['l_ignite']


    ind = 0
    time_arr = [0]  # Список времени для графика
    V_arr = [0]  # Список скорости для графика
    V_podd = [0]
    x_s = layers[0].x[-1] if only1 else layers[-1].x[-1]
    x_arr = [x_s]  # Список координаты для графика
    p_arr1 = [layers[0].p[-1]]
    p_arr = [layers[-1].p[-1]]

    p_arr_3d = np.append(layers[0].p, layers[1].p)
    x_c_arr_3d = np.append(layers[0].x_c, layers[1].x_c)
    time_arr_3d = [0]

    Vmax_curr = 0
    pmax_curr = 0

    ro, u ,p  = lr1.func_in(x_r2, solv_dict2)
    v = tube.get_W_between(x_r1, x_r2)
    omega2 = ro*v

    m_sum = m1 + m2 + omega2 if not only1 else m2

    isignite = False
    while True:
        if l_max < x_s:
            break

        layers1 = []

        if not isignite:
            if (not only1) and layers[1].x[-1] > l_ignite:
                isignite = True
                layers[1].init_arr_q()
                layers[1].e = layers[1].get_energ(layers[1].p, layers[1].ro)

                layers[1].q = layers[1].init_arr_q()  # Список нумпи массивов q1, q2, q3, размерностями n

                layers[1].h = layers[1].get_arr_h()  # Список нумпи массивов h1, h2, h3, размерностями n

        if isignite:
            tau_arr = [l.time_step() for l in layers]
            tau = courant_number * min(tau_arr)  # Вычисление шага по времени

            x1, v1, x2, v2 = get_borders(layers, tau, l_min, m1, m2)

            layers1.append(layers[0].euler_step_new(tau, 0, 0, x1, v1))
            layers1.append(layers[1].euler_step_new(tau, x1, v1, x2, v2))
        else:
            tau_arr = [l.time_step() for l in layers[:-1]]
            tau = courant_number * min(tau_arr)  # Вычисление шага по времени
            x1, v1 = get_bord_before_ign2(layers, tau, m_sum)
            x2, v2 = x1 + l_min, v1
            layers1.append(layers[0].euler_step_new(tau, 0, 0, x1, v1))
            layers1.append(layers[1].move_to(tau, x1, v1, x1 + l_min))

        layers = layers1

        if layers[-1].V[-1] > Vmax_curr:
            Vmax_curr = layers[-1].V[-1]
        pmax_curr1 = max([max(layer.p) for layer in layers])
        if pmax_curr < pmax_curr1:
            pmax_curr = pmax_curr1

        x_s = layers[0].x[-1] if only1 else layers[-1].x[-1]
        time_arr.append(layers[-1].time)  # Добавление текущего шага по времени в список для графика
        V_arr.append(layers[-1].V[-1])  # Добавление текущей скорости поршня в список для графика
        V_podd.append(layers[0].V[-1])
        x_arr.append(x_s)  # Добавление текущей координаты поршня в список для графика
        p_arr.append(layers[-1].p[-1])
        p_arr1.append(layers[0].p[-1])

        ind += 1
        if ind % 300 == 0:
            ro, u, e = layers[0].get_param(layers[0].q)
            print(layers[-1].time, Vmax_curr, pmax_curr, x2, isignite)
            x_c_arr_3d = np.vstack([x_c_arr_3d, np.append(layers[0].x_c, layers[1].x_c)])
            p_arr_3d = np.vstack([p_arr_3d, np.append(layers[0].p, layers[1].p)])
            time_arr_3d.append(layers[-1].time)


    print("--- %s seconds ---" % (time.time() - start_time))

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

    plot_two(time_arr, V_arr, V_podd, 'График скорости снаряда от времени', 'снаряд', 'поддон')
    plot_one(x_arr, V_arr, 'График скорости снаряда от времени', 'Координата', 'Скорость')
    plot_two(time_arr, p_arr, p_arr1, 'График давления на дно снаряда от времени', 'снаряд', 'сборка')
    plot_contours(x_c_arr_3d, x_c_arr_3d[0], time_arr_3d, p_arr_3d, 'Распределение давления', 'Координата',
                  'Время')
    plot_3d(x_c_arr_3d, x_c_arr_3d[0], time_arr_3d, p_arr_3d, 'Распределение давления на дно снаряда',
            'Координата', 'Время')

    return Vmax_curr, pmax_curr
Example #6
0
def main():
    start_time = time.time()
    layers = []
    for i in range(len(solver['grids'])):
        if solver['grids'][i]['type'] == 'gas':
            layers.append(pn_create_layer(i, solver))
        elif solver['grids'][i]['type'] == 'powder':
            layers.append(ov_create_layer(i, solver))
        elif solver['grids'][i]['type'] == 'piston':
            layers.append(el_pist_create_layer(i, solver))

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

    results = []

    while (solver['geom'][-1][0] - layers[-1].x[-1]) >= 0.001:
        layers1 = []
        tau_arr = [l.time_step() for l in layers]
        tau = solver['courant_number'] * min(
            tau_arr)  # Вычисление шага по времени

        for i in range(len(layers)):
            if len(layers) == 1:
                layers1.append(layers[i].euler_step(layers[i],
                                                    tau,
                                                    p_left=4 * 10**7,
                                                    p_right=101325))
            elif i == 0:
                layers1.append(layers[i].euler_step(layers[i],
                                                    tau,
                                                    p_right=layers[i +
                                                                   1].p[0]))
            elif i != 0 and i != (len(layers) - 1):
                layers1.append(layers[i].euler_step(layers[i],
                                                    tau,
                                                    p_left=layers[i - 1].p[-1],
                                                    p_right=layers[i +
                                                                   1].p[0]))
            elif i == (len(layers) - 1):
                layers1.append(layers[i].euler_step(layers[i],
                                                    tau,
                                                    p_left=layers[i -
                                                                  1].p[-1]))

        results.append(layers)
        layers = layers1

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

    print("--- %s seconds ---" % (time.time() - start_time))

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

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

    # plot_contours(x_c_arr, x_c_arr[0], time_arr, p_arr, 'Распределение давления', 'Координата', 'Время')
    # plot_3d(x_c_arr, x_c_arr[0], time_arr, p_arr, 'Распределение давления', 'Координата', 'Время')

    plot_muzzle(results[0])