예제 #1
0
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")
예제 #2
0
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")