def run_Biot_Savart(setupFileName,meshFileName,folder_path): ''' Runs the Biot-Savart method\n setupFileName: setup file name\n meshFileName: file name of the mesh\n folder_path: path of solution folder\n example:\n field_solution=Biot_Savart.run_Biot_Savart(setup_file_name,mesh_file_name,folder_path) ''' print("Running Biot-Savart law") #=============================================================================== # Pre Processing #=============================================================================== preProcData= get_preproc_data(meshFileName, setupFileName) integ_gauss_points_coordinates=Get_Gauss_points_list(preProcData,True,folder_path) #=============================================================================== # Initial data #=============================================================================== # Setup regions_excitation=preProcData.RegionExcitation #------------------------------------------------------------------------------ # Pre-processor mesh_data=preProcData.MeshData all_elem_nodes= mesh_data.ElemNodes nodes_coordenates=mesh_data.NodesCoordenates elem_tags=mesh_data.ElemTags elem_type=mesh_data.ElemType operations=Operations() global_nodes=list() counter=0 global_values=list() for each_elem in integ_gauss_points_coordinates: local=list() for each_point in each_elem: local.append(np.array([0,0,0])) global_values.append(local) for elem_counter, each_element in enumerate(all_elem_nodes): if elem_type[elem_counter]>1: I=0 for eachregion in regions_excitation: if eachregion.RegionNumber==elem_tags[elem_counter][0]: Js=eachregion.Value element_area=operations.get_area_element(elem_type[elem_counter],all_elem_nodes[elem_counter],nodes_coordenates) I=math.fabs(Js*element_area) break if I!=0: dl=np.array([0,0,Js/math.fabs(Js)]) #baricenter of the element with current density xbar=0 ybar=0 zbar=0 nodes=all_elem_nodes[elem_counter] for nodeCounter in range(0,len(nodes)): xbar=nodes_coordenates[nodes[nodeCounter]][0]+xbar ybar=nodes_coordenates[nodes[nodeCounter]][1]+ybar zbar=nodes_coordenates[nodes[nodeCounter]][2]+zbar num_nodes=len(nodes) baricenter_coordinates=np.array([xbar/num_nodes,ybar/num_nodes,zbar/num_nodes]) local=list() for elem_inner_counter, inner_elem_coodinates in enumerate(integ_gauss_points_coordinates): for node_counter,each_node in enumerate(inner_elem_coodinates): r= each_node-baricenter_coordinates abs_r=LA.norm(r) #============================================================================== # Biot_savart equation #============================================================================== H_field=I*(1.0/(2.0*math.pi))*np.cross(dl,r)/math.pow(abs_r,2) global_values[elem_inner_counter][node_counter]=global_values[elem_inner_counter][node_counter]+H_field #List containing all the integration points coordinates points_list=list() counter=0 for each_elem in integ_gauss_points_coordinates: local=list() local_nodes=list() for each_point in each_elem: local.append(counter) points_list.append(each_point) local_nodes.append(counter) counter+=1 global_nodes.append(local_nodes) # Folder results path file_names=File_names() results_folder=file_names.get_results_folder_name() results_path=os.path.join(folder_path,results_folder) #============================================================================== # Write file with the results integPOintResults=list() for each_element in global_values: for each in each_element: integPOintResults.append(each) counter=0 h_field_results_file_name=file_names.get_H_results_file_name() full_path=os.path.join(results_path,h_field_results_file_name) write_numeric_data_file(full_path,integPOintResults,"HResults",True) # Write file with the points numbering global_list=list() for eachw in global_nodes: local=list() for each in eachw: local.append(each) global_list.append(local) h_field_results_file_name=file_names.get_H_results_file_name() full_path=os.path.join(results_path,h_field_results_file_name) write_numeric_data_file(full_path,global_list,"Points",False) #============================================================================== # GMSH post processing Gmsh_file_name=file_names.get_H_Gmsh_pos_proc_file_name() path=os.path.join(results_path,Gmsh_file_name) Create_Vector_field(points_list,integPOintResults,path,"H vector")
def run_permanent_magnets(preProcData, folder_path): print("Running permanent magnetic field solution") #=============================================================================== # Initial data #=============================================================================== #------------------------------------------------------------------------------ # Pre-processor mesh_data=preProcData.MeshData all_elem_nodes= mesh_data.ElemNodes elem_tags=mesh_data.ElemTags regions_material=preProcData.RegionMaterial materials_lib=get_materials_lib() elem_type=mesh_data.ElemType region_ID_list=list() counter=0 for elem_counter in range(0,len(all_elem_nodes)): if elem_type[elem_counter]>1: for each_region in regions_material: if each_region.RegionNumber==elem_tags[counter][0]: region_ID_list.append(each_region.MaterialName) counter+=1 integ_gauss_points_coordinates=Get_Gauss_points_list(preProcData,True,folder_path) global_Hc_list=list() for elem_counter, each_element in enumerate(region_ID_list): local_Hc=list() for integ_point in range(0,len(integ_gauss_points_coordinates[elem_counter])): local_Hc.append(materials_lib[each_element].Hc) global_Hc_list.append(local_Hc) Hc_points_list=list() for each_element in global_Hc_list: for each_point in each_element: Hc_points_list.append((each_point)) points_list=list() global_nodes=list() counter=0 for each_elem in integ_gauss_points_coordinates: local=list() for each_point in each_elem: local.append(counter) counter+=1 points_list.append(each_point) global_nodes.append(local) #============================================================================== # Folder results path file_names=File_names() results_folder=file_names.get_results_folder_name() folder_path=os.path.join(folder_path,results_folder) #============================================================================== # Write file with the results file_names=File_names() global_list=list() for eachw in Hc_points_list: global_list.append(eachw) h_field_results_file_name=file_names.get_H_results_file_name() full_path=os.path.join(folder_path,h_field_results_file_name) # print(global_list) write_numeric_data_file(full_path,global_list,"HResults",True) global_list=list() for eachw in global_nodes: local=list() for each in eachw: local.append(each) global_list.append(local) h_field_results_file_name=file_names.get_H_results_file_name() full_path=os.path.join(folder_path,h_field_results_file_name) write_numeric_data_file(full_path,global_list,"Points",False) #============================================================================== # GMSH post processing file_names=File_names() Gmsh_file_name=file_names.get_H_Gmsh_pos_proc_file_name() path=os.path.join(folder_path,Gmsh_file_name) global_coor=list() for each_element in integ_gauss_points_coordinates: for each_point in each_element: global_coor.append(each_point) Create_Vector_field(global_coor,Hc_points_list,path,"H vector")