6 import medcoupling as MC
10 print( "USAGE: convert_2Dgmsh_to_med.py file.typ2")
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 = {3: MC.NORM_TRI3,
30 read_new_cell_connectivity = False
33 vertex_line_number=False
34 cell_line_number=False
39 cell_connectivity = []
41 mesh = MC.MEDCouplingUMesh.New()
42 mesh.setMeshDimension(mesh_dim)
43 mesh.setName("mesh_from_typ")
45 with open(filename, 'r', encoding="iso-8859-1") as f:
47 # remove end of line character
51 if vertex_line_number:
52 print("Reading number of vertices")
53 nb_vertices = int(infos[0])
54 vertex_line_number = False
56 print("Start reading vertex coordinates")
58 elif cell_line_number:
59 print("Reading number of cells")
60 nb_cells = int(infos[0])
61 mesh.allocateCells(nb_cells)
62 cell_line_number = False
64 print("Start reading cell connectivity")
66 elif infos and infos[0] == "Vertices":
67 vertex_line_number = True
68 elif infos and ( infos[0] == "cells" or infos[0] == "Control"):
69 cell_line_number = True
73 coords_i = [float(v) for v in infos]
76 values = [int(v) for v in infos]
77 nb_nodes_in_cell = int(values[0])
78 cell_connectivity = values[1:]
79 #print( "nb_nodes_in_cell: ", nb_nodes_in_cell)
80 #print "cell_connectivity: ", cell_connectivity
81 # start numbering at 0
82 cell_connectivity = [v-1 for v in cell_connectivity]
83 mesh.insertNextCell(d_cell_types[nb_nodes_in_cell], nb_nodes_in_cell, cell_connectivity)
85 cell_connectivity = []
87 meshCoords = MC.DataArrayDouble.New()
89 meshCoords.setValues(coords, nb_vertices, mesh_dim)
90 mesh.setCoords(meshCoords)
93 # Merge les noeuds confondus (à faire avant le conformize2D)
94 arr, areNodesMerged, newNbOfNodes = mesh.mergeNodes(1e-10)
96 # Crée des polyèdres pour rendre conforme les mailles
97 mesh.convertAllToPoly()
98 mesh.conformize2D(1e-10)
101 # Crée les éléments 1D pour pouvoir imposer les conditions aux limites
102 mesh_1d = mesh.computeSkin()
104 # Identifie les faces de chaque côté pour créer les groupes
107 barycenters = mesh_1d.computeIsoBarycenterOfNodesPerCell()
112 for i, coord in enumerate(barycenters):
123 arr_left = MC.DataArrayInt64(ids_left)
124 arr_right = MC.DataArrayInt64(ids_right)
125 arr_bottom = MC.DataArrayInt64(ids_bottom)
126 arr_top = MC.DataArrayInt64(ids_top)
128 arr_left.setName("Left")
129 arr_right.setName("Right")
130 arr_bottom.setName("Bottom")
131 arr_top.setName("Top")
133 # Trie les cellules par type conformément à la convention MED fichier
134 o2n = mesh.sortCellsInMEDFileFrmt()
135 o2n = mesh_1d.sortCellsInMEDFileFrmt()
136 meshMEDFile = ML.MEDFileUMesh.New()
137 # Ecrit le maillage 2D
138 meshMEDFile.setMeshAtLevel(0,mesh)
139 # Ecrit le maillage 1D
140 meshMEDFile.setMeshAtLevel(-1,mesh_1d)
142 meshMEDFile.addGroup(-1, arr_left)
143 meshMEDFile.addGroup(-1, arr_right)
144 meshMEDFile.addGroup(-1, arr_bottom)
145 meshMEDFile.addGroup(-1, arr_top)
146 med_filename = filename.replace(".typ2", ".med")
147 meshMEDFile.write(med_filename,2) # 2 stands for write from scratch
149 print( "...done converting ", filename, " to ", med_filename)