Beispiel #1
0
def main_tube_w_tst():
    from matplotlib import pyplot as plt
    t = Tube([1, 3, 4], [2, 1, 2])

    x1, x2 = 0.5, 3.5
    w = t.get_W_between(x1, x2)
    x22 = t.get_x2(x1, w)
    print(f"w = {w}, x2 = {x22}")

    xs = [0, 1, 2, 3, 4, 5]
    ys = [t.w(x) for x in xs]
    plt.plot(xs, ys)
    plt.grid()
    plt.show()
Beispiel #2
0
def wchr_to_solver(wchr):
    cr = wchr['chromo']
    i = 0
    xs, ds = [cr[f"l_{i}"]], [cr[f"d_{i}"]]
    i += 1
    while f"d_{i}" in cr:
        li, di = cr[f"l_{i}"], cr[f"d_{i}"]
        xs.append(xs[-1] + li)
        ds.append(di)
        i += 1
    geom = list(zip(xs, ds))
    tube = Tube(xs, ds)
    fun_dict = {
        "powder": get_powder_grid_and_rborder,
        "piston": get_piston_grid_and_rborder,
        "gas": get_gas_grid_and_rborder
    }
    borders = [{'m': 10000, 'p_f': 1e10, 'x': 0, 'V': 0}]
    grids = []
    x_left = 0
    for gname, scr in zip(cr["struct"], cr["struct_chromos"]):
        grid, border = fun_dict[gname](scr, tube, x_left)
        x_left = border['x']
        grids.append(grid)
        borders.append(border)

    borders[-1]['m'] = m_elem
    solver = {
        'borders': borders,
        'grids': grids,
        'geom': geom,
        'courant_number': 0.13
    }
    return solver
Beispiel #3
0
def get_tube(inv_dict):
    d_0 = inv_dict['d_0']
    l_0 = inv_dict['l_0']
    l_05 = inv_dict['l_05']
    d_1 = inv_dict['d_1']
    l_1 = inv_dict['l_1']
    xs = [0, l_0, l_0 + l_05, l_0 + l_05 + l_1]
    ds = [d_0, d_0, d_1, d_1]
    return Tube(xs, ds)
Beispiel #4
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,
            'Распределение давления на дно снаряда', 'Координата', 'Время')
Beispiel #5
0
def get_tube(par_dict):
    d_0 = par_dict['d_0']
    l_0 = par_dict['l_0']
    xs = [0, l_0]
    ds = [d_0, d_0]
    return Tube(xs, ds)
Beispiel #6
0
        :param tau: шаг по времени
        :return: слой на следующем шаге
        """
        l1 = self.clone(self)
        l1.stretch_me_new(tau, x_left, V_left, x_right, V_right)
        l1.W = l1.tube.get_W(l1.x)
        df = self.get_dQs()
        l1.q = [(self.q[num] * self.W + tau * df[num]) / l1.W
                for num in range(len(self.q))]
        l1.p = l1.get_pressure(l1.q)
        return l1


if __name__ == "__main__":
    from PnBorder import get_flux_left, get_flux_right
    tube = Tube([-1, 10], [0.1, 0.1])
    solver_grid = {
        'n_cells': 10,
        'xl': 0,
        'xr': 1,
        'vl': 1,
        'vr': 1,
        'consts': {
            'gamma': 1.4,
            'covolume': 0.0001
        },
        'type': 'gas'
    }
    glayer = PnLayer(solver_grid=solver_grid,
                     func_in=lambda x, grid: (1, 2, 3),
                     get_flux_left=get_flux_left,