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