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)
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 -------------------------------------------------------
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')