Salome HOME
Further fix for CaseReader Py3 ...
[tools/medcoupling.git] / src / MEDLoader / Swig / SauvLoaderTest.py
index 0da6104cdc1b71ccc92654f375fd5aa196709db4..f9454b1b183c3fd765b2805dcdbe4b0db599178d 100644 (file)
@@ -1,10 +1,10 @@
 #  -*- coding: iso-8859-1 -*-
-# Copyright (C) 2007-2013  CEA/DEN, EDF R&D
+# Copyright (C) 2007-2016  CEA/DEN, EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
 # License as published by the Free Software Foundation; either
-# version 2.1 of the License.
+# version 2.1 of the License, or (at your option) any later version.
 #
 # This library is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -25,20 +25,31 @@ from MEDLoaderDataForTest import MEDLoaderDataForTest
 
 class SauvLoaderTest(unittest.TestCase):
 
+    def __getResourcesDirectory(self):
+        med_root_dir = os.getenv("MEDCOUPLING_ROOT_DIR")
+        if med_root_dir:
+            pth = os.path.join( os.getenv("MEDCOUPLING_ROOT_DIR"), "share","resources","med")
+            if os.path.exists(pth):
+              return pth
+        current_dir = os.path.dirname(os.path.realpath(__file__))
+        pth = os.path.join(current_dir, "..", "..", "..", "resources")
+        if not os.path.exists(pth):
+          raise Exception("SauvLoaderTest: Unable to get resource directory")
+        return pth
+        pass
+
     def testSauv2Med(self):
         # get a file containing all types of readable piles
-        self.assertTrue( os.getenv("MED_ROOT_DIR") )
-        sauvFile = os.path.join( os.getenv("MED_ROOT_DIR"), "share","salome",
-                                 "resources","med","allPillesTest.sauv")
+        sauvFile = os.path.join( self.__getResourcesDirectory(),"allPillesTest.sauv")
         self.assertTrue( os.access( sauvFile, os.F_OK))
 
         # read SAUV and write MED
         medFile = "SauvLoaderTest.med"
-        sr=SauvReader.New(sauvFile);
+        sr=SauvReader(sauvFile);
         d2=sr.loadInMEDFileDS();
         d2.write(medFile,0);
 
-        # check 
+        # check
         self.assertEqual(1,d2.getNumberOfMeshes())
         self.assertEqual(8+97,d2.getNumberOfFields())
         mm = d2.getMeshes()
@@ -50,9 +61,7 @@ class SauvLoaderTest(unittest.TestCase):
 
     def testMed2Sauv(self):
         # read pointe.med
-        self.assertTrue( os.getenv("MED_ROOT_DIR") )
-        medFile = os.path.join( os.getenv("MED_ROOT_DIR"), "share","salome",
-                                "resources","med","pointe.med")
+        medFile = os.path.join(self.__getResourcesDirectory(),"pointe.med")
         self.assertTrue( os.access( medFile, os.F_OK))
         pointeMed = MEDFileData.New( medFile )
 
@@ -88,14 +97,14 @@ class SauvLoaderTest(unittest.TestCase):
 
         #remove fieldnodeint
         pointeFields = pointeMed.getFields()
-        for i in range( pointeFields.getNumberOfFields() ):
+        for i in range(pointeFields.getNumberOfFields()):
             if pointeFields.getFieldAtPos(i).getName() == "fieldnodeint":
                 pointeFields.destroyFieldAtPos( i )
                 break
 
         # write pointeMed to SAUV
         sauvFile = "SauvLoaderTest.sauv"
-        sw=SauvWriter.New();
+        sw=SauvWriter();
         sw.setMEDFileDS(pointeMed);
         sw.write(sauvFile);
 
@@ -116,16 +125,17 @@ class SauvLoaderTest(unittest.TestCase):
         self.assertTrue( "groupe5" in groups )
         self.assertTrue( "maa1" in groups )
         self.assertEqual(16,m.getSizeAtLevel(0))
-        um0 = m.getGenMeshAtLevel(0)
+        um0 = m.getMeshAtLevel(0)
         self.assertEqual(12, um0.getNumberOfCellsWithType( NORM_TETRA4 ))
         self.assertEqual(2, um0.getNumberOfCellsWithType( NORM_PYRA5 ))
         self.assertEqual(2, um0.getNumberOfCellsWithType( NORM_HEXA8 ))
-        um1 = m.getGenMeshAtLevel(-1)
-        self.assertEqual(2, um1.getNumberOfCellsWithType( NORM_TRI3 ))
-        pointeUM0 = pointeMedMesh.getGenMeshAtLevel(0)
+        um1 = m.getMeshAtLevel(-1)
+        #self.assertEqual(2, um1.getNumberOfCellsWithType( NORM_TRI3 ))
+        self.assertEqual(1, um1.getNumberOfCellsWithType( NORM_TRI3 ))
+        pointeUM0 = pointeMedMesh.getMeshAtLevel(0)
         self.assertTrue(m.getCoords().isEqualWithoutConsideringStr(pointeMedMesh.getCoords(),1e-12))
-        self.assertEqual( um0.getMeasureField(0).accumulate(0),
-                          pointeUM0.getMeasureField(0).accumulate(0),1e-12)
+        self.assertEqual( um0.getMeasureField(False).accumulate(0),
+                          pointeUM0.getMeasureField(False).accumulate(0),1e-12)
         # check fields
         # fieldnodedouble
         fieldnodedoubleTS1 = pointeMed.getFields().getFieldWithName("fieldnodedouble")
@@ -134,7 +144,7 @@ class SauvLoaderTest(unittest.TestCase):
         self.assertEqual( fieldnodedoubleTS1.getNumberOfTS(), fieldnodedoubleTS2.getNumberOfTS())
         io1 = fieldnodedoubleTS1.getIterations()
         io2 = fieldnodedoubleTS2.getIterations()
-        for i in range(fieldnodedoubleTS1.getNumberOfTS() ):
+        for i in range(fieldnodedoubleTS1.getNumberOfTS()):
             fnd1 = fieldnodedoubleTS1.getFieldOnMeshAtLevel(ON_NODES, io1[i][0],io1[i][1],pointeUM0)
             fnd2 = fieldnodedoubleTS2.getFieldOnMeshAtLevel(ON_NODES, io2[i][0],io2[i][1],um0)
             self.assertTrue( fnd1.getArray().isEqual( fnd2.getArray(), 1e-12 ))
@@ -145,7 +155,7 @@ class SauvLoaderTest(unittest.TestCase):
         self.assertEqual( fieldnodedoubleTS1.getNumberOfTS(), fieldnodedoubleTS2.getNumberOfTS())
         io1 = fieldnodedoubleTS1.getIterations()
         io2 = fieldnodedoubleTS2.getIterations()
-        for i in range(fieldnodedoubleTS1.getNumberOfTS() ):
+        for i in range(fieldnodedoubleTS1.getNumberOfTS()):
             fnd1 = fieldnodedoubleTS1.getFieldOnMeshAtLevel(ON_CELLS, io1[i][0],io1[i][1],pointeUM0)
             fnd2 = fieldnodedoubleTS2.getFieldOnMeshAtLevel(ON_CELLS, io2[i][0],io2[i][1],um0)
             self.assertAlmostEqual( fnd1.accumulate(0), fnd2.accumulate(0) )
@@ -238,12 +248,62 @@ class SauvLoaderTest(unittest.TestCase):
         os.remove(sauvFile)
         pass
 
-    @unittest.skipUnless(MEDLoader.HasXDR(),"requires XDR")
+    def testSauvReaderOnBigMesh(self):
+        # create a box with 1 million cells
+        mesh_dim = 3
+        nb_segs = [100, 100, 100]
+        box_sizes = [1., 1., 1.]
+        compo_names = ["x", "y", "z"]
+        box_steps = [box_sizes[i]/nb_segs[i] for i in range(mesh_dim)]
+        mesh = MEDCouplingCMesh.New("Mesh_box")
+
+        # axes coords
+        axes_arrays = []
+        for i in range(mesh_dim):
+          axe_coords = [j*box_steps[i] for j in range(nb_segs[i]+1)]
+
+          axe_arr = DataArrayDouble.New(axe_coords)
+          axe_arr.setInfoOnComponent(0,compo_names[i])
+
+          axes_arrays.append(axe_arr)
+
+        mesh.setCoords(*axes_arrays)
+        umesh = mesh.buildUnstructured()
+
+        m=MEDFileUMesh.New()
+        m.setMeshAtLevel(0,umesh)
+
+        # MED file data
+        ms=MEDFileMeshes.New()
+        ms.setMeshAtPos(0,m)
+        meddata=MEDFileData.New()
+        meddata.setMeshes(ms)
+
+        # write to SAUV
+        sauvFile = "box.sauv"
+        sw=SauvWriter();
+        sw.setMEDFileDS(meddata);
+        sw.write(sauvFile);
+
+        # read SAUV
+        sr=SauvReader(sauvFile);
+        d2=sr.loadInMEDFileDS();
+        mm = d2.getMeshes()
+        m = mm.getMeshAtPos(0)
+
+        # check
+        coords = m.getCoords()
+        nb_coords_values = coords.getNbOfElems()
+        nb_coords_values_expected = mesh_dim*((nb_segs[0]+1)*(nb_segs[1]+1)*(nb_segs[2]+1))
+        self.assertEqual(nb_coords_values, nb_coords_values_expected)
+
+        os.remove( sauvFile )
+        pass
+
+    @unittest.skipUnless(HasXDR(),"requires XDR")
     def testMissingGroups(self):
         """test for issue 0021749: [CEA 601] Some missing groups in mesh after reading a SAUV file with SauvReader."""
-        self.assertTrue( os.getenv("MED_ROOT_DIR") )
-        sauvFile = os.path.join( os.getenv("MED_ROOT_DIR"), "share","salome",
-                                 "resources","med","BDC-714.sauv")
+        sauvFile = os.path.join(self.__getResourcesDirectory(),"BDC-714.sauv")
         self.assertTrue( os.access( sauvFile, os.F_OK))
         name_of_group_on_cells='Slice10:ABSORBER'
         name_of_group_on_cells2='Slice10:00LR'
@@ -283,7 +343,7 @@ class SauvLoaderTest(unittest.TestCase):
         wgt=[0.3,0.3,0.3,0.3,0.4,0.4,0.4,0.4,0.7]
         f.setGaussLocalizationOnType(NORM_QUAD8,refCoo,gpCoo,wgt)
         f.setName("SIGT")
-        f.checkCoherency()
+        f.checkConsistencyLight()
         #
         mm=MEDFileUMesh()
         mm.setMeshAtLevel(0,m)
@@ -321,9 +381,71 @@ class SauvLoaderTest(unittest.TestCase):
         self.assertTrue( f2.isEqual( f, 1e-12, 1e-12 ))
         del sr
         os.remove( sauvFile )
+        pass
 
+    def testSauvWriterGroupWithOneFamily(self):
+        """
+        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.
+        """
+        import re
+        mfd=MEDLoaderDataForTest.buildAMEDFileDataWithGroupOnOneFamilyForSauv()
+        sauvFile = "mesh.sauv"
+        sw=SauvWriter.New()
+        sw.setMEDFileDS(mfd)
+        self.assertTrue(not sw.getCpyGrpIfOnASingleFamilyStatus())
+        sw.setCpyGrpIfOnASingleFamilyStatus(True)
+        self.assertTrue(sw.getCpyGrpIfOnASingleFamilyStatus())
+        sw.write(sauvFile)
+
+        f = open(sauvFile)
+        # String pattern for the header of the sub meshes record ("PILE" number, number of named objects, number of objects)
+        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]+)')
+        # String pattern for a sub mesh header (cell type, number of components and three numbers)
+        pattern_header=re.compile(r'\s+(?P<type>[0-9]+)\s+(?P<nbsubs>[0-9]+)\s+[0-9]+\s+[0-9]+\s+[0-9]+')
+
+        nbobjects=0
+        line = f.readline()
+        while(line):
+            match_pile = pattern_pile.match(line)
+            if match_pile:
+                number=int(match_pile.group("number"))
+                if number == 1:
+                    nbnamed=int(match_pile.group("nbnamed"))
+                    nbobjects=int(match_pile.group("nbobjects"))
+                    break
+                pass
+            line=f.readline()
+            pass
 
+        # Skipping the objects names
+        f.readline()
+        # Skipping the objects ids
+        f.readline()
+
+        # Looking for each sub-mesh header
+        line = f.readline()
+        cur_object=0
+        while(line and cur_object < nbobjects):
+            match_header=pattern_header.match(line)
+            if match_header:
+                cell_type=int(match_header.group("type"))
+                nb_subs=int(match_header.group("nbsubs"))
+                # Looking for a compound object
+                if cell_type == 0:
+                    # Testing if there is only one component
+                    self.assertTrue(nb_subs > 1)
+                else:
+                    f.readline()
+                    f.readline()
+                    cur_object = cur_object + 1
+                    pass
+                pass
+            line=f.readline()
+            pass
+        f.close()
+        os.remove(sauvFile)
         pass
+
     pass
 
 unittest.main()