6 import medcoupling as MC
9 #filename = "locrafgrid_1_new.msh"
10 #filename = "checkerboard_2x2x2_new.msh"
12 if len(sys.argv) != 2:
13 print( "USAGE: convert_gmsh_to_med.py file.msh")
16 filename = sys.argv[1]
18 print( "Converting ", filename)
20 # type de maille en fonction du nombre de noeuds.
21 # cf INTERP_KERNEL/CellModel.cxx
22 d_cell_types = {8: MC.NORM_HEXA8,
31 read_new_cell_connectivity = False
36 cell_connectivity = []
38 mesh = MC.MEDCouplingUMesh.New()
39 mesh.setMeshDimension(mesh_dim)
40 mesh.setName("mesh_from_gmsh")
42 with open(filename, 'rb') as f:
44 # remove end of line character
48 if infos and infos[0] == "Vertices":
49 nb_vertices = int(infos[1])
51 elif infos and infos[0] == "Volumes->faces":
52 # stop reading node coords
54 meshCoords = MC.DataArrayDouble.New()
56 meshCoords.setValues(coords, nb_vertices, mesh_dim)
57 mesh.setCoords(meshCoords)
60 coords_i = [float(v) for v in infos]
62 elif infos and (infos[0] == "Volumes->Vertices" or infos[0] == "Volumes->Verticess"):
63 # start reading cells connectivity
64 nb_cells = int(infos[1])
65 mesh.allocateCells(nb_cells)
67 read_new_cell_connectivity = True
68 elif infos and (infos[0] == "Faces->Edges" or infos[0] == "Faces->Edgess"):
69 # stop reading cells connectivity
72 nb_faces = int(infos[1])
74 values = [int(v) for v in infos]
75 if read_new_cell_connectivity:
77 #print "start new cell connectivity"
78 nb_nodes_in_cell = int(values[0])
79 cell_connectivity = values[1:]
80 #print "nb_nodes_in_cell: ", nb_nodes_in_cell
81 #print "cell_connectivity: ", cell_connectivity
82 if len(cell_connectivity) < nb_nodes_in_cell:
83 read_new_cell_connectivity = False
85 read_new_cell_connectivity = True
87 #print "complete the cell connectivity"
88 cell_connectivity += values
89 #print "cell_connectivity: ", cell_connectivity
90 if len(cell_connectivity) == nb_nodes_in_cell:
91 read_new_cell_connectivity = True
93 read_new_cell_connectivity = False
94 if read_new_cell_connectivity and cell_connectivity:
95 #print "finish cell connectivity"
96 #print nb_nodes_in_cell, cell_connectivity
97 # start numbering at 0
98 cell_connectivity = [v-1 for v in cell_connectivity]
99 mesh.insertNextCell(d_cell_types[nb_nodes_in_cell], nb_nodes_in_cell, cell_connectivity)
101 cell_connectivity = []
103 # Merge les noeuds confondus (à faire avant le conformize2D)
104 arr, areNodesMerged, newNbOfNodes = mesh.mergeNodes(1e-10)
106 # Crée des polyèdres pour rendre conforme les mailles
107 mesh.convertAllToPoly()
108 mesh.conformize3D(1e-10)
111 # Crée les éléments 1D pour pouvoir imposer les conditions aux limites
112 mesh_2d = mesh.computeSkin()
114 # Identifie les faces de chaque côté pour créer les groupes
117 barycenters = mesh_2d.computeIsoBarycenterOfNodesPerCell()
124 for i, coord in enumerate(barycenters):
139 arr_left = MC.DataArrayIdType(ids_left)
140 arr_right = MC.DataArrayIdType(ids_right)
141 arr_bottom = MC.DataArrayIdType(ids_bottom)
142 arr_top = MC.DataArrayIdType(ids_top)
143 arr_back = MC.DataArrayIdType(ids_back)
144 arr_front = MC.DataArrayIdType(ids_front)
146 arr_left.setName("Left")
147 arr_right.setName("Right")
148 arr_bottom.setName("Bottom")
149 arr_top.setName("Top")
150 arr_back.setName("Back")
151 arr_front.setName("Front")
153 # Trie les cellules par type conformément à la convention MED fichier
154 o2n = mesh.sortCellsInMEDFileFrmt()
155 o2n = mesh_2d.sortCellsInMEDFileFrmt()
156 meshMEDFile = ML.MEDFileUMesh.New()
157 # Ecrit le maillage 3D
158 meshMEDFile.setMeshAtLevel(0,mesh)
159 # Ecrit le maillage 2D
160 meshMEDFile.setMeshAtLevel(-1,mesh_2d)
162 meshMEDFile.addGroup(-1, arr_left)
163 meshMEDFile.addGroup(-1, arr_right)
164 meshMEDFile.addGroup(-1, arr_bottom)
165 meshMEDFile.addGroup(-1, arr_top)
166 meshMEDFile.addGroup(-1, arr_back)
167 meshMEDFile.addGroup(-1, arr_front)
168 med_filename = filename.replace(".msh", ".med")
169 meshMEDFile.write(med_filename,2) # 2 stands for write from scratch