from pygem import FFDParameters, FFD, StlHandler params = FFDParameters() params.read_parameters( filename='PyGem/tests/test_datasets/parameters_test_ffd_sphere.prm') stl_handler = StlHandler() mesh_points = stl_handler.parse('PyGem/tests/test_datasets/test_sphere.stl') fig = stl_handler.plot(plot_file='PyGem/tests/test_datasets/test_sphere.stl') free_form = FFD(params, mesh_points) free_form.perform() new_mesh_points = free_form.modified_mesh_points stl_handler.write(new_mesh_points, 'test_sphere_mod.stl') fig = stl_handler.plot(plot_file='test_sphere_mod.stl')
def wheelcase_FitnessFunc(pop): def downscaleXandZ(value, max_orig, min_orig, max_goal, min_goal): return (value - min_orig) / (max_orig - min_orig) * ( max_goal - min_goal) + min_goal # os.system('. /usr/local/stella/OpenFOAM/OpenFOAM-2.4.0/bin/tools/RunFunctions') fitness_values = [] case_folder = 'domain/wheelcase/hpc1_velo_changed' home_dir = '/home/sascha/' # TODO: adapt Fitnessfunction for wheelcase params_left = FFDParameters() params_right = FFDParameters() # stl_handler_wheel = StlHandler() # stl_handler_velo = StlHandler() # stl_handler_top = StlHandler() stl_handler_all = StlHandler() params_left.read_parameters( filename='domain/wheelcase/ffd/ffd_config_left.prm' ) # Dummy config file params_right.read_parameters( filename='domain/wheelcase/ffd/ffd_config_right.prm') # pop.to_csv('domain/wheelcase/pop.csv',mode='a+',index=False,header=False) # WORKAROUND because of OpenFOAM error when faces of mesh intersect -> x and z deformation downscale # TODO: Teste ob hier die pop Werte schon skalierst sind # print("pop_before") # print(pop) # pop[0] = pop[0].apply(lambda x : downscaleXandZ(x,0,-2,0.2,-0.2)) # pop[1] = pop[1].apply(lambda x : downscaleXandZ(x,0,-2,0.2,-0.2)) # pop[4] = pop[4].apply(lambda x : downscaleXandZ(x,0,-2,0.2,-0.2)) # pop[5] = pop[5].apply(lambda x : downscaleXandZ(x,0,-2,0.2,-0.2)) pop.to_csv('domain/wheelcase/pop.csv', mode='a+', index=False, header=False) # print("pop") # print(pop) # Generate config file for each sample # print("len(pop)") # print(len(pop)) for i in range(len(pop)): # Change displacements (weights) of each sample sample = pop.iloc[i] # get sample (1x6) # add penalty if abs(bottom ffd value ) < 1.5 # and abs(top ffd value) < 0.2 if (sample.iloc[2:4].to_numpy().reshape((1, 2))[0, 0] > -1.5 or sample.iloc[2:4].to_numpy().reshape((1, 2))[0, 1] > -0.2): fitness_values.append(-1) else: fitness_values.append(0) mu_x = [] mu_x_right = [] mu_y = [] mu_y_right = [] mu_z = [] mu_z_right = [] tmp_list = [] x = sample.iloc[:2].to_numpy().reshape((1, 2)) # for 6 genomes tmp_list.append([0, 0]) tmp_list.append([0, 0]) mu_x.append(tmp_list.copy()) del tmp_list[:] tmp_list.append([0, 0]) tmp_list.append([x[0, 0], x[0, 1]]) mu_x.append(tmp_list.copy()) del tmp_list[:] tmp_list.append([0, 0]) tmp_list.append([0, 0]) mu_x.append(tmp_list.copy()) del tmp_list[:] # for 18 genomes # tmp_list.append([0,0]) # tmp_list.append([x[0,0],x[0,1]]) # mu_x.append(tmp_list.copy()) # del tmp_list[:] # tmp_list.append([0,0]) # tmp_list.append([x[1,0],x[1,1]]) # mu_x.append(tmp_list.copy()) # del tmp_list[:] # tmp_list.append([0,0]) # tmp_list.append([x[2,0],x[2,1]]) # mu_x.append(tmp_list.copy()) # del tmp_list[:] # for 36 genomes # mu_x.append(x[0:2]) # mu_x.append(x[2:4]) # mu_x.append(x[4:6]) # print(mu_x) # print(mu_x) params_left.array_mu_x = mu_x # for right side: different coords # Reihenfolge # 2,3,0,1,6,7,4,5,10,11,8,9 # for 36 genomes # tmp_list.append([x[1,0],x[1,1]]) # tmp_list.append([x[0,0],x[0,1]]) # mu_x_right.append(tmp_list.copy()) # del tmp_list[:] # tmp_list.append([x[3,0],x[3,1]]) # tmp_list.append([x[2,0],x[2,1]]) # mu_x_right.append(tmp_list.copy()) # del tmp_list[:] # tmp_list.append([x[5,0],x[5,1]]) # tmp_list.append([x[4,0],x[4,1]]) # mu_x_right.append(tmp_list.copy()) # del tmp_list[:] # for 6 genomes tmp_list.append([0, 0]) tmp_list.append([0, 0]) mu_x_right.append(tmp_list.copy()) del tmp_list[:] tmp_list.append([x[0, 0], x[0, 1]]) tmp_list.append([0, 0]) mu_x_right.append(tmp_list.copy()) del tmp_list[:] tmp_list.append([0, 0]) tmp_list.append([0, 0]) mu_x_right.append(tmp_list.copy()) del tmp_list[:] # for 18 genomes # tmp_list.append([x[0,0],x[0,1]]) # tmp_list.append([0,0]) # mu_x_right.append(tmp_list.copy()) # del tmp_list[:] # tmp_list.append([x[1,0],x[1,1]]) # tmp_list.append([0,0]) # mu_x_right.append(tmp_list.copy()) # del tmp_list[:] # tmp_list.append([x[2,0],x[2,1]]) # tmp_list.append([0,0]) # mu_x_right.append(tmp_list.copy()) # del tmp_list[:] params_right.array_mu_x = mu_x_right y = sample.iloc[2:4].to_numpy().reshape((1, 2)) # for 36 genomes # mu_y.append(y[0:2]) # mu_y.append(y[2:4]) # mu_y.append(y[4:6]) # for 6 genomes tmp_list.append([0, 0]) tmp_list.append([0, 0]) mu_y.append(tmp_list.copy()) del tmp_list[:] tmp_list.append([0, 0]) tmp_list.append([y[0, 0], y[0, 1]]) mu_y.append(tmp_list.copy()) del tmp_list[:] tmp_list.append([0, 0]) tmp_list.append([0, 0]) mu_y.append(tmp_list.copy()) del tmp_list[:] # for 18 genomes # tmp_list.append([0,0]) # tmp_list.append([y[0,0],y[0,1]]) # mu_y.append(tmp_list.copy()) # del tmp_list[:] # tmp_list.append([0,0]) # tmp_list.append([y[1,0],y[1,1]]) # mu_y.append(tmp_list.copy()) # del tmp_list[:] # tmp_list.append([0,0]) # tmp_list.append([y[2,0],y[2,1]]) # mu_y.append(tmp_list.copy()) # del tmp_list[:] params_left.array_mu_y = mu_y # for 6 genomes tmp_list.append([0, 0]) tmp_list.append([0, 0]) mu_y_right.append(tmp_list.copy()) del tmp_list[:] tmp_list.append([-y[0, 0], -y[0, 1]]) tmp_list.append([0, 0]) mu_y_right.append(tmp_list.copy()) del tmp_list[:] tmp_list.append([0, 0]) tmp_list.append([0, 0]) mu_y_right.append(tmp_list.copy()) del tmp_list[:] # for 18 genomes # tmp_list.append([-y[0,0],-y[0,1]]) # tmp_list.append([0,0]) # mu_y_right.append(tmp_list.copy()) # del tmp_list[:] # tmp_list.append([-y[1,0],-y[1,1]]) # tmp_list.append([0,0]) # mu_y_right.append(tmp_list.copy()) # del tmp_list[:] # tmp_list.append([-y[2,0],-y[2,1]]) # tmp_list.append([0,0]) # mu_y_right.append(tmp_list.copy()) # del tmp_list[:] params_right.array_mu_y = mu_y_right z = sample.iloc[4:6].to_numpy().reshape((1, 2)) # mu_z.append(z[0:2]) # mu_z.append(z[2:4]) # mu_z.append(z[4:6]) # for 6 genomes tmp_list.append([0, 0]) tmp_list.append([0, 0]) mu_z.append(tmp_list.copy()) del tmp_list[:] tmp_list.append([0, 0]) tmp_list.append([z[0, 0], z[0, 1]]) mu_z.append(tmp_list.copy()) del tmp_list[:] tmp_list.append([0, 0]) tmp_list.append([0, 0]) mu_z.append(tmp_list.copy()) del tmp_list[:] # for 18 genomes # tmp_list.append([0,0]) # tmp_list.append([z[0,0],z[0,1]]) # mu_z.append(tmp_list.copy()) # del tmp_list[:] # tmp_list.append([0,0]) # tmp_list.append([z[1,0],z[1,1]]) # mu_z.append(tmp_list.copy()) # del tmp_list[:] # tmp_list.append([0,0]) # tmp_list.append([z[2,0],z[2,1]]) # mu_z.append(tmp_list.copy()) # del tmp_list[:] params_left.array_mu_z = mu_z # for 6 genomes tmp_list.append([0, 0]) tmp_list.append([0, 0]) mu_z_right.append(tmp_list.copy()) del tmp_list[:] tmp_list.append([z[0, 0], z[0, 1]]) tmp_list.append([0, 0]) mu_z_right.append(tmp_list.copy()) del tmp_list[:] tmp_list.append([0, 0]) tmp_list.append([0, 0]) mu_z_right.append(tmp_list.copy()) del tmp_list[:] # for 18 genomes # tmp_list.append([z[0,0],z[0,1]]) # tmp_list.append([0,0]) # mu_z_right.append(tmp_list.copy()) # del tmp_list[:] # tmp_list.append([z[1,0],z[1,1]]) # tmp_list.append([0,0]) # mu_z_right.append(tmp_list.copy()) # del tmp_list[:] # tmp_list.append([z[2,0],z[2,1]]) # tmp_list.append([0,0]) # mu_z_right.append(tmp_list.copy()) # del tmp_list[:] params_right.array_mu_z = mu_z_right params_left.write_parameters(filename='configs/ffd_config_left_' + str(i) + '.prm') params_right.write_parameters(filename='configs/ffd_config_right_' + str(i) + '.prm') print("config files generated") # print("fitness values") # print(fitness_values) # Create wheelcase stl based on each config file for j in range(len(pop)): params_left.read_parameters(filename='configs/ffd_config_left_' + str(j) + '.prm') params_right.read_parameters(filename='configs/ffd_config_right_' + str(j) + '.prm') mesh_points_all = stl_handler_all.parse( filename='/home/sascha/SAIL/domain/wheelcase/ffd/combined_180.stl') free_form = FFD(params_left, mesh_points_all) free_form.perform() # Perform FFD new_mesh_points = free_form.modified_mesh_points # Save new mesh of wheelcase free_form = FFD(params_right, new_mesh_points) free_form.perform() mesh_points_final = free_form.modified_mesh_points stl_handler_all.write(mesh_points_final, 'stls/all_deformed_' + str(j) + '.stl') print("slts generated") # config and stls correct # execute openFoam for each stl (combine with top and velo stls) # long running loop (!) print("start openfoam") for k in range(len(pop)): copy_cmd = "cp stls/all_deformed_" + str( k) + ".stl domain/wheelcase/hpc1_velo_changed/constant/triSurface" rename_cmd = "mv domain/wheelcase/hpc1_velo_changed/constant/triSurface/all_deformed_" + str( k ) + ".stl domain/wheelcase/hpc1_velo_changed/constant/triSurface/all_deformed.stl" print("cp: " + str(os.system(copy_cmd))) print("cp executed") print("renaming: " + str(os.system(rename_cmd))) print("renaming executed") os.chdir("/home/sascha/SAIL/domain/wheelcase/hpc1_velo_changed") os.system("./Allrun") data_force = np.loadtxt( '/home/sascha/SAIL/domain/wheelcase/hpc1_velo_changed/postProcessing/forceCoeffs1/0/forceCoeffs.dat' ) df_force = pd.DataFrame(data=data_force) cD = df_force.iloc[:, 2] cD.to_csv('drag' + str(k) + '.csv') # fitness is mean over the last 100 timesteps (inverted because lower cD (drag) is better) fitness = np.negative( cD.iloc[100:200].mean()) # OpenFOAM 200 timesteps -> controlDict print("FITNESS IS: " + str(fitness)) fitness_values[k] += fitness remove_wheelcase_cmd = "rm /home/sascha/SAIL/domain/wheelcase/hpc1_velo_changed/constant/triSurface/all_deformed.stl" os.system("./Allclean") os.system(remove_wheelcase_cmd) os.chdir("/home/sascha/SAIL") print("wheelcase_turned.stl removed from hpc folder") print("end openfoam") # print("fitness values after") # print(fitness_values) remove_stls_cmd = "rm -r " + home_dir + "SAIL/stls/*" remove_configs_cmd = "rm -r " + home_dir + "SAIL/configs/*" os.system(remove_stls_cmd) os.system(remove_configs_cmd) # extract Fitness values (postProcessing folder) pd.DataFrame(data=fitness_values).to_csv('domain/wheelcase/fitness.csv', mode='a+', index=False, header=False) df_fitness = pd.DataFrame(data=fitness_values).transpose() return df_fitness