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()
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
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)
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, 'Распределение давления на дно снаряда', 'Координата', 'Время')
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)
: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,