Esempio n. 1
0
g.structuredSurface([15, 16, 27, 22])  # 4
g.structuredSurface([22, 26, 1, 13])
g.structuredSurface([16, 18, 23, 28])
g.structuredSurface([19, 2, 29, 23])
g.structuredSurface([19, 21, 4, 3])  # 8
g.structuredSurface([20, 6, 5, 21])
g.structuredSurface([25, 20, 7, 33])
g.structuredSurface([32, 17, 18, 25])  # 11

# ---- Create mesh ----------------------------------------------------------

cfu.info("Meshing geometry...")

# Create mesh

mesh = cfm.GmshMesh(geometry=g)
mesh.el_type = 3
mesh.dofs_per_node = 2

coords, edof, dofs, bdofs, elementmarkers = mesh.create()

# ---- Solve problem --------------------------------------------------------

cfu.info("Assembling system matrix...")

nDofs = np.size(dofs)
ex, ey = cfc.coordxtr(edof, coords, dofs)
K = np.zeros([nDofs, nDofs])

for eltopo, elx, ely in zip(edof, ex, ey):
    Ke = cfc.planqe(elx, ely, ep, D)
Esempio n. 2
0
g.spline([1,2], el_on_curve=20, el_distrib_type="progression", el_distrib_val=1.1)
g.spline([2,3], el_on_curve=10, el_distrib_type="bump", el_distrib_val=0.2)
g.spline([0,3], el_on_curve=20, el_distrib_type="progression", el_distrib_val=1.1) #Change order of points to reverse progression distribution
g.spline([2, 4, 1])

# Add Surfaces:
#  A structured surface must contain 4 curves that have the parameter 'el_on_curve' 
#  defined. The number of elements on two opposite curves must be the same 
#  (In this case, curves 0 & 2 and 1 & 3).

g.structuredSurface([0,1,2,3]) 
g.surface([4,1])

# ---- Create mesh ----------------------------------------------------------

mesh = cfm.GmshMesh(g)

# Element type 3 is quad. (2 is triangle. See user manual for more element types)

mesh.el_type = 3 

# Degrees of freedom per node.

mesh.dofs_per_node = 1 
mesh.el_size_factor = 0.01

# mesh.gmsh_exec_path = "D:\\vsmn20-software\\gmsh\gmsh.exe"

coords, edof, dofs, bdofs, elementmarkers = mesh.create()

# ---- Visualise mesh -------------------------------------------------------
Esempio n. 3
0
def part(file_name, sample_size, mesh_size, Inhomogeneity_factor, L_groove,
         L_slope, Element_type, Material_angle, Groove_angle):

    with open(file_name, 'a') as inp_file:
        inp_file.write('** PART\n')
        inp_file.write('*Part,name=MK_sample\n')
        inp_file.write('**\n')
        inp_file.write('*End part\n')
        inp_file.write('**\n')
        inp_file.write('**\n')
        inp_file.write('** ASSEMBLY\n*Assembly,name=Assembly\n')
        inp_file.write('**\n')
        inp_file.write('**\n')
        inp_file.write('** INSTANCE\n*Instance, name=MK_sample-1, part=MK_sample\n')
        inp_file.write('**\n')
        inp_file.write('**\n')


    ###################################
    ######         Nodes         ######
    ###################################
    Rotate = 0
        
    if Groove_angle>45:
        Groove_angle = 90 - Groove_angle
        Rotate = 1
        
    L_slope = L_slope/np.cos(Groove_angle*np.pi/180)
    L_groove = L_groove/np.cos(Groove_angle*np.pi/180)
    
    
    if Groove_angle == 45:
        warnings.warn("Difficulties to mesh the sample. Please consider change the groove angle.")
        
    else:    
        Groove_angle = Groove_angle*np.pi/180
        
        g = cfg.Geometry()
        g.point([0.0, sample_size[1]/2-np.tan(Groove_angle)*sample_size[0]/2 + L_slope+L_groove/2]) # point 0
        g.point([sample_size[0],  np.tan(Groove_angle)*sample_size[0]/2+sample_size[1]/2 + L_slope+L_groove/2 ]) # point 1
        g.point([sample_size[0], sample_size[1]]) # point 2
        g.point([0.0, sample_size[1]]) # point 3
    
        g.spline([0, 1]) # line 0
        g.spline([1, 2]) # line 1
        g.spline([2, 3]) # line 2
        g.spline([3, 0]) # line 3
        
        g.surface([0, 1, 2, 3])
            
        mesh = cfm.GmshMesh(g)
        
        mesh.elType = 3          # Degrees of freedom per node.
        mesh.dofsPerNode = 1     # Factor that changes element sizes.
        mesh.elSizeFactor = mesh_size   # Element size Factor
        
        Corner = 0  
        test_mesh = 0
        while Corner == 0:
            test_mesh += 1
            coords, edof, dofs, bdofs, elementmarkers = mesh.create()
            Nb_fois_el = np.zeros(len(dofs))
            # Trouver les bords
            for x in edof:
                Nb_fois_el[x-1] = Nb_fois_el[x-1]+1
            if np.sum(Nb_fois_el==1)==4:
                Corner = 1
            else:
                mesh.elSizeFactor = mesh.elSizeFactor*0.95
            if test_mesh>10:
                warnings.warn("Difficulties to mesh the sample. Please consider refining.")
                break
                
        
        Z_coord = np.ones(len(coords))*sample_size[2]
        
        
        i1 = next(x for x, value in enumerate(coords[3:-1,0]) if value>sample_size[0]-1e-5)
        Ege_bottom_1 = coords[4:3+i1,:]
        Ege_bottom_1 = np.vstack([coords[0,:],Ege_bottom_1,coords[1,:]])
        Num_up = np.arange(4,3+i1)
        Num_up = np.append([0],Num_up)
        Num_up = np.append(Num_up,[1])
    
        Num_bottom = Num_up + len(coords)
        
        Coord_groove_up = Ege_bottom_1.copy()
        Coord_groove_up[:,1] = Coord_groove_up[:,1]-L_slope
        
        Z_groove_up = np.ones(len(Coord_groove_up))*((sample_size[2]-Inhomogeneity_factor)/2+Inhomogeneity_factor)
        
        Coord_groove_bottom = Coord_groove_up.copy()
        Coord_groove_bottom[:,1] = Coord_groove_bottom[:,1]-L_groove
    
        Z_groove_bottom = np.ones(len(Coord_groove_bottom))*((sample_size[2]-Inhomogeneity_factor)/2+Inhomogeneity_factor)

        coords_2 = coords.copy()
        coords_2[:,0] = sample_size[0]-coords[:,0]
        coords_2[:,1] = sample_size[1]-coords[:,1]
       
        Z_coord_2 = Z_coord.copy()
        
        coord_all = coords.copy()
        coord_all = np.vstack([coords,coords_2,Coord_groove_up,Coord_groove_bottom])
        
        Z_coord_all = np.concatenate([Z_coord,Z_coord_2,Z_groove_up,Z_groove_bottom])
    
        edof_2 = edof.copy()
        edof_2 = edof_2+np.max(edof_2)
        edof_all = edof.copy()
        edof_all = np.vstack([edof,edof_2])
        
        connectivite = np.zeros((len(Num_up)-1,4))
        
        for i in range(len(Num_up)-1):
            connectivite[i,:] = [len(coords)+len(coords_2)+i,len(coords)+len(coords_2)+i+1,Num_up[i+1],Num_up[i]]
            
        connectivite2 = np.zeros((len(Num_up)-1,4))
        for i in range(len(Num_up)-1):
            connectivite2[i,:] = [len(coords)+len(coords_2)+len(Coord_groove_up)+i,
                                  len(coords)+len(coords_2)+len(Coord_groove_up)+i+1,len(coords)+len(coords_2)+i+1,len(coords)+len(coords_2)+i]    
            
        connectivite3 = np.zeros((len(Num_up)-1,4))
        for i in range(len(Num_up)-1):
            connectivite3[i,:] = [Num_bottom[-i-1],Num_bottom[-i-2],len(coords)+len(coords_2)+len(Coord_groove_up)+i+1,len(coords)+len(coords_2)+len(Coord_groove_up)+i]
            
       
        edof_all = np.vstack([edof_all,connectivite+1,connectivite2+1,connectivite3+1])
                
        if Rotate==1:
            C = coord_all.copy()
            C[:,0] = -coord_all[:,1] + sample_size[1]
            C[:,1] = coord_all[:,0]
            C[:,0] = sample_size[1]-C[:,0]   
            coord_all[:,0] = C[:,0] 
            coord_all[:,1] = C[:,1]

    
    # cfv.figure()
    # cfv.drawMesh(
    #     coords=coord_all,
    #     edof=edof_all,
    #     dofs_per_node=mesh.dofsPerNode,
    #     el_type=mesh.elType,
    #     filled=True,
    #     title="Mesh"   
    #         )   
    
    coord_all_2 = coord_all.copy()
    Z_coord_all_2 = Z_coord_all.copy()
    Z_coord_all_2 = abs(Z_coord_all-sample_size[2])
    
    Coordinate = np.zeros((2*len(coord_all_2), 4))   
    Coordinate[:,0] = np.array(range(2*len(coord_all)))+1
    Coordinate[:,1] = np.concatenate((coord_all[:,0],coord_all_2[:,0]))
    Coordinate[:,2] = np.concatenate((coord_all[:,1],coord_all_2[:,1]))
    Coordinate[:,3] = np.concatenate((Z_coord_all,Z_coord_all_2))
    if Rotate==1:
        Coordinate[:,3] = sample_size[2]-Coordinate[:,3]
            

    with open(file_name, 'a') as inp_file:
        inp_file.write('*Node, nset=Sheet_nodes\n')
        for line in Coordinate:
            inp_file.write('%i, %.6f, %.6f, %.6f\n'%(line[0],line[1],line[2],line[3]))
            
            

    ###################################
    ######       Elements        ######
    ###################################  
    Num_el = []
    el_node =  np.zeros((8))

    Num = 0
    for i in range(len(edof_all)):
        Num += 1
        el_node[0] = edof_all[i,3]
        el_node[1] = edof_all[i,2]
        el_node[2] = edof_all[i,1]
        el_node[3] = edof_all[i,0]
        el_node[4] = edof_all[i,3] + len(coord_all)
        el_node[5] = edof_all[i,2] + len(coord_all)
        el_node[6] = edof_all[i,1] + len(coord_all)
        el_node[7] = edof_all[i,0] + len(coord_all)
        Num_el.append([Num] + list(el_node))
  
    with open(file_name, 'a') as inp_file:
        inp_file.write('**\n')
        inp_file.write('**\n')
        inp_file.write('**\n')
        inp_file.write('**\n')
        inp_file.write('*Element, type=%s, elset=Sheet_Elements\n'%(Element_type))
        for line in Num_el:
            inp_file.write('%i, %i, %i, %i, %i, %i, %i, %i, %i\n'%(line[0],line[1],line[2],line[3],line[4],line[5],line[6],line[7],line[8]))


    ##########################################
    ## Orientation - Section - End instance ##
    ##########################################
    Mat_Angle = Material_angle*np.pi/180
    Rot = [np.cos(Mat_Angle), -np.sin(Mat_Angle), 0.0, np.sin(Mat_Angle), np.cos(Mat_Angle), 0.0]
    str_line = ', '.join([' ' + str(round(x,5)) for x in Rot])

    with open(file_name, 'a') as inp_file:
        inp_file.write('**\n')
        inp_file.write('**\n')
        inp_file.write('*Orientation, name=Ori\n')
        inp_file.write(str_line + '\n')
        inp_file.write('3, 0.\n')
        inp_file.write('**\n')
        inp_file.write('** SECTION\n') 
        inp_file.write('*Solid Section, elset=Sheet_Elements, orientation=Ori, material=Material-1\n')
        inp_file.write(',\n')
        inp_file.write('*End Instance\n')


    ###################################
    ####           Sets           #####
    ###################################


    Left_nodes  = np.where(Coordinate[:,1]<1e-4)[0]+1
    Bottom_nodes = np.where(Coordinate[:,2]<1e-4)[0]+1
    Upper_nodes  = np.where(Coordinate[:,2]>(sample_size[1]-1e-4))[0]+1
    Right_nodes   = np.where(Coordinate[:,1]>(sample_size)[0]-1e-4)[0]+1
    
    Mid = abs(Coordinate[:,1]-sample_size[0]/2)+abs(Coordinate[:,2]-sample_size[1]/2)
    Mid = np.argmin(Mid) + 1 
    i = np.where(connectivite2==Mid)[0][0]
    idx_el_mid = len(edof_all) - len(connectivite3)-len(connectivite2)+i
    
    Corner = Coordinate[:,1]+Coordinate[:,2]
    Corner = np.argmin(Corner) + 1 
    idx_el_corner = np.where(Num_el==Corner)[0][1] +1 
    
    
    ### Bottom nodes
    Node_set = Bottom_nodes  
    nodetowrite = []
    [div,rest] = np.divmod(len(Node_set),16)   
    for i in range(div):
        nodetowrite.append(Node_set[i*16:i*16+16])      
    if rest!=0:
        nodetowrite.append(Node_set[div*16:div*16+rest])
    with open(file_name, 'a') as inp_file:
        inp_file.write('**\n')
        inp_file.write('**\n')
        inp_file.write('**Node_Set : Bottom_nodes \n')
        inp_file.write('*nset, nset=Bottom_nodes, instance=MK_sample-1\n')
        for line in nodetowrite:
            str_line = ', '.join([' ' + str(x) for x in line])
            inp_file.write(str_line + '\n')


    ### Upper nodes
    Node_set = Upper_nodes  
    nodetowrite = []
    [div,rest] = np.divmod(len(Node_set),16)   
    for i in range(div):
        nodetowrite.append(Node_set[i*16:i*16+16])     
    if rest!=0:
        nodetowrite.append(Node_set[div*16:div*16+rest])
    with open(file_name, 'a') as inp_file:
        inp_file.write('**\n')
        inp_file.write('**\n')
        inp_file.write('**Node_Set : Upper_nodes \n')
        inp_file.write('*nset, nset=Upper_nodes, instance=MK_sample-1\n')
        for line in nodetowrite:
            str_line = ', '.join([' ' + str(x) for x in line])
            inp_file.write(str_line + '\n')


    ### Left nodes
    Node_set = Left_nodes  
    nodetowrite = []
    [div,rest] = np.divmod(len(Node_set),16)   
    for i in range(div):
        nodetowrite.append(Node_set[i*16:i*16+16])  
    if rest!=0:
        nodetowrite.append(Node_set[div*16:div*16+rest])
    with open(file_name, 'a') as inp_file:
        inp_file.write('**\n')
        inp_file.write('**\n')
        inp_file.write('**Node_Set : Left_nodes \n')
        inp_file.write('*nset, nset=Left_nodes, instance=MK_sample-1\n')
        for line in nodetowrite:
            str_line = ', '.join([' ' + str(x) for x in line])
            inp_file.write(str_line + '\n')


    ### Right nodes
    Node_set = Right_nodes 
    nodetowrite = []
    [div,rest] = np.divmod(len(Node_set),16)
    for i in range(div):
        nodetowrite.append(Node_set[i*16:i*16+16])
    if rest!=0:
        nodetowrite.append(Node_set[div*16:div*16+rest])
    with open(file_name, 'a') as inp_file:
        inp_file.write('**\n')
        inp_file.write('**\n')
        inp_file.write('**Node_Set : Right_nodes \n')
        inp_file.write('*nset, nset=Right_nodes, instance=MK_sample-1\n')
        for line in nodetowrite:
            str_line = ', '.join([' ' + str(x) for x in line])
            inp_file.write(str_line + '\n')
    
    ### Middle element
    with open(file_name, 'a') as inp_file:
        inp_file.write('**\n')
        inp_file.write('**\n')
        inp_file.write('**Element_Set : Middle_element \n')
        inp_file.write('*elset, elset=Middle_element, instance=MK_sample-1\n')
        inp_file.write('%i\n'%(idx_el_mid))
        
    ### Corner element
    with open(file_name, 'a') as inp_file:
        inp_file.write('**\n')
        inp_file.write('**\n')
        inp_file.write('**Element_Set : Corner_element \n')
        inp_file.write('*elset, elset=Corner_element, instance=MK_sample-1\n')
        inp_file.write('%i\n'%(idx_el_corner))

    ###################################
    ####       End Assembly       #####
    ###################################
    with open(file_name, 'a') as inp_file:
        inp_file.write('**\n')
        inp_file.write('**\n')
        inp_file.write('*End Assembly\n')