Salome HOME
928996345a473bcc756722c691bc91e4467a087a
[tools/medcoupling.git] / src / MEDLoader / Swig / SauvLoaderTest.py
1 #  -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2015  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
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     def testSauv2Med(self):
42         # get a file containing all types of readable piles
43         sauvFile = os.path.join( self.__getResourcesDirectory(),"allPillesTest.sauv")
44         self.assertTrue( os.access( sauvFile, os.F_OK))
45
46         # read SAUV and write MED
47         medFile = "SauvLoaderTest.med"
48         sr=SauvReader(sauvFile);
49         d2=sr.loadInMEDFileDS();
50         d2.write(medFile,0);
51
52         # check
53         self.assertEqual(1,d2.getNumberOfMeshes())
54         self.assertEqual(8+97,d2.getNumberOfFields())
55         mm = d2.getMeshes()
56         m = mm.getMeshAtPos(0)
57         self.assertEqual(17,len(m.getGroupsNames()))
58
59         os.remove( medFile )
60         pass
61
62     def testMed2Sauv(self):
63         # read pointe.med
64         medFile = os.path.join(self.__getResourcesDirectory(),"pointe.med")
65         self.assertTrue( os.access( medFile, os.F_OK))
66         pointeMed = MEDFileData.New( medFile )
67
68         # add 3 faces to pointeMed
69         pointeMedMesh = pointeMed.getMeshes().getMeshAtPos(0)
70         pointeM1D = MEDCouplingUMesh.New()
71         pointeM1D.setCoords( pointeMedMesh.getCoords() )
72         pointeM1D.setMeshDimension( 2 )
73         pointeM1D.allocateCells( 3 )
74         pointeM1D.insertNextCell( NORM_TRI3, 3, [0,1,2])
75         pointeM1D.insertNextCell( NORM_TRI3, 3, [0,1,3])
76         pointeM1D.insertNextCell( NORM_QUAD4, 4, [10,11,12,13])
77         pointeM1D.finishInsertingCells()
78         pointeMedMesh.setMeshAtLevel( -1, pointeM1D )
79         pointeMed.getMeshes().setMeshAtPos( 0, pointeMedMesh )
80
81         # add a field on 2 faces to pointeMed
82         ff1=MEDFileFieldMultiTS.New()
83         f1=MEDCouplingFieldDouble.New(ON_GAUSS_NE,ONE_TIME)
84         #f1.setMesh( pointeM1D )
85         f1.setName("Field on 2 faces")
86         d=DataArrayDouble.New()
87         d.alloc(3+4,2)
88         d.setInfoOnComponent(0,"sigX [MPa]")
89         d.setInfoOnComponent(1,"sigY [GPa]")
90         d.setValues([311,312,321,322,331,332,411,412,421,422,431,432,441,442],3+4,2)
91         f1.setArray(d)
92         da=DataArrayInt.New()
93         da.setValues([0,2],2,1)
94         da.setName("sup2")
95         ff1.appendFieldProfile(f1,pointeMedMesh,-1,da)
96         pointeMed.getFields().pushField( ff1 )
97
98         #remove fieldnodeint
99         pointeFields = pointeMed.getFields()
100         for i in range( pointeFields.getNumberOfFields() ):
101             if pointeFields.getFieldAtPos(i).getName() == "fieldnodeint":
102                 pointeFields.destroyFieldAtPos( i )
103                 break
104
105         # write pointeMed to SAUV
106         sauvFile = "SauvLoaderTest.sauv"
107         sw=SauvWriter();
108         sw.setMEDFileDS(pointeMed);
109         sw.write(sauvFile);
110
111         # read SAUV and check
112         sr=SauvReader.New(sauvFile);
113         d2=sr.loadInMEDFileDS();
114         self.assertEqual(1,d2.getNumberOfMeshes())
115         self.assertEqual(4,d2.getNumberOfFields())
116         m = d2.getMeshes().getMeshAtPos(0)
117         self.assertEqual("maa1",m.getName())
118         self.assertEqual(6,len(m.getGroupsNames()))
119         self.assertEqual(3,m.getMeshDimension())
120         groups = m.getGroupsNames()
121         self.assertTrue( "groupe1" in groups )
122         self.assertTrue( "groupe2" in groups )
123         self.assertTrue( "groupe3" in groups )
124         self.assertTrue( "groupe4" in groups )
125         self.assertTrue( "groupe5" in groups )
126         self.assertTrue( "maa1" in groups )
127         self.assertEqual(16,m.getSizeAtLevel(0))
128         um0 = m.getMeshAtLevel(0)
129         self.assertEqual(12, um0.getNumberOfCellsWithType( NORM_TETRA4 ))
130         self.assertEqual(2, um0.getNumberOfCellsWithType( NORM_PYRA5 ))
131         self.assertEqual(2, um0.getNumberOfCellsWithType( NORM_HEXA8 ))
132         um1 = m.getMeshAtLevel(-1)
133         self.assertEqual(2, um1.getNumberOfCellsWithType( NORM_TRI3 ))
134         pointeUM0 = pointeMedMesh.getMeshAtLevel(0)
135         self.assertTrue(m.getCoords().isEqualWithoutConsideringStr(pointeMedMesh.getCoords(),1e-12))
136         self.assertEqual( um0.getMeasureField(0).accumulate(0),
137                           pointeUM0.getMeasureField(0).accumulate(0),1e-12)
138         # check fields
139         # fieldnodedouble
140         fieldnodedoubleTS1 = pointeMed.getFields().getFieldWithName("fieldnodedouble")
141         fieldnodedoubleTS2 = d2.getFields().getFieldWithName("fieldnodedouble")
142         self.assertEqual( fieldnodedoubleTS1.getInfo(), fieldnodedoubleTS2.getInfo())
143         self.assertEqual( fieldnodedoubleTS1.getNumberOfTS(), fieldnodedoubleTS2.getNumberOfTS())
144         io1 = fieldnodedoubleTS1.getIterations()
145         io2 = fieldnodedoubleTS2.getIterations()
146         for i in range(fieldnodedoubleTS1.getNumberOfTS() ):
147             fnd1 = fieldnodedoubleTS1.getFieldOnMeshAtLevel(ON_NODES, io1[i][0],io1[i][1],pointeUM0)
148             fnd2 = fieldnodedoubleTS2.getFieldOnMeshAtLevel(ON_NODES, io2[i][0],io2[i][1],um0)
149             self.assertTrue( fnd1.getArray().isEqual( fnd2.getArray(), 1e-12 ))
150         # fieldcelldoublevector
151         fieldnodedoubleTS1 = pointeMed.getFields().getFieldWithName("fieldcelldoublevector")
152         fieldnodedoubleTS2 = d2.getFields().getFieldWithName("fieldcelldoublevector")
153         self.assertEqual( fieldnodedoubleTS1.getInfo(), fieldnodedoubleTS2.getInfo())
154         self.assertEqual( fieldnodedoubleTS1.getNumberOfTS(), fieldnodedoubleTS2.getNumberOfTS())
155         io1 = fieldnodedoubleTS1.getIterations()
156         io2 = fieldnodedoubleTS2.getIterations()
157         for i in range(fieldnodedoubleTS1.getNumberOfTS() ):
158             fnd1 = fieldnodedoubleTS1.getFieldOnMeshAtLevel(ON_CELLS, io1[i][0],io1[i][1],pointeUM0)
159             fnd2 = fieldnodedoubleTS2.getFieldOnMeshAtLevel(ON_CELLS, io2[i][0],io2[i][1],um0)
160             self.assertAlmostEqual( fnd1.accumulate(0), fnd2.accumulate(0) )
161             self.assertAlmostEqual( fnd1.accumulate(1), fnd2.accumulate(1) )
162             self.assertAlmostEqual( fnd1.accumulate(2), fnd2.accumulate(2) )
163             # Field on 2 faces
164             fieldOnFaces = d2.getFields().getFieldWithName(f1.getName())
165             io1 = fieldOnFaces.getIterations()
166             fof = fieldOnFaces.getFieldOnMeshAtLevel(f1.getTypeOfField(),io1[i][0],io1[i][1],um1)
167             self.assertTrue( d.isEqual( fof.getArray(), 1e-12 ))
168             pass
169         del sr
170         os.remove( sauvFile )
171         pass
172
173     def testSauv2MedWONodeFamilyNum(self):
174         """test for issue 0021673: [CEA 566] Bug in SauvWriter when writing meshes
175         having no family ids on nodes."""
176
177         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)
178         targetConn=[0,3,4,1, 1,4,2, 4,5,2, 6,7,4,3, 7,8,5,4];
179         targetMesh=MEDCouplingUMesh.New("BugInSauvWriter",2);
180         targetMesh.allocateCells(5);
181         targetMesh.insertNextCell(NORM_TRI3,3,targetConn[4:7]);
182         targetMesh.insertNextCell(NORM_TRI3,3,targetConn[7:10]);
183         targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[0:4]);
184         targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[10:14]);
185         targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[14:18]);
186         targetMesh.finishInsertingCells();
187         targetMesh.setCoords(myCoords);
188         #
189         m=MEDFileUMesh.New()
190         m.setMeshAtLevel(0,targetMesh)
191         # start of bug
192         fam=DataArrayInt.New(targetMesh.getNumberOfNodes())
193         fam[:]=0
194         #m.setFamilyFieldArr(1,fam)
195         #end of bug
196
197         ms=MEDFileMeshes.New()
198         ms.setMeshAtPos(0,m)
199         meddata=MEDFileData.New()
200         meddata.setMeshes(ms)
201
202         medFile = "BugInSauvWriter.sauv"
203         sw=SauvWriter.New();
204         sw.setMEDFileDS(meddata);
205         sw.write(medFile);
206
207         os.remove( medFile )
208         pass
209
210     def testSauv2MedOnPipe1D(self):
211         """test for issue 0021745: [CEA 600] Some missing groups in mesh after reading a SAUV file with SauvReader."""
212         sauvFile="Test_sauve_1D.sauv"
213         # Make a sauve file with a qudratic 1D mesh
214         m=MEDCouplingUMesh.New("pipe1D",1)
215         m.allocateCells(2);
216         targetConn=[0,2,1, 2,4,3]
217         m.insertNextCell(NORM_SEG3,3,targetConn[0:3])
218         m.insertNextCell(NORM_SEG3,3,targetConn[3:6])
219         m.finishInsertingCells();
220         # coords
221         coords=[ 0.,1.,2.,4.,5. ];
222         c=DataArrayDouble.New()
223         c.setValues(coords,5,1)
224         m.setCoords(c)
225         # MEDFileUMesh
226         mm=MEDFileUMesh.New()
227         mm.setName(m.getName())
228         mm.setDescription("1D mesh")
229         mm.setCoords(c)
230         mm.setMeshAtLevel(0,m);
231         # MEDFileData
232         mfd1 = MEDFileData.New()
233         ms=MEDFileMeshes.New(); ms.setMeshAtPos(0,mm)
234         mfd1.setMeshes(ms)
235         # write
236         sw=SauvWriter.New()
237         sw.setMEDFileDS(mfd1)
238         sw.write(sauvFile)
239         # Check connectivity read from the sauv file
240         sr = SauvReader.New(sauvFile)
241         mfd2 = sr.loadInMEDFileDS()
242         mfMesh = mfd2.getMeshes()[0]
243         mesh = mfMesh.getMeshAtLevel(0)
244         self.assertTrue(mesh.getNodalConnectivity().isEqual(m.getNodalConnectivity()))
245         #
246         del sr
247         os.remove(sauvFile)
248         pass
249
250     @unittest.skipUnless(HasXDR(),"requires XDR")
251     def testMissingGroups(self):
252         """test for issue 0021749: [CEA 601] Some missing groups in mesh after reading a SAUV file with SauvReader."""
253         sauvFile = os.path.join(self.__getResourcesDirectory(),"BDC-714.sauv")
254         self.assertTrue( os.access( sauvFile, os.F_OK))
255         name_of_group_on_cells='Slice10:ABSORBER'
256         name_of_group_on_cells2='Slice10:00LR'
257         sr=SauvReader.New(sauvFile)
258         mfd2=sr.loadInMEDFileDS()
259         mfMesh=mfd2.getMeshes()[0]
260         #
261         self.assertTrue(name_of_group_on_cells in mfMesh.getGroupsNames())
262         self.assertTrue(name_of_group_on_cells2 in mfMesh.getGroupsNames())
263         self.assertEqual(270,len(mfMesh.getGroupsNames()))
264         #
265         ids1=mfMesh.getGroupArr(0,name_of_group_on_cells)
266         ids2=mfMesh.getGroupArr(0,name_of_group_on_cells2)
267         ids1.setName("")
268         ids2.setName("")
269         self.assertTrue(ids1.isEqual(ids2))
270         pass
271
272     def testGaussPt(self):
273         """issue 22321: [CEA 933] Bug when reading a sauve file containing field on Gauss Pt.
274         The problem was that a field ON_GAUSS_PT was created but no Gauss Localization
275         was defined"""
276
277         # create a MEDFileData with a field ON_GAUSS_PT: 9 Gauss points, on 4 QUAD8 elements
278         f=MEDCouplingFieldDouble(ON_GAUSS_PT)
279         m=MEDCouplingUMesh("mesh",2) ; m.allocateCells()
280         m.insertNextCell(NORM_QUAD8,[0,2,4,6,1,3,5,7])
281         m.insertNextCell(NORM_QUAD8,[2,9,11,4,8,10,12,3])
282         m.insertNextCell(NORM_QUAD8,[6,4,14,16,5,13,15,17])
283         m.insertNextCell(NORM_QUAD8,[4,11,19,14,12,18,20,13])
284         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))
285         f.setMesh(m)
286         arr=DataArrayDouble(4*9*2) ; arr.iota() ; arr.rearrange(2) ; arr.setInfoOnComponents(["YOUN []","NU []"])
287         f.setArray(arr)
288         refCoo=[-1,-1,1,-1,1,1,-1,1,0,-1,1,0,0,1,-1,0]
289         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]
290         wgt=[0.3,0.3,0.3,0.3,0.4,0.4,0.4,0.4,0.7]
291         f.setGaussLocalizationOnType(NORM_QUAD8,refCoo,gpCoo,wgt)
292         f.setName("SIGT")
293         f.checkConsistencyLight()
294         #
295         mm=MEDFileUMesh()
296         mm.setMeshAtLevel(0,m)
297         mfm = MEDFileMeshes()
298         mfm.pushMesh( mm )
299         ff=MEDFileField1TS()
300         ff.setFieldNoProfileSBT(f)
301         mfmts = MEDFileFieldMultiTS()
302         mfmts.pushBackTimeStep(ff)
303         mff = MEDFileFields()
304         mff.pushField( mfmts )
305         mfd = MEDFileData.New()
306         mfd.setFields( mff )
307         mfd.setMeshes( mfm )
308
309         # convert the MED file to a SAUV file
310         sauvFile = "SauvLoaderTest_testGaussPt.sauv"
311         sw=SauvWriter.New();
312         sw.setMEDFileDS(mfd);
313         sw.write(sauvFile);
314
315         # convert the SAUV file back to MED
316         sr=SauvReader.New(sauvFile);
317         d2=sr.loadInMEDFileDS();
318
319         self.assertEqual( 1, d2.getNumberOfFields() )
320         self.assertEqual( 1, d2.getNumberOfMeshes() )
321         mfm2 = d2.getMeshes()[0]
322         mff2 = d2.getFields()[0]
323         m2 = mfm2.getMeshAtLevel(0)
324         f2 = mff2.getTimeStepAtPos(0).getFieldOnMeshAtLevel(f.getTypeOfField(),0,mfm2)
325         f2.setGaussLocalizationOnType(NORM_QUAD8,refCoo,gpCoo,wgt) # not stored in SAUV
326         #f2.setOrder( f.getTime()[2] ) # not stored in SAUV
327         self.assertTrue( m2.isEqual( m, 1e-12 ))
328         self.assertTrue( f2.isEqual( f, 1e-12, 1e-12 ))
329         del sr
330         os.remove( sauvFile )
331         pass
332
333     def testSauvWriterGroupWithOneFamily(self):
334         """
335         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.
336         """
337         import re
338         mfd=MEDLoaderDataForTest.buildAMEDFileDataWithGroupOnOneFamilyForSauv()
339         sauvFile = "mesh.sauv"
340         sw=SauvWriter.New()
341         sw.setMEDFileDS(mfd)
342         self.assertTrue(not sw.getCpyGrpIfOnASingleFamilyStatus())
343         sw.setCpyGrpIfOnASingleFamilyStatus(True)
344         self.assertTrue(sw.getCpyGrpIfOnASingleFamilyStatus())
345         sw.write(sauvFile)
346
347         f = open(sauvFile)
348         # String pattern for the header of the sub meshes record ("PILE" number, number of named objects, number of objects)
349         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]+)')
350         # String pattern for a sub mesh header (cell type, number of components and three numbers)
351         pattern_header=re.compile(r'\s+(?P<type>[0-9]+)\s+(?P<nbsubs>[0-9]+)\s+[0-9]+\s+[0-9]+\s+[0-9]+')
352
353         nbobjects=0
354         line = f.readline()
355         while(line):
356             match_pile = pattern_pile.match(line)
357             if match_pile:
358                 number=int(match_pile.group("number"))
359                 if number == 1:
360                     nbnamed=int(match_pile.group("nbnamed"))
361                     nbobjects=int(match_pile.group("nbobjects"))
362                     break
363                 pass
364             line=f.readline()
365             pass
366
367         # Skipping the objects names
368         f.readline()
369         # Skipping the objects ids
370         f.readline()
371
372         # Looking for each sub-mesh header
373         line = f.readline()
374         cur_object=0
375         while(line and cur_object < nbobjects):
376             match_header=pattern_header.match(line)
377             if match_header:
378                 cell_type=int(match_header.group("type"))
379                 nb_subs=int(match_header.group("nbsubs"))
380                 # Looking for a compound object
381                 if cell_type == 0:
382                     # Testing if there is only one component
383                     self.assertTrue(nb_subs > 1)
384                 else:
385                     f.readline()
386                     f.readline()
387                     cur_object = cur_object + 1
388                     pass
389                 pass
390             line=f.readline()
391             pass
392         f.close()
393         os.remove(sauvFile)
394         pass
395
396     pass
397
398 unittest.main()