1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
4 # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
5 # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
7 # This library is free software; you can redistribute it and/or
8 # modify it under the terms of the GNU Lesser General Public
9 # License as published by the Free Software Foundation; either
10 # version 2.1 of the License.
12 # This library is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 # Lesser General Public License for more details.
17 # You should have received a copy of the GNU Lesser General Public
18 # License along with this library; if not, write to the Free Software
19 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
24 ###################################################################################
25 # This Python script is parsing a MED file using MED Memory from SALOME platform:
26 # It analyses all meshes in the MED file (coordinates, connectivity of d-cells as
27 # well as (d-1)-cells, families), it tests all fields generated in the MESH class
28 # and write them in a 2 new med files (V2.1 and V2.2), it gives only the number of
29 # fields stored in the MED file (d is the mesh/space dimension).
30 ###################################################################################
32 from libMEDMEM_Swig import *
35 #==============================================================================
37 def AnalyzeField(field):
38 name = field.getName()
39 desc = field.getDescription()
40 nbComp = field.getNumberOfComponents()
41 itNum = field.getIterationNumber()
42 ordNum = field.getOrderNumber()
43 type = field.getValueType()
45 print "Analysis of the field ",name," with the description ",desc
46 print "iteration number ",itNum," order Number ",ordNum
47 print "It has ",nbComp," component(s) with the type ",type
49 fieldValue = field.getValue()
50 fieldSupport = field.getSupport()
51 fieldMesh = fieldSupport.getMesh()
52 fieldEntity = fieldSupport.getEntity()
53 bool = fieldSupport.isOnAllElements()
56 print "The support of this field is on all entities ",fieldEntity," of the mesh ",fieldMesh.getName()
57 if fieldEntity == MED_NODE:
58 nbValByComp = fieldMesh.getNumberOfNodes()
60 nbValByComp = fieldMesh.getNumberOfElements(fieldEntity,MED_ALL_ELEMENTS)
61 print "and its dimension (number of values by component of the field) is ",nbValByComp
63 print "The support of this field is partially on entities ",fieldEntity," of the mesh ",fieldMesh.getName()
64 nbValByComp = fieldSupport.getNumberOfElements(MED_ALL_ELEMENTS)
65 print "and its dimension (number of values by component of the field) is ",nbValByComp
67 for i in range(nbComp):
69 compName = field.getComponentName(ip1)
70 compDesc = field.getComponentDescription(ip1)
71 compUnit = field.getMEDComponentUnit(ip1)
72 print "The ",(i+1),"-th component ",compName," with the dexription ",compDesc," and the unit ",compUnit
74 for i in range(nbValByComp):
75 print " * ",fieldValue[i*nbComp:(i+1)*nbComp]
77 #==============================================================================
80 #befor running this script, please be sure about the path the file fileName
82 filePath=os.environ["MED_ROOT_DIR"]
83 filePath=os.path.join(filePath, "share", "salome", "resources", "med")
85 medFile = os.path.join(filePath, "carre_en_quad4_seg2.med")
86 #medFile = os.path.join(filePath, "cube_hexa8_quad4.med")
98 md = MEDFILEBROWSER(medFile)
100 nbMeshes = md.getNumberOfMeshes()
102 nbFields = md.getNumberOfFields()
104 print "The med file", medFile, "contains", nbMeshes, "mesh(es) and", nbFields, "field(s)"
107 print "Mesh(es) Name(s) is(are) "
109 for i in range(nbMeshes):
110 mesh_name = md.getMeshName(i)
111 print " - ",mesh_name
114 print "Field(s) Name(s) is(are) "
116 for i in range(nbFields):
117 field_name = md.getFieldName(i)
118 print " - ",field_name
123 print "Mesh(es) Analysis "
124 for i in range(nbMeshes):
125 mesh_name = md.getMeshName(i)
126 mesh = MESH(MED_DRIVER,md.getFileName(),mesh_name)
127 spaceDim = mesh.getSpaceDimension()
128 meshDim = mesh.getMeshDimension()
129 print "The",print_ord(i), "mesh, '",mesh_name,"', is a",spaceDim,"D mesh on a",meshDim,"D geometry"
130 nbNodes = mesh.getNumberOfNodes()
131 print "The mesh has",nbNodes,"Nodes"
132 coordSyst = mesh.getCoordinatesSystem()
133 print "The coordinates system is",coordSyst
134 print "The Coordinates :"
137 for isd in range(spaceDim):
138 coordNames.append(mesh.getCoordinateName(isd))
139 coordUnits.append(mesh.getCoordinateUnit(isd))
141 print "names:", coordNames
142 print "units", coordUnits
144 coordinates = mesh.getCoordinates(MED_FULL_INTERLACE)
145 for k in range(nbNodes):
148 for isd in range(spaceDim):
150 coords.append(mesh.getCoordinate(kp1,isdp1))
152 print coords," ---- ", coordinates[k*spaceDim:((k+1)*spaceDim)]
155 print "Show the Nodal Connectivity:"
156 nbTypesCell = mesh.getNumberOfTypes(MED_CELL)
159 print "The Mesh has",nbTypesCell,"Type(s) of Cell"
160 types = mesh.getTypes(MED_CELL)
161 for k in range(nbTypesCell):
163 nbElemType = mesh.getNumberOfElements(MED_CELL,type)
164 print "For the type:",type,"there is(are)",nbElemType,"elemnt(s)"
165 connectivity = mesh.getConnectivity(MED_NODAL,MED_CELL,type)
166 nbNodesPerCell = type%100
167 for j in range(nbElemType):
168 print "Element",(j+1)," ",connectivity[j*nbNodesPerCell:(j+1)*nbNodesPerCell]
171 print "Show the Reverse Nodal Connectivity:"
172 ReverseConnectivity = mesh.getReverseConnectivity(MED_NODAL)
173 ReverseConnectivityIndex = mesh.getReverseConnectivityIndex(MED_NODAL)
175 for j in range(nbNodes):
176 begin = ReverseConnectivityIndex[j]-1
177 end = ReverseConnectivityIndex[j+1]-1
178 print "Node",(j+1),"-->",ReverseConnectivity[begin:end]
181 print "Show the Descending Connectivity:"
182 mesh.calculateConnectivity(MED_DESCENDING,MED_CELL)
183 nbElemts = mesh.getNumberOfElements(MED_CELL,MED_ALL_ELEMENTS)
184 Connectivity = mesh.getConnectivity(MED_DESCENDING,MED_CELL,MED_ALL_ELEMENTS)
185 ConnectivityIndex = mesh.getConnectivityIndex(MED_DESCENDING,MED_CELL)
187 for j in range(nbElemts):
188 begin = ConnectivityIndex[j]-1
189 end = ConnectivityIndex[j+1]-1
190 print "Element",(j+1),"-->",Connectivity[begin:end]
193 for entity in [MED_NODE,MED_CELL,MED_FACE,MED_EDGE]:
194 nbFam = mesh.getNumberOfFamilies(entity)
195 if (entity == MED_NODE) & (nbFam > 0):
196 print "This mesh has",nbFam,"Node Family(ies)"
197 elif (entity == MED_CELL) & (nbFam > 0):
198 print "This mesh has",nbFam,"Cell Family(ies)"
199 elif (entity == MED_FACE) & (nbFam > 0):
200 print "This mesh has",nbFam,"Face Family(ies)"
201 elif (entity == MED_EDGE) & (nbFam > 0):
202 print "This mesh has",nbFam,"Edge Family(ies)"
205 for j in range(nbFam):
207 family = mesh.getFamily(entity,j+1)
208 familyName = family.getName()
209 familyDescription = family.getDescription()
210 familyEntity = family.getEntity()
211 familyBool = family.isOnAllElements()
212 print " -Name:",familyName
213 print " -Description:",familyDescription
214 print " -Entity:",familyEntity
215 familyIdentifier = family.getIdentifier()
216 nbOfAtt = family.getNumberOfAttributes()
217 print " -Identifier:",familyIdentifier
218 print " -Number Of Attributes:",nbOfAtt
219 attributesids = family.getAttributesIdentifiers()
220 attributesvals = family.getAttributesValues()
221 for k in range(nbOfAtt):
222 print " * Attributes:",attributesids[k],":",attributesvals[k],",",family.getAttributeDescription(k+1)
223 nbOfGrp = family.getNumberOfGroups()
224 print " -Number Of Groups:",nbOfGrp
225 for k in range(nbOfGrp):
226 print " * Group:",family.getGroupName(k+1)
227 print " -Entities list:"
229 print " -Is on all entities"
231 nbOfTypes = family.getNumberOfTypes()
232 types = family.getTypes()
233 print " -Number Of Types:",nbOfTypes
234 for k in range(nbOfTypes):
236 nbOfElmtsOfType = family.getNumberOfElements(type)
237 number = family.getNumber(type)
239 print " * Number",number[0:nbOfElmtsOfType]
241 numberFamily = family.getNumber(MED_ALL_ELEMENTS)
242 print " * Getting an Integer Field on the family ",familyName
243 fieldFamilyIntg = FIELDINT(family,spaceDim)
244 fieldFamilyIntg.setIterationNumber(0)
245 fieldFamilyIntg.setOrderNumber(0)
246 fieldFamilyIntg.setTime(0.0)
247 for kcomp in range(spaceDim):
250 fieldCompName = "comp1"
251 fieldCompDesc = "desc1"
252 fieldCompUnit = "unit1"
254 fieldCompName = "comp2"
255 fieldCompDesc = "desc2"
256 fieldCompUnit = "unit2"
258 fieldCompName = "comp2"
259 fieldCompDesc = "desc2"
260 fieldCompUnit = "unit2"
262 fieldFamilyIntg.setComponentName(kcomp1,fieldCompName)
263 fieldFamilyIntg.setComponentDescription(kcomp1,fieldCompDesc)
264 fieldFamilyIntg.setMEDComponentUnit(kcomp1,fieldCompUnit)
265 fieldFamilyName = "Integer Field on "+familyName
266 fieldFamilyIntg.setName(fieldFamilyName)
267 field_name = fieldFamilyIntg.getName()
268 type_field = fieldFamilyIntg.getValueType()
269 nbOfComp = fieldFamilyIntg.getNumberOfComponents()
270 print " The field",field_name,"is with the type",type_field
271 print " It has",nbOfComp,"Component(s)"
272 for kcomp in range(nbOfComp):
274 compName = fieldFamilyIntg.getComponentName(kcomp1)
275 compDesc = fieldFamilyIntg.getComponentDescription(kcomp1)
276 compUnit = fieldFamilyIntg.getMEDComponentUnit(kcomp1)
277 print " * Component:",kcomp1
278 print " Name:",compName
279 print " Description:",compDesc
280 print " Unit:",compUnit
282 nbOf = fieldFamilyIntg.getSupport().getNumberOfElements(MED_ALL_ELEMENTS)
283 print " Values:",nbOf
284 print " Randomly set and get to check ..!"
285 for k in range(nbOf):
287 for kcomp in range(nbOfComp):
288 valueI.append(randint(0,100))
290 # print " Set Entry *",(k+1)," ",valueI[:nbOfComp]
291 valInd = numberFamily[k]
292 fieldFamilyIntg.setRow(valInd,valueI)
293 valueIverif = fieldFamilyIntg.getRow(valInd)
294 print " Set/Get Entry *",(k+1)," ",valueI[:nbOfComp]," / ",valueIverif[:nbOfComp]
295 print " * Getting a Real Field"
296 fieldFamilyDble = FIELDDOUBLE(family,spaceDim)
297 fieldFamilyDble.setIterationNumber(0)
298 fieldFamilyDble.setOrderNumber(0)
299 fieldFamilyDble.setTime(0.0)
300 for kcomp in range(spaceDim):
303 fieldCompName = "comp1"
304 fieldCompDesc = "desc1"
305 fieldCompUnit = "unit1"
307 fieldCompName = "comp2"
308 fieldCompDesc = "desc2"
309 fieldCompUnit = "unit2"
311 fieldCompName = "comp2"
312 fieldCompDesc = "desc2"
313 fieldCompUnit = "unit2"
315 fieldFamilyDble.setComponentName(kcomp1,fieldCompName)
316 fieldFamilyDble.setComponentDescription(kcomp1,fieldCompDesc)
317 fieldFamilyDble.setMEDComponentUnit(kcomp1,fieldCompUnit)
319 fieldFamilyName = "Real Field on "+familyName
320 fieldFamilyDble.setName(fieldFamilyName)
321 field_name = fieldFamilyDble.getName()
322 type_field = fieldFamilyDble.getValueType()
323 nbOfComp = fieldFamilyDble.getNumberOfComponents()
324 print " The field",field_name,"is with the type",type_field
325 print " It has",nbOfComp,"Component(s)"
326 for kcomp in range(nbOfComp):
328 compName = fieldFamilyDble.getComponentName(kcomp1)
329 compDesc = fieldFamilyDble.getComponentDescription(kcomp1)
330 compUnit = fieldFamilyDble.getMEDComponentUnit(kcomp1)
331 print " * Component:",kcomp1
332 print " Name:",compName
333 print " Description:",compDesc
334 print " Unit:",compUnit
336 nbOf = fieldFamilyDble.getSupport().getNumberOfElements(MED_ALL_ELEMENTS)
337 print " Values:",nbOf
338 print " Randomly set and get to check ..!"
339 for k in range(nbOf):
341 for kcomp in range(nbOfComp):
342 valueI.append(random())
344 # print " Set Entry *",(k+1)," ",valueI[:nbOfComp]
345 valInd = numberFamily[k]
346 fieldFamilyDble.setRow(valInd,valueI)
347 valueIverif = fieldFamilyDble.getRow(valInd)
348 print " Set/Get Entry *",(k+1)," ",valueI[:nbOfComp]," / ",valueIverif[:nbOfComp]
349 if (entity != MED_NODE):
351 print "Getting barycenter on this family"
352 barycenterfamily = mesh.getBarycenter(family)
353 if (not familyBool): numberFamily = family.getNumber(MED_ALL_ELEMENTS)
354 nbVal = barycenterfamily.getSupport().getNumberOfElements(MED_ALL_ELEMENTS)
355 nbComp = barycenterfamily.getNumberOfComponents()
356 for j in range(nbVal):
358 if (not familyBool): valInd = numberFamily[j]
359 barycenterfamilyentity = barycenterfamily.getRow(valInd)
360 print " * ",barycenterfamilyentity[:nbComp]
363 print "Building of the support on all Cells of the mesh."
364 supportCell = mesh.getSupportOnAll( MED_CELL )
366 print "Getting barycenter of all Cells of the mesh"
367 barycenter = mesh.getBarycenter(supportCell)
368 for j in range(nbElemts):
369 barycenterCell = barycenter.getRow(j+1)
370 print " * ",barycenterCell[:spaceDim]
372 print "Writing on file the mesh"
373 writeMed21File = medFile[0:(len(medFile)-4)]+"_V21_fields.med"
374 writeMed22File = medFile[0:(len(medFile)-4)]+"_V22_fields.med"
375 fieldsMesh = barycenter.getSupport().getMesh()
376 fieldsMeshName = "Fields Mesh"
377 fieldsMesh.setName(fieldsMeshName)
379 index22Mesh = fieldsMesh.addDriver(MED_DRIVER,writeMed22File,fieldsMeshName)
380 fieldsMesh.write(index22Mesh)
382 AnalyzeField(barycenter)
384 print "Writing on file the cells barycenter field"
386 barycenterName = barycenter.getName()
388 index22FieldBarycenter = barycenter.addDriver(MED_DRIVER,writeMed22File,barycenterName)
389 barycenter.write(index22FieldBarycenter)
393 print "Getting volume of all Cells of the mesh:"
394 volume = mesh.getVolume(supportCell)
396 for j in range(nbElemts):
397 volumeCell = volume.getValueIJ(j+1,1)
398 print " * ",volumeCell
399 voltot = voltot + volumeCell
400 print "Volume of the mesh:",voltot
405 print "Writing on file the cells volume field"
407 volumeName = volume.getName()
409 index22FieldVolume = volume.addDriver(MED_DRIVER,writeMed22File,volumeName)
410 volume.write(index22FieldVolume)
413 print "Building of the support on all Faces of the mesh."
414 supportFace = SUPPORT(mesh,"Support on all faces of the mesh",MED_FACE)
416 nbFace = mesh.getNumberOfElements(MED_FACE,MED_ALL_ELEMENTS)
418 print "Getting normal of each face of this support",nbFace
419 nbTypeFace = mesh.getNumberOfTypes(MED_FACE)
420 TypeFace = mesh.getTypes(MED_FACE)
421 print "nbTypeFace:",nbTypeFace,"----",TypeFace[:nbTypeFace]
422 normal = mesh.getNormal(supportFace)
423 for j in range(nbFace):
424 normalFace = normal.getRow(j+1)
425 value1 = normalFace[0]
426 value2 = normalFace[1]
427 value3 = normalFace[2]
428 norm = (value1*value1 + value2*value2 + value3*value3)**(0.5)
429 print " * ",normalFace[:spaceDim],"norm:",norm
434 print "Writing on file the face normal field"
436 normalName = normal.getName()
438 index22FieldNormal = normal.addDriver(MED_DRIVER,writeMed22File,normalName)
439 normal.write(index22FieldNormal)
442 print "Getting area on all Cells of the mesh:"
443 area = mesh.getArea(supportCell)
445 for j in range(nbElemts):
446 areaCell = area.getValueIJ(j+1,1)
448 areatot = areatot + areaCell
449 print "Area of the mesh:",areatot
454 print "Writing on file the cells area field"
456 areaName = area.getName()
458 index22FieldArea = area.addDriver(MED_DRIVER,writeMed22File,areaName)
459 area.write(index22FieldArea)
462 print "Getting the support on all Edges of the mesh."
463 supportEdge = mesh.getSupportOnAll(MED_EDGE)
464 nbEdge = mesh.getNumberOfElements(MED_EDGE,MED_ALL_ELEMENTS)
466 print "Getting normal of each edge of this support",nbEdge
467 nbTypeEdge = mesh.getNumberOfTypes(MED_EDGE)
468 TypeEdge = mesh.getTypes(MED_EDGE)
469 print "nbTypeEdge:",nbTypeEdge,"----",TypeEdge[:nbTypeEdge]
470 normal = mesh.getNormal(supportEdge)
471 for j in range(nbEdge):
472 normalEdge = normal.getRow(j+1)
473 value1 = normalEdge[0]
474 value2 = normalEdge[1]
475 norm = (value1*value1 + value2*value2)**(0.5)
476 print " * ",normalEdge[:spaceDim],"norm:",norm
481 print "Writing on file the edge normal field"
483 normalName = normal.getName()
485 index22FieldNormal = normal.addDriver(MED_DRIVER,writeMed22File,normalName)
486 normal.write(index22FieldNormal)
489 print "END of the Pyhton script ..... Ctrl D to exit"