Пример #1
0
    def geometry(self):
        """Skapa en geometri instans baserat på definierade parametrar"""

        # --- Skapa en geometri-instans för att lagra vår
        #     geometribeskrivning

        g = cfg.Geometry()

        # --- Enklare att använda referenser till self.xxx
        w = self.w
        h = self.h
        b = self.b
        a = self.a

        # --- Punkter i modellen skapas med point(...) metoden

        g.point([0, 0])
        g.point([(w - a) * 0.5, 0])
        g.point([(w - a) * 0.5, b])
        g.point([(w + a) * 0.5, b])
        g.point([(w + a) * 0.5, 0])
        g.point([w, 0])
        g.point([w, h])
        g.point([(w + a) * 0.5, h])
        g.point([(w + a) * 0.5, h - b])
        g.point([(w - a) * 0.5, h - b])
        g.point([(w - a) * 0.5, h])
        g.point([0, h])

        # --- Linker och kurvor skapas med spline(...) metoden

        q = 20
        wall = 30

        g.spline([0, 1])
        g.spline([1, 2])
        g.spline([2, 3])
        g.spline([3, 4])
        g.spline([4, 5])
        g.spline([5, 6], marker=q)
        g.spline([6, 7])
        g.spline([7, 8])
        g.spline([8, 9])
        g.spline([9, 10])
        g.spline([10, 11])
        g.spline([11, 0], marker=wall)

        # --- Ytan på vilket nätet skall genereras definieras med
        #     surface(...) metoden.

        g.surface([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

        # --- Slutligen returnerar vi den skapade geometrin

        return g
Пример #2
0
    def geometry(self):
        """Skapa en geometri-instans baserad för definierade parametrar"""

        # --- Geometri-instans för geometribeskrivning
        g = cfg.Geometry()
        hn = self.hn        
        hvec = self.hvec
        b = self.b
        B = self.B
        
        # --- Punkter

        g.point([b, 0])
        g.point([B, 0])
        g.point([0, 0])
        
        h = 0
        for i in range(hn):
            h=h - float(hvec[i])
            g.point([B, h])
            g.point([0, h])

        # --- Linjer
        g.spline([1, 0], marker = 2) #markyta
        g.spline([0, 2], marker = 3) #under last
       
        a = 0
        b = 500
        c = 600
        d = 700
        for i in range (hn):
            g.spline([a + 2, a + 4], marker = b) #CL 
            g.spline([a + 4, a + 3], marker = c) #underkant  
            g.spline([a + 3, a + 1], marker = d)
            a = a + 2
            b = b + 1
            c = c + 1
            d = d + 1 
          
        # --- Yta
        g.surface([0, 1, 2, 3, 4], marker = 100)
        
        svec=np.array([3, 5, 6, 7])
        a = 101
        for i in range(hn - 1):
            g.surface(svec, marker = a)
            svec = svec + 3
            a = a + 1
            
        # --- Returnera skapade geometrin
        return g
Пример #3
0
    def geometry(self):
        """Return geometry of shape"""
        self.g = cfg.Geometry()

        w = self.width
        h = self.height

        self.g.point([0, 0])
        self.g.point([w, 0])
        self.g.point([w, h])
        self.g.point([0, h])

        self.g.spline([0, 1], marker=self.bottomId)
        self.g.spline([1, 2], marker=self.rightId)
        self.g.spline([2, 3], marker=self.topId)
        self.g.spline([3, 0], marker=self.leftId)

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

        return self.g
Пример #4
0
    def solveProblem(self):

        g = cfg.Geometry()  #Create a GeoData object that holds the geometry.

        g.point([0, 0])
        g.point([2, 0])
        g.point([2, 1])
        g.point([0, 1])
        g.point([0.5, 0.3])
        g.point([0.3, 0.7])
        g.point([0.7, 0.7])
        g.point([0.8, 0.5])
        g.point([1.7, 0.5])
        g.point([1.5, 0.5])
        g.point([1.7, 0.7])

        g.ellipse([7, 8, 9, 10],
                  marker=50)  # 0 - An ellipse arc. Read the function
        g.spline([0, 1], marker=80)  # 1 - A spline. Splines pass through the
        g.spline([2, 1])  # 2
        g.spline([3, 2])  # 3
        g.spline([0, 3])  # 4
        g.spline([7, 9], marker=50)  # 5
        g.spline([10, 9])  # 6
        g.spline([4, 5, 6, 4])  # 7 - This is a closed spline.

        g.surface([4, 3, 2, 1], [[7], [5, 6, 0]])

        meshGen = cfm.GmshMeshGenerator(g)

        meshGen.elType = 3  # Degrees of freedom per node.
        meshGen.dofsPerNode = 1  # Factor that changes element sizes.
        meshGen.elSizeFactor = 0.05

        self.coords, self.edof, self.dofs, self.bdofs, self.elementmarkers = meshGen.create(
        )
        self.meshGen = meshGen
        self.g = g
Пример #5
0
# -*- coding: utf-8 -*-

'''Example 03

Shows structured meshing in 2D.
'''

import calfem.geometry as cfg
import calfem.mesh as cfm
import calfem.vis_mpl as cfv

# ---- Define geometry ------------------------------------------------------

g = cfg.Geometry()

# Add Points:

g.point([0,0])
g.point([1.2, 0])
g.point([1, 1.3])
g.point([0, 1])
g.point([2, 0.5])

# Add Splines:
# The first four curves are structured curves, i.e the number of nodes along 
# the curves is pre-determined. Parameter el_on_curve states how many elements 
# are placed along the curve. Parameters el_distrib_type and el_distrib_val are 
# optional parameters that specify how elements are distributed.
#   "bump" means elements are bunched up at the ends or the middle of the curve.
#       In this case el_distrib_val is smaller than 1, so elements crowd at the edges.
#   "progression" means each element along the curve is larger/smaller than the previous one.
Пример #6
0
        if len(self.scene.selectedItems())>0:
            print(self.scene.selectedItems()[0].pos())

    def on_item_mouse_move(self):
        print("on_item_mouse_move")

def edit_geometry(g):
    app = QApplication(sys.argv)
    widget = MainWindow(g)
    widget.show()
    sys.exit(app.exec_())


if __name__ == "__main__":

    g = cfg.Geometry()  # Create a GeoData object that holds the geometry.

    # Add points:
    #  The first parameter is the coordinates. These can be in 2D or 3D.
    #  The other parameters are not defined in this example. These parameters are
    #  ID, marker, and elSize.
    #  Since we do not specify an ID the points are automatically assigned IDs,
    #  starting from 0.

    g.point([0, 0])
    g.point([2, 0])
    g.point([2, 1])
    g.point([0, 1])
    g.point([0.5, 0.3])
    g.point([0.3, 0.7])
    g.point([0.7, 0.7])
Пример #7
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')