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
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, 'График координаты поршня от времени', 'Время', 'Координата')
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 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
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
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])