Salome HOME
ef8ec13bde9c6c15fbc1dfa514d7ae6e0b600e71
[tools/solverlab.git] / CDMATH / tests / ressources / scripts / convert_gmsh_to_med.py
1 #!/usr/bin/env python
2 # -*- coding: UTF8 -*-
3
4 import sys
5
6 import medcoupling as MC
7 import MEDLoader as ML
8
9 #filename = "locrafgrid_1_new.msh"
10 #filename = "checkerboard_2x2x2_new.msh"
11
12 if len(sys.argv) != 2:
13   print( "USAGE: convert_gmsh_to_med.py file.msh")
14   sys.exit(-1)
15
16 filename = sys.argv[1]
17
18 print( "Converting ", filename)
19
20 # type de maille en fonction du nombre de noeuds.
21 # cf INTERP_KERNEL/CellModel.cxx
22 d_cell_types = {8: MC.NORM_HEXA8,
23                 6: MC.NORM_PENTA6}
24
25 mesh_dim = 3
26
27 read_vertices = False
28 coords = []
29
30 read_cells = False
31 read_new_cell_connectivity = False
32
33 nb_vertices = 0
34 nb_cells = 0
35 nb_nodes_in_cell = 0
36 cell_connectivity = []
37
38 mesh = MC.MEDCouplingUMesh.New()
39 mesh.setMeshDimension(mesh_dim)
40 mesh.setName("mesh_from_gmsh")
41
42 with open(filename, 'rb') as f:
43   for line in f:
44     # remove end of line character
45     line = line[:-1]
46     infos = line.split()
47     #print infos
48     if infos and infos[0] == "Vertices":
49       nb_vertices = int(infos[1])
50       read_vertices = True
51     elif infos and infos[0] == "Volumes->faces":
52       # stop reading node coords
53       read_vertices = False
54       meshCoords = MC.DataArrayDouble.New()
55       #pdb.set_trace()
56       meshCoords.setValues(coords, nb_vertices, mesh_dim)
57       mesh.setCoords(meshCoords)
58     elif read_vertices:
59       # read node coords
60       coords_i = [float(v) for v in infos]
61       coords += coords_i
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)
66       read_cells = True
67       read_new_cell_connectivity = True
68     elif infos and (infos[0] == "Faces->Edges" or infos[0] == "Faces->Edgess"):
69       # stop reading cells connectivity
70       read_cells = False
71       read_faces = True
72       nb_faces = int(infos[1])
73     elif read_cells:
74       values = [int(v) for v in infos]
75       if read_new_cell_connectivity:
76         #print ""
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
84         else:
85           read_new_cell_connectivity = True
86       else:
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
92           else:
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)
100         nb_nodes_in_cell = 0
101         cell_connectivity = []
102
103 # Merge les noeuds confondus (à faire avant le conformize2D)
104 arr, areNodesMerged, newNbOfNodes = mesh.mergeNodes(1e-10)
105
106 # Crée des polyèdres pour rendre conforme les mailles
107 mesh.convertAllToPoly()
108 mesh.conformize3D(1e-10)
109 mesh.unPolyze()
110
111 # Crée les éléments 1D pour pouvoir imposer les conditions aux limites
112 mesh_2d = mesh.computeSkin()
113
114 # Identifie les faces de chaque côté pour créer les groupes
115 tol = 1e-10
116
117 barycenters = mesh_2d.computeIsoBarycenterOfNodesPerCell()
118 ids_left = []
119 ids_right = []
120 ids_bottom = []
121 ids_top = []
122 ids_front = []
123 ids_back = []
124 for i, coord in enumerate(barycenters):
125   x, y, z = coord
126   if abs(x) < tol:
127     ids_left.append(i)
128   elif abs(x-1) < tol:
129     ids_right.append(i)
130   elif abs(y) < tol:
131     ids_bottom.append(i)
132   elif abs(y-1) < tol:
133     ids_top.append(i)
134   elif abs(z) < tol:
135     ids_back.append(i)
136   elif abs(z-1) < tol:
137     ids_front.append(i)
138
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)
145
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")
152
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)
161 # Ecrit les groupes
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
170
171 print( "...done")