Salome HOME
Copyright update 2021
[tools/medcoupling.git] / src / MEDLoader / Swig / SauvLoaderTest.py
1 #  -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2021  CEA/DEN, EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20 # Author : Edward AGAPOV (eap)
21
22 from MEDLoader import *
23 import unittest, os
24 from MEDLoaderDataForTest import MEDLoaderDataForTest,WriteInTmpDir
25
26 class SauvLoaderTest(unittest.TestCase):
27
28     def __getResourcesDirectory(self):
29         med_root_dir = os.getenv("MEDCOUPLING_ROOT_DIR")
30         if med_root_dir:
31             pth = os.path.join( os.getenv("MEDCOUPLING_ROOT_DIR"), "share","resources","med")
32             if os.path.exists(pth):
33               return pth
34         current_dir = os.path.dirname(os.path.realpath(__file__))
35         pth = os.path.join(current_dir, "..", "..", "..", "resources")
36         if not os.path.exists(pth):
37           raise Exception("SauvLoaderTest: Unable to get resource directory")
38         return pth
39         pass
40     
41     @WriteInTmpDir
42     def testSauv2Med(self):
43         # get a file containing all types of readable piles
44         sauvFile = os.path.join( self.__getResourcesDirectory(),"allPillesTest.sauv")
45         self.assertTrue( os.access( sauvFile, os.F_OK))
46
47         # read SAUV and write MED
48         medFile = "SauvLoaderTest.med"
49         sr=SauvReader(sauvFile);
50         d2=sr.loadInMEDFileDS();
51         d2.write(medFile,0);
52
53         # check
54         self.assertEqual(1,d2.getNumberOfMeshes())
55         self.assertEqual(8+97,d2.getNumberOfFields())
56         mm = d2.getMeshes()
57         m = mm.getMeshAtPos(0)
58         self.assertEqual(17,len(m.getGroupsNames()))
59
60         os.remove( medFile )
61         pass
62
63     @WriteInTmpDir
64     def testMed2Sauv(self):
65         # read pointe.med
66         medFile = os.path.join(self.__getResourcesDirectory(),"pointe.med")
67         self.assertTrue( os.access( medFile, os.F_OK))
68         pointeMed = MEDFileData.New( medFile )
69
70         # add 3 faces to pointeMed
71         pointeMedMesh = pointeMed.getMeshes().getMeshAtPos(0)
72         pointeM1D = MEDCouplingUMesh.New()
73         pointeM1D.setCoords( pointeMedMesh.getCoords() )
74         pointeM1D.setMeshDimension( 2 )
75         pointeM1D.allocateCells( 3 )
76         pointeM1D.insertNextCell( NORM_TRI3, 3, [0,1,2])
77         pointeM1D.insertNextCell( NORM_TRI3, 3, [0,1,3])
78         pointeM1D.insertNextCell( NORM_QUAD4, 4, [10,11,12,13])
79         pointeM1D.finishInsertingCells()
80         pointeMedMesh.setMeshAtLevel( -1, pointeM1D )
81         pointeMed.getMeshes().setMeshAtPos( 0, pointeMedMesh )
82
83         # add a field on 2 faces to pointeMed
84         ff1=MEDFileFieldMultiTS.New()
85         f1=MEDCouplingFieldDouble.New(ON_GAUSS_NE,ONE_TIME)
86         #f1.setMesh( pointeM1D )
87         f1.setName("Field on 2 faces")
88         d=DataArrayDouble.New()
89         d.alloc(3+4,2)
90         d.setInfoOnComponent(0,"sigX [MPa]")
91         d.setInfoOnComponent(1,"sigY [GPa]")
92         d.setValues([311,312,321,322,331,332,411,412,421,422,431,432,441,442],3+4,2)
93         f1.setArray(d)
94         da=DataArrayInt.New()
95         da.setValues([0,2],2,1)
96         da.setName("sup2")
97         ff1.appendFieldProfile(f1,pointeMedMesh,-1,da)
98         pointeMed.getFields().pushField( ff1 )
99
100         #remove fieldnodeint
101         pointeFields = pointeMed.getFields()
102         for i in range(pointeFields.getNumberOfFields()):
103             if pointeFields.getFieldAtPos(i).getName() == "fieldnodeint":
104                 pointeFields.destroyFieldAtPos( i )
105                 break
106
107         # write pointeMed to SAUV
108         sauvFile = "SauvLoaderTest.sauv"
109         sw=SauvWriter();
110         sw.setMEDFileDS(pointeMed);
111         sw.write(sauvFile);
112
113         # read SAUV and check
114         sr=SauvReader.New(sauvFile);
115         d2=sr.loadInMEDFileDS();
116         self.assertEqual(1,d2.getNumberOfMeshes())
117         self.assertEqual(4,d2.getNumberOfFields())
118         m = d2.getMeshes().getMeshAtPos(0)
119         self.assertEqual("maa1",m.getName())
120         self.assertEqual(6,len(m.getGroupsNames()))
121         self.assertEqual(3,m.getMeshDimension())
122         groups = m.getGroupsNames()
123         self.assertTrue( "groupe1" in groups )
124         self.assertTrue( "groupe2" in groups )
125         self.assertTrue( "groupe3" in groups )
126         self.assertTrue( "groupe4" in groups )
127         self.assertTrue( "groupe5" in groups )
128         self.assertTrue( "maa1" in groups )
129         self.assertEqual(16,m.getSizeAtLevel(0))
130         um0 = m.getMeshAtLevel(0)
131         self.assertEqual(12, um0.getNumberOfCellsWithType( NORM_TETRA4 ))
132         self.assertEqual(2, um0.getNumberOfCellsWithType( NORM_PYRA5 ))
133         self.assertEqual(2, um0.getNumberOfCellsWithType( NORM_HEXA8 ))
134         um1 = m.getMeshAtLevel(-1)
135         #self.assertEqual(2, um1.getNumberOfCellsWithType( NORM_TRI3 ))
136         self.assertEqual(1, um1.getNumberOfCellsWithType( NORM_TRI3 ))
137         pointeUM0 = pointeMedMesh.getMeshAtLevel(0)
138         self.assertTrue(m.getCoords().isEqualWithoutConsideringStr(pointeMedMesh.getCoords(),1e-12))
139         self.assertEqual( um0.getMeasureField(False).accumulate(0),
140                           pointeUM0.getMeasureField(False).accumulate(0),1e-12)
141         # check fields
142         # fieldnodedouble
143         fieldnodedoubleTS1 = pointeMed.getFields().getFieldWithName("fieldnodedouble")
144         fieldnodedoubleTS2 = d2.getFields().getFieldWithName("fieldnodedouble")
145         self.assertEqual( fieldnodedoubleTS1.getInfo(), fieldnodedoubleTS2.getInfo())
146         self.assertEqual( fieldnodedoubleTS1.getNumberOfTS(), fieldnodedoubleTS2.getNumberOfTS())
147         io1 = fieldnodedoubleTS1.getIterations()
148         io2 = fieldnodedoubleTS2.getIterations()
149         for i in range(fieldnodedoubleTS1.getNumberOfTS()):
150             fnd1 = fieldnodedoubleTS1.getFieldOnMeshAtLevel(ON_NODES, io1[i][0],io1[i][1],pointeUM0)
151             fnd2 = fieldnodedoubleTS2.getFieldOnMeshAtLevel(ON_NODES, io2[i][0],io2[i][1],um0)
152             self.assertTrue( fnd1.getArray().isEqual( fnd2.getArray(), 1e-12 ))
153         # fieldcelldoublevector
154         fieldnodedoubleTS1 = pointeMed.getFields().getFieldWithName("fieldcelldoublevector")
155         fieldnodedoubleTS2 = d2.getFields().getFieldWithName("fieldcelldoublevector")
156         self.assertEqual( fieldnodedoubleTS1.getInfo(), fieldnodedoubleTS2.getInfo())
157         self.assertEqual( fieldnodedoubleTS1.getNumberOfTS(), fieldnodedoubleTS2.getNumberOfTS())
158         io1 = fieldnodedoubleTS1.getIterations()
159         io2 = fieldnodedoubleTS2.getIterations()
160         for i in range(fieldnodedoubleTS1.getNumberOfTS()):
161             fnd1 = fieldnodedoubleTS1.getFieldOnMeshAtLevel(ON_CELLS, io1[i][0],io1[i][1],pointeUM0)
162             fnd2 = fieldnodedoubleTS2.getFieldOnMeshAtLevel(ON_CELLS, io2[i][0],io2[i][1],um0)
163             self.assertAlmostEqual( fnd1.accumulate(0), fnd2.accumulate(0) )
164             self.assertAlmostEqual( fnd1.accumulate(1), fnd2.accumulate(1) )
165             self.assertAlmostEqual( fnd1.accumulate(2), fnd2.accumulate(2) )
166             # Field on 2 faces
167             fieldOnFaces = d2.getFields().getFieldWithName(f1.getName())
168             io1 = fieldOnFaces.getIterations()
169             fof = fieldOnFaces.getFieldOnMeshAtLevel(f1.getTypeOfField(),io1[i][0],io1[i][1],um1)
170             self.assertTrue( d.isEqual( fof.getArray(), 1e-12 ))
171             pass
172         del sr
173         os.remove( sauvFile )
174         pass
175
176     @WriteInTmpDir
177     def testSauv2MedWONodeFamilyNum(self):
178         """test for issue 0021673: [CEA 566] Bug in SauvWriter when writing meshes
179         having no family ids on nodes."""
180
181         myCoords=DataArrayDouble.New([-0.3,-0.3, 0.2,-0.3, 0.7,-0.3, -0.3,0.2, 0.2,0.2, 0.7,0.2, -0.3,0.7, 0.2,0.7, 0.7,0.7 ],9,2)
182         targetConn=[0,3,4,1, 1,4,2, 4,5,2, 6,7,4,3, 7,8,5,4];
183         targetMesh=MEDCouplingUMesh.New("BugInSauvWriter",2);
184         targetMesh.allocateCells(5);
185         targetMesh.insertNextCell(NORM_TRI3,3,targetConn[4:7]);
186         targetMesh.insertNextCell(NORM_TRI3,3,targetConn[7:10]);
187         targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[0:4]);
188         targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[10:14]);
189         targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[14:18]);
190         targetMesh.finishInsertingCells();
191         targetMesh.setCoords(myCoords);
192         #
193         m=MEDFileUMesh.New()
194         m.setMeshAtLevel(0,targetMesh)
195         # start of bug
196         fam=DataArrayInt.New(targetMesh.getNumberOfNodes())
197         fam[:]=0
198         #m.setFamilyFieldArr(1,fam)
199         #end of bug
200
201         ms=MEDFileMeshes.New()
202         ms.setMeshAtPos(0,m)
203         meddata=MEDFileData.New()
204         meddata.setMeshes(ms)
205
206         medFile = "BugInSauvWriter.sauv"
207         sw=SauvWriter.New();
208         sw.setMEDFileDS(meddata);
209         sw.write(medFile);
210
211         os.remove( medFile )
212         pass
213
214     @WriteInTmpDir
215     def testSauv2MedOnPipe1D(self):
216         """test for issue 0021745: [CEA 600] Some missing groups in mesh after reading a SAUV file with SauvReader."""
217         sauvFile="Test_sauve_1D.sauv"
218         # Make a sauve file with a qudratic 1D mesh
219         m=MEDCouplingUMesh.New("pipe1D",1)
220         m.allocateCells(2);
221         targetConn=[0,2,1, 2,4,3]
222         m.insertNextCell(NORM_SEG3,3,targetConn[0:3])
223         m.insertNextCell(NORM_SEG3,3,targetConn[3:6])
224         m.finishInsertingCells();
225         # coords
226         coords=[ 0.,1.,2.,4.,5. ];
227         c=DataArrayDouble.New()
228         c.setValues(coords,5,1)
229         m.setCoords(c)
230         # MEDFileUMesh
231         mm=MEDFileUMesh.New()
232         mm.setName(m.getName())
233         mm.setDescription("1D mesh")
234         mm.setCoords(c)
235         mm.setMeshAtLevel(0,m);
236         # MEDFileData
237         mfd1 = MEDFileData.New()
238         ms=MEDFileMeshes.New(); ms.setMeshAtPos(0,mm)
239         mfd1.setMeshes(ms)
240         # write
241         sw=SauvWriter.New()
242         sw.setMEDFileDS(mfd1)
243         sw.write(sauvFile)
244         # Check connectivity read from the sauv file
245         sr = SauvReader.New(sauvFile)
246         mfd2 = sr.loadInMEDFileDS()
247         mfMesh = mfd2.getMeshes()[0]
248         mesh = mfMesh.getMeshAtLevel(0)
249         self.assertTrue(mesh.getNodalConnectivity().isEqual(m.getNodalConnectivity()))
250         #
251         del sr
252         os.remove(sauvFile)
253         pass
254
255     @WriteInTmpDir
256     def testSauvReaderOnBigMesh(self):
257         # create a box with 1 million cells
258         mesh_dim = 3
259         nb_segs = [100, 100, 100]
260         box_sizes = [1., 1., 1.]
261         compo_names = ["x", "y", "z"]
262         box_steps = [box_sizes[i]/nb_segs[i] for i in range(mesh_dim)]
263         mesh = MEDCouplingCMesh.New("Mesh_box")
264
265         # axes coords
266         axes_arrays = []
267         for i in range(mesh_dim):
268           axe_coords = [j*box_steps[i] for j in range(nb_segs[i]+1)]
269
270           axe_arr = DataArrayDouble.New(axe_coords)
271           axe_arr.setInfoOnComponent(0,compo_names[i])
272
273           axes_arrays.append(axe_arr)
274
275         mesh.setCoords(*axes_arrays)
276         umesh = mesh.buildUnstructured()
277
278         m=MEDFileUMesh.New()
279         m.setMeshAtLevel(0,umesh)
280
281         # MED file data
282         ms=MEDFileMeshes.New()
283         ms.setMeshAtPos(0,m)
284         meddata=MEDFileData.New()
285         meddata.setMeshes(ms)
286
287         # write to SAUV
288         sauvFile = "box.sauv"
289         sw=SauvWriter();
290         sw.setMEDFileDS(meddata);
291         sw.write(sauvFile);
292
293         # read SAUV
294         sr=SauvReader(sauvFile);
295         d2=sr.loadInMEDFileDS();
296         mm = d2.getMeshes()
297         m = mm.getMeshAtPos(0)
298
299         # check
300         coords = m.getCoords()
301         nb_coords_values = coords.getNbOfElems()
302         nb_coords_values_expected = mesh_dim*((nb_segs[0]+1)*(nb_segs[1]+1)*(nb_segs[2]+1))
303         self.assertEqual(nb_coords_values, nb_coords_values_expected)
304
305         os.remove( sauvFile )
306         pass
307
308     @unittest.skipUnless(HasXDR(),"requires XDR")
309     @WriteInTmpDir
310     def testMissingGroups(self):
311         """test for issue 0021749: [CEA 601] Some missing groups in mesh after reading a SAUV file with SauvReader."""
312         sauvFile = os.path.join(self.__getResourcesDirectory(),"BDC-714.sauv")
313         self.assertTrue( os.access( sauvFile, os.F_OK))
314         name_of_group_on_cells='Slice10:ABSORBER'
315         name_of_group_on_cells2='Slice10:00LR'
316         sr=SauvReader.New(sauvFile)
317         mfd2=sr.loadInMEDFileDS()
318         mfMesh=mfd2.getMeshes()[0]
319         #
320         self.assertTrue(name_of_group_on_cells in mfMesh.getGroupsNames())
321         self.assertTrue(name_of_group_on_cells2 in mfMesh.getGroupsNames())
322         self.assertEqual(270,len(mfMesh.getGroupsNames()))
323         #
324         ids1=mfMesh.getGroupArr(0,name_of_group_on_cells)
325         ids2=mfMesh.getGroupArr(0,name_of_group_on_cells2)
326         ids1.setName("")
327         ids2.setName("")
328         self.assertTrue(ids1.isEqual(ids2))
329         pass
330
331     @unittest.skipUnless(HasXDR(),"requires XDR")
332     @WriteInTmpDir
333     def testReadSauvXDRCastem17(self):
334         """test reading Castem17 XDR sauv with 'ENREGISTREMENT DE TYPE 8'"""
335         sauvFile = os.path.join(self.__getResourcesDirectory(),"castem17_result_xdr.sauv")
336         self.assertTrue( os.access( sauvFile, os.F_OK))
337         sr=SauvReader.New(sauvFile)
338         mfd2=sr.loadInMEDFileDS()
339         mfMesh=mfd2.getMeshes()[0]
340         umesh0 = mfMesh.getMeshAtLevel(0)
341         #
342         self.assertEqual(2,umesh0.getNumberOfCellsWithType( NORM_HEXA8 ))
343         self.assertEqual(12,umesh0.getNumberOfNodes())
344         #
345         mfField=mfd2.getFields().getFieldWithName("TEMP1")
346         iterations = mfField.getIterations()
347         field0 = mfField.getFieldOnMeshAtLevel(ON_NODES, iterations[0][0],iterations[0][1],umesh0)
348         fieldArray = field0.getArray()
349         expectedValues = [238.46153846153845]*4 + [169.23076923076923]*4 + [100]*4
350         expectedArray = DataArrayDouble(expectedValues)
351         self.assertTrue( fieldArray.isEqualWithoutConsideringStr( expectedArray, 1e-12 ))
352         pass
353
354     @WriteInTmpDir
355     def testReadSauvAsciiCastem17(self):
356         """test reading Castem17 ascii sauv with 'ENREGISTREMENT DE TYPE 8'"""
357         sauvFile = os.path.join(self.__getResourcesDirectory(),"castem17_result_ascii.sauv")
358         self.assertTrue( os.access( sauvFile, os.F_OK))
359         sr=SauvReader.New(sauvFile)
360         mfd2=sr.loadInMEDFileDS()
361         mfMesh=mfd2.getMeshes()[0]
362         umesh0 = mfMesh.getMeshAtLevel(0)
363         #
364         self.assertEqual(2,umesh0.getNumberOfCellsWithType( NORM_HEXA8 ))
365         self.assertEqual(12,umesh0.getNumberOfNodes())
366         #
367         mfField=mfd2.getFields().getFieldWithName("TEMP1")
368         iterations = mfField.getIterations()
369         field0 = mfField.getFieldOnMeshAtLevel(ON_NODES, iterations[0][0],iterations[0][1],umesh0)
370         fieldArray = field0.getArray()
371         expectedValues = [238.46153846153845]*4 + [169.23076923076923]*4 + [100]*4
372         expectedArray = DataArrayDouble(expectedValues)
373         self.assertTrue( fieldArray.isEqualWithoutConsideringStr( expectedArray, 1e-12 ))
374         pass
375
376     @WriteInTmpDir
377     def testGaussPt(self):
378         """issue 22321: [CEA 933] Bug when reading a sauve file containing field on Gauss Pt.
379         The problem was that a field ON_GAUSS_PT was created but no Gauss Localization
380         was defined"""
381
382         # create a MEDFileData with a field ON_GAUSS_PT: 9 Gauss points, on 4 QUAD8 elements
383         f=MEDCouplingFieldDouble(ON_GAUSS_PT)
384         m=MEDCouplingUMesh("mesh",2) ; m.allocateCells()
385         m.insertNextCell(NORM_QUAD8,[0,2,4,6,1,3,5,7])
386         m.insertNextCell(NORM_QUAD8,[2,9,11,4,8,10,12,3])
387         m.insertNextCell(NORM_QUAD8,[6,4,14,16,5,13,15,17])
388         m.insertNextCell(NORM_QUAD8,[4,11,19,14,12,18,20,13])
389         m.setCoords(DataArrayDouble([(0,0),(0,0.25),(0,0.5),(0.25,0.5),(0.5,0.5),(0.5,0.25),(0.5,0),(0.25,0),(0,0.75),(0,1),(0.25,1),(0.5,1),(0.5,0.75),(0.75,0.5),(1,0.5),(1,0.25),(1,0),(0.75,0),(0.75,1),(1,1),(1,0.75)],21,2))
390         f.setMesh(m)
391         arr=DataArrayDouble(4*9*2) ; arr.iota() ; arr.rearrange(2) ; arr.setInfoOnComponents(["YOUN []","NU []"])
392         f.setArray(arr)
393         refCoo=[-1,-1,1,-1,1,1,-1,1,0,-1,1,0,0,1,-1,0]
394         gpCoo=[-0.7,-0.7,0.7,-0.7,0.7,0.7,-0.7,0.7,0,-0.7,0.7,0,0,0.7,-0.7,0,0,0]
395         wgt=[0.3,0.3,0.3,0.3,0.4,0.4,0.4,0.4,0.7]
396         f.setGaussLocalizationOnType(NORM_QUAD8,refCoo,gpCoo,wgt)
397         f.setName("SIGT")
398         f.checkConsistencyLight()
399         #
400         mm=MEDFileUMesh()
401         mm.setMeshAtLevel(0,m)
402         mfm = MEDFileMeshes()
403         mfm.pushMesh( mm )
404         ff=MEDFileField1TS()
405         ff.setFieldNoProfileSBT(f)
406         mfmts = MEDFileFieldMultiTS()
407         mfmts.pushBackTimeStep(ff)
408         mff = MEDFileFields()
409         mff.pushField( mfmts )
410         mfd = MEDFileData.New()
411         mfd.setFields( mff )
412         mfd.setMeshes( mfm )
413
414         # convert the MED file to a SAUV file
415         sauvFile = "SauvLoaderTest_testGaussPt.sauv"
416         sw=SauvWriter.New();
417         sw.setMEDFileDS(mfd);
418         sw.write(sauvFile);
419
420         # convert the SAUV file back to MED
421         sr=SauvReader.New(sauvFile);
422         d2=sr.loadInMEDFileDS();
423
424         self.assertEqual( 1, d2.getNumberOfFields() )
425         self.assertEqual( 1, d2.getNumberOfMeshes() )
426         mfm2 = d2.getMeshes()[0]
427         mff2 = d2.getFields()[0]
428         m2 = mfm2.getMeshAtLevel(0)
429         f2 = mff2.getTimeStepAtPos(0).getFieldOnMeshAtLevel(f.getTypeOfField(),0,mfm2)
430         f2.setGaussLocalizationOnType(NORM_QUAD8,refCoo,gpCoo,wgt) # not stored in SAUV
431         #f2.setOrder( f.getTime()[2] ) # not stored in SAUV
432         self.assertTrue( m2.isEqual( m, 1e-12 ))
433         self.assertTrue( f2.isEqual( f, 1e-12, 1e-12 ))
434         del sr
435         os.remove( sauvFile )
436         pass
437
438     @WriteInTmpDir
439     def testSauvWriterGroupWithOneFamily(self):
440         """
441         This test checks an option for sauv writing. It is requested here to copy a group from a family if a group is lying on a single family.
442         """
443         import re
444         mfd=MEDLoaderDataForTest.buildAMEDFileDataWithGroupOnOneFamilyForSauv()
445         sauvFile = "mesh.sauv"
446         sw=SauvWriter.New()
447         sw.setMEDFileDS(mfd)
448         self.assertTrue(not sw.getCpyGrpIfOnASingleFamilyStatus())
449         sw.setCpyGrpIfOnASingleFamilyStatus(True)
450         self.assertTrue(sw.getCpyGrpIfOnASingleFamilyStatus())
451         sw.write(sauvFile)
452
453         f = open(sauvFile)
454         # String pattern for the header of the sub meshes record ("PILE" number, number of named objects, number of objects)
455         pattern_pile= re.compile(r'\sPILE\sNUMERO\s+(?P<number>[0-9]+)NBRE\sOBJETS\sNOMMES\s+(?P<nbnamed>[0-9]+)NBRE\sOBJETS\s+(?P<nbobjects>[0-9]+)')
456         # String pattern for a sub mesh header (cell type, number of components and three numbers)
457         pattern_header=re.compile(r'\s+(?P<type>[0-9]+)\s+(?P<nbsubs>[0-9]+)\s+[0-9]+\s+[0-9]+\s+[0-9]+')
458
459         nbobjects=0
460         line = f.readline()
461         while(line):
462             match_pile = pattern_pile.match(line)
463             if match_pile:
464                 number=int(match_pile.group("number"))
465                 if number == 1:
466                     nbnamed=int(match_pile.group("nbnamed"))
467                     nbobjects=int(match_pile.group("nbobjects"))
468                     break
469                 pass
470             line=f.readline()
471             pass
472
473         # Skipping the objects names
474         f.readline()
475         # Skipping the objects ids
476         f.readline()
477
478         # Looking for each sub-mesh header
479         line = f.readline()
480         cur_object=0
481         while(line and cur_object < nbobjects):
482             match_header=pattern_header.match(line)
483             if match_header:
484                 cell_type=int(match_header.group("type"))
485                 nb_subs=int(match_header.group("nbsubs"))
486                 # Looking for a compound object
487                 if cell_type == 0:
488                     # Testing if there is only one component
489                     self.assertTrue(nb_subs > 1)
490                 else:
491                     f.readline()
492                     f.readline()
493                     cur_object = cur_object + 1
494                     pass
495                 pass
496             line=f.readline()
497             pass
498         f.close()
499         os.remove(sauvFile)
500         pass
501
502     pass
503
504 unittest.main()