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
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
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
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
# -*- 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.
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])
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')