Salome HOME
Copyright update 2022
[tools/medcoupling.git] / src / MEDLoader / Swig / MEDLoaderTest3.py
index 4099e19e1c7c6aa281860fe1d5021e5a43878c23..71740199dee19b56cd4ebdc5ee38d4d2e985169c 100644 (file)
@@ -1,5 +1,5 @@
 #  -*- coding: iso-8859-1 -*-
-# Copyright (C) 2007-2019  CEA/DEN, EDF R&D
+# Copyright (C) 2007-2022  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
@@ -288,6 +288,7 @@ class MEDLoaderTest3(unittest.TestCase):
         renumNode=DataArrayInt.New()
         renumNode.setValues([10,11,12,13,14,15,16,17,18],9,1)
         mm.setRenumFieldArr(1,renumNode)
+        mm.computeRevNum()
         mm.setMeshAtLevel(-1,m1,True);
         mm.setMeshAtLevel(0,m,True);
         mm.setMeshAtLevel(-2,m2,True);
@@ -409,7 +410,7 @@ class MEDLoaderTest3(unittest.TestCase):
         m1.setTimeUnit(m.getTimeUnit())
         m1.setDescription(m.getDescription())
         self.assertTrue(m2.isEqual(m1,1e-12));
-        
+
     @WriteInTmpDir
     def testMEDMesh6(self):
         self.internalMEDMesh6()
@@ -686,7 +687,7 @@ class MEDLoaderTest3(unittest.TestCase):
         self.assertEqual([((3, 0), (0, 18)), ((3, 1), (18, 30)), ((3, 2), (30, 36)), ((4, 0), (36, 42)), ((4, 1), (42, 44)), ((6, 0), (44, 53))],infos)
         #
         pass
-    
+
     @WriteInTmpDir
     def testMEDFileData1(self):
         fname="Pyfile29.med"
@@ -744,7 +745,7 @@ class MEDLoaderTest3(unittest.TestCase):
         self.assertEqual([(-1,-1,0.0)],d2.getFields().getFieldWithName("f21").getTimeSteps())
         self.assertEqual([(-1,-1,0.0)],d2.getFields()["f21"].getTimeSteps())
         pass
-    
+
     @WriteInTmpDir
     def testMEDField9(self):
         # first test field profile WR. Full type but with some type missing
@@ -784,7 +785,7 @@ class MEDLoaderTest3(unittest.TestCase):
         self.assertTrue(pfl.isEqualWithoutConsideringStr(da))
         self.assertTrue(vals.isEqual(d,1e-14))
         pass
-    
+
     @WriteInTmpDir
     def testMEDField10(self):
         fname="Pyfile31.med"
@@ -820,7 +821,7 @@ class MEDLoaderTest3(unittest.TestCase):
         self.assertTrue(pfl.isEqualWithoutConsideringStr(da))
         self.assertTrue(vals.isEqual(d,1e-14))
         pass
-    
+
     # idem testMEDField9 method except that here testing profile on nodes and not on cells.
     @WriteInTmpDir
     def testMEDField11(self):
@@ -1127,7 +1128,7 @@ class MEDLoaderTest3(unittest.TestCase):
         g=mm.getGroupArr(0,"g1")
         self.assertTrue(g.isEqual(g1));
         pass
-    
+
     # bug detected by gauthier
     @WriteInTmpDir
     def testMEDLoaderMEDLoaderNSReadFieldDoubleDataInMedFile(self):
@@ -1418,7 +1419,7 @@ class MEDLoaderTest3(unittest.TestCase):
         refValues2=refValues[:] ; refValues2[7:9]=[1.365,1.47]
         valsToTest=mm.getMeshAtLevel(0).getMeasureField(True).getArray() ; delta=(valsToTest-refValues2) ; delta.abs()
         self.assertTrue(delta.getMaxValue()[0]<1e-12)
-        mm.write(fname,2)       
+        mm.write(fname,2)
         pass
 
     @WriteInTmpDir
@@ -1431,9 +1432,9 @@ class MEDLoaderTest3(unittest.TestCase):
         m = m.buildUnstructured(); m.setName("simple")
         m2 = m.buildDescendingConnectivity()[0]
         m2.setName(m.getName())
-            
+
         # A crack in two non connected parts of the mesh:
-        grpSeg = DataArrayInt([3,19]) ; grpSeg.setName("Grp") 
+        grpSeg = DataArrayInt([3,19]) ; grpSeg.setName("Grp")
 
         mm = MEDFileUMesh.New()
         mm.setMeshAtLevel(0,m)
@@ -1462,7 +1463,7 @@ class MEDLoaderTest3(unittest.TestCase):
         refValues2=refValues[:] ; refValues2[0] = 1.265; refValues2[6] = 1.105
         valsToTest=mm.getMeshAtLevel(0).getMeasureField(True).getArray() ;     delta=(valsToTest-refValues2) ; delta.abs()
         self.assertTrue(delta.getMaxValue()[0]<1e-12)
-        mm.write(fname,2)   
+        mm.write(fname,2)
 
     @WriteInTmpDir
     def testBuildInnerBoundaryAlongM1Group4(self):
@@ -1507,7 +1508,6 @@ class MEDLoaderTest3(unittest.TestCase):
         self.assertEqual([9,11],mfu.getGroupArr(-1,"group").getValues())
         self.assertEqual([23,24],mfu.getGroupArr(-1,"group_dup").getValues())
         self.assertEqual([0,1],mfu.getGroupArr(-1,"group2").getValues())
-#         mfu.getMeshAtLevel(0).writeVTK("/tmp/mfu_M0.vtu")
         ref0 =[3, 5, 10, 12, 3, 12, 10, 11, 3, 12, 11, 13]
         ref1 =[3, 2, 6, 7, 3, 2, 7, 3, 3, 1, 5, 6, 3, 1, 6, 2]
         self.assertEqual(ref0,mfu.getMeshAtLevel(0)[[3,10,11]].getNodalConnectivity().getValues())
@@ -1522,15 +1522,15 @@ class MEDLoaderTest3(unittest.TestCase):
     def testBuildInnerBoundary5(self):
         """ Full 3D test with tetras only. In this case a tri from the group is not duplicated because it is made only
         of non duplicated nodes. The tri in question is hence not part of the final new "dup" group. """
-        coo = DataArrayDouble([200.0, 200.0, 0.0, 200.0, 200.0, 200.0, 200.0, 0.0, 200.0, 200.0, 0.0, 0.0, 0.0, 200.0, 0.0, 0.0, 200.0, 200.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
+        coo = DataArrayDouble([200.0, 200.0, 0.0, 200.0, 200.0, 200.0, 200.0, 0.0, 200.0, 200.0, 0.0, 0.0, 0.0, 200.0, 0.0, 0.0, 200.0, 200.0, 0.0, 0.0, 0.0, 0.0, 0.0,
         200.0, 400.0, 200.0, 0.0, 400.0, 200.0, 200.0, 400.0, 0.0, 0.0, 400.0, 0.0, 200.0, 0.0, 100.00000000000016, 200.0, 63.15203310314546, 200.0, 200.0, 134.45205700643342,
-         200.0, 200.0, 200.0, 100.00000000000016, 200.0, 63.15203310314546, 0.0, 200.0, 134.45205700643342, 0.0, 200.0, 0.0, 100.00000000000016, 0.0, 63.15203310314546, 
-         200.0, 0.0, 134.45205700643342, 200.0, 0.0, 200.0, 100.00000000000016, 0.0, 63.15203310314546, 0.0, 0.0, 134.45205700643342, 0.0, 0.0, 200.0, 200.0, 100.02130053568538, 
-         0.0, 200.0, 100.00938163175135, 200.0, 0.0, 100.02130053568538, 0.0, 0.0, 100.00938163175135, 299.3058739933347, 200.0, 200.0, 400.0, 98.68100542924483, 
-         200.0, 302.8923433403344, 0.0, 200.0, 302.8923433403344, 200.0, 0.0, 400.0, 100.00000000000016, 0.0, 302.8923433403344, 0.0, 0.0, 400.0, 200.0, 98.55126825835082, 
+         200.0, 200.0, 200.0, 100.00000000000016, 200.0, 63.15203310314546, 0.0, 200.0, 134.45205700643342, 0.0, 200.0, 0.0, 100.00000000000016, 0.0, 63.15203310314546,
+         200.0, 0.0, 134.45205700643342, 200.0, 0.0, 200.0, 100.00000000000016, 0.0, 63.15203310314546, 0.0, 0.0, 134.45205700643342, 0.0, 0.0, 200.0, 200.0, 100.02130053568538,
+         0.0, 200.0, 100.00938163175135, 200.0, 0.0, 100.02130053568538, 0.0, 0.0, 100.00938163175135, 299.3058739933347, 200.0, 200.0, 400.0, 98.68100542924483,
+         200.0, 302.8923433403344, 0.0, 200.0, 302.8923433403344, 200.0, 0.0, 400.0, 100.00000000000016, 0.0, 302.8923433403344, 0.0, 0.0, 400.0, 200.0, 98.55126825835082,
          400.0, 0.0, 100.02162286181577, 99.31624553977466, 99.99999998882231, 200.0, 99.31624576683302, 100.00000010178034, 0.0, 99.31624560596512, 200.0, 100.0050761312483,
-         99.31624560612883, 0.0, 100.00507613125338, 200.0, 99.99999995813045, 100.00950673487786, 0.0, 99.99999989928207, 100.0041870621175, 301.29063354383015, 
-         100.0000000093269, 0.0, 301.29063360689975, 0.0, 100.00957769061164, 140.52853868782435, 99.99999963972768, 100.00509135751312, 297.87779091770784, 
+         99.31624560612883, 0.0, 100.00507613125338, 200.0, 99.99999995813045, 100.00950673487786, 0.0, 99.99999989928207, 100.0041870621175, 301.29063354383015,
+         100.0000000093269, 0.0, 301.29063360689975, 0.0, 100.00957769061164, 140.52853868782435, 99.99999963972768, 100.00509135751312, 297.87779091770784,
          97.16750463405486, 97.18018457127863], 46, 3)
         c0 = [14, 45, 31, 21, 42, 14, 37, 38, 20, 44, 14, 39, 36, 41, 44, 14, 5, 25, 12, 13, 14, 38, 36, 44, 41, 14, 21, 20, 24, 44, 14, 38, 25, 41, 19, 14, 37, 38, 44, 41, 14, 16, 27,
          39, 41, 14, 21, 45, 26, 40, 14, 39, 37, 44, 41, 14, 14, 15, 24, 44, 14, 25, 38, 41, 13, 14, 27, 18, 6, 22, 14, 38, 36, 41, 13, 14, 44, 14, 15, 36, 14, 44, 23, 39, 26, 14,
@@ -1544,7 +1544,7 @@ class MEDLoaderTest3(unittest.TestCase):
          21, 26, 33, 3, 14, 35, 45, 32, 29, 14, 29, 34, 9, 28, 14, 15, 45, 24, 40, 14, 29, 45, 28, 15, 14, 21, 24, 45, 40, 14, 24, 15, 1, 28, 14, 35, 45, 29, 30, 14, 26, 15,
          30, 2]
         cI0 = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, 140, 145, 150, 155, 160, 165, 170, 175, 180, 185,
-         190, 195, 200, 205, 210, 215, 220, 225, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295, 300, 305, 310, 315, 320, 325, 330, 335, 340, 345, 350, 355, 
+         190, 195, 200, 205, 210, 215, 220, 225, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295, 300, 305, 310, 315, 320, 325, 330, 335, 340, 345, 350, 355,
          360, 365, 370, 375, 380, 385, 390, 395, 400, 405, 410, 415, 420, 425, 430]
         m3 = MEDCouplingUMesh("3D", 3)
         m3.setCoords(coo)
@@ -1579,6 +1579,155 @@ class MEDLoaderTest3(unittest.TestCase):
         m_bis0.checkDeepEquivalOnSameNodesWith(mfu.getMeshAtLevel(-1), 2, 9.9999999)
         pass
 
+    @WriteInTmpDir
+    def testBuildInnerBoundary6(self):
+        """ 3D test where the crack has a funny shape with a singular point (i.e. two faces of the M1 group are only connected by one point, not a full segment)
+        The singular point was wrongly duplicated.
+        """
+        coo = DataArrayDouble([(-1.38778e-17,0.226,0),(-1.38778e-17,-1.38778e-17,0),(0.226,0.226,0),(0.226,-1.38778e-17,0),(0.452,0.226,0),(0.452,-1.38778e-17,0),
+                                (-1.38778e-17,0.452,0),(0.226,0.452,0),(0.452,0.452,0),(-1.38778e-17,0.226,0.25),(0.226,0.226,0.25),(0.226,-1.38778e-17,0.25),(-1.38778e-17,-1.38778e-17,0.25),
+                                (-1.38778e-17,0.226,0.779375),(0.226,0.226,0.779375),(0.226,-1.38778e-17,0.779375),(-1.38778e-17,-1.38778e-17,0.779375),(-1.38778e-17,0.226,1.30875),
+                                (0.226,0.226,1.30875),(0.226,-1.38778e-17,1.30875),(-1.38778e-17,-1.38778e-17,1.30875),(0.452,0.226,0.25),(0.452,-1.38778e-17,0.25),(0.452,0.226,0.779375),
+                                (0.452,-1.38778e-17,0.779375),(0.452,0.226,1.30875),(0.452,-1.38778e-17,1.30875),(-1.38778e-17,0.452,0.25),(0.226,0.452,0.25),(-1.38778e-17,0.452,0.779375),
+                                (0.226,0.452,0.779375),(-1.38778e-17,0.452,1.30875),(0.226,0.452,1.30875),(0.452,0.452,0.25),(0.452,0.452,0.779375),(0.452,0.452,1.30875),(0.146,0.226,0.779375),
+                                (0.146,-1.38778e-17,0.779375),(0.146,0.226,1.30875),(0.146,-1.38778e-17,1.30875),(0.146,0.452,0.779375),(0.146,0.452,1.30875)])
+        c0 = [18, 0, 2, 3, 1, 9, 10, 11, 12, 18, 9, 10, 11, 12, 13, 36, 37, 16, 18, 13, 36, 37, 16, 17, 38, 39, 20, 18, 2, 4, 5, 3, 10, 21, 22, 11, 18, 10, 21, 22, 11, 14, 23, 24, 15,
+              18, 14, 23, 24, 15, 18, 25, 26, 19, 18, 6, 7, 2, 0, 27, 28, 10, 9, 18, 27,
+              28, 10, 9, 29, 40, 36, 13, 18, 29, 40, 36, 13, 31, 41, 38, 17, 18, 7, 8, 4, 2, 28, 33, 21, 10, 18, 28, 33, 21, 10, 30, 34, 23, 14, 18, 30, 34, 23, 14, 32, 35, 25, 18]
+        cI0 = [0, 9, 18, 27, 36, 45, 54, 63, 72, 81, 90, 99, 108]
+        m3 = MEDCouplingUMesh("3D", 3)
+        m3.setCoords(coo)
+        m3.setConnectivity(DataArrayInt(c0), DataArrayInt(cI0))
+        m3.checkConsistency()
+        m2, _, _, _, _ = m3.buildDescendingConnectivity()
+        grpIds = DataArrayInt([7,12,22,27]); grpIds.setName("group")
+        mfu = MEDFileUMesh()
+        mfu.setMeshAtLevel(0, m3)
+        mfu.setMeshAtLevel(-1, m2)
+        mfu.setGroupsAtLevel(-1, [grpIds])
+        nNod = m3.getNumberOfNodes()
+        nodesDup, cells1, cells2 = mfu.buildInnerBoundaryAlongM1Group("group")
+        m3_bis = mfu.getMeshAtLevel(0)
+        m3_bis.checkConsistency()
+        m2_bis = mfu.getMeshAtLevel(-1)
+        m2_bis.checkConsistency()
+        self.assertEqual(nNod+8, mfu.getNumberOfNodes())
+        self.assertEqual(nNod+8, m3_bis.getNumberOfNodes())
+        self.assertEqual(nNod+8, m2_bis.getNumberOfNodes())
+        self.assertEqual([13, 14, 17, 18, 23, 25, 36, 38], nodesDup.getValues())
+        self.assertEqual(m3_bis.getCoords()[nodesDup].getValues(), m3_bis.getCoords()[nNod:].getValues())
+        self.assertEqual(set([1, 2, 4, 5]), set(cells1.getValues()))
+        self.assertEqual(set([7, 8, 10, 11]), set(cells2.getValues()))
+        self.assertEqual([7, 12, 22, 27],mfu.getGroupArr(-1,"group").getValues())
+        self.assertEqual([56, 57, 58, 59],mfu.getGroupArr(-1,"group_dup").getValues())  # here only one cell has been duplicated
+        m_desc, _, _, _, _ = m3_bis.buildDescendingConnectivity()
+        m_desc.checkDeepEquivalOnSameNodesWith(m2_bis, 2, 9.9999)
+        pass
+
+    @WriteInTmpDir
+    def testBuildInnerBoundary7(self):
+        """ 3D test where the crack has another funny shape with another singular point (i.e. two faces of the M1 group are only connected by one point, not a full segment)
+        Once the crack is inserted, the cells on either side of the crack do not necessarily form a connex spread zone. This was not properly handled either. 
+        """
+        m3 = MEDCouplingUMesh('box', 3)
+        coo = DataArrayDouble([(5,17,0),(0,17,0),(0,12,0),(5,12,0),(15,17,0),(15,12,0),(20,12,0),(20,17,0),(20,2,0),(15,2,0),(15,-3,0),(20,-3,0),(5,-3,0),(5,2,0),(0,-3,0),(0,2,0),(5,17,10),(5,17,20),(5,17,30),(5,17,40),(0,17,10),(0,17,20),(0,17,30),(0,17,40),(0,12,10),(0,12,20),(0,12,30),(0,12,40),(5,12,10),(5,12,20),(5,12,30),(5,12,40),(15,17,10),(15,17,20),(15,17,30),(15,17,40),(15,12,10),(15,12,20),(15,12,30),(15,12,40),(20,12,10),(20,12,20),(20,12,30),(20,12,40),(20,17,10),(20,17,20),(20,17,30),(20,17,40),(20,2,10),(20,2,20),(20,2,30),(20,2,40),(15,2,10),(15,2,20),(15,2,30),(15,2,40),(15,-3,10),(15,-3,20),(15,-3,30),(15,-3,40),(20,-3,10),(20,-3,20),(20,-3,30),(20,-3,40),
+                               (5,-3,10),(5,-3,20),(5,-3,30),(5,-3,40),(5,2,10),(5,2,20),(5,2,30),(5,2,40),(0,-3,10),(0,-3,20),(0,-3,30),(0,-3,40),(0,2,10),(0,2,20),(0,2,30),(0,2,40),(20,8,0),(0,8,0),(20,8,10),(20,8,20),(20,8,30),(20,8,40),(15,8,30),(15,8,40),(5,8,30),(5,8,40),(0,8,10),(0,8,20),(0,8,30),(0,8,40)])
+        m3.setCoords(coo)
+        c = DataArrayInt([31, 0, 3, 2, 1, -1, 16, 20, 24, 28, -1, 0, 16, 28, 3, -1, 3, 28, 24, 2, -1, 2, 24, 20, 1, -1, 1, 20, 16, 0, 31, 16, 28, 24, 20, -1, 17, 21, 25, 29, -1, 16, 17, 29, 28, -1, 28, 29, 25, 24, -1, 24, 25, 21, 20, -1, 20, 21, 17, 16, 31, 17, 29, 25, 21, -1, 18, 22, 26, 30, -1, 17, 18, 30, 29, -1, 29, 30, 26, 25, -1, 25, 26, 22, 21, -1, 21, 22, 18, 17, 31, 18, 30, 26, 22, -1, 19, 23, 27, 31, -1, 18, 19, 31, 30, -1, 30, 31, 27, 26, -1, 26, 27, 23, 22, -1, 22, 23, 19, 18, 31, 4, 5, 3, 0, -1, 32, 16, 28, 36, -1, 4, 32, 36, 5, -1, 5, 36, 28, 3, -1, 3, 28, 16, 0, -1, 0, 16, 32, 4, 31, 32, 36, 28, 16, -1, 33, 17, 29, 37, -1, 32, 33, 37,
+                          36, -1, 36, 37, 29, 28, -1, 28, 29, 17, 16, -1, 16, 17, 33, 32, 31, 33, 37, 29, 17, -1, 34, 18, 30, 38, -1, 33, 34, 38, 37, -1, 37, 38, 30, 29, -1, 29, 30, 18, 17, -1, 17, 18, 34, 33, 31, 34, 38, 30, 18, -1, 35, 19, 31, 39, -1, 34, 35, 39, 38, -1, 38, 39, 31, 30, -1, 30, 31, 19, 18, -1, 18, 19, 35, 34, 31, 6, 5, 4, 7, -1, 40, 44, 32, 36, -1, 6, 40, 36, 5, -1, 5, 36, 32, 4, -1, 4, 32, 44, 7, -1, 7, 44, 40, 6, 31, 40, 36, 32, 44, -1, 41, 45, 33, 37, -1, 40, 41, 37, 36, -1, 36, 37, 33, 32, -1, 32, 33, 45, 44, -1, 44, 45, 41, 40, 31, 41, 37, 33, 45, -1, 42, 46, 34, 38, -1, 41, 42, 38, 37, -1, 37, 38, 34, 33, -1, 33, 34, 46, 45, -1, 45, 46, 42, 41, 31,
+                          42, 38, 34, 46, -1, 43, 47, 35, 39, -1, 42, 43, 39, 38, -1, 38, 39, 35, 34, -1, 34, 35, 47, 46, -1, 46, 47, 43, 42, 31, 80, 9, 5, 6, -1, 82, 40, 36, 52, -1, 80, 82, 52, 9, -1, 9, 52, 36, 5, -1, 5, 36, 40, 6, -1, 6, 40, 82, 80, 31, 82, 52, 36, 40, -1, 83, 41, 37, 53, -1, 82, 83, 53, 52, -1, 52, 53, 37, 36, -1, 36, 37, 41, 40, -1, 40, 41, 83, 82, 31, 83, 53, 37, 41, -1, 84, 42, 38, 86, -1, 83, 84, 86, 53, -1, 53, 86, 38, 37, -1, 37, 38, 42, 41, -1, 41, 42, 84, 83, 31, 84, 86, 38, 42, -1, 85, 43, 39, 87, -1, 84, 85, 87, 86, -1, 86, 87, 39, 38, -1, 38, 39, 43, 42, -1, 42, 43, 85, 84, 31, 10, 9, 8, 11, -1, 56, 60, 48, 52, -1, 10, 56, 52, 9, -1, 9, 52,
+                          48, 8, -1, 8, 48, 60, 11, -1, 11, 60, 56, 10, 31, 56, 52,
+                          48, 60, -1, 57, 61, 49, 53, -1, 56, 57, 53, 52, -1, 52, 53, 49, 48, -1, 48, 49, 61, 60, -1, 60, 61, 57, 56, 31, 57, 53, 49, 61, -1, 58, 62, 50, 54, -1, 57, 58, 54, 53, -1, 53, 54, 50, 49, -1, 49, 50, 62, 61, -1, 61, 62, 58, 57, 31, 58, 54, 50, 62, -1, 59, 63, 51, 55, -1, 58, 59, 55, 54, -1, 54, 55, 51, 50, -1, 50, 51, 63, 62, -1, 62, 63, 59, 58, 31, 12, 13, 9, 10, -1, 64, 56, 52, 68, -1, 12, 64, 68, 13, -1, 13, 68, 52, 9, -1, 9, 52, 56, 10, -1, 10, 56, 64, 12, 31, 64, 68, 52, 56, -1, 65, 57, 53, 69, -1, 64, 65, 69, 68, -1, 68, 69, 53, 52, -1, 52, 53, 57, 56, -1, 56, 57, 65, 64, 31, 65, 69, 53, 57, -1, 66, 58, 54, 70, -1, 65, 66, 70, 69, -1, 69, 70,
+                          54, 53, -1, 53, 54, 58, 57, -1, 57, 58, 66, 65, 31, 66, 70, 54, 58, -1, 67, 59, 55, 71, -1, 66, 67, 71, 70, -1, 70, 71, 55, 54, -1, 54, 55, 59, 58, -1, 58, 59, 67, 66, 31, 14, 15, 13, 12, -1, 72, 64, 68, 76, -1, 14, 72, 76, 15, -1, 15, 76, 68, 13, -1, 13, 68, 64, 12, -1, 12, 64, 72, 14, 31, 72, 76, 68, 64, -1, 73, 65, 69, 77, -1, 72, 73, 77, 76, -1, 76, 77, 69, 68, -1, 68, 69, 65, 64, -1, 64, 65, 73, 72, 31, 73, 77, 69, 65, -1, 74, 66, 70, 78, -1, 73, 74, 78, 77, -1, 77, 78, 70, 69, -1, 69, 70, 66, 65, -1, 65, 66, 74, 73, 31, 74, 78, 70, 66, -1, 75, 67, 71, 79, -1, 74, 75, 79, 78, -1, 78, 79, 71, 70, -1, 70, 71, 67, 66, -1,
+                          66, 67, 75, 74, 31, 2, 3, 13, 81, -1, 24, 90, 68, 28, -1, 2, 24, 28, 3, -1, 3, 28, 68, 13, -1, 13, 68, 90, 81, -1, 81, 90, 24, 2, 31, 24, 28, 68, 90, -1, 25, 91, 69, 29, -1, 24, 25, 29, 28, -1, 28, 29, 69, 68, -1, 68, 69, 91, 90, -1, 90, 91, 25, 24, 31, 25, 29, 69, 91, -1, 26, 92, 88, 30, -1, 25, 26, 30, 29, -1, 29, 30, 88, 69, -1, 69, 88, 92, 91, -1, 91, 92, 26, 25, 31, 26, 30, 88, 92, -1, 27, 93, 89, 31, -1, 26, 27, 31, 30, -1, 30, 31, 89, 88, -1, 88, 89, 93, 92, -1, 92, 93, 27, 26, 31, 13, 3, 5, 9, -1, 68, 52, 36, 28, -1, 13, 68, 28, 3, -1, 3, 28, 36, 5, -1, 5, 36, 52, 9, -1, 9, 52, 68, 13, 31, 68, 28, 36, 52, -1, 69, 53, 37, 29, -1, 68, 69, 29,
+                          28, -1, 28, 29, 37, 36, -1, 36, 37, 53, 52, -1, 52, 53, 69, 68, 31, 69, 29, 37, 53, -1, 88, 86, 38, 30, -1, 69, 88, 30, 29, -1, 29, 30, 38, 37, -1, 37, 38, 86, 53, -1, 53, 86, 88, 69, 31, 88, 30, 38, 86, -1, 89, 87, 39, 31, -1, 88, 89, 31, 30, -1, 30, 31, 39, 38, -1, 38, 39, 87, 86, -1, 86, 87, 89, 88])
+        cI = DataArrayInt([0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330, 360, 390, 420, 450, 480, 510, 540, 570, 600, 630, 660, 690, 720, 750, 780, 810, 840, 870, 900, 930, 960, 990, 1020, 1050, 1080])
+        m3.setConnectivity(c, cI)
+        m3.checkConsistency()
+        m2, _, _, _, _ = m3.buildDescendingConnectivity()
+        grpIds = DataArrayInt([2,7,12,17,95,99,103,107,129,133,137,141]); grpIds.setName("group")
+        mfu = MEDFileUMesh()
+        mfu.setMeshAtLevel(0, m3)
+        mfu.setMeshAtLevel(-1, m2)
+        mfu.setGroupsAtLevel(-1, [grpIds])
+        nNod = m3.getNumberOfNodes()
+        nodesDup, cells1, cells2 = mfu.buildInnerBoundaryAlongM1Group("group")
+        m3_bis = mfu.getMeshAtLevel(0)
+        m3_bis.checkConsistency()
+        m2_bis = mfu.getMeshAtLevel(-1)
+        m2_bis.checkConsistency()
+        self.assertEqual(nNod+22, mfu.getNumberOfNodes())
+        self.assertEqual(nNod+22, m3_bis.getNumberOfNodes())
+        self.assertEqual(nNod+22, m2_bis.getNumberOfNodes())
+        self.assertEqual([0, 3, 12, 13, 16, 17, 18, 19, 28, 29, 30, 31, 64, 65, 66, 67, 68, 69, 70, 71, 88, 89], nodesDup.getValues())
+        self.assertEqual(m3_bis.getCoords()[nodesDup].getValues(), m3_bis.getCoords()[nNod:].getValues())
+        self.assertEqual(set([0, 1, 2, 3, 24, 25, 26, 27, 28, 29, 30, 31]), set(cells1.getValues()))
+        self.assertEqual(set([4, 5, 6, 7, 20, 21, 22, 23, 32, 33, 34, 35]), set(cells2.getValues()))
+        self.assertEqual([2, 7, 12, 17, 95, 99, 103, 107, 129, 133, 137, 141],mfu.getGroupArr(-1,"group").getValues())
+        self.assertEqual([151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162],mfu.getGroupArr(-1,"group_dup").getValues())  # here only one cell has been duplicated
+        m_desc, _, _, _, _ = m3_bis.buildDescendingConnectivity()
+        m_desc.checkDeepEquivalOnSameNodesWith(m2_bis, 2, 9.9999)
+        pass
+
+    def testBuildInnerBoundary8(self):
+        """ 3D test where the crack leaves 'naked' cells. If we call a 'close-to-crack cell' a cell which shares a face with the M1 group,
+         a 'naked cell' is a cell that has some node duplicated, but which do not share any face with a 'close-to-crack cell'. In this case
+         it is tricky to decide whether this cell should be renumbered or not ...
+         Warning: on the mesh below some points have already been doubled by a previous cut. 
+        """
+        m3 = MEDCouplingUMesh('box', 3)
+        coo = DataArrayDouble([(0,15,0),(0,5,0),(3,5,0),(5,5,0),(5,15,0),(5,20,0),(0,20,0),(15,20,0),(15,15,0),(20,15,0),(20,20,0),(20,5,0),(15,5,0),(15,0,0),(20,0,0),(5,-1.60551e-25,0),(5,3,0),(3,0,0),
+        (3,3,0),(0,0,0),(0,3,0),(0,15,10),(0,15,20),(0,15,30),(0,15,40),(0,5,10),(0,5,20),(0,5,30),(0,5,40),(3,5,10),(3,5,20),(3,5,30),(3,5,40),(5,5,10),(5,5,20),(5,5,30),(5,5,40),(5,15,10),(5,15,20),(5,15,30),
+        (5,15,40),(5,20,10),(5,20,20),(5,20,30),(5,20,40),(0,20,10),(0,20,20),(0,20,30),(0,20,40),(15,20,10),(15,20,20),(15,20,30),(15,20,40),(15,15,10),(15,15,20),(15,15,30),(15,15,40),(20,15,10),(20,15,20),
+        (20,15,30),(20,15,40),(20,20,10),(20,20,20),(20,20,30),(20,20,40),(20,5,10),(20,5,20),(20,5,30),(20,5,40),(15,5,10),(15,5,20),(15,5,30),(15,5,40),(15,0,10),(15,0,20),(15,0,30),(15,0,40),(20,0,10),
+        (20,0,20),(20,0,30),(20,0,40),(5,-1.60551e-25,10),(5,-1.60551e-25,20),(5,-1.60551e-25,30),(5,-1.60551e-25,40),(5,3,10),(5,3,20),(5,3,30),(5,3,40),(3,0,10),(3,0,20),(3,0,30),(3,0,40),(3,3,10),(3,3,20),
+        (3,3,30),(3,3,40),(0,0,10),(0,0,20),(0,0,30),(0,0,40),(0,3,10),(0,3,20),(0,3,30),(0,3,40),(0,9,0),(3,9,0),(20,9,0),(0,9,10),(0,9,20),(0,9,30),(0,9,40),(3,9,10),(3,9,20),(3,9,30),(3,9,40),(5,9,30),
+        (5,9,40),(20,9,10),(20,9,20),(20,9,30),(20,9,40),(15,9,30),(15,9,40),(0,15,0),(20,15,0),(0,15,10),(0,15,20),(0,15,30),(0,15,40),(5,15,30),(5,15,40),(15,15,30),(15,15,40),(20,15,10),(20,15,20),(20,15,30),
+        (20,15,40)])
+        m3.setCoords(coo)
+        c = DataArrayInt([31, 5, 4, 124, 6, -1, 41, 45, 126, 37, -1, 5, 41, 37, 4, -1, 4, 37, 126, 124, -1, 124, 126, 45, 6, -1, 6, 45, 41, 5, 31, 41, 37, 126, 45, -1, 42, 46, 127, 38, -1, 41, 42, 38, 37, -1, 37, 38, 127, 126, -1, 126, 127, 46, 45, -1, 45, 46, 42, 41, 31, 42, 38, 127, 46, -1, 43, 47, 128, 130, -1, 42, 43, 130, 38, -1, 38, 130, 128, 127, -1, 127, 128, 47, 46, -1, 46, 47, 43, 42, 31, 43, 130, 128, 47,
+        -1, 44, 48, 129, 131, -1, 43, 44, 131, 130, -1, 130, 131, 129, 128, -1, 128, 129, 48, 47, -1, 47, 48, 44, 43, 31, 7, 8, 4, 5, -1, 49, 41, 37, 53, -1, 7, 49, 53, 8, -1, 8, 53, 37, 4, -1, 4, 37, 41, 5, -1, 5, 41, 49, 7, 31, 49, 53, 37, 41, -1, 50, 42, 38, 54, -1, 49, 50, 54, 53, -1, 53, 54, 38, 37, -1, 37, 38, 42, 41, -1, 41, 42, 50, 49, 31, 50, 54, 38, 42, -1, 51, 43, 130, 132, -1, 50, 51, 132, 54, -1, 54, 132,
+        130, 38, -1, 38, 130, 43, 42, -1, 42, 43, 51, 50, 31, 51, 132, 130, 43, -1, 52, 44, 131, 133, -1, 51, 52, 133, 132, -1, 132, 133, 131, 130, -1, 130, 131, 44, 43, -1, 43, 44, 52, 51, 31, 125, 8, 7, 10, -1, 134, 61, 49, 53, -1, 125, 134, 53, 8, -1, 8, 53, 49, 7, -1, 7, 49, 61, 10, -1, 10, 61, 134, 125, 31, 134, 53, 49, 61, -1, 135, 62, 50, 54, -1, 134, 135, 54, 53, -1, 53, 54, 50, 49, -1, 49, 50, 62, 61, -1,
+        61, 62, 135, 134, 31, 135, 54, 50, 62, -1, 136, 63, 51, 132, -1, 135, 136, 132, 54, -1, 54, 132, 51, 50, -1, 50, 51, 63, 62, -1, 62, 63, 136, 135, 31, 136, 132, 51, 63, -1, 137, 64, 52, 133, -1, 136, 137, 133, 132, -1, 132, 133, 52, 51, -1, 51, 52, 64, 63, -1, 63, 64, 137, 136, 31, 107, 12, 8, 9, -1, 118, 57, 53, 69, -1, 107, 118, 69, 12, -1, 12, 69, 53, 8, -1, 8, 53, 57, 9, -1, 9, 57, 118, 107, 31, 118, 69,
+        53, 57, -1, 119, 58, 54, 70, -1, 118, 119, 70, 69, -1, 69, 70, 54, 53, -1, 53, 54, 58, 57, -1, 57, 58, 119, 118, 31, 119, 70, 54, 58, -1, 120, 59, 55, 122, -1, 119, 120, 122, 70, -1, 70, 122, 55, 54, -1, 54, 55, 59, 58, -1, 58, 59, 120, 119, 31, 120, 122, 55, 59, -1, 121, 60, 56, 123, -1, 120, 121, 123, 122, -1, 122, 123, 56, 55, -1, 55, 56, 60, 59, -1, 59, 60, 121, 120, 31, 13, 12, 11, 14, -1, 73, 77, 65, 69,
+        -1, 13, 73, 69, 12, -1, 12, 69, 65, 11, -1, 11, 65, 77, 14, -1, 14, 77, 73, 13, 31, 73, 69, 65, 77, -1, 74, 78, 66, 70, -1, 73, 74, 70, 69, -1, 69, 70, 66, 65, -1, 65, 66, 78, 77, -1, 77, 78, 74, 73, 31, 74, 70, 66, 78, -1, 75, 79, 67, 71, -1, 74, 75, 71, 70, -1, 70, 71, 67, 66, -1, 66, 67, 79, 78, -1, 78, 79, 75, 74, 31, 75, 71, 67, 79, -1, 76, 80, 68, 72, -1, 75, 76, 72, 71, -1, 71, 72, 68, 67, -1, 67, 68, 80,
+        79, -1, 79, 80, 76, 75, 31, 17, 18, 16, 15, -1, 89, 81, 85, 93, -1, 17, 89, 93, 18, -1, 18, 93, 85, 16, -1, 16, 85, 81, 15, -1, 15, 81, 89, 17, 31, 89, 93, 85, 81, -1, 90, 82, 86, 94, -1, 89, 90, 94, 93, -1, 93, 94, 86, 85, -1, 85, 86, 82, 81, -1, 81, 82, 90, 89, 31, 90, 94, 86, 82, -1, 91, 83, 87, 95, -1, 90, 91, 95, 94, -1, 94, 95, 87, 86, -1, 86, 87, 83, 82, -1, 82, 83, 91, 90, 31, 91, 95, 87, 83, -1, 92, 84,
+        88, 96, -1, 91, 92, 96, 95, -1, 95, 96, 88, 87, -1, 87, 88, 84, 83, -1, 83, 84, 92, 91, 31, 19, 20, 18, 17, -1, 97, 89, 93, 101, -1, 19, 97, 101, 20, -1, 20, 101, 93, 18, -1, 18, 93, 89, 17, -1, 17, 89, 97, 19, 31, 97, 101, 93, 89, -1, 98, 90, 94, 102, -1, 97, 98, 102, 101, -1, 101, 102, 94, 93, -1, 93, 94, 90, 89, -1, 89, 90, 98, 97, 31, 98, 102, 94, 90, -1, 99, 91, 95, 103, -1, 98, 99, 103, 102, -1, 102, 103,
+        95, 94, -1, 94, 95, 91, 90, -1, 90, 91, 99, 98, 31, 99, 103, 95, 91, -1, 100, 92, 96, 104, -1, 99, 100, 104, 103, -1, 103, 104, 96, 95, -1, 95, 96, 92, 91, -1, 91, 92, 100, 99, 31, 1, 2, 18, 20, -1, 25, 101, 93, 29, -1, 1, 25, 29, 2, -1, 2, 29, 93, 18, -1, 18, 93, 101, 20, -1, 20, 101, 25, 1, 31, 25, 29, 93, 101, -1, 26, 102, 94, 30, -1, 25, 26, 30, 29, -1, 29, 30, 94, 93, -1, 93, 94, 102, 101, -1, 101, 102,
+        26, 25, 31, 26, 30, 94, 102, -1, 27, 103, 95, 31, -1, 26, 27, 31, 30, -1, 30, 31, 95, 94, -1, 94, 95, 103, 102, -1, 102, 103, 27, 26, 31, 27, 31, 95, 103, -1, 28, 104, 96, 32, -1, 27, 28, 32, 31, -1, 31, 32, 96, 95, -1, 95, 96, 104, 103, -1, 103, 104, 28, 27, 31, 3, 4, 8, 12, -1, 33, 69, 53, 37, -1, 3, 33, 37, 4, -1, 4, 37, 53, 8, -1, 8, 53, 69, 12, -1, 12, 69, 33, 3, 31, 33, 37, 53, 69, -1, 34, 70, 54, 38, -1,
+        33, 34, 38, 37, -1, 37, 38, 54, 53, -1, 53, 54, 70, 69, -1, 69, 70, 34, 33, 31, 34, 38, 54, 70, -1, 116, 122, 55, 39, -1, 34, 116, 39, 38, -1, 38, 39, 55, 54, -1, 54, 55, 122, 70, -1, 70, 122, 116, 34, 31, 116, 39, 55, 122, -1, 117, 123, 56, 40, -1, 116, 117, 40, 39, -1, 39, 40, 56, 55, -1, 55, 56, 123, 122, -1, 122, 123, 117, 116, 31, 16, 18, 2, 3, -1, 85, 33, 29, 93, -1, 16, 85, 93, 18, -1, 18, 93, 29, 2,
+        -1, 2, 29, 33, 3, -1, 3, 33, 85, 16, 31, 85, 93, 29, 33, -1, 86, 34, 30, 94, -1, 85, 86, 94, 93, -1, 93, 94, 30, 29, -1, 29, 30, 34, 33, -1, 33, 34, 86, 85, 31, 86, 94, 30, 34, -1, 87, 35, 31, 95, -1, 86, 87, 95, 94, -1, 94, 95, 31, 30, -1, 30, 31, 35, 34, -1, 34, 35, 87, 86, 31, 87, 95, 31, 35, -1, 88, 36, 32, 96, -1, 87, 88, 96, 95, -1, 95, 96, 32, 31, -1, 31, 32, 36, 35, -1, 35, 36, 88, 87, 31, 4, 3, 106,
+        105, 0, -1, 37, 21, 108, 112, 33, -1, 3, 4, 37, 33, -1, 106, 3, 33, 112, -1, 105, 106, 112, 108, -1, 0, 105, 108, 21, -1, 4, 0, 21, 37, 31, 37, 33, 112, 108, 21, -1, 38, 22, 109, 113, 34, -1, 33, 37, 38, 34, -1, 112, 33, 34, 113, -1, 108, 112, 113, 109, -1, 21, 108, 109, 22, -1, 37, 21, 22, 38, 31, 38, 34, 113, 109, 22, -1, 39, 23, 110, 114, 116, -1, 34, 38, 39, 116, -1, 113, 34, 116, 114, -1, 109, 113, 114, 110,
+        -1, 22, 109, 110, 23, -1, 38, 22, 23, 39, 31, 39, 116, 114, 110, 23, -1, 40, 24, 111, 115, 117, -1, 116, 39, 40, 117, -1, 114, 116, 117, 115, -1, 110, 114, 115, 111, -1, 23, 110, 111, 24, -1, 39, 23, 24, 40, 31, 16, 3, 12, 13, 15, -1, 85, 81, 73, 69, 33, -1, 3, 16, 85, 33, -1, 12, 3, 33, 69, -1, 13, 12, 69, 73, -1, 15, 13, 73, 81, -1, 16, 15, 81, 85, 31, 85, 33, 69, 73, 81, -1, 86, 82, 74, 70, 34, -1, 33, 85,
+        86, 34, -1, 69, 33, 34, 70, -1, 73, 69, 70, 74, -1, 81, 73, 74, 82, -1, 85, 81, 82, 86, 31, 86, 34, 70, 74, 82, -1, 87, 83, 75, 71, 35, -1, 34, 86, 87, 35, -1, 70, 34, 35, 71, -1, 74, 70, 71, 75, -1, 82, 74, 75, 83, -1, 86, 82, 83, 87, 31, 87, 35, 71, 75, 83, -1, 88, 84, 76, 72, 36, -1, 35, 87, 88, 36, -1, 71, 35, 36, 72, -1, 75, 71, 72, 76, -1, 83, 75, 76, 84, -1, 87, 83, 84, 88])
+        cI = DataArrayInt([0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330, 360, 390, 420, 450, 480, 510, 540, 570, 600, 630, 660, 690, 720, 750, 780, 810, 840, 870, 900, 930, 960, 990, 1020, 1050, 1080, 1110, 1140, 1170, 1200, 1237, 1274, 1311, 1348, 1385, 1422, 1459, 1496])
+        m3.setConnectivity(c, cI)
+        m3.checkConsistency()
+        m2, _, _, _, _ = m3.buildDescendingConnectivity()
+        grpIds = DataArrayInt([2,7,12,17,101,106,111,116,160,164,170,173,176,179]); grpIds.setName("group")
+        mfu = MEDFileUMesh()
+        mfu.setMeshAtLevel(0, m3)
+        mfu.setMeshAtLevel(-1, m2)
+        mfu.setGroupsAtLevel(-1, [grpIds])
+        nNod = m3.getNumberOfNodes()
+        nodesDup, cells1, cells2 = mfu.buildInnerBoundaryAlongM1Group("group")
+        m3_bis = mfu.getMeshAtLevel(0)
+        m3_bis.checkConsistency()
+        m2_bis = mfu.getMeshAtLevel(-1)
+        m2_bis.checkConsistency()
+        self.assertEqual(nNod+23, mfu.getNumberOfNodes())
+        self.assertEqual(nNod+23, m3_bis.getNumberOfNodes())
+        self.assertEqual(nNod+23, m2_bis.getNumberOfNodes())
+        self.assertEqual([5, 15, 16, 35, 36, 39, 40, 41, 42, 43, 44, 81, 82, 83, 84, 85, 86, 87, 88, 116, 117, 130, 131], nodesDup.getValues())
+        self.assertEqual(m3_bis.getCoords()[nodesDup].getValues(), m3_bis.getCoords()[nNod:].getValues())
+        self.assertEqual(set([0, 1, 2, 3, 20, 21, 22, 23, 34, 35, 36, 37, 38, 39]), set(cells1.getValues()))
+        self.assertEqual(set([4, 5, 6, 7, 42, 43, 44, 45, 46, 47]), set(cells2.getValues()))
+        self.assertEqual([2, 7, 12, 17, 101, 106, 111, 116, 160, 164, 170, 173, 176, 179],mfu.getGroupArr(-1,"group").getValues())
+        self.assertEqual([212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225],mfu.getGroupArr(-1,"group_dup").getValues())  # here only one cell has been duplicated
+        m_desc, _, _, _, _ = m3_bis.buildDescendingConnectivity()
+        m_desc.checkDeepEquivalOnSameNodesWith(m2_bis, 2, 9.9999)
+        pass
+
     @WriteInTmpDir
     def testBasicConstructors(self):
         GeneratePyfile18(self)
@@ -1753,7 +1902,7 @@ class MEDLoaderTest3(unittest.TestCase):
         mT3.allocateCells(1)
         mT3.insertNextCell(NORM_TRI3,list(range(3)))
         mT3.finishInsertingCells()
-        
+
         tr=[[0.,4.],[2.,4.],[4.,4.],[6.,4.],[8.,4.],[10.,4.],[12.,4.],[14.,4.],[16.,4.],[18.,4.],[20.,4.],[0.,0.],[2.,0.], [0.,2.],[2.,2.],[4.,2.],[6.,2.],[8.,2.],[10.,2.],[12.,2.]]
         ms=11*[mT3]+2*[mQ4]+7*[mQ8]
         ms[:]=(elt.deepCopy() for elt in ms)
@@ -1865,7 +2014,7 @@ class MEDLoaderTest3(unittest.TestCase):
         f.setGaussLocalizationOnCells([16,19],[0.,0.,1.,0.,1.,1.,0.,1.,0.5,0.,1.,0.5,0.5,1.,0.,0.5],[0.3,0.3,0.7,0.7,0.8,0.8],[0.8,0.1,0.1])
         f.checkConsistencyLight()
         mm=MEDFileUMesh()
-        mm.setMeshAtLevel(0,m) 
+        mm.setMeshAtLevel(0,m)
         f1ts=MEDFileField1TS.New()
         f1ts.setFieldNoProfileSBT(f)
         self.assertEqual(f1ts.getPfls(),('Pfl_fieldCellWithoutPfl_NORM_TRI3_0','Pfl_fieldCellWithoutPfl_NORM_TRI3_1','Pfl_fieldCellWithoutPfl_NORM_QUAD8_3','Pfl_fieldCellWithoutPfl_NORM_QUAD8_4'))
@@ -1982,7 +2131,7 @@ class MEDLoaderTest3(unittest.TestCase):
         pfl1_r.setName(pfl1.getName())
         self.assertTrue(pfl1_r.isEqual(pfl1))
         pass
-    
+
         # Testing profile on nodes when the profile is identity but not on all nodes.
     @WriteInTmpDir
     def testMEDFieldPflOnCell1(self):
@@ -2256,12 +2405,17 @@ class MEDLoaderTest3(unittest.TestCase):
         m=m.buildUnstructured()
         m.setName("mm")
         f=m.getMeasureField(False)
-        self.assertIn(m.getHeapMemorySize(), list(range(3552 - 100, 3552 + 100 + 4 * strMulFac)))
-        self.assertIn(f.getHeapMemorySize(), list(range(4215 - 100, 4215 + 100 + 8 * strMulFac)))
+        cooMem = 100 * 2 * 8
+        nodalMem = 5 * 81 * MEDCouplingSizeOfIDs()//8
+        indexMem = 82 * MEDCouplingSizeOfIDs()//8
+        meshMem = cooMem + nodalMem + indexMem
+        self.assertIn(m.getHeapMemorySize(), list(range(meshMem - 100, meshMem + 100 + 4 * strMulFac)))
+        delta = (m.getHeapMemorySize()-meshMem)//3 # std::string::capacity behaves differently
+        self.assertIn(f.getHeapMemorySize(), list(range(meshMem + 81*8 - (100 + 3*delta), meshMem + 81*8 + (100+3*delta) + 8 * strMulFac)))
         #
         mm=MEDFileUMesh()
         mm.setMeshAtLevel(0,m)
-        self.assertIn(mm.getHeapMemorySize(), list(range(3889 - 100, 4225 + 100 + 10 * strMulFac)))
+        self.assertIn(mm.getHeapMemorySize(), list(range(meshMem + 81*(MEDCouplingSizeOfIDs()//8) - (100+3*delta), meshMem + 81*(MEDCouplingSizeOfIDs()//8) + (100+3*delta) + 10 * strMulFac)))
         ff=MEDFileField1TS()
         ff.setFieldNoProfileSBT(f)
         self.assertIn(ff.getHeapMemorySize(), list(range(771 - 40, 871 + 21 + (4 + 1) * strMulFac)))
@@ -2277,9 +2431,9 @@ class MEDLoaderTest3(unittest.TestCase):
         f2.setTime(2.,1,-1)
         pfl=DataArrayInt.Range(0,50,1) ; pfl.setName("pfl")
         fff.appendFieldProfile(f2,mm,0,pfl)
-        self.assertIn(fff.getHeapMemorySize(), list(range(2348 - 130, 2608 + 100 + (10 + 2) * strMulFac)))
-        self.assertIn(fff.getProfile("pfl").getHeapMemorySize(), list(range(204 - 10, 204 + 10 + 2 * strMulFac)))
-        self.assertIn(fff[1, -1].getHeapMemorySize(), list(range(738 - 50, 838 + 30 + 4 * strMulFac)))
+        self.assertIn(fff.getHeapMemorySize(), range(2348 - 130, 2608 + 400 + (10 + 2) * strMulFac))
+        self.assertIn(fff.getProfile("pfl").getHeapMemorySize(), list(range(50 *(MEDCouplingSizeOfIDs()//8) - 10, 50 *(MEDCouplingSizeOfIDs()//8) + 10 + 2 * strMulFac)))
+        self.assertIn(fff[1, -1].getHeapMemorySize(), range(538 + (50 *(MEDCouplingSizeOfIDs()//8)) - 50, 900 + (50 *(MEDCouplingSizeOfIDs()//8))  + 30 + 4 * strMulFac))
         pass
 
     def internalCurveLinearMesh1(self):
@@ -2321,7 +2475,7 @@ class MEDLoaderTest3(unittest.TestCase):
         self.assertTrue(len(m1.getUnivName())!=0)
         self.assertTrue(m1.getMesh().isEqual(mesh,1e-12))
         pass
-    
+
     @WriteInTmpDir
     def testCurveLinearMesh1(self):
         self.internalCurveLinearMesh1()
@@ -2329,7 +2483,7 @@ class MEDLoaderTest3(unittest.TestCase):
     @WriteInTmpDir
     def testParameters1(self):
         self.internalParameters1()
-        
+
     def internalParameters1(self):
         fname="Pyfile56.med"
         m=MEDCouplingCMesh() ; arr=DataArrayDouble([0.,1.2,3.5]) ; m.setCoords(arr,arr) ; m.setName("mesh")
@@ -2657,7 +2811,7 @@ class MEDLoaderTest3(unittest.TestCase):
                 pass
             pass
         pass
-    
+
     @WriteInTmpDir
     def testNonRegressionMantis22212ChangeGrpName(self):
         fileName="Pyfile62.med"
@@ -2749,7 +2903,7 @@ class MEDLoaderTest3(unittest.TestCase):
         self.assertTrue(a.getArray().isEqual(2*f1.getArray()))
         f1.setTime(3.,1,2) ; f1.getArray()[:]*=2
         self.assertTrue(a.isEqual(f1,1e-12,0)) ; f1.getArray()[:]/=2
-        bc=DataArrayInt(6,3) ; bc[:]=0 ; bc.setInfoOnComponents(['power [MW/m^3]','density [g/cm^3]','temperature [K]'])
+        bc=DataArrayInt32(6,3) ; bc[:]=0 ; bc.setInfoOnComponents(['power [MW/m^3]','density [g/cm^3]','temperature [K]'])
         for it in ffs1:
             a=it.getFieldOnMeshAtLevel(ON_CELLS,0,mm1)
             bc+=a.getArray()
@@ -2758,7 +2912,7 @@ class MEDLoaderTest3(unittest.TestCase):
         nf1=MEDCouplingFieldInt(ON_NODES)
         nf1.setTime(9.,10,-1)
         nf1.setMesh(f1.getMesh())
-        narr=DataArrayInt(12,2) ; narr.setInfoOnComponents(["aa [u1]","bbbvv [ppp]"]) ; narr[:,0]=list(range(12)) ; narr[:,1]=2*narr[:,0]
+        narr=DataArrayInt32(12,2) ; narr.setInfoOnComponents(["aa [u1]","bbbvv [ppp]"]) ; narr[:,0]=list(range(12)) ; narr[:,1]=2*narr[:,0]
         nf1.setName("VectorFieldOnNodes") ; nf1.setArray(narr)
         nff1=MEDFileIntField1TS.New()
         nff1.setFieldNoProfileSBT(nf1)
@@ -2769,7 +2923,7 @@ class MEDLoaderTest3(unittest.TestCase):
         nf2=MEDCouplingFieldInt(ON_NODES)
         nf2.setTime(19.,20,-11)
         nf2.setMesh(f1.getMesh())
-        narr2=DataArrayInt(8,2) ; narr.setInfoOnComponents(["aapfl [u1]","bbbvvpfl [ppp]"]) ; narr2[:,0]=list(range(8)) ; narr2[:,0]+=10  ; narr2[:,1]=3*narr2[:,0]
+        narr2=DataArrayInt32(8,2) ; narr.setInfoOnComponents(["aapfl [u1]","bbbvvpfl [ppp]"]) ; narr2[:,0]=list(range(8)) ; narr2[:,0]+=10  ; narr2[:,1]=3*narr2[:,0]
         nf2.setName("VectorFieldOnNodesPfl") ; narr2.setName(nf2.getName()) ; nf2.setArray(narr2)
         nff2=MEDFileIntField1TS.New()
         npfl=DataArrayInt([1,2,4,5,6,7,10,11]) ; npfl.setName("npfl")
@@ -2857,7 +3011,7 @@ class MEDLoaderTest3(unittest.TestCase):
     @WriteInTmpDir
     def testMEDFileFields2(self):
         fname="Pyfile65.med"
-        # to check that all is initialize 
+        # to check that all is initialize
         MEDFileField1TS().__str__()
         MEDFileFieldMultiTS().__str__()
         # building a mesh containing 4 tri3 + 5 quad4
@@ -3001,7 +3155,7 @@ class MEDLoaderTest3(unittest.TestCase):
         fs0.checkGlobsCoherency()
         fs0.write(fname,0)
         pass
-    
+
     @WriteInTmpDir
     def testSplitComponents1(self):
         fname="Pyfile67.med"
@@ -3107,8 +3261,16 @@ class MEDLoaderTest3(unittest.TestCase):
         ff1=ff0i.convertToDouble()
         self.assertTrue(ff1.getUndergroundDataArray().isEqual(ff0.getUndergroundDataArray(),1e-13))
         self.assertEqual(ff1.getFieldSplitedByType(),fspExp)
+        # For int64
+        ff0i64=ff0.convertToInt64()
+        self.assertEqual(ff0i64.getFieldSplitedByType(),fspExp)
+        self.assertTrue(arr.convertToInt64Arr().isEqual(ff0i64.getUndergroundDataArray()))
+        #
+        ff2=ff0i64.convertToDouble()
+        self.assertTrue(ff2.getUndergroundDataArray().isEqual(ff0.getUndergroundDataArray(),1e-13))
+        self.assertEqual(ff2.getFieldSplitedByType(),fspExp)
         # With profiles
-        del arr,f0,ff0,ff1,ff0i,fspExp
+        del arr,f0,ff0,ff1,ff2,ff0i,ff0i64,fspExp
         ff0=MEDFileField1TS()
         f0=MEDCouplingFieldDouble(ON_CELLS,ONE_TIME) ; f0.setMesh(m[:7]) ; arr=DataArrayDouble(7*2) ; arr.iota() ; arr.rearrange(2) ; arr.setInfoOnComponents(["XX [pm]","YYY [hm]"]) ; f0.setArray(arr) ; f0.setName("FieldCellPfl")
         f0.checkConsistencyLight()
@@ -3126,6 +3288,16 @@ class MEDLoaderTest3(unittest.TestCase):
         self.assertTrue(isinstance(ff1,MEDFileField1TS))
         self.assertTrue(ff1.getUndergroundDataArray().isEqual(ff0.getUndergroundDataArray(),1e-13))
         self.assertEqual(ff1.getFieldSplitedByType(),fspExp)
+        # For Int64
+        ff0i64=ff0.convertToInt64()
+        self.assertTrue(isinstance(ff0i64,MEDFileInt64Field1TS))
+        self.assertEqual(ff0i64.getFieldSplitedByType(),fspExp)
+        self.assertTrue(arr.convertToInt64Arr().isEqual(ff0i64.getUndergroundDataArray()))
+        #
+        ff2=ff0i64.convertToDouble()
+        self.assertTrue(isinstance(ff2,MEDFileField1TS))
+        self.assertTrue(ff2.getUndergroundDataArray().isEqual(ff0.getUndergroundDataArray(),1e-13))
+        self.assertEqual(ff2.getFieldSplitedByType(),fspExp)
         ## MultiTimeSteps
         ff0=MEDFileFieldMultiTS()
         f0=MEDCouplingFieldDouble(ON_CELLS,ONE_TIME) ; f0.setMesh(m[:7]) ; arr=DataArrayDouble(7*2) ; arr.iota() ; arr.rearrange(2) ; arr.setInfoOnComponents(["X [km]","YY [mm]"]) ; f0.setArray(arr) ; f0.setName("FieldCellMTime") ; f0.setTime(0.1,0,10)
@@ -3143,7 +3315,7 @@ class MEDLoaderTest3(unittest.TestCase):
         for delt,(dt,it,t) in  zip([0,100,200],ff1.getTimeSteps()):
             self.assertEqual(ff1.getFieldSplitedByType(dt,it),fspExp)
             arr=ff1.getUndergroundDataArray(dt,it)
-            arr.isEqualWithoutConsideringStr(DataArrayInt.Range(delt,delt+7,1))
+            arr.isEqualWithoutConsideringStr(DataArrayInt32.Range(delt,delt+7,1))
             pass
         self.assertEqual(ff1.getPfls(),('pfl_NORM_QUAD4', 'pfl_NORM_QUAD4', 'pfl_NORM_QUAD4'))
         #
@@ -3166,7 +3338,7 @@ class MEDLoaderTest3(unittest.TestCase):
         for delt,(dt,it,t) in  zip([0,100,200],ff1.getTimeSteps()):
             self.assertTrue(ff1.getFieldSplitedByType(dt,it),fspExp)
             arr=ff1.getUndergroundDataArray(dt,it)
-            arr.isEqualWithoutConsideringStr(DataArrayInt.Range(delt,delt+7,1))
+            arr.isEqualWithoutConsideringStr(DataArrayInt32.Range(delt,delt+7,1))
             pass
         self.assertEqual(ff1.getPfls(),('pfl_NORM_QUAD4',))
         pass
@@ -3227,7 +3399,7 @@ class MEDLoaderTest3(unittest.TestCase):
         ff0=MEDFileField1TS(fname,"FieldCellPfl",False)
         self.assertEqual(ff0.getUndergroundDataArray().getInfoOnComponents(),["XX [pm]","YYY [hm]"])
         heap_memory_ref=ff0.getHeapMemorySize()
-        self.assertIn(heap_memory_ref, list(range(350, 600 + 6 * strMulFac)))
+        self.assertIn(heap_memory_ref, list(range(350, 700 + 6 * strMulFac)))
         ff0.loadArrays() ##
         arr=DataArrayDouble(100) ; arr.iota() ; arr.rearrange(2)
         self.assertTrue(ff0.getUndergroundDataArray().isEqualWithoutConsideringStr(arr,1e-14))
@@ -3245,7 +3417,7 @@ class MEDLoaderTest3(unittest.TestCase):
         self.assertEqual(ff0.getUndergroundDataArray().getIJ(30,1),5.5)
         self.assertTrue(not ff0.getUndergroundDataArray().isEqualWithoutConsideringStr(arr,1e-14))
         heap_memory_ref=ff0.getHeapMemorySize()
-        self.assertIn(heap_memory_ref, list(range(1100, 1400 + 2 * strMulFac)))
+        self.assertIn(heap_memory_ref, list(range(1100, 1600 + 2 * strMulFac)))
         ff0.unloadArrays()
         hmd=ff0.getHeapMemorySize()-heap_memory_ref
         self.assertEqual(hmd,-800) # -50*8*2
@@ -3254,7 +3426,7 @@ class MEDLoaderTest3(unittest.TestCase):
         #
         ff0=MEDFileField1TS(fname,"FieldCellPfl",-1,-1,False)
         heap_memory_ref=ff0.getHeapMemorySize()
-        self.assertIn(heap_memory_ref, list(range(299, 620 + 6 * strMulFac)))
+        self.assertIn(heap_memory_ref, list(range(299, 670 + 6 * strMulFac)))
         ff0.loadArrays() ##
         self.assertTrue(ff0.getUndergroundDataArray().isEqualWithoutConsideringStr(arr,1e-14))
         self.assertEqual(ff0.getHeapMemorySize()-heap_memory_ref,50*8*2)
@@ -3271,14 +3443,14 @@ class MEDLoaderTest3(unittest.TestCase):
         #
         ff0=MEDFileAnyTypeFieldMultiTS.New(fname,fieldName,False)
         heap_memory_ref=ff0.getHeapMemorySize()
-        self.assertIn(heap_memory_ref, list(range(5536, 9212 + (80 + 26 + 1) * strMulFac)))
+        self.assertIn(heap_memory_ref, range(5536, 9212 + (80 + 26 + 1) * strMulFac))
         ff0.loadArrays()
         self.assertEqual(ff0.getHeapMemorySize()-heap_memory_ref,20*70*8*2)
         del ff0
         #
         ffs=MEDFileFields(fname,False)
         heap_memory_ref=ffs.getHeapMemorySize()
-        self.assertIn(heap_memory_ref, list(range(5335, 10031 + (80 + 50 + len(ffs)) * strMulFac)))
+        self.assertIn(heap_memory_ref, range(5335, 10331 + (80 + 50 + len(ffs)) * strMulFac))
         ffs.loadArrays()
         self.assertEqual(ffs.getHeapMemorySize()-heap_memory_ref,20*70*8*2+70*8*2+50*8*2)
         pass
@@ -3444,7 +3616,7 @@ class MEDLoaderTest3(unittest.TestCase):
         mrs.setNodeNumFieldReading(True)
         self.assertEqual(mrs.getCode(),63)
         pass
-    
+
     @WriteInTmpDir
     def testPartialReadOfMeshes(self):
         fname="Pyfile70.med"
@@ -3542,7 +3714,7 @@ class MEDLoaderTest3(unittest.TestCase):
         self.assertTrue(mm.getNumberFieldAtLevel(1) is None)
         delta4=ref_heap_mem-mm.getHeapMemorySize()
         self.assertTrue(delta4<delta3)
-        self.assertTrue(delta4>=32*4*2)
+        self.assertTrue(delta4>=MEDCouplingSizeOfIDs()/2*4*2)
         #
         mm=MEDFileUMesh.New(fname,"mesh",-1,-1,MEDFileMeshReadSelector(51))
         self.assertEqual(len(mm.getGroupsNames()),6)
@@ -3644,7 +3816,7 @@ class MEDLoaderTest3(unittest.TestCase):
         f.setArray(vals)
         f1ts.setFieldProfile(f,mm,0,pfl)
         pass
-    
+
     @WriteInTmpDir
     def testWRMeshWithNoCells(self):
         fname="Pyfile71.med"
@@ -3776,7 +3948,7 @@ class MEDLoaderTest3(unittest.TestCase):
             self.assertTrue(fs[0][i].getUndergroundDataArray().isEqual(arr,1e-12))
             pass
         pass
-    
+
     @WriteInTmpDir
     def testField1TSSetFieldNoProfileSBTPerGeoTypes(self):
         """ This test is very important, because the same mechanism is used by the MEDReader to generate a field on all the mesh without any processing and memory.
@@ -3847,7 +4019,7 @@ class MEDLoaderTest3(unittest.TestCase):
         self.assertEqual(f1ts.getFieldSplitedByType(),[(0,[(0,(0,4),'','')]),(3,[(0,(4,6),'','')]),(4,[(0,(6,9),'','')]),(14,[(0,(9,15),'','')]),(15,[(0,(15,20),'','')]),(16,[(0,(20,24),'','')])])
         self.assertTrue(f1ts.getUndergroundDataArray().isEqual(DataArrayDouble([0,1,2,3,0,1,0,1,2,0,1,2,3,4,5,0,1,2,3,4,0,1,2,3]),1e-12))
         pass
-    
+
     @WriteInTmpDir
     def testMEDFileUMeshSetName(self):
         """ This test is a small but important one for MEDReader in sauv mode. When .sauv file is loaded the conversion is performed in memory and a preparation is done then.
@@ -3965,7 +4137,7 @@ class MEDLoaderTest3(unittest.TestCase):
         m.checkConsistency()
         mm=MEDFileUMesh()
         mm.setMeshAtLevel(0,m)
-        m1=MEDCouplingCMesh() ; m1.setCoords(arr) ; m1.setName("Mesh") 
+        m1=MEDCouplingCMesh() ; m1.setCoords(arr) ; m1.setName("Mesh")
         m1=m1.buildUnstructured() ; m1.setCoords(m.getCoords())
         mm.setMeshAtLevel(-1,m1)
         renum0=DataArrayInt([3,6,7,10,11,0,2,1,9,8,5,4,12,13,14,24,23,22,21,20,19,18,17,16,15])
@@ -4154,6 +4326,28 @@ class MEDLoaderTest3(unittest.TestCase):
         arr=DataArrayDouble([(204,304),(205,305),(206,306),(207,307),(210,310),(211,311),(212,312),(213,313)])
         arr.setInfoOnComponents(compos)
         self.assertTrue(fs[1][0].getUndergroundDataArray().isEqual(arr,1e-12))
+        m_ref = mm[0].deepCopy()
+        # now read it in 2 load sessions to avoid memory peak. zipCoords is no more requested here.
+        ms=MEDFileMeshes()
+        mrs = MEDFileMeshReadSelector()
+        mrs.setNumberOfCoordsLoadSessions(2)
+        mm=MEDFileUMesh.LoadPartOf(fileName,meshName,[NORM_QUAD4],[4,6,1],-1,-1,mrs)
+        ms.pushMesh(mm)
+        spd=mm.getPartDefAtLevel(0,NORM_QUAD4)
+        self.assertEqual(spd.getSlice(),slice(4,6,1))
+        spd=mm.getPartDefAtLevel(1)
+        self.assertTrue(spd.getNumberOfElems()==8 and spd.getNumberOfElems()==mm.getNumberOfNodes())
+        self.assertTrue(spd.toDAI().isEqual(DataArrayInt([4,5,6,7,10,11,12,13])))
+        fs=MEDFileFields.LoadPartOf(fileName,False,ms)
+        fs[0][0].loadArrays()
+        arr=DataArrayDouble([(4,104),(5,105)])
+        arr.setInfoOnComponents(compos)
+        self.assertTrue(fs[0][0].getUndergroundDataArray().isEqual(arr,1e-12))
+        fs[1][0].loadArrays()
+        arr=DataArrayDouble([(204,304),(205,305),(206,306),(207,307),(210,310),(211,311),(212,312),(213,313)])
+        arr.setInfoOnComponents(compos)
+        self.assertTrue(fs[1][0].getUndergroundDataArray().isEqual(arr,1e-12))
+        self.assertTrue( mm[0].deepCopy().isEqual(m_ref,1e-12) )
         pass
 
     @WriteInTmpDir
@@ -4495,7 +4689,7 @@ class MEDLoaderTest3(unittest.TestCase):
             pass
         self.assertEqual(fs2[0].getTimeSteps(), [(i, 0, float(i)) for i in range(nbPdt)])
         pass
-    
+
     @WriteInTmpDir
     def testMEDFileMeshRearrangeFamIds1(self):
         """ Test for bug EDF10720. The aim of this test is the call of MEDFileMesh.rearrangeFamilies."""
@@ -4679,7 +4873,7 @@ class MEDLoaderTest3(unittest.TestCase):
             grpExp=grp+delta ; grpExp.setName("%s_node"%grp.getName())
             self.assertTrue(mm.getGroupArr(1,"%s_node"%grp.getName()).isEqual(grpExp))
         pass
-    
+
     @WriteInTmpDir
     def testMEDFileJoint1(self):
         fileName="Pyfile92.med"
@@ -4719,7 +4913,7 @@ class MEDLoaderTest3(unittest.TestCase):
         self.assertRaises( InterpKernelException, jointsR.destroyJointAtPos,1)
         jointsR.destroyJointAtPos(0)
         pass
-    
+
     @WriteInTmpDir
     def testMEDFileJoint2(self):
         fileNameWr="Pyfile93.med"
@@ -4795,6 +4989,9 @@ class MEDLoaderTest3(unittest.TestCase):
         self.assertFalse( joint1st_1.isEqual( joint1st_4 ))
         self.assertFalse( joint1st_4.isEqual( joint1st_5 ))
         self.assertFalse( joint1st_4.isEqual( joint1st_6 ))
+        self.assertEqual(1,joint1st_6.getNumberOfCorrespondences())
+        joint1st_6.clearCorrespondences()
+        self.assertEqual(0,joint1st_6.getNumberOfCorrespondences())
         one_joint=MEDFileJoint()
         one_joint.pushStep(joint1st_1)
         one_joint.setLocalMeshName("maa1")
@@ -4807,6 +5004,12 @@ class MEDLoaderTest3(unittest.TestCase):
         self.assertEqual( "joint_description", one_joint.getDescription())
         self.assertEqual( 1, one_joint.getDomainNumber())
         self.assertEqual( "joint_1", one_joint.getJointName())
+        one_joint_copy = one_joint.deepCopy()
+        self.assertEqual( "maa1", one_joint_copy.getLocalMeshName())
+        self.assertEqual( "maa2", one_joint_copy.getRemoteMeshName())
+        self.assertEqual( "joint_description", one_joint_copy.getDescription())
+        self.assertEqual( 1, one_joint_copy.getDomainNumber())
+        self.assertEqual( "joint_1", one_joint_copy.getJointName())
         pass
 
     @unittest.skipUnless('linux'==platform.system().lower(),"stderr redirection not ported on Windows ?")
@@ -4815,7 +5018,7 @@ class MEDLoaderTest3(unittest.TestCase):
         """ EDF11242 : check status of MED file calls to detect problems immediately. Sorry this test generates awful messages !"""
         fname="Pyfile94.med"
         errfname="Pyfile94.err"
-        
+
         import os
         # first clean file if needed
         if os.path.exists(fname):
@@ -4866,12 +5069,12 @@ class MEDLoaderTest3(unittest.TestCase):
         mm=MEDFileCMesh(fname)
         self.assertTrue(mm.getUnivName()!="")
         pass
-    
+
     @WriteInTmpDir
     def testEmptyMesh(self):
       """ MEDLoader should be able to consistently write and read an empty mesh (coords array
       with 0 tuples """
-      fname = "Pyfile96.med" 
+      fname = "Pyfile96.med"
       m = MEDCouplingUMesh('toto', 2)
       m.setCoords(DataArrayDouble([], 0, 2))
       m.setConnectivity(DataArrayInt([]), DataArrayInt([0]))
@@ -4900,7 +5103,7 @@ class MEDLoaderTest3(unittest.TestCase):
       grp1=bary1.findIdsInRange(hauteur-1e-12,hauteur+1e-12) ; grp1.setName(grpName1)
       grp2=bary1.findIdsInRange(0.-1e-12,0.+1e-12) ; grp2.setName(grpName2)
       mesh.setGroupsAtLevel(-1,[grp1,grp2])
-      
+
       st=pickle.dumps(mesh,2)
       mm=pickle.loads(st)
       st2=pickle.dumps(mm,2)
@@ -4926,14 +5129,14 @@ class MEDLoaderTest3(unittest.TestCase):
       mm.addFamily("HOMARD________-2",-2)
       mm.addFamily("HOMARD________-3",-3)
       mm.setFamiliesIdsOnGroup("HOMARD",[-1,-2,-3])
-      
+
       eqName="MAILLES_A_RECOLLER_APRES_HOMARD"
       descEq="Cette equivalence decrit les mailles a recoller. Dans chaque correspondance, le premier numero est celui de la maille coupee ; le second numero est celui d'une des petites mailles en regard."
       mm.initializeEquivalences()
       eqs=mm.getEquivalences()
       eq0=eqs.appendEmptyEquivalenceWithName(eqName)
       eq0.setDescription(descEq)
-      corr=DataArrayInt([(0,3),(0,4),(0,5),(0,6),(1,7),(1,8),(1,9),(1,10),(2,11),(2,12),(2,13),(2,14)])
+      corr=DataArrayInt32([(0,3),(0,4),(0,5),(0,6),(1,7),(1,8),(1,9),(1,10),(2,11),(2,12),(2,13),(2,14)])
       eq0.setArray(-1,corr)
       self.assertEqual(eq0.getCell().size(),1)
       self.assertTrue(eq0.getCell().getArray(NORM_QUAD4).isEqual(corr))
@@ -5232,7 +5435,7 @@ class MEDLoaderTest3(unittest.TestCase):
       self.assertTrue(mm2.getFamilyFieldAtLevel(0) is None)
       self.assertTrue(mm2.getFamilyFieldAtLevel(1) is None)
       pass
-  
+
     @WriteInTmpDir
     def testAppendFieldProfileOnIntField(self):
       fname="Pyfile100.med"
@@ -5248,7 +5451,7 @@ class MEDLoaderTest3(unittest.TestCase):
       f=MEDCouplingFieldInt(ON_CELLS) ; f.setMesh(mesh)
       fieldName="FieldOnCell"
       f.setTime(1.2,1,1) ; f.setName(fieldName)
-      arr=DataArrayInt([101,102,103]) ; f.setArray(arr)
+      arr=DataArrayInt32([101,102,103]) ; f.setArray(arr)
       fmts.appendFieldProfile(f,mm,0,pfl)
       #
       mm.write(fname,2)
@@ -5339,7 +5542,7 @@ class MEDLoaderTest3(unittest.TestCase):
       f1ts=MEDFileField1TS(fname,fieldName,4,5)
       self.assertTrue(f4.isEqual(f1ts.field(mm),1e-12,1e-12))
       pass
-  
+
     @WriteInTmpDir
     def testMEDFileFieldEasyField2(self):
         """Same thantestMEDFileFieldEasyField1 except that here intfields are considered.
@@ -5359,7 +5562,7 @@ class MEDLoaderTest3(unittest.TestCase):
         m.insertNextCell(NORM_QUAD4,[104,105,106,107])
         mm[0]=m
         mm.write(fname,2)
-        arr0=DataArrayInt([10,11,12,13,100,101])
+        arr0=DataArrayInt32([10,11,12,13,100,101])
         f=MEDCouplingFieldInt(ON_CELLS) ; f.setArray(arr0) ; f.setMesh(m)
         f.setName(fieldName) ; f.setTime(2.,6,7)
         f0=f.deepCopy()
@@ -5380,7 +5583,7 @@ class MEDLoaderTest3(unittest.TestCase):
         fmts=MEDFileIntFieldMultiTS(fname,fieldName)
         self.assertTrue(f1.isEqual(fmts.field(8,9,mm),1e-12,0))
         ## Basic test on nodes on top level
-        f2=MEDCouplingFieldInt(ON_NODES) ; arr2=DataArrayInt([200,201,202]) ; arr2.setInfoOnComponent(0,"tutu") ; f2.setArray(arr2) ; f2.setMesh(m) ; f2.setTime(22.,23,24)
+        f2=MEDCouplingFieldInt(ON_NODES) ; arr2=DataArrayInt32([200,201,202]) ; arr2.setInfoOnComponent(0,"tutu") ; f2.setArray(arr2) ; f2.setMesh(m) ; f2.setTime(22.,23,24)
         f2.setName(fieldName)
         mm.write(fname,2)
         ff=MEDFileIntField1TS() ; ff.setFieldNoProfileSBT(f2) ; ff.write(fname,0)
@@ -5391,7 +5594,7 @@ class MEDLoaderTest3(unittest.TestCase):
         fmts=MEDFileIntFieldMultiTS(fname,fieldName)
         self.assertTrue(f2.isEqual(fmts.field(23,24,mm),1e-12,0))
         ## Node on elements
-        f3=MEDCouplingFieldInt(ON_GAUSS_NE) ; f3.setMesh(m) ; arr3=DataArrayInt([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]) ; f3.setArray(arr3) ; f3.setTime(0.5,2,3)
+        f3=MEDCouplingFieldInt(ON_GAUSS_NE) ; f3.setMesh(m) ; arr3=DataArrayInt32([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]) ; f3.setArray(arr3) ; f3.setTime(0.5,2,3)
         f3.setName(fieldName) ; f3.checkConsistencyLight()
         mm.write(fname,2) ; ff=MEDFileIntField1TS() ; ff.setFieldNoProfileSBT(f3) ; ff.write(fname,0)
         #
@@ -5402,7 +5605,7 @@ class MEDLoaderTest3(unittest.TestCase):
         f4=MEDCouplingFieldInt(ON_GAUSS_PT) ; f4.setMesh(m) ; f4.setName(fieldName)
         f4.setGaussLocalizationOnType(NORM_TRI3,[0.,0.,1.,0.,1.,1.],[0.1,0.1, 0.2,0.2, 0.3,0.3, 0.4,0.4, 0.5,0.5],[0.2,0.3,0.1,0.05,0.35])
         f4.setGaussLocalizationOnType(NORM_QUAD4,[0.,0.,1.,0.,1.,1.,0.,1.],[0.3,0.4, 0.6,0.7],[0.7,0.3]) ; f4.setTime(0.25,4,5)
-        arr4=DataArrayInt([0,1,2,3,4 ,10,11,12,13,14, 20,21,22,23,24, 30,31,32,33,34, 45,46, 55,56]) ; arr4.setInfoOnComponent(0,"abc") ; f4.setArray(arr4)
+        arr4=DataArrayInt32([0,1,2,3,4 ,10,11,12,13,14, 20,21,22,23,24, 30,31,32,33,34, 45,46, 55,56]) ; arr4.setInfoOnComponent(0,"abc") ; f4.setArray(arr4)
         f4.checkConsistencyLight()
         mm.write(fname,2) ; ff=MEDFileIntField1TS() ; ff.setFieldNoProfileSBT(f4) ; ff.write(fname,0)
         #
@@ -5494,13 +5697,13 @@ class MEDLoaderTest3(unittest.TestCase):
         mm[0]=m0
         mm.write(fname,2)
         # start slowly
-        f1=MEDCouplingFieldInt(ON_CELLS) ; f1.setName(fieldName) ; f1.setArray(DataArrayInt([(0,100),(1,101)])) ; f1.setMesh(mm[0]) ; f1.setTime(4.,1,2)
+        f1=MEDCouplingFieldInt(ON_CELLS) ; f1.setName(fieldName) ; f1.setArray(DataArrayInt32([(0,100),(1,101)])) ; f1.setMesh(mm[0]) ; f1.setTime(4.,1,2)
         f1ts=MEDFileIntField1TS() ; f1ts.setFieldNoProfileSBT(f1) ; f1ts.write(fname,0)
         #
         mm=MEDFileMesh.New(fname) ; f1ts=MEDFileIntField1TS(fname,fieldName,1,2)
         self.assertTrue(f1.isEqual(f1ts.field(mm),1e-12,0))
         # here f1 lying on level -1 not 0 check if "field" method detect it !
-        f1=MEDCouplingFieldInt(ON_CELLS) ; f1.setName(fieldName) ; f1.setArray(DataArrayInt([(0,100),(1,101),(0,100),(1,101),(0,100),(1,101)]))
+        f1=MEDCouplingFieldInt(ON_CELLS) ; f1.setName(fieldName) ; f1.setArray(DataArrayInt32([(0,100),(1,101),(0,100),(1,101),(0,100),(1,101)]))
         f1.setMesh(mm[-1]) # -1 is very important
         f1.setTime(16.,3,4)
         f1.checkConsistencyLight()
@@ -5512,7 +5715,7 @@ class MEDLoaderTest3(unittest.TestCase):
         # nodes on elements
         f3=MEDCouplingFieldInt(ON_GAUSS_NE)
         f3.setMesh(mm[-1]) # this line is important
-        arr3=DataArrayInt([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]) ; f3.setArray(arr3) ; f3.setTime(0.5,2,3)
+        arr3=DataArrayInt32([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]) ; f3.setArray(arr3) ; f3.setTime(0.5,2,3)
         f3.setName(fieldName) ; f3.checkConsistencyLight()
         mm.write(fname,2) ; ff=MEDFileIntField1TS() ; ff.setFieldNoProfileSBT(f3) ; ff.write(fname,0)
         #
@@ -5524,7 +5727,7 @@ class MEDLoaderTest3(unittest.TestCase):
         f4.setName(fieldName)
         f4.setGaussLocalizationOnType(NORM_TRI3,[0.,0.,1.,0.,1.,1.],[0.1,0.1, 0.2,0.2, 0.3,0.3, 0.4,0.4, 0.5,0.5],[0.2,0.3,0.1,0.05,0.35])
         f4.setGaussLocalizationOnType(NORM_QUAD4,[0.,0.,1.,0.,1.,1.,0.,1.],[0.3,0.4, 0.6,0.7],[0.7,0.3]) ; f4.setTime(0.25,4,5)
-        arr4=DataArrayInt([0,1,2,3,4 ,10,11,12,13,14, 20,21,22,23,24, 30,31,32,33,34, 45,46, 55,56]) ; arr4.setInfoOnComponent(0,"abc") ; f4.setArray(arr4)
+        arr4=DataArrayInt32([0,1,2,3,4 ,10,11,12,13,14, 20,21,22,23,24, 30,31,32,33,34, 45,46, 55,56]) ; arr4.setInfoOnComponent(0,"abc") ; f4.setArray(arr4)
         f4.checkConsistencyLight()
         mm.write(fname,2) ; ff=MEDFileIntField1TS() ; ff.setFieldNoProfileSBT(f4) ; ff.write(fname,0)
         mm=MEDFileMesh.New(fname) ; f1ts=MEDFileIntField1TS(fname,fieldName,4,5)
@@ -5900,6 +6103,40 @@ class MEDLoaderTest3(unittest.TestCase):
         CheckMFD(self,mfd)
         pass
 
+    @WriteInTmpDir
+    def testAggregateWithGroups(self):
+        """ Testing MEDFileUMesh::Aggretate when groups are present. """
+        def generate(grp_name, offset):
+            coo = DataArrayDouble([0., 1., 2.])
+            coo += offset
+            m = MEDCouplingCMesh("toto")
+            m.setCoords(coo, coo)
+            m = m.buildUnstructured()
+            mu = MEDFileUMesh.New()
+            mu.setMeshAtLevel(0, m)
+            g = DataArrayInt([0])
+            g.setName(grp_name)
+            g2 = DataArrayInt([1])
+            g2.setName("common")  # make a common group for all meshes being merged
+            mu.setGroupsAtLevel(0, [g, g2])
+            return mu
+
+        m1 = generate("A", 0.)
+        m2 = generate("B", 2.)
+        mm = MEDFileUMesh.Aggregate([m1,m2])
+
+        self.assertEqual(mm.getFamilyFieldAtLevel(0).getValues(), [-2, -3, -1, -1, -4, -5, -1, -1])
+        self.assertEqual(mm.getNumberFieldAtLevel(0), None)
+        refFamIds=[('Family_-1',-1),('Family_-2',-2),('Family_-3',-3), ('Family_-4',-4), ('Family_-5',-5)]
+        self.assertEqual(set(mm.getFamiliesNames()),set([elt[0] for elt in refFamIds]))
+        self.assertEqual(set([mm.getFamilyId(elt) for elt in mm.getFamiliesNames()]),set([elt[1] for elt in refFamIds]))
+        self.assertEqual(mm.getGroupsNames(),('A','B', 'common'))
+        self.assertEqual(mm.getGroupArr(0, 'A').getValues(), [0])
+        self.assertEqual(mm.getGroupArr(0, 'B').getValues(), [4])
+        self.assertEqual(mm.getGroupArr(0, 'common').getValues(), [1,5])
+
+        pass
+
     @WriteInTmpDir
     def testExtrudedMesh1(self):
         fname="Pyfile107.med"
@@ -5914,7 +6151,7 @@ class MEDLoaderTest3(unittest.TestCase):
         self.assertTrue(ex.isEqual(ex2,1e-12))
         self.assertTrue(ex.isEqual(ex3,1e-12))
         pass
-    
+
     @unittest.skipUnless(LooseVersion(MEDFileVersionStr())>=LooseVersion('3.2.1'),"This test requires at least MEDFile version 3.2.1")
     @WriteInTmpDir
     def testWriteInto30(self):
@@ -6142,7 +6379,7 @@ class MEDLoaderTest3(unittest.TestCase):
         f3=f1.deepCopy() ; f3+=2. ; f3.setTime(6.,3,4)
         self.assertTrue(ff1.field(mm).isEqual(f3,1e-12,1e-12))
         pass
-    
+
     @WriteInTmpDir
     def testFloat32InMEDFileFieldStar1(self):
         """Like testInt32InMEDFileFieldStar1 but with float32 :)"""
@@ -6173,7 +6410,7 @@ class MEDLoaderTest3(unittest.TestCase):
         self.assertTrue(a.isEqual(f1,1e-12,1e-12))
         ff2.setTime(1,2,3.)
         c=ff2.getUndergroundDataArray() ; c*=2
-        ff2.write(fname,0) # 2 time steps in 
+        ff2.write(fname,0) # 2 time steps in
         ffs1=MEDFileAnyTypeFieldMultiTS.New(fname,"VectorFieldOnCells")
         self.assertEqual(ffs1.getTimeSteps(),[(0, 1, 2.0), (1, 2, 3.0)])
         self.assertEqual(len(ffs1),2)
@@ -6339,7 +6576,7 @@ class MEDLoaderTest3(unittest.TestCase):
         fs2=fs.linearToQuadratic(mms,mmqs)
         self.myTester1(fs2,mmqs[0])
         pass
-    
+
     def myTester1(self,fs2,mmq):
         dataExp=DataArrayDouble([0.,0.,0.,1.,0.,0.,0.,1.,0.,1.,1.,0.,0.,0.,1.,1.,0.,1.,0.,1.,1.,1.,1.,1.,2.,0.,0.,3.,0.,0.,2.,1.,0.,3.,1.,0.,2.,0.,1.,3.,0.,1.,2.,1.,1.,3.,1.,1.,0.5, 0.,0.,0.,0.5, 0.,0.5, 1.,0.,1.,0.5, 0.,0.5, 0.,1.,0.,0.5, 1.,0.5, 1.,1.,1.,0.5, 1.,1.,0.,0.5, 0.,0.,0.5, 0.,1.,0.5, 1.,1.,0.5, 2.5, 0.,0.,2.,0.5, 0.,2.5, 1.,0.,3.,0.5, 0.,2.5, 0.,1.,2.,0.5, 1.,2.5, 1.,1.,3.,0.5, 1.,3.,0.,0.5, 2.,0.,0.5, 2.,1.,0.5, 3.,1.,0.5],40,3)
         dataExp1=DataArrayInt([1,0,2,3,5,4,6,7,16,17,18,19,20,21,22,23,24,25,26,27,9,8,10,11,13,12,14,15,28,29,30,31,32,33,34,35,36,37,38,39])
@@ -6463,7 +6700,7 @@ class MEDLoaderTest3(unittest.TestCase):
         self.assertTrue(mTest.getNodalConnectivity().isEqual(DataArrayInt([1,0,2,3,5,4,6,7,8,9,10,11,12,13,14,15,16,17,18,19])))
         self.assertTrue(mTest.getCoords().isEqual(DataArrayDouble([(2,0,0),(3,0,0),(2,1,0),(3,1,0),(2,0,1),(3,0,1),(2,1,1),(3,1,1),(2.5,0,0),(2,0.5,0),(2.5,1,0),(3,0.5,0),(2.5,0,1),(2,0.5,1),(2.5,1,1),(3,0.5,1),(3,0,0.5),(2,0,0.5),(2,1,0.5),(3,1,0.5)],20,3),1e-12))
         self.assertTrue(fToTest.getArray().isEqual(4*exp1,1e-12))
-        
+
         pass
 
     @WriteInTmpDir
@@ -6624,6 +6861,135 @@ class MEDLoaderTest3(unittest.TestCase):
         self.assertIn(fmts.getHeapMemorySize(),range(refSize,refSize+refSize//10))
         pass
 
+    def testZipFamilies1(self):
+        """
+        MEDFileMesh.zipFamilies tries to reduce family partitions under groups.
+        """
+        mname="mesh"
+        arr=DataArrayDouble(10) ; arr.iota()
+        m=MEDCouplingCMesh()
+        m.setCoords(arr,arr)
+        m=m.buildUnstructured()
+        m.setName(mname)
+        #
+        mm=MEDFileUMesh()
+        mm[0]=m
+        for i in range(m.getNumberOfCells()):
+            d = DataArrayInt([i])
+            d.setName("grp%d"%i)
+            mm.addGroup(0,d)
+            pass
+
+        grp_all = DataArrayInt.Range(0,m.getNumberOfCells(),1)
+        grp_all.setName("grp_all")
+        mm.addGroup(0,grp_all)
+        for i in range(m.getNumberOfCells()):
+            mm.removeGroup("grp{}".format(i))
+            pass
+        #
+        mm.zipFamilies() # the method to test
+        #
+        self.assertEqual(mm.getGroupsNames(),("grp_all",))
+        self.assertEqual(len(mm.getFamiliesNames()),1)
+        self.assertTrue(mm.getGroupArr(0,"grp_all").isEqualWithoutConsideringStr(DataArrayInt.Range(0,81,1)))
+        pass
+
+    def testZipFamilies2(self):
+        """
+        MEDFileMesh.zipFamilies tries to reduce family partitions under groups.
+        """
+        mname="mesh"
+        arr=DataArrayDouble(21) ; arr.iota()
+        m=MEDCouplingCMesh()
+        m.setCoords(arr)
+        m=m.buildUnstructured()
+        m.setName(mname)
+        #
+        mm=MEDFileUMesh()
+        mm[0]=m
+        # 1 and 3 to be merged
+        # 2 and 5 to be merged
+        mm.setFamilyFieldArr(0,DataArrayInt([-1,-1,-2,-3,-8, 0,-7,-7,-1,0, -6,-2,-5,-5,-2, -2,-2,-5,-4,-3]))
+        for i in range(1,9):
+            mm.setFamilyId("Fam_{}".format(i),-i)
+        mm.setFamiliesOnGroup("grp0",["Fam_1","Fam_3","Fam_6"])
+        mm.setFamiliesOnGroup("grp1",["Fam_1","Fam_2","Fam_3","Fam_5","Fam_6"])
+        mm.setFamiliesOnGroup("grp2",["Fam_2","Fam_5","Fam_6","Fam_7"])
+        #
+        grp0=DataArrayInt([0,1,3,8,10,19])
+        grp1=DataArrayInt([0,1,2,3,8,10,11,12,13,14,15,16,17,19])
+        grp2=DataArrayInt([2,6,7,10,11,12,13,14,15,16,17])
+        self.assertTrue(mm.getGroupArr(0,"grp0").isEqualWithoutConsideringStr(grp0))
+        self.assertTrue(mm.getGroupArr(0,"grp1").isEqualWithoutConsideringStr(grp1))
+        self.assertTrue(mm.getGroupArr(0,"grp2").isEqualWithoutConsideringStr(grp2))
+        self.assertEqual(mm.getGroupsNames(),('grp0','grp1','grp2'))
+        mm.zipFamilies()
+        self.assertEqual(mm.getGroupsNames(),('grp0','grp1','grp2'))
+        self.assertTrue(mm.getGroupArr(0,"grp0").isEqualWithoutConsideringStr(grp0))
+        self.assertTrue(mm.getGroupArr(0,"grp1").isEqualWithoutConsideringStr(grp1))
+        self.assertTrue(mm.getGroupArr(0,"grp2").isEqualWithoutConsideringStr(grp2))
+        self.assertEqual(mm.getFamiliesNames(),('Fam_1','Fam_2','Fam_6','Fam_7'))
+        pass
+
+    def testMeshConvertFromMEDFileGeoType(self):
+        self.assertEqual(MEDFileMesh.ConvertFromMEDFileGeoType(320),NORM_HEXA20)
+
+    @WriteInTmpDir
+    def testFieldInt64_0(self):
+        """
+        Small basic test with I/O of field in int64.
+        """
+        fname="Pyfile120.med"
+        arr = DataArrayDouble([0,1])
+        m = MEDCouplingCMesh() ; m.setCoords(arr,arr) ; m.setName("mesh") ; m=m.buildUnstructured()
+        f = MEDCouplingFieldInt64(ON_CELLS) ; f.setName("field")
+        v = 1234567890123456
+        f.setArray(DataArrayInt64([v]))
+        f.setMesh(m)
+        mm = MEDFileUMesh()
+        mm[0] = m
+        f1ts = MEDFileInt64Field1TS()
+        f1ts.setFieldNoProfileSBT(f)
+        fmts = MEDFileInt64FieldMultiTS()
+        fmts.pushBackTimeStep(f1ts)
+        fs = MEDFileFields()
+        fs.pushField(fmts)
+        mm.write(fname,2)
+        fs.write(fname,0)
+        #
+        mm = MEDFileMesh.New(fname)
+        fs = MEDFileFields(fname)
+        f = fs[0][0].field(mm)
+        self.assertTrue( isinstance(f,MEDCouplingFieldInt64) )
+        self.assertEqual( f.getArray().getIJ(0,0) , v )
+
+    @WriteInTmpDir
+    def testNonRegUMeshSubParts(self):
+        """
+        Non regression test focuses on accordance between time stamp and active data structure in MEDFileUMeshAggregateCompute class.
+        """
+        fname = "Pyfile121.med"
+        m0 = MEDCouplingUMesh("mesh",1)
+        coords = DataArrayDouble([(0,0),(1,0),(2,0)])
+        m0.setCoords(coords)
+        m0.allocateCells()
+        m0.insertNextCell(NORM_SEG2,[1,2])
+        mm = MEDFileUMesh()
+        mm[0] = m0
+        m1 = MEDCoupling1SGTUMesh(m0.getName(), NORM_POINT1)
+        m1.setCoords(m0.getCoords())
+        m1.setNodalConnectivity(DataArrayInt([1,2]))
+        m1.setName(m0.getName())
+        mm[-1] = m1
+        fni = mm.computeFetchedNodeIds() # <- This invokation of const method implies 1SGTU parts computation
+        mm.zipCoords() # <- This call changes the coords and connectivity
+        mm.write(fname,2)
+        #
+        mm = MEDFileMesh.New(fname)
+        mm[0].checkConsistency() # <- check that correct DS has been taken at write time into MEDFileUMeshAggregateCompute
+        self.assertTrue( m0.isEqual(mm[0],1e-12) )
+        pass
+
     pass
 
 if __name__ == "__main__":