6 import medcoupling as MC
10 print( "USAGE: convert_gmsh_to_med.py file.msh")
13 filename = sys.argv[1]
15 print( "Converting ", filename)
17 # type de maille en fonction du nombre de noeuds.
18 # cf INTERP_KERNEL/CellModel.cxx
19 d_cell_types = {8: MC.NORM_HEXA8,
29 read_new_cell_connectivity = False
34 cell_connectivity = []
36 mesh = MC.MEDCouplingUMesh.New()
37 mesh.setMeshDimension(mesh_dim)
38 mesh.setName("mesh_from_msh")
40 with open(filename, 'r', encoding="iso-8859-1") as f:
42 # remove end of line character
46 if infos and infos[0] == "Vertices":
47 nb_vertices = int(infos[1])
49 elif infos and (infos[0] == "Volumes->faces" or infos[0] == "Volumes->Faces"):
50 # stop reading node coords
52 meshCoords = MC.DataArrayDouble.New()
54 meshCoords.setValues(coords, nb_vertices, mesh_dim)
55 mesh.setCoords(meshCoords)
58 coords_i = [float(v) for v in infos]
60 elif infos and (infos[0] == "Volumes->Vertices" or infos[0] == "Volumes->Verticess"):
61 # start reading cells connectivity
62 nb_cells = int(infos[1])
63 mesh.allocateCells(nb_cells)
65 read_new_cell_connectivity = True
66 elif infos and (infos[0] == "Faces->Edges" or infos[0] == "Faces->Edgess"):
67 # stop reading cells connectivity
70 nb_faces = int(infos[1])
72 values = [int(v) for v in infos]
73 if read_new_cell_connectivity:
75 #print "start new cell connectivity"
76 nb_nodes_in_cell = int(values[0])
77 cell_connectivity = values[1:]
78 #print "nb_nodes_in_cell: ", nb_nodes_in_cell
79 #print "cell_connectivity: ", cell_connectivity
80 if len(cell_connectivity) < nb_nodes_in_cell:
81 read_new_cell_connectivity = False
83 read_new_cell_connectivity = True
85 #print "complete the cell connectivity"
86 cell_connectivity += values
87 #print "cell_connectivity: ", cell_connectivity
88 if len(cell_connectivity) == nb_nodes_in_cell:
89 read_new_cell_connectivity = True
91 read_new_cell_connectivity = False
92 if read_new_cell_connectivity and cell_connectivity:
93 #print "finish cell connectivity"
94 #print nb_nodes_in_cell, cell_connectivity
95 # start numbering at 0
96 cell_connectivity = [v-1 for v in cell_connectivity]
97 mesh.insertNextCell(d_cell_types[nb_nodes_in_cell], nb_nodes_in_cell, cell_connectivity)
99 cell_connectivity = []
101 # Merge les noeuds confondus (à faire avant le conformize2D)
102 arr, areNodesMerged, newNbOfNodes = mesh.mergeNodes(1e-10)
104 # Crée des polyèdres pour rendre conforme les mailles
105 mesh.convertAllToPoly()
106 mesh.conformize3D(1e-10)
109 # Crée les éléments 1D pour pouvoir imposer les conditions aux limites
110 mesh_2d = mesh.computeSkin()
112 # Identifie les faces de chaque côté pour créer les groupes
115 barycenters = mesh_2d.computeIsoBarycenterOfNodesPerCell()
122 for i, coord in enumerate(barycenters):
137 arr_left = MC.DataArrayInt64(ids_left)
138 arr_right = MC.DataArrayInt64(ids_right)
139 arr_bottom = MC.DataArrayInt64(ids_bottom)
140 arr_top = MC.DataArrayInt64(ids_top)
141 arr_back = MC.DataArrayInt64(ids_back)
142 arr_front = MC.DataArrayInt64(ids_front)
144 arr_left.setName("Left")
145 arr_right.setName("Right")
146 arr_bottom.setName("Bottom")
147 arr_top.setName("Top")
148 arr_back.setName("Back")
149 arr_front.setName("Front")
151 # Trie les cellules par type conformément à la convention MED fichier
152 o2n = mesh.sortCellsInMEDFileFrmt()
153 o2n = mesh_2d.sortCellsInMEDFileFrmt()
154 meshMEDFile = ML.MEDFileUMesh.New()
155 # Ecrit le maillage 3D
156 meshMEDFile.setMeshAtLevel(0,mesh)
157 # Ecrit le maillage 2D
158 meshMEDFile.setMeshAtLevel(-1,mesh_2d)
160 meshMEDFile.addGroup(-1, arr_left)
161 meshMEDFile.addGroup(-1, arr_right)
162 meshMEDFile.addGroup(-1, arr_bottom)
163 meshMEDFile.addGroup(-1, arr_top)
164 meshMEDFile.addGroup(-1, arr_back)
165 meshMEDFile.addGroup(-1, arr_front)
166 med_filename = filename.replace(".msh", ".med")
167 meshMEDFile.write(med_filename,2) # 2 stands for write from scratch