Salome HOME
Unwanted trailing spaces ...
[tools/medcoupling.git] / src / MEDLoader / Swig / MEDLoaderTest3.py
index 29aa66cb71ad8b755147ae5eabf1fee79a49f3a2..5b89f87060ba398e8ab6f0f0eac045f8adae40ce 100644 (file)
@@ -1,5 +1,5 @@
 #  -*- coding: iso-8859-1 -*-
-# Copyright (C) 2007-2015  CEA/DEN, EDF R&D
+# Copyright (C) 2007-2020  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
 #
 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
-# Author : Anthony Geay (CEA/DEN)
+# Author : Anthony Geay (EDF R&D)
 
 from MEDLoader import *
 import unittest
 import platform
 from math import pi,e,sqrt
-from MEDLoaderDataForTest import MEDLoaderDataForTest
+from MEDLoaderDataForTest import MEDLoaderDataForTest,WriteInTmpDir
+from MEDLoaderDataForTest import TestWriteUMeshesRW1,TestMultiFieldShuffleRW1,GeneratePyfile7,GeneratePyfile10,GeneratePyfile12,GeneratePyfile13,GeneratePyfile14,GeneratePyfile18,GeneratePyfile19
+from distutils.version import LooseVersion
 
-class MEDLoaderTest(unittest.TestCase):
+import sys
+if sys.version_info.major < 3:
+    import cPickle as pickle
+else:
+    import pickle
+
+class StdOutRedirect(object):
+    def __init__(self,fileName):
+        import os,sys
+        sys.stderr.flush()
+        self.stdoutOld=os.dup(2)
+        self.fdOfSinkFile=os.open(fileName,os.O_CREAT | os.O_RDWR)
+        fd2=os.dup2(self.fdOfSinkFile,2)
+        self.origPyVal=sys.stderr
+        class FlushFile(object):
+            def __init__(self,f):
+                self.f=f
+            def write(self,st):
+                self.f.write(st)
+                self.f.flush()
+            def flush(self):
+                return self.f.flush()
+            def isatty(self):
+                return self.f.isatty()
+            def close(self):
+                os.fsync(self.f)
+                self.f.close();
+        sys.stderr=FlushFile(os.fdopen(self.fdOfSinkFile,"w"))
+    def __del__(self):
+        import os,sys
+        sys.stderr.close()
+        sys.stderr=self.origPyVal
+        os.fsync(2)
+        os.dup2(self.stdoutOld,2)
+        os.close(self.stdoutOld)
+
+class MEDLoaderTest3(unittest.TestCase):
+    @WriteInTmpDir
     def testMEDMesh1(self):
+        GeneratePyfile18(self)
         fileName="Pyfile18.med"
         mname="ExampleOfMultiDimW"
         medmesh=MEDFileMesh.New(fileName,mname)
@@ -40,7 +80,9 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(m2_0.isEqual(m2_1,1e-12));
         pass
 
+    @WriteInTmpDir
     def testMEDMesh2(self):
+        GeneratePyfile10(self)
         fileName="Pyfile10.med"
         mname="3DToto"
         outFileName="MEDFileMesh1.med"
@@ -83,6 +125,7 @@ class MEDLoaderTest(unittest.TestCase):
         pass
 
     # this tests emulates MEDMEM ( Except that it works ! ) The permutation are NOT taken into account
+    @WriteInTmpDir
     def testMEDMesh3(self):
         outFileName="MEDFileMesh3.med"
         c=DataArrayDouble.New()
@@ -144,10 +187,10 @@ class MEDLoaderTest(unittest.TestCase):
         g2_1.setName("G2")
         mm.setGroupsAtLevel(-1,[g1_1,g2_1],False)
         g1_N=DataArrayInt.New()
-        g1_N.setValues(range(8),8,1)
+        g1_N.setValues(list(range(8)),8,1)
         g1_N.setName("G1")
         g2_N=DataArrayInt.New()
-        g2_N.setValues(range(9),9,1)
+        g2_N.setValues(list(range(9)),9,1)
         g2_N.setName("G2")
         mm.setGroupsAtLevel(1,[g1_N,g2_N],False)
         mm.createGroupOnAll(0,"GrpOnAllCell")
@@ -166,7 +209,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(g2_N.isEqual(t));
         self.assertTrue(mm.existsGroup("GrpOnAllCell"));
         t=mm.getGroupArr(0,"GrpOnAllCell")
-        self.assertTrue(t.getValues()==range(5))
+        self.assertTrue(t.getValues()==list(range(5)))
         #
         mmCpy=mm.deepCopy()
         self.assertTrue(mm.isEqual(mmCpy,1e-12)[0]) ; del mm
@@ -198,6 +241,7 @@ class MEDLoaderTest(unittest.TestCase):
         pass
 
     # this test is the testMEDMesh3 except that permutation is dealed here
+    @WriteInTmpDir
     def testMEDMesh4(self):
         outFileName="MEDFileMesh4.med"
         c=DataArrayDouble.New()
@@ -244,6 +288,7 @@ class MEDLoaderTest(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);
@@ -301,11 +346,13 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(not mm2.existsFamily("Family_-8"))
         mm2.createGroupOnAll(-1,"GrpOnAllFace")
         self.assertTrue(mm2.existsFamily("Family_-8"))
-        self.assertEqual(range(3),mm2.getGroupArr(-1,"GrpOnAllFace").getValues())
+        self.assertEqual(list(range(3)),mm2.getGroupArr(-1,"GrpOnAllFace").getValues())
         pass
 
     #testing persistence of retrieved arrays
+    @WriteInTmpDir
     def testMEDMesh5(self):
+        GeneratePyfile18(self)
         fileName="Pyfile18.med"
         mname="ExampleOfMultiDimW"
         medmesh=MEDFileUMesh.New(fileName,mname)
@@ -316,7 +363,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertEqual(20,da1.getNumberOfTuples())
         pass
 
-    def testMEDMesh6(self):
+    def internalMEDMesh6(self):
         outFileName="MEDFileMesh5.med"
         m=MEDFileCMesh.New()
         m.setTime(-1,-1,2.3)
@@ -363,8 +410,13 @@ class MEDLoaderTest(unittest.TestCase):
         m1.setTimeUnit(m.getTimeUnit())
         m1.setDescription(m.getDescription())
         self.assertTrue(m2.isEqual(m1,1e-12));
+
+    @WriteInTmpDir
+    def testMEDMesh6(self):
+        self.internalMEDMesh6()
         pass
 
+    @WriteInTmpDir
     def testMEDMesh7(self):
         fileName="Pyfile24.med"
         m2,m1,m0,f2,f1,f0,p,n2,n1,n0,fns,fids,grpns,famIdsPerGrp=MEDLoaderDataForTest.buildMultiLevelMesh_1()
@@ -381,11 +433,11 @@ class MEDLoaderTest(unittest.TestCase):
         m.setRenumFieldArr(-1,n1)
         m.setRenumFieldArr(-2,n0)
         nbOfFams=len(fns)
-        for i in xrange(nbOfFams):
+        for i in range(nbOfFams):
             m.addFamily(fns[i],fids[i])
             pass
         nbOfGrps=len(grpns)
-        for i in xrange(nbOfGrps):
+        for i in range(nbOfGrps):
             m.setFamiliesIdsOnGroup(grpns[i],famIdsPerGrp[i])
             pass
         m.setName(m2.getName())
@@ -410,7 +462,9 @@ class MEDLoaderTest(unittest.TestCase):
         pass
 
     #emulation of pointe.med file.
+    @WriteInTmpDir
     def testMEDField1(self):
+        TestMultiFieldShuffleRW1(self)
         mm=MEDFileMesh.New("Pyfile17.med")
         mm.write("Pyfile17_bis.med",2)
         ff=MEDFileFieldMultiTS("Pyfile17.med")
@@ -434,7 +488,9 @@ class MEDLoaderTest(unittest.TestCase):
         pass
 
     #profiles
+    @WriteInTmpDir
     def testMEDField2(self):
+        GeneratePyfile19(self)
         mm=MEDFileMesh.New("Pyfile19.med")
         mm.write("Pyfile19_bis.med",2)
         ff=MEDFileFieldMultiTS.New("Pyfile19.med")
@@ -443,7 +499,9 @@ class MEDLoaderTest(unittest.TestCase):
         pass
 
     #gauss points
+    @WriteInTmpDir
     def testMEDField3(self):
+        GeneratePyfile13(self)
         mm=MEDFileMesh.New("Pyfile13.med")
         mm.write("Pyfile13_bis.med",2)
         ff=MEDFileFieldMultiTS.New("Pyfile13.med","MyFirstFieldOnGaussPoint")
@@ -461,7 +519,9 @@ class MEDLoaderTest(unittest.TestCase):
         pass
 
     #gauss NE
+    @WriteInTmpDir
     def testMEDField4(self):
+        GeneratePyfile14(self)
         mm=MEDFileMesh.New("Pyfile14.med")
         mm.write("Pyfile14_bis.med",2)
         ff=MEDFileFieldMultiTS.New("Pyfile14.med","MyFieldOnGaussNE")
@@ -473,7 +533,9 @@ class MEDLoaderTest(unittest.TestCase):
         pass
 
     # MEDField get/set on pointe.med
+    @WriteInTmpDir
     def testMEDField5(self):
+        TestMultiFieldShuffleRW1(self)
         ff=MEDFileField1TS.New("Pyfile17.med","MeasureOfMesh_Extruded",1,2)
         f=ff.getFieldAtLevel(ON_CELLS,0)
         f2=ReadFieldCell("Pyfile17.med","Extruded",0,"MeasureOfMesh_Extruded",1,2)
@@ -494,13 +556,16 @@ class MEDLoaderTest(unittest.TestCase):
         pass
 
     # MEDField get/set on profiles nodes
+    @WriteInTmpDir
     def testMEDField6(self):
+        GeneratePyfile7(self)
         ff=MEDFileFieldMultiTS.New("Pyfile7.med","VectorFieldOnNodes")
         its=ff.getIterations()
         self.assertRaises(InterpKernelException,ff.getFieldAtLevel,ON_CELLS,its[0][0],its[0][1],0)# request on cell and it is not on cells
         f=ff.getFieldAtLevel(ON_NODES,its[0][0],its[0][1],0)
         f2=ReadFieldNode("Pyfile7.med",'3DSurfMesh_1',0,"VectorFieldOnNodes",its[0][0],its[0][1])
         self.assertTrue(f.isEqual(f2,1e-12,1e-12))
+        GeneratePyfile19(self)
         ff=MEDFileFieldMultiTS.New("Pyfile19.med","VFieldOnNodes")
         its=ff.getIterations()
         f=ff.getFieldAtLevel(ON_NODES,its[0][0],its[0][1],0)
@@ -511,7 +576,9 @@ class MEDLoaderTest(unittest.TestCase):
         pass
 
     # MEDField get/set on profiles cells
+    @WriteInTmpDir
     def testMEDField7(self):
+        GeneratePyfile12(self)
         ff=MEDFileFieldMultiTS.New("Pyfile12.med","VectorFieldOnCells")
         its=ff.getIterations()
         f=ff.getFieldAtLevel(ON_CELLS,its[0][0],its[0][1],0)
@@ -520,6 +587,7 @@ class MEDLoaderTest(unittest.TestCase):
         pass
 
     #first test of assignation. No profile and types sorted by type.
+    @WriteInTmpDir
     def testMEDField8(self):
         fname="Pyfile25.med"
         f1=MEDLoaderDataForTest.buildVecFieldOnCells_1();
@@ -539,6 +607,10 @@ class MEDLoaderTest(unittest.TestCase):
         ff1.setTime(3,4,2.3)
         itt,orr,ti=ff1.getTime()
         self.assertEqual(3,itt); self.assertEqual(4,orr); self.assertAlmostEqual(2.3,ti,14);
+        f1.setTime(5.5,7,8)
+        ff1.copyTimeInfoFrom(f1)
+        itt,orr,ti=ff1.getTime()
+        self.assertEqual(7,itt); self.assertEqual(8,orr); self.assertAlmostEqual(5.5,ti,14);
         da,infos=ff1.getUndergroundDataArrayExt()
         f2.getArray().setName(da.getName())#da has the same name than f2
         self.assertTrue(da.isEqual(f2.getArray(),1e-12))
@@ -615,7 +687,8 @@ class MEDLoaderTest(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"
         d=MEDFileData.New()
@@ -672,7 +745,8 @@ class MEDLoaderTest(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
         fname="Pyfile30.med"
@@ -711,7 +785,8 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(pfl.isEqualWithoutConsideringStr(da))
         self.assertTrue(vals.isEqual(d,1e-14))
         pass
-    
+
+    @WriteInTmpDir
     def testMEDField10(self):
         fname="Pyfile31.med"
         m1=MEDLoaderDataForTest.build2DMesh_1()
@@ -746,8 +821,9 @@ class MEDLoaderTest(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):
         fname="Pyfile32.med"
         m1=MEDLoaderDataForTest.build2DMesh_1()
@@ -774,6 +850,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(vals.isEqual(d,1e-14))
         pass
 
+    @WriteInTmpDir
     def testMEDField12(self):
         fname="Pyfile33.med"
         m1=MEDLoaderDataForTest.build2DMesh_1()
@@ -807,12 +884,13 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(vals.isEqual(d,1e-14))
         pass
 
+    @WriteInTmpDir
     def testMEDField13(self):
         fname="Pyfile34.med"
         m1=MEDLoaderDataForTest.build2DMesh_1()
         m1.renumberCells([0,1,4,2,3,5],False)
         tmp=m1.getName();
-        m1=m1.buildPartOfMySelf(range(5),True) ; m1.setName(tmp) # suppression of last cell that is a polygon
+        m1=m1.buildPartOfMySelf(list(range(5)),True) ; m1.setName(tmp) # suppression of last cell that is a polygon
         mm1=MEDFileUMesh.New() ; mm1.setCoords(m1.getCoords()) ; mm1.setMeshAtLevel(0,m1) ;
         mm1.write(fname,2)
         ff1=MEDFileField1TS.New()
@@ -834,12 +912,13 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(vals.isEqual(d,1e-14))
         pass
 
+    @WriteInTmpDir
     def testMEDField14(self):
         fname="Pyfile35.med"
         m1=MEDLoaderDataForTest.build2DMesh_1()
         m1.renumberCells([0,1,4,2,3,5],False)
         tmp=m1.getName();
-        m1=m1.buildPartOfMySelf(range(5),True) ; m1.setName(tmp) # suppression of last cell that is a polygon
+        m1=m1.buildPartOfMySelf(list(range(5)),True) ; m1.setName(tmp) # suppression of last cell that is a polygon
         mm1=MEDFileUMesh.New() ; mm1.setCoords(m1.getCoords()) ; mm1.setMeshAtLevel(0,m1) ;
         mm1.write(fname,2)
         ff1=MEDFileFieldMultiTS.New()
@@ -871,7 +950,8 @@ class MEDLoaderTest(unittest.TestCase):
         pass
     # Tricky test of the case of in a MED file containing a Field on GAUSS_NE is lying on a profile that is reality represents all the geom entities of a level.
     # By default when using setFieldProfile method such profile is not created because it is not useful ! So here a trick is used to force MEDLoader to do that
-    # for the necessity of the test ! The idea is too create artificially a mesh having one more fictious cell per type and to roll back right after !
+    # for the necessity of the test ! The idea is too create artificially a mesh having one more fictitious cell per type and to roll back right after !
+    @WriteInTmpDir
     def testMEDField15(self):
         fname="Pyfile36.med"
         m0=MEDLoaderDataForTest.build2DMesh_1()
@@ -886,7 +966,7 @@ class MEDLoaderTest(unittest.TestCase):
         da=DataArrayInt.New(); da.setValues([0,1,3,4,6],5,1) ; da.setName("sup1NodeElt")
         #
         ff1.setFieldProfile(f1,mm1,0,da)
-        m1=m0.buildPartOfMySelf(range(5),True) ; m1.setName(tmp) ; mm1.setMeshAtLevel(0,m1) ;
+        m1=m0.buildPartOfMySelf(list(range(5)),True) ; m1.setName(tmp) ; mm1.setMeshAtLevel(0,m1) ;
         mm1.write(fname,2)
         ff1.write(fname,0)
         f1=ff1.getFieldOnMeshAtLevel(ON_GAUSS_NE,m1,0)
@@ -895,6 +975,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(f1.getArray().isEqual(f2,1e-12))
         pass
     # Test for getFieldAtTopLevel method
+    @WriteInTmpDir
     def testMEDField16(self):
         fname="Pyfile37.med"
         f1=MEDLoaderDataForTest.buildVecFieldOnCells_1();
@@ -942,6 +1023,7 @@ class MEDLoaderTest(unittest.TestCase):
         pass
 
     # Non regression test to check that globals are correctly appended on MEDFileFields::setFieldAtPos
+    @WriteInTmpDir
     def testMEDField17(self):
         fname="Pyfile39.med"
         m1=MEDLoaderDataForTest.build2DMesh_1()
@@ -970,6 +1052,7 @@ class MEDLoaderTest(unittest.TestCase):
         pass
 
     # Non regression test to check that globals are correctly appended on MEDFileFields::setFieldAtPos
+    @WriteInTmpDir
     def testMEDField18(self):
         fname="Pyfile40.med"
         m1=MEDLoaderDataForTest.build2DMesh_1()
@@ -995,12 +1078,15 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(f4.getArray().isEqual(f1.getArray(),1e-12))
         pass
 
+    @WriteInTmpDir
     def testMEDFieldBug1(self):
+        GeneratePyfile13(self)
         fname="Pyfile13.med"
         d=MEDFileData.New(fname)
         self.assertEqual(('Loc_MyFirstFieldOnGaussPoint_NORM_QUAD4_1','Loc_MyFirstFieldOnGaussPoint_NORM_TRI3_0','Loc_MyFirstFieldOnGaussPoint_NORM_TRI6_2'),d.getFields().getFieldAtPos(0).getLocs())
         pass
 
+    @WriteInTmpDir
     def testMEDMesh8(self):
         m=MEDLoaderDataForTest.build1DMesh_1()
         m.convertQuadraticCellsToLinear()
@@ -1042,8 +1128,9 @@ class MEDLoaderTest(unittest.TestCase):
         g=mm.getGroupArr(0,"g1")
         self.assertTrue(g.isEqual(g1));
         pass
-    
+
     # bug detected by gauthier
+    @WriteInTmpDir
     def testMEDLoaderMEDLoaderNSReadFieldDoubleDataInMedFile(self):
         fname="Pyfile41.med"
         f1=MEDLoaderDataForTest.buildVecFieldOnCells_1();
@@ -1076,6 +1163,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(f4.isEqual(f2,1e-12,1e-12))
         pass
 
+    @WriteInTmpDir
     def testMEDLoaderMultiLevelCellField1(self):
         fname="Pyfile42.med"
         m2,m1,m0,f2,f1,f0,p,n2,n1,n0,fns,fids,grpns,famIdsPerGrp=MEDLoaderDataForTest.buildMultiLevelMesh_1()
@@ -1146,6 +1234,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertEqual(ff2.getFieldSplitedByType(),[(0, [(0, (0, 4), '', '')]), (1, [(0, (4, 84), '', '')])])
         pass
 
+    @WriteInTmpDir
     def testFieldOnPflRetrieveOnMdimRelMax1(self):
         fname="Pyfile43.med"
         m2,m1,m0,f2,f1,f0,p,n2,n1,n0,fns,fids,grpns,famIdsPerGrp=MEDLoaderDataForTest.buildMultiLevelMesh_1()
@@ -1172,17 +1261,17 @@ class MEDLoaderTest(unittest.TestCase):
         expected1=[1.,10.,100.,2.,20.,200.]
         nodeCoordsWithValue1=[10.,2.5,0.]
         nodeCoordsWithValue2=[10.,3.75,0.]
-        for i in xrange(3):
+        for i in range(3):
             self.assertAlmostEqual(nodeCoordsWithValue1[i],tes0.getMesh().getCoordinatesOfNode(0)[i],13);
             self.assertAlmostEqual(nodeCoordsWithValue2[i],tes0.getMesh().getCoordinatesOfNode(1)[i],13);
             pass
-        for i in xrange(6):
+        for i in range(6):
             self.assertAlmostEqual(expected1[i],tes0.getArray().getIJ(0,i),13);
             pass
         del tes0
         #
         tes1=f.getFieldOnMeshAtLevel(ON_NODES,1,m)
-        self.assertEqual(ON_CELLS,tes1.getTypeOfField())# it is not a bug even if ON_NODES has been sepecified
+        self.assertEqual(ON_CELLS,tes1.getTypeOfField())# it is not a bug even if ON_NODES has been specified
         self.assertEqual(0,tes1.getMesh().getMeshDimension())
         self.assertEqual(2,tes1.getMesh().getNumberOfCells())
         self.assertEqual(135,tes1.getMesh().getNumberOfNodes())
@@ -1190,7 +1279,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertEqual([0,2,4],tes1.getMesh().getNodalConnectivityIndex().getValues())
         self.assertEqual(2,tes1.getArray().getNumberOfTuples())
         self.assertEqual(3,tes1.getArray().getNumberOfComponents())
-        for i in xrange(6):
+        for i in range(6):
             self.assertAlmostEqual(expected1[i],tes1.getArray().getIJ(0,i),13);
             pass
         m.write(fname,2)
@@ -1209,16 +1298,16 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertEqual(2,tes2.getArray().getNumberOfTuples())
         self.assertEqual(3,tes2.getArray().getNumberOfComponents())
         expected2=[2.,20.,200.,1.,10.,100.]
-        for i in xrange(3):
+        for i in range(3):
             self.assertAlmostEqual(nodeCoordsWithValue1[i],tes2.getMesh().getCoordinatesOfNode(0)[i],13);
             self.assertAlmostEqual(nodeCoordsWithValue2[i],tes2.getMesh().getCoordinatesOfNode(1)[i],13);
             pass
-        for i in xrange(6):
+        for i in range(6):
             self.assertAlmostEqual(expected2[i],tes2.getArray().getIJ(0,i),13);#compare tes2 and tes3
             pass
         #
         tes3=f.getFieldOnMeshAtLevel(ON_NODES,1,m)
-        self.assertEqual(ON_CELLS,tes3.getTypeOfField())# it is not a bug even if ON_NODES has been sepecified
+        self.assertEqual(ON_CELLS,tes3.getTypeOfField())# it is not a bug even if ON_NODES has been specified
         self.assertEqual(0,tes3.getMesh().getMeshDimension())
         self.assertEqual(2,tes3.getMesh().getNumberOfCells())
         self.assertEqual(135,tes3.getMesh().getNumberOfNodes())
@@ -1226,11 +1315,12 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertEqual([0,2,4],tes3.getMesh().getNodalConnectivityIndex().getValues())
         self.assertEqual(2,tes3.getArray().getNumberOfTuples())
         self.assertEqual(3,tes3.getArray().getNumberOfComponents())
-        for i in xrange(6):
+        for i in range(6):
             self.assertAlmostEqual(expected1[i],tes3.getArray().getIJ(0,i),13);
             pass
         pass
 
+    @WriteInTmpDir
     def testBuildInnerBoundaryAlongM1Group1(self):
         fname="Pyfile44.med"
         m=MEDCouplingCMesh.New()
@@ -1281,6 +1371,7 @@ class MEDLoaderTest(unittest.TestCase):
         mm.write(fname,2)
         pass
 
+    @WriteInTmpDir
     def testBuildInnerBoundaryAlongM1Group2(self):
         fname="Pyfile45.med"
         m=MEDCouplingCMesh.New()
@@ -1328,9 +1419,10 @@ class MEDLoaderTest(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
     def testBuildInnerBoundaryAlongM1Group3(self):
         """ Test buildInnerBoundaryAlongM1Group() with *non-connex* cracks """
         fname = "Pyfile73.med"
@@ -1340,9 +1432,9 @@ class MEDLoaderTest(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)
@@ -1371,17 +1463,135 @@ class MEDLoaderTest(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):
+        """ Test case where cells touch the M1 group on some nodes only and not on full edges (triangle mesh for ex)
+        """
+        coo = DataArrayDouble([0.,0., 1.,0., 2.,0., 3.,0.,
+                               0.,1., 1.,1., 2.,1., 3.,1.,
+                               0.,2., 1.,2., 2.,2., 3.,2.], 12, 2)
+        conn = [3,0,4,1,  3,1,4,5,
+                3,5,9,10, 3,5,10,6,
+                3,2,6,7,  3,2,7,3,
+                3,4,8,9,  3,4,9,5,
+                3,1,5,6,  3,1,6,2,
+                3,6,10,11,3,6,11,7]
+        # Only TRI3:
+        connI = DataArrayInt()
+        connI.alloc(13, 1); connI.iota(); connI *= 4
+        m2 = MEDCouplingUMesh("2D", 2)
+        m2.setCoords(coo)
+        m2.setConnectivity(DataArrayInt(conn), connI)
+        m2.checkConsistency()
+        m1, _, _, _, _ = m2.buildDescendingConnectivity()
+        grpIds = DataArrayInt([9,11]); grpIds.setName("group")
+        grpIds2 = DataArrayInt([0,1]); grpIds2.setName("group2")
+        mfu = MEDFileUMesh()
+        mfu.setMeshAtLevel(0, m2)
+        mfu.setMeshAtLevel(-1, m1)
+        mfu.setGroupsAtLevel(-1, [grpIds, grpIds2])
+        nNod = m2.getNumberOfNodes()
+        nodesDup, cells1, cells2 = mfu.buildInnerBoundaryAlongM1Group("group")
+        m2_bis = mfu.getMeshAtLevel(0)
+        m2_bis.checkConsistency()
+        m1_bis = mfu.getMeshAtLevel(-1)
+        m1_bis.checkConsistency()
+        self.assertEqual(nNod+2, mfu.getNumberOfNodes())
+        self.assertEqual(nNod+2, m2_bis.getNumberOfNodes())
+        self.assertEqual(nNod+2, m1_bis.getNumberOfNodes())
+        self.assertEqual([6,7], nodesDup.getValues())
+        self.assertEqual([2.,1., 3.,1.], m2_bis.getCoords()[nNod:].getValues())
+        self.assertEqual(set([3,10,11]), set(cells1.getValues()))
+        self.assertEqual(set([8,9,4,5]), set(cells2.getValues()))
+        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())
+        self.assertEqual(ref1,mfu.getMeshAtLevel(0)[[4,5,8,9]].getNodalConnectivity().getValues())
+        self.assertRaises(InterpKernelException,mfu.getGroup(-1,"group_dup").checkGeoEquivalWith,mfu.getGroup(-1,"group"),2,1e-12) # Grp_dup and Grp are not equal considering connectivity only
+        mfu.getGroup(-1,"group_dup").checkGeoEquivalWith(mfu.getGroup(-1,"group"),12,1e-12)# Grp_dup and Grp are equal considering connectivity and coordinates
+        m_bis0 = mfu.getMeshAtLevel(-1)
+        m_desc, _, _, _, _ = m_bis0.buildDescendingConnectivity()
+        m_bis0.checkDeepEquivalOnSameNodesWith(mfu.getMeshAtLevel(-1), 2, 9.9999999)
+
+    @WriteInTmpDir
+    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,
+        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,
+         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,
+         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,
+         21,26, 23, 44, 14, 38, 44, 14, 24, 14, 39, 37, 41, 22, 14, 21, 33, 45, 42, 14, 27, 22, 39, 41, 14, 23, 26, 21, 3, 14, 27, 18, 22, 41, 14, 39, 36, 44, 17, 14, 21, 26, 44, 40,
+         14, 39, 37, 22, 23, 14, 37, 38, 41, 19, 14, 25, 12, 13, 41, 14, 30, 26, 43, 45, 14, 38, 36, 13, 14, 14, 12, 36, 13, 41, 14, 20, 44, 21, 37, 14, 16, 36, 12, 41, 14, 39, 36,
+         17, 16, 14, 44, 20, 24, 38, 14, 27, 16, 12, 41, 14, 26, 15, 17, 44, 14, 19, 18, 41, 37, 14, 40, 45, 26, 15, 14, 37, 38, 19, 20, 14, 17, 15, 26, 2, 14, 39, 36, 16, 41, 14,
+         24, 21, 44, 40, 14, 16, 7, 27, 12, 14, 22, 18, 37, 41, 14, 21, 31, 45, 24, 14, 44, 40, 15, 24, 14, 24, 45, 15, 28, 14, 44, 40, 26, 15, 14, 24, 20, 21, 0, 14, 38, 36, 14,
+         44, 14, 39, 37, 23, 44, 14, 45, 31, 42, 32, 14, 25, 18, 19, 4, 14, 36, 44, 17, 15, 14, 25, 19, 18, 41, 14, 24, 15, 14, 1, 14, 45, 24, 34, 28, 14, 35, 45, 30, 43, 14, 17,
+         44, 39, 26, 14, 44, 23, 21, 37, 14, 30, 45, 29, 15, 14, 45, 35, 33, 43, 14, 30, 15, 26, 45, 14, 31, 21, 0, 24, 14, 33, 35, 32, 10, 14, 29, 45, 34, 28, 14, 32, 45, 34,
+         29, 14, 45, 31, 32, 34, 14, 33, 26, 45, 43, 14, 45, 31, 34, 24, 14, 33, 26, 21, 45, 14, 11, 30, 35, 29, 14, 33, 35, 45, 32, 14, 33, 45, 42, 32, 14, 32, 8, 34, 31, 14,
+         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,
+         360, 365, 370, 375, 380, 385, 390, 395, 400, 405, 410, 415, 420, 425, 430]
+        m3 = MEDCouplingUMesh("3D", 3)
+        m3.setCoords(coo)
+        m3.setConnectivity(DataArrayInt(c0), DataArrayInt(cI0))
+        m3.checkConsistency()
+        m2, _, _, _, _ = m3.buildDescendingConnectivity()
+        grpIds = DataArrayInt([36,74]); grpIds.setName("group")
+        mfu = MEDFileUMesh()
+        mfu.setMeshAtLevel(0, m3)
+        mfu.setMeshAtLevel(-1, m2)
+        grpIds3D = DataArrayInt([0,1]); grpIds3D.setName("group_3d")
+        mfu.setGroupsAtLevel(0, [grpIds3D])  # just to check preservation of 3D group
+        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+1, mfu.getNumberOfNodes())
+        self.assertEqual(nNod+1, m3_bis.getNumberOfNodes())
+        self.assertEqual(nNod+1, m2_bis.getNumberOfNodes())
+        self.assertEqual([3], nodesDup.getValues())
+        self.assertEqual(m3_bis.getCoords()[3].getValues(), m3_bis.getCoords()[nNod:].getValues())
+        self.assertEqual(set([22]), set(cells1.getValues()))
+        self.assertEqual(set([77]), set(cells2.getValues()))
+        self.assertEqual([36,74],mfu.getGroupArr(-1,"group").getValues())
+        self.assertEqual([0,1],mfu.getGroupArr(0,"group_3d").getValues())
+        self.assertEqual([213],mfu.getGroupArr(-1,"group_dup").getValues())  # here only one cell has been duplicated
+        m_bis0 = mfu.getMeshAtLevel(-1)
+        m_desc, _, _, _, _ = m_bis0.buildDescendingConnectivity()
+        m_bis0.checkDeepEquivalOnSameNodesWith(mfu.getMeshAtLevel(-1), 2, 9.9999999)
+        pass
+
+    @WriteInTmpDir
     def testBasicConstructors(self):
+        GeneratePyfile18(self)
         fname="Pyfile18.med"
+        TestWriteUMeshesRW1(self)
         m=MEDFileMesh.New(fname)
         m=MEDFileMesh.New(fname,"ExampleOfMultiDimW",-1,-1)
         m=MEDFileMesh.New(fname)
         m=MEDFileUMesh(fname,"ExampleOfMultiDimW",-1,-1)
         m=MEDFileUMesh(fname)
         m=MEDFileUMesh()
-        self.testMEDMesh6()
+        self.internalMEDMesh6()
         m=MEDFileCMesh("MEDFileMesh5.med")
         m=MEDFileCMesh("MEDFileMesh5.med","myFirstCartMesh",-1,-1)
         m=MEDFileCMesh()
@@ -1410,11 +1620,12 @@ class MEDLoaderTest(unittest.TestCase):
         pass
 
     # This is a non regression test. When a field lies partially on a mesh but fully on one of its geometric type.
+    @WriteInTmpDir
     def testBugSemiPartialField(self):
         fname="Pyfile46.med"
         m=MEDLoaderDataForTest.build2DMesh_3()
         m=m[:10] ; m.setName("mesh")
-        f=m.getMeasureField(ON_CELLS)
+        f=m.getMeasureField(False)
         f=f.buildNewTimeReprFromThis(ONE_TIME,False)
         f.setTime(5.5,3,4)
         f.setName("SemiPartialField")
@@ -1439,6 +1650,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(fread2.isEqual(f1,1e-12,1e-12))
         pass
 
+    @WriteInTmpDir
     def testUnPolyze1(self):
         fname="Pyfile47.med"
         mm=MEDLoaderDataForTest.buildMLMeshUnPolyze(self)
@@ -1459,6 +1671,7 @@ class MEDLoaderTest(unittest.TestCase):
         mm.setFamilyFieldArr(-1,None)
         pass
 
+    @WriteInTmpDir
     def testUnPolyze2(self):
         fname="Pyfile48.med"
         mfd=MEDFileData.New()
@@ -1524,23 +1737,24 @@ class MEDLoaderTest(unittest.TestCase):
         mfd.write(fname,2)
         pass
 
+    @WriteInTmpDir
     def testGaussWriteOnPfl1(self):
         fname="Pyfile49.med"
         fname2="Pyfile50.med"
         coords=DataArrayDouble([0.,0.,0.,1.,1.,1.,1.,0.,0.,0.5,0.5,1.,1.,0.5,0.5,0.],8,2)
         mQ8=MEDCouplingUMesh("",2) ; mQ8.setCoords(coords)
         mQ8.allocateCells(1)
-        mQ8.insertNextCell(NORM_QUAD8,range(8))
+        mQ8.insertNextCell(NORM_QUAD8,list(range(8)))
         mQ8.finishInsertingCells()
         mQ4=MEDCouplingUMesh("",2) ; mQ4.setCoords(coords)
         mQ4.allocateCells(1)
-        mQ4.insertNextCell(NORM_QUAD4,range(4))
+        mQ4.insertNextCell(NORM_QUAD4,list(range(4)))
         mQ4.finishInsertingCells()
         mT3=MEDCouplingUMesh("",2) ; mT3.setCoords(coords)
         mT3.allocateCells(1)
-        mT3.insertNextCell(NORM_TRI3,range(3))
+        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)
@@ -1571,7 +1785,7 @@ class MEDLoaderTest(unittest.TestCase):
         mm.write(fname,2)
         #
         f1ts=MEDFileField1TS.New()
-        pfl=DataArrayInt(range(13)) ; pfl.setName("pfl")
+        pfl=DataArrayInt(list(range(13))) ; pfl.setName("pfl")
         self.assertRaises(InterpKernelException,f1ts.setFieldProfile,fInvalid,mm,0,pfl) # fails because no Gauss localization per cell set !
         self.assertRaises(InterpKernelException,f1ts.setFieldProfile,fInvalid2,mm,0,pfl) # fails because no Gauss localization set whereas gauss locid per cell given !
         f1ts.setFieldProfile(f,mm,0,pfl)
@@ -1652,7 +1866,7 @@ class MEDLoaderTest(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'))
@@ -1680,6 +1894,7 @@ class MEDLoaderTest(unittest.TestCase):
         pass
 
     # Testing profile on nodes when the profile is identity but not on all nodes.
+    @WriteInTmpDir
     def testMEDFieldPflOnNode1(self):
         fname="Pyfile51.med"
         coo=DataArrayDouble([0.,0.,0.5,0.,1.,0.,0.,0.5,0.5,0.5,1.,0.5,0.,1.,0.5,1.,1.,1.],9,2)
@@ -1695,7 +1910,7 @@ class MEDLoaderTest(unittest.TestCase):
         m1=MEDCouplingUMesh(m0.getName(),1)
         m1.allocateCells(9)
         conn1=[0,1,0,3,3,4,4,1,5,4,2,4,1,2,3,6,5,8]
-        for i in xrange(9):
+        for i in range(9):
             m1.insertNextCell(NORM_SEG2,conn1[2*i:2*i+2])
             pass
         m1.finishInsertingCells()
@@ -1768,8 +1983,9 @@ class MEDLoaderTest(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):
         fname="Pyfile52.med"
         coo=DataArrayDouble([0.,0.,0.5,0.,1.,0.,0.,0.5,0.5,0.5,1.,0.5,0.,1.,0.5,1.,1.,1.],9,2)
@@ -1785,7 +2001,7 @@ class MEDLoaderTest(unittest.TestCase):
         m1=MEDCouplingUMesh(m0.getName(),1)
         m1.allocateCells(9)
         conn1=[0,1,0,3,3,4,4,1,5,4,2,4,1,2,3,6,5,8]
-        for i in xrange(9):
+        for i in range(9):
             m1.insertNextCell(NORM_SEG2,conn1[2*i:2*i+2])
             pass
         m1.finishInsertingCells()
@@ -1859,6 +2075,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(pfl1_r.isEqual(pfl1))
         pass
 
+    @WriteInTmpDir
     def testMEDFileUMeshZipCoords1(self):
         m=MEDFileUMesh()
         coo=DataArrayDouble(30) ; coo.iota(1.) ; coo.rearrange(3) ; coo.setInfoOnComponents(["aaa [b]","cc [dd]", "e [fff]"])
@@ -1885,6 +2102,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(m.getMeshAtLevel(-2).getNodalConnectivityIndex().isEqual(DataArrayInt([0,2,4,6])))
         pass
 
+    @WriteInTmpDir
     def testMEDUMeshAddNodeGroup1(self):
         fname="Pyfile53.med"
         m=MEDFileUMesh()
@@ -1907,8 +2125,16 @@ class MEDLoaderTest(unittest.TestCase):
         mm.setFamiliesOnGroup("grp0",["MyOtherFam"])
         mm.setFamiliesOnGroup("grpA",["MyOther-1"])
         #
+        self.assertTrue(mm.getNodeFamiliesArr(["MyFam","MyOtherFam"]).isEqual(DataArrayInt([1,3,4,12]))) # find family id 2 and 3 into famCoo
+        #
         daTest=DataArrayInt([1,3,4,6,9,10,12]) ; daTest.setName("grp1")
         mm.addNodeGroup(daTest)
+        self.assertTrue(mm.getNodeGroupArr(daTest.getName()).isEqual(daTest)) # the node group has been pushed right before -> now read it
+        self.assertTrue(mm.getNodeGroupsArr(["grp1","grpA"]).isEqual(DataArrayInt([1,3,4,6,9,10,11,12])))#daTest+[11] because 11 is the rank of -1 (MyOther-1) in famCoo
+        #
+        expect1=DataArrayInt([1,4]) ; expect1.setName("MyFam")
+        self.assertTrue(mm.getNodeFamilyArr(expect1.getName()).isEqual(expect1))
+        #
         self.assertTrue(mm.getGroupArr(1,daTest.getName()).isEqual(daTest))
         self.assertTrue(mm.getFamilyFieldAtLevel(1).isEqual(DataArrayInt([6,2,6,8,2,6,5,6,6,7,7,4,8])))
         for lev,arr in [(0,da0),(-1,da1),(-2,da2)]:
@@ -1947,18 +2173,19 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(mm.getGroupArr(-1,"grp0").isEqual(da))
         pass
 
+    @WriteInTmpDir
     def testMEDUMeshAddGroup1(self):
         fname="Pyfile54.med"
         m=MEDFileUMesh()
         coo=DataArrayDouble(9) ; coo.iota(1.) ; coo.rearrange(3) ; coo.setInfoOnComponents(["aaa [b]","cc [dd]", "e [fff]"])
         m0=MEDCouplingUMesh("toto",2) ; m0.allocateCells(0)
-        for i in xrange(7):
+        for i in range(7):
             m0.insertNextCell(NORM_TRI3,[1,2,1])
             pass
-        for i in xrange(4):
+        for i in range(4):
             m0.insertNextCell(NORM_QUAD4,[1,1,2,0])
             pass
-        for i in xrange(2):
+        for i in range(2):
             m0.insertNextCell(NORM_POLYGON,[0,0,1,1,2,2])
             pass
         m1=MEDCouplingUMesh("toto",1) ; m1.allocateCells(0) ; m1.insertNextCell(NORM_SEG2,[1,6]) ; m1.insertNextCell(NORM_SEG2,[7,3])
@@ -2018,6 +2245,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(mm.getGroupArr(-1,"grp0").isEqual(da))
         pass
 
+    @WriteInTmpDir
     def testHeapMem1(self):
         a=DataArrayInt() ; aa=a.getHeapMemorySize()
         a.alloc(0,1)
@@ -2028,34 +2256,39 @@ class MEDLoaderTest(unittest.TestCase):
         m.setCoords(arr,arr)
         m=m.buildUnstructured()
         m.setName("mm")
-        f=m.getMeasureField(ON_CELLS)
-        self.assertIn(m.getHeapMemorySize(),xrange(3552-100,3552+100+4*strMulFac))
-        self.assertIn(f.getHeapMemorySize(),xrange(4215-100,4215+100+8*strMulFac))
+        f=m.getMeasureField(False)
+        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(),xrange(3889-100,3889+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(),xrange(771-40,771+21+(4+1)*strMulFac))
+        self.assertIn(ff.getHeapMemorySize(), list(range(771 - 40, 871 + 21 + (4 + 1) * strMulFac)))
         #
         fff=MEDFileFieldMultiTS()
         fff.appendFieldNoProfileSBT(f)
-        self.assertIn(fff.getHeapMemorySize(),xrange(815-50,815+30+(6+2)*strMulFac))
+        self.assertIn(fff.getHeapMemorySize(), list(range(815 - 50, 915 + 30 + (6 + 2) * strMulFac)))
         f.setTime(1.,0,-1)
         fff.appendFieldNoProfileSBT(f)
-        self.assertIn(fff.getHeapMemorySize(),xrange(1594-90,1594+50+(10+1)*strMulFac))
-        self.assertIn(fff[0,-1].getHeapMemorySize(),xrange(771-40,771+20+(4+1)*strMulFac))
+        self.assertIn(fff.getHeapMemorySize(), list(range(1594 - 90, 1794 + 50 + (10 + 1) * strMulFac)))
+        self.assertIn(fff[0, -1].getHeapMemorySize(), list(range(771 - 40, 871 + 20 + (4 + 1) * strMulFac)))
         f2=f[:50]
         f2.setTime(2.,1,-1)
         pfl=DataArrayInt.Range(0,50,1) ; pfl.setName("pfl")
         fff.appendFieldProfile(f2,mm,0,pfl)
-        self.assertIn(fff.getHeapMemorySize(),xrange(2348-130,2348+100+(10+2)*strMulFac))
-        self.assertIn(fff.getProfile("pfl").getHeapMemorySize(),xrange(204-10,204+10+2*strMulFac))
-        self.assertIn(fff[1,-1].getHeapMemorySize(),xrange(738-50,738+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 testCurveLinearMesh1(self):
+    def internalCurveLinearMesh1(self):
         fname="Pyfile55.med"
         mesh=MEDCouplingCurveLinearMesh();
         mesh.setTime(2.3,4,5);
@@ -2095,7 +2328,15 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(m1.getMesh().isEqual(mesh,1e-12))
         pass
 
+    @WriteInTmpDir
+    def testCurveLinearMesh1(self):
+        self.internalCurveLinearMesh1()
+
+    @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")
         mm=MEDFileCMesh() ; mm.setMesh(m)
@@ -2149,6 +2390,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertAlmostEqual(data2.getParams()["B"][1,2].getValue(),567.89,13)
         pass
 
+    @WriteInTmpDir
     def testNamesOnCellAndNodesInMeshes1(self):
         fname="Pyfile58.med"
         fname2="Pyfile59.med"
@@ -2160,20 +2402,20 @@ class MEDLoaderTest(unittest.TestCase):
         mm.setMeshAtLevel(0,m)
         mm.setMeshAtLevel(-1,m1)
         namesCellL0=DataArrayAsciiChar(6,16)
-        namesCellL0[:]=["CellL0#%.3d      "%(i) for i in xrange(6)]
+        namesCellL0[:] = ["CellL0#%.3d      " % (i) for i in range(6)]
         mm.setNameFieldAtLevel(0,namesCellL0)
-        namesCellL1=DataArrayAsciiChar.Aggregate([namesCellL0,namesCellL0,namesCellL0.substr(2)])
-        namesCellL1[:]=["CellLM1#%.3d     "%(i) for i in xrange(16)]
+        namesCellL1=DataArrayAsciiChar.Aggregate([namesCellL0,namesCellL0,namesCellL0.subArray(2)])
+        namesCellL1[:] = ["CellLM1#%.3d     " % (i) for i in range(16)]
         mm.setNameFieldAtLevel(-1,namesCellL1)
-        namesNodes=namesCellL1.substr(4,16)
-        namesNodes[:]=["Node#%.3d        "%(i) for i in xrange(12)]
+        namesNodes=namesCellL1.subArray(4,16)
+        namesNodes[:] = ["Node#%.3d        " % (i) for i in range(12)]
         mm.setNameFieldAtLevel(1,namesNodes)
         mm.write(fname,2)
         #
         mmr=MEDFileMesh.New(fname)
-        self.assertTrue(mm.getNameFieldAtLevel(0).isEqual(DataArrayAsciiChar(["CellL0#%.3d      "%(i) for i in xrange(6)])))
-        self.assertTrue(mm.getNameFieldAtLevel(-1).isEqual(DataArrayAsciiChar(["CellLM1#%.3d     "%(i) for i in xrange(16)])))
-        self.assertTrue(mm.getNameFieldAtLevel(1).isEqual(DataArrayAsciiChar(["Node#%.3d        "%(i) for i in xrange(12)])))
+        self.assertTrue(mm.getNameFieldAtLevel(0).isEqual(DataArrayAsciiChar(["CellL0#%.3d      " % (i) for i in range(6)])))
+        self.assertTrue(mm.getNameFieldAtLevel(-1).isEqual(DataArrayAsciiChar(["CellLM1#%.3d     " % (i) for i in range(16)])))
+        self.assertTrue(mm.getNameFieldAtLevel(1).isEqual(DataArrayAsciiChar(["Node#%.3d        " % (i) for i in range(12)])))
         self.assertTrue(mm.isEqual(mmr,1e-12)[0])
         mmr.getNameFieldAtLevel(1).setIJ(0,0,'M')
         self.assertTrue(not mm.isEqual(mmr,1e-12)[0])
@@ -2190,7 +2432,7 @@ class MEDLoaderTest(unittest.TestCase):
         mm.write(fname,2)
         mmr=MEDFileMesh.New(fname)
         self.assertEqual(mmr.getNameFieldAtLevel(1),None)
-        self.assertTrue(mmr.getNameFieldAtLevel(0).isEqual(DataArrayAsciiChar(["CellL0#%.3d      "%(i) for i in xrange(6)])))
+        self.assertTrue(mmr.getNameFieldAtLevel(0).isEqual(DataArrayAsciiChar(["CellL0#%.3d      " % (i) for i in range(6)])))
         self.assertEqual(mmr.getNameFieldAtLevel(-1),None)
         #
         c=MEDCouplingCMesh()
@@ -2199,12 +2441,12 @@ class MEDLoaderTest(unittest.TestCase):
         c.setName("cmesh")
         cc=MEDFileCMesh()
         cc.setMesh(c)
-        cc.setNameFieldAtLevel(0,DataArrayAsciiChar(["Cell#%.3d        "%(i) for i in xrange(4)]))
-        cc.setNameFieldAtLevel(1,DataArrayAsciiChar(["Node#%.3d        "%(i) for i in xrange(9)]))
+        cc.setNameFieldAtLevel(0, DataArrayAsciiChar(["Cell#%.3d        " % (i) for i in range(4)]))
+        cc.setNameFieldAtLevel(1, DataArrayAsciiChar(["Node#%.3d        " % (i) for i in range(9)]))
         cc.write(fname2,2)
         ccr=MEDFileMesh.New(fname2)
-        self.assertTrue(ccr.getNameFieldAtLevel(0).isEqual(DataArrayAsciiChar(["Cell#%.3d        "%(i) for i in xrange(4)])))
-        self.assertTrue(ccr.getNameFieldAtLevel(1).isEqual(DataArrayAsciiChar(["Node#%.3d        "%(i) for i in xrange(9)])))
+        self.assertTrue(ccr.getNameFieldAtLevel(0).isEqual(DataArrayAsciiChar(["Cell#%.3d        " % (i) for i in range(4)])))
+        self.assertTrue(ccr.getNameFieldAtLevel(1).isEqual(DataArrayAsciiChar(["Node#%.3d        " % (i) for i in range(9)])))
         self.assertTrue(cc.isEqual(ccr,1e-12)[0])
         ccr.getNameFieldAtLevel(1).setIJ(0,0,'M')
         self.assertTrue(not cc.isEqual(ccr,1e-12)[0])
@@ -2214,6 +2456,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(cc.isEqual(ccCpy,1e-12)[0])
         pass
 
+    @WriteInTmpDir
     def testToExportInExamples1(self):
         m=MEDCouplingCMesh()
         arr=DataArrayDouble([0.,1.,2.,3.,4.])
@@ -2253,6 +2496,7 @@ class MEDLoaderTest(unittest.TestCase):
         splitOfM1[1].isEqual(DataArrayInt([4,5,7,9,14,15]))
         pass
 
+    @WriteInTmpDir
     def testBugCorrection1(self):
         fs=MEDFileFields()
         fs.resize(3)
@@ -2260,6 +2504,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertEqual(3,len(fs))
         pass
 
+    @WriteInTmpDir
     def testCompareMEDFilesContainingOnlyFieldsOnCell1(self):
         f1Name="Pyfile60.med"
         f2Name="Pyfile61.med"
@@ -2306,6 +2551,7 @@ class MEDLoaderTest(unittest.TestCase):
             pass
         pass
 
+    @WriteInTmpDir
     def testNonRegBugNormalizeFamIdsMEDFile1(self):
         m=MEDCouplingCMesh()
         arr=DataArrayDouble([0.,1.,2.,3.,4.])
@@ -2417,7 +2663,8 @@ class MEDLoaderTest(unittest.TestCase):
                 pass
             pass
         pass
-    
+
+    @WriteInTmpDir
     def testNonRegressionMantis22212ChangeGrpName(self):
         fileName="Pyfile62.med"
         m2,m1,m0,f2,f1,f0,p,n2,n1,n0,fns,fids,grpns,famIdsPerGrp=MEDLoaderDataForTest.buildMultiLevelMesh_1()
@@ -2431,11 +2678,11 @@ class MEDLoaderTest(unittest.TestCase):
         m.setFamilyFieldArr(-2,f0)
         m.setFamilyFieldArr(1,p)
         nbOfFams=len(fns)
-        for i in xrange(nbOfFams):
+        for i in range(nbOfFams):
             m.addFamily(fns[i],fids[i])
             pass
         nbOfGrps=len(grpns)
-        for i in xrange(nbOfGrps):
+        for i in range(nbOfGrps):
             m.setFamiliesIdsOnGroup(grpns[i],famIdsPerGrp[i])
             pass
         m.setName(m2.getName())
@@ -2462,11 +2709,14 @@ class MEDLoaderTest(unittest.TestCase):
             pass
         pass
 
+    @WriteInTmpDir
     def testInt32InMEDFileFieldStar1(self):
+        self.internalInt32InMEDFileFieldStar1()
+
+    def internalInt32InMEDFileFieldStar1(self):
         fname="Pyfile63.med"
         f1=MEDLoaderDataForTest.buildVecFieldOnCells_1();
-        arr=f1.getArray().convertToIntArr()
-        f1.setArray(None)
+        f1=f1.convertToIntField()
         m1=f1.getMesh()
         mm1=MEDFileUMesh.New()
         mm1.setCoords(m1.getCoords())
@@ -2474,63 +2724,62 @@ class MEDLoaderTest(unittest.TestCase):
         mm1.setName(m1.getName())
         mm1.write(fname,2)
         ff1=MEDFileIntField1TS()
-        ff1.setFieldNoProfileSBT(f1,arr)
-        a,b=ff1.getFieldOnMeshAtLevel(0,ON_CELLS,mm1)
-        self.assertEqual(b.getInfoOnComponents(),['power [MW/m^3]','density [g/cm^3]','temperature [K]'])
-        self.assertTrue(b.isEqual(arr))
-        self.assertTrue(a.isEqual(f1,1e-12,1e-12))
+        ff1.setFieldNoProfileSBT(f1)
+        a=ff1.getFieldOnMeshAtLevel(0,ON_CELLS,mm1)
+        self.assertEqual(a.getArray().getInfoOnComponents(),['power [MW/m^3]','density [g/cm^3]','temperature [K]'])
+        self.assertTrue(a.isEqual(f1,1e-12,0))
         ff1.write(fname,0)
+        a,b=ff1.getUndergroundDataArrayExt()
+        self.assertEqual(a.getHiddenCppPointer(),ff1.getUndergroundDataArray().getHiddenCppPointer())
+        self.assertEqual(b,[((3,0),(0,2)),((4,0),(2,4)),((6,0),(4,5)),((5,0),(5,6))])
         ff2=MEDFileAnyTypeField1TS.New(fname)
         self.assertEqual(ff2.getName(),"VectorFieldOnCells")
         self.assertEqual(ff2.getTime(),[0,1,2.0])
         self.assertTrue(isinstance(ff2,MEDFileIntField1TS))
-        a,b=ff1.getFieldOnMeshAtLevel(0,ON_CELLS,mm1)
-        self.assertEqual(b.getInfoOnComponents(),['power [MW/m^3]','density [g/cm^3]','temperature [K]'])
-        self.assertTrue(b.isEqual(arr))
-        self.assertTrue(a.isEqual(f1,1e-12,1e-12))
+        a=ff1.getFieldOnMeshAtLevel(ON_CELLS,0,mm1)
+        self.assertEqual(a.getArray().getInfoOnComponents(),['power [MW/m^3]','density [g/cm^3]','temperature [K]'])
+        self.assertTrue(a.isEqual(f1,1e-12,0))
         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)
         self.assertTrue(isinstance(ffs1,MEDFileIntFieldMultiTS))
-        a,b=ffs1[2.].getFieldOnMeshAtLevel(0,ON_CELLS,mm1)
-        self.assertTrue(b.isEqual(arr))
-        self.assertTrue(a.isEqual(f1,1e-12,1e-12))
-        a,b=ffs1[2.].getFieldOnMeshAtLevel(0,ON_CELLS,mm1)
-        self.assertTrue(b.isEqual(arr))
-        self.assertTrue(a.isEqual(f1,1e-12,1e-12))
+        a=ffs1[2.].getFieldOnMeshAtLevel(ON_CELLS,0,mm1)
+        self.assertTrue(a.isEqual(f1,1e-12,0))
+        a=ffs1.getFieldOnMeshAtLevel(ON_CELLS,0,1,0,mm1)
+        self.assertTrue(a.isEqual(f1,1e-12,0))
         it=ffs1.__iter__() ; it.next() ; ff2bis=it.next()
-        a,b=ff2bis.getFieldOnMeshAtLevel(0,ON_CELLS,mm1)
-        self.assertTrue(b.isEqual(2*arr))
-        f1.setTime(3.,1,2)
-        self.assertTrue(a.isEqual(f1,1e-12,1e-12))
-        bc=DataArrayInt(6,3) ; bc[:]=0 ; bc.setInfoOnComponents(['power [MW/m^3]','density [g/cm^3]','temperature [K]'])
+        a=ff2bis.getFieldOnMeshAtLevel(0,ON_CELLS,mm1)
+        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=DataArrayInt32(6,3) ; bc[:]=0 ; bc.setInfoOnComponents(['power [MW/m^3]','density [g/cm^3]','temperature [K]'])
         for it in ffs1:
-            a,b=it.getFieldOnMeshAtLevel(0,ON_CELLS,mm1)
-            bc+=b
+            a=it.getFieldOnMeshAtLevel(ON_CELLS,0,mm1)
+            bc+=a.getArray()
             pass
-        self.assertTrue(bc.isEqual(3*arr))
-        nf1=MEDCouplingFieldDouble(ON_NODES)
+        self.assertTrue(bc.isEqual(3*f1.getArray()))
+        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]=range(12) ; narr[:,1]=2*narr[:,0]
-        nf1.setName("VectorFieldOnNodes")
+        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,narr)
+        nff1.setFieldNoProfileSBT(nf1)
         self.assertEqual(nff1.getInfo(),('aa [u1]','bbbvv [ppp]'))
         self.assertEqual(nff1.getTime(),[10,-1,9.0])
         nff1.write(fname,0)
         #
-        nf2=MEDCouplingFieldDouble(ON_NODES)
+        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]=range(8) ; narr2[:,0]+=10  ; narr2[:,1]=3*narr2[:,0]
-        nf2.setName("VectorFieldOnNodesPfl") ; narr2.setName(nf2.getName())
+        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")
-        nff2.setFieldProfile(nf2,narr2,mm1,0,npfl)
+        nff2.setFieldProfile(nf2,mm1,0,npfl)
         nff2.getFieldWithProfile(ON_NODES,0,mm1)
         a,b=nff2.getFieldWithProfile(ON_NODES,0,mm1) ; b.setName(npfl.getName())
         self.assertTrue(b.isEqual(npfl))
@@ -2557,8 +2806,8 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(isinstance(ffs[2],MEDFileFieldMultiTS))
         self.assertTrue(isinstance(ffs[3],MEDFileIntFieldMultiTS))
         #
-        self.assertTrue(fs["VectorFieldOnCells"][0].getUndergroundDataArray().isEqualWithoutConsideringStr(arr))
-        self.assertTrue(fs["VectorFieldOnCells"][1,2].getUndergroundDataArray().isEqualWithoutConsideringStr(2*arr))
+        self.assertTrue(fs["VectorFieldOnCells"][0].getUndergroundDataArray().isEqualWithoutConsideringStr(f1.getArray()))
+        self.assertTrue(fs["VectorFieldOnCells"][1,2].getUndergroundDataArray().isEqualWithoutConsideringStr(2*f1.getArray()))
         self.assertTrue(fs["VectorFieldOnNodesPfl"][0].getUndergroundDataArray().isEqualWithoutConsideringStr(narr2))
         self.assertTrue(fs["VectorFieldOnNodes"][9.].getUndergroundDataArray().isEqualWithoutConsideringStr(narr))
         self.assertTrue(fs["VectorFieldOnNodesDouble"][29.].getUndergroundDataArray().isEqualWithoutConsideringStr(f1.getMesh().getCoords(),1e-12))
@@ -2578,6 +2827,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(not fs.changeMeshNames([('3DSurfMesh_1','3DSurfMesh')]))
         pass
 
+    @WriteInTmpDir
     def testMEDFileFields1(self):
         fname="Pyfile64.med"
         f1=MEDCouplingFieldDouble(ON_NODES)
@@ -2585,7 +2835,7 @@ class MEDLoaderTest(unittest.TestCase):
         c=DataArrayDouble(12) ; c.iota(); m=MEDCouplingCMesh() ; m.setCoordsAt(0,c) ; m.setName("mesh")
         mm=MEDFileCMesh() ; mm.setMesh(m) ; mm.write(fname,2)
         f1.setMesh(m)
-        arr=DataArrayDouble(12,2) ; arr.setInfoOnComponents(["aa [u1]","bbbvv [ppp]"]) ; arr[:,0]=range(12) ; arr[:,1]=2*arr[:,0]
+        arr=DataArrayDouble(12,2) ; arr.setInfoOnComponents(["aa [u1]","bbbvv [ppp]"]) ; arr[:,0]=list(range(12)) ; arr[:,1]=2*arr[:,0]
         f1.setArray(arr)
         f1.setName("Field1")
         ff1=MEDFileField1TS.New()
@@ -2610,22 +2860,23 @@ class MEDLoaderTest(unittest.TestCase):
         pass
 
     # Multi time steps and multi fields management without Globals (profiles, locs) aspects
+    @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
         tri=MEDCouplingUMesh("tri",2)
         tri.allocateCells() ; tri.insertNextCell(NORM_TRI3,[0,1,2])
         tri.setCoords(DataArrayDouble([(0.,0.),(0.,1.),(1.,0.)]))
-        tris=[tri.deepCopy() for i in xrange(4)]
+        tris = [tri.deepCopy() for i in range(4)]
         for i,elt in enumerate(tris): elt.translate([i,0])
         tris=MEDCouplingUMesh.MergeUMeshes(tris)
         quad=MEDCouplingUMesh("quad",2)
         quad.allocateCells() ; quad.insertNextCell(NORM_QUAD4,[0,1,2,3])
         quad.setCoords(DataArrayDouble([(0.,0.),(0.,1.),(1.,1.),(1.,0.)]))
-        quads=[quad.deepCopy() for i in xrange(5)]
+        quads = [quad.deepCopy() for i in range(5)]
         for i,elt in enumerate(quads): elt.translate([5+i,0])
         quads=MEDCouplingUMesh.MergeUMeshes(quads)
         m=MEDCouplingUMesh.MergeUMeshes(tris,quads)
@@ -2634,7 +2885,7 @@ class MEDLoaderTest(unittest.TestCase):
         fmts0_0=MEDFileFieldMultiTS()
         fmts0_1=MEDFileFieldMultiTS()
         # time steps
-        for i in xrange(10):
+        for i in range(10):
             infos1=["aa [bb]","ccc [ddd]"] ; name1="1stField"
             d=DataArrayDouble(18) ; d.iota(i*10) ; d.rearrange(2) ; d.setInfoOnComponents(infos1)
             f=MEDCouplingFieldDouble(ON_CELLS) ; f.setName(name1) ; f.setArray(d) ; f.setMesh(m)
@@ -2691,19 +2942,20 @@ class MEDLoaderTest(unittest.TestCase):
         pass
 
     # Multi time steps and multi fields management with Globals (profiles, locs) aspects
+    @WriteInTmpDir
     def testMEDFileFields3(self):
         fname="Pyfile66.med"
         # building a mesh containing 4 tri3 + 5 quad4
         tri=MEDCouplingUMesh("tri",2)
         tri.allocateCells() ; tri.insertNextCell(NORM_TRI3,[0,1,2])
         tri.setCoords(DataArrayDouble([(0.,0.),(0.,1.),(1.,0.)]))
-        tris=[tri.deepCopy() for i in xrange(4)]
+        tris = [tri.deepCopy() for i in range(4)]
         for i,elt in enumerate(tris): elt.translate([i,0])
         tris=MEDCouplingUMesh.MergeUMeshes(tris)
         quad=MEDCouplingUMesh("quad",2)
         quad.allocateCells() ; quad.insertNextCell(NORM_QUAD4,[0,1,2,3])
         quad.setCoords(DataArrayDouble([(0.,0.),(0.,1.),(1.,1.),(1.,0.)]))
-        quads=[quad.deepCopy() for i in xrange(5)]
+        quads = [quad.deepCopy() for i in range(5)]
         for i,elt in enumerate(quads): elt.translate([5+i,0])
         quads=MEDCouplingUMesh.MergeUMeshes(quads)
         m=MEDCouplingUMesh.MergeUMeshes(tris,quads)
@@ -2716,7 +2968,7 @@ class MEDLoaderTest(unittest.TestCase):
         fmts0_0=MEDFileFieldMultiTS()
         fmts0_1=MEDFileFieldMultiTS()
         # time steps
-        for i in xrange(10):
+        for i in range(10):
             infos1=["aa [bb]","ccc [ddd]"] ; name1="1stField"
             d=DataArrayDouble(14) ; d.iota(i*10) ; d.rearrange(2) ; d.setInfoOnComponents(infos1)
             f=MEDCouplingFieldDouble(ON_CELLS) ; f.setName(name1) ; f.setArray(d) ; f.setMesh(m)
@@ -2743,7 +2995,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertEqual(fs0.getPfls(),('pfl_NORM_QUAD4',))
         #
         fmts0_5=MEDFileFieldMultiTS()
-        for i in xrange(7):
+        for i in range(7):
             infos1=["aa [bb]","ccc [ddd]"] ; name1="1stField"
             d=DataArrayDouble(16) ; d.iota(i*10) ; d.rearrange(2) ; d.setInfoOnComponents(infos1)
             f=MEDCouplingFieldDouble(ON_CELLS) ; f.setName(name1) ; f.setArray(d) ; f.setMesh(m)
@@ -2755,20 +3007,21 @@ class MEDLoaderTest(unittest.TestCase):
         fs0.checkGlobsCoherency()
         fs0.write(fname,0)
         pass
-    
+
+    @WriteInTmpDir
     def testSplitComponents1(self):
         fname="Pyfile67.med"
         # building a mesh containing 4 tri3 + 5 quad4
         tri=MEDCouplingUMesh("tri",2)
         tri.allocateCells() ; tri.insertNextCell(NORM_TRI3,[0,1,2])
         tri.setCoords(DataArrayDouble([(0.,0.),(0.,1.),(1.,0.)]))
-        tris=[tri.deepCopy() for i in xrange(4)]
+        tris = [tri.deepCopy() for i in range(4)]
         for i,elt in enumerate(tris): elt.translate([i,0])
         tris=MEDCouplingUMesh.MergeUMeshes(tris)
         quad=MEDCouplingUMesh("quad",2)
         quad.allocateCells() ; quad.insertNextCell(NORM_QUAD4,[0,1,2,3])
         quad.setCoords(DataArrayDouble([(0.,0.),(0.,1.),(1.,1.),(1.,0.)]))
-        quads=[quad.deepCopy() for i in xrange(5)]
+        quads = [quad.deepCopy() for i in range(5)]
         for i,elt in enumerate(quads): elt.translate([5+i,0])
         quads=MEDCouplingUMesh.MergeUMeshes(quads)
         m=MEDCouplingUMesh.MergeUMeshes(tris,quads)
@@ -2782,7 +3035,7 @@ class MEDLoaderTest(unittest.TestCase):
         fmts0_1=MEDFileFieldMultiTS()
         # time steps
         infos1=['aa [bb]','ccc [ddd]',"ZZZZ [MW*s]"]
-        for i in xrange(10):
+        for i in range(10):
             name1="1stField"
             d=DataArrayDouble(21) ; d.iota(i*10) ; d.rearrange(3) ; d.setInfoOnComponents(infos1)
             f=MEDCouplingFieldDouble(ON_CELLS) ; f.setName(name1) ; f.setArray(d) ; f.setMesh(m)
@@ -2811,7 +3064,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertEqual(fs1.getPfls(),('pfl_NORM_QUAD4',))
         self.assertEqual(fs1.getPflsReallyUsed(),('pfl_NORM_QUAD4',))
         self.assertEqual(4,len(fs1))
-        for i in xrange(10):
+        for i in range(10):
             for j,fieldName in enumerate(['1stField_aa','1stField_ccc','1stField_ZZZZ']):
                 f1ts=fs1[fieldName][i]
                 f=f1ts.getFieldOnMeshAtLevel(ON_CELLS,0,mm)
@@ -2825,19 +3078,20 @@ class MEDLoaderTest(unittest.TestCase):
             pass
         pass
 
+    @WriteInTmpDir
     def testMEDFileFieldConvertTo1(self):
         fname="Pyfile68.med"
         # building a mesh containing 4 tri3 + 5 quad4
         tri=MEDCouplingUMesh("tri",2)
         tri.allocateCells() ; tri.insertNextCell(NORM_TRI3,[0,1,2])
         tri.setCoords(DataArrayDouble([(0.,0.),(0.,1.),(1.,0.)]))
-        tris=[tri.deepCopy() for i in xrange(4)]
+        tris = [tri.deepCopy() for i in range(4)]
         for i,elt in enumerate(tris): elt.translate([i,0])
         tris=MEDCouplingUMesh.MergeUMeshes(tris)
         quad=MEDCouplingUMesh("quad",2)
         quad.allocateCells() ; quad.insertNextCell(NORM_QUAD4,[0,1,2,3])
         quad.setCoords(DataArrayDouble([(0.,0.),(0.,1.),(1.,1.),(1.,0.)]))
-        quads=[quad.deepCopy() for i in xrange(5)]
+        quads = [quad.deepCopy() for i in range(5)]
         for i,elt in enumerate(quads): elt.translate([5+i,0])
         quads=MEDCouplingUMesh.MergeUMeshes(quads)
         m=MEDCouplingUMesh.MergeUMeshes(tris,quads)
@@ -2895,7 +3149,7 @@ class MEDLoaderTest(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'))
         #
@@ -2918,11 +3172,12 @@ class MEDLoaderTest(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
 
+    @WriteInTmpDir
     def testMEDFileFieldPartialLoading(self):
         fname="Pyfile69.med"
         #
@@ -2933,13 +3188,13 @@ class MEDLoaderTest(unittest.TestCase):
         tri=MEDCouplingUMesh("tri",2)
         tri.allocateCells() ; tri.insertNextCell(NORM_TRI3,[0,1,2])
         tri.setCoords(DataArrayDouble([(0.,0.),(0.,1.),(1.,0.)]))
-        tris=[tri.deepCopy() for i in xrange(30)]
+        tris = [tri.deepCopy() for i in range(30)]
         for i,elt in enumerate(tris): elt.translate([i,0])
         tris=MEDCouplingUMesh.MergeUMeshes(tris)
         quad=MEDCouplingUMesh("quad",2)
         quad.allocateCells() ; quad.insertNextCell(NORM_QUAD4,[0,1,2,3])
         quad.setCoords(DataArrayDouble([(0.,0.),(0.,1.),(1.,1.),(1.,0.)]))
-        quads=[quad.deepCopy() for i in xrange(40)]
+        quads = [quad.deepCopy() for i in range(40)]
         for i,elt in enumerate(quads): elt.translate([40+i,0])
         quads=MEDCouplingUMesh.MergeUMeshes(quads)
         m=MEDCouplingUMesh.MergeUMeshes(tris,quads)
@@ -2969,7 +3224,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(not ff0.getUndergroundDataArray().isAllocated())
         self.assertEqual(ff0.getUndergroundDataArray().getInfoOnComponents(),['X [km]','YY [mm]'])
         heap_memory_ref=ff0.getHeapMemorySize()
-        self.assertIn(heap_memory_ref,xrange(182,298+2*strMulFac))
+        self.assertIn(heap_memory_ref, list(range(182, 540 + 2 * strMulFac)))
         ff0.loadArrays() ##
         arr=DataArrayDouble(140) ; arr.iota() ; arr.rearrange(2)
         self.assertTrue(ff0.getUndergroundDataArray().isEqualWithoutConsideringStr(arr,1e-14))
@@ -2978,7 +3233,7 @@ class MEDLoaderTest(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,xrange(350,415+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))
@@ -2996,7 +3251,7 @@ class MEDLoaderTest(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,xrange(1100,1215+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
@@ -3005,14 +3260,14 @@ class MEDLoaderTest(unittest.TestCase):
         #
         ff0=MEDFileField1TS(fname,"FieldCellPfl",-1,-1,False)
         heap_memory_ref=ff0.getHeapMemorySize()
-        self.assertIn(heap_memory_ref,xrange(299,415+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)
         #
         fieldName="FieldCellMultiTS"
         ff0=MEDFileFieldMultiTS()
-        for t in xrange(20):
+        for t in range(20):
             f0=MEDCouplingFieldDouble(ON_CELLS,ONE_TIME) ; f0.setMesh(m) ; arr=DataArrayDouble(m.getNumberOfCells()*2) ; arr.iota(float(t+1000)) ; arr.rearrange(2) ; arr.setInfoOnComponents(["X [km]","YY [mm]"]) ; f0.setArray(arr) ; f0.setName(fieldName)
             f0.setTime(float(t)+0.1,t,100+t)
             f0.checkConsistencyLight()
@@ -3022,18 +3277,19 @@ class MEDLoaderTest(unittest.TestCase):
         #
         ff0=MEDFileAnyTypeFieldMultiTS.New(fname,fieldName,False)
         heap_memory_ref=ff0.getHeapMemorySize()
-        self.assertIn(heap_memory_ref,xrange(5536,5956+(80+26)*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,xrange(5335,6687+(80+50)*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
 
+    @WriteInTmpDir
     def testMEDFileMeshReadSelector1(self):
         mrs=MEDFileMeshReadSelector()
         self.assertTrue(mrs.isCellFamilyFieldReading() and mrs.isNodeFamilyFieldReading() and mrs.isCellNameFieldReading() and mrs.isNodeNameFieldReading() and mrs.isCellNumFieldReading() and mrs.isNodeNumFieldReading())
@@ -3194,20 +3450,21 @@ class MEDLoaderTest(unittest.TestCase):
         mrs.setNodeNumFieldReading(True)
         self.assertEqual(mrs.getCode(),63)
         pass
-    
+
+    @WriteInTmpDir
     def testPartialReadOfMeshes(self):
         fname="Pyfile70.med"
         # building a mesh containing 4 tri3 + 5 quad4
         tri=MEDCouplingUMesh("tri",2)
         tri.allocateCells() ; tri.insertNextCell(NORM_TRI3,[0,1,2])
         tri.setCoords(DataArrayDouble([(0.,0.),(0.,1.),(1.,0.)]))
-        tris=[tri.deepCopy() for i in xrange(4)]
+        tris = [tri.deepCopy() for i in range(4)]
         for i,elt in enumerate(tris): elt.translate([i,0])
         tris=MEDCouplingUMesh.MergeUMeshes(tris)
         quad=MEDCouplingUMesh("quad",2)
         quad.allocateCells() ; quad.insertNextCell(NORM_QUAD4,[0,1,2,3])
         quad.setCoords(DataArrayDouble([(0.,0.),(0.,1.),(1.,1.),(1.,0.)]))
-        quads=[quad.deepCopy() for i in xrange(5)]
+        quads = [quad.deepCopy() for i in range(5)]
         for i,elt in enumerate(quads): elt.translate([5+i,0])
         quads=MEDCouplingUMesh.MergeUMeshes(quads)
         m=MEDCouplingUMesh.MergeUMeshes(tris,quads)
@@ -3291,7 +3548,7 @@ class MEDLoaderTest(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)
@@ -3311,18 +3568,19 @@ class MEDLoaderTest(unittest.TestCase):
     # this test checks that setFieldProfile perform a check of the array length
     # compared to the profile length. This test also checks that mesh attribute of field
     # is not used by setFieldProfile (because across this test mesh is equal to None)
+    @WriteInTmpDir
     def testCheckCompatibilityPfl1(self):
         # building a mesh containing 4 tri3 + 5 quad4
         tri=MEDCouplingUMesh("tri",2)
         tri.allocateCells() ; tri.insertNextCell(NORM_TRI3,[0,1,2])
         tri.setCoords(DataArrayDouble([(0.,0.),(0.,1.),(1.,0.)]))
-        tris=[tri.deepCopy() for i in xrange(4)]
+        tris = [tri.deepCopy() for i in range(4)]
         for i,elt in enumerate(tris): elt.translate([i,0])
         tris=MEDCouplingUMesh.MergeUMeshes(tris)
         quad=MEDCouplingUMesh("quad",2)
         quad.allocateCells() ; quad.insertNextCell(NORM_QUAD4,[0,1,2,3])
         quad.setCoords(DataArrayDouble([(0.,0.),(0.,1.),(1.,1.),(1.,0.)]))
-        quads=[quad.deepCopy() for i in xrange(5)]
+        quads = [quad.deepCopy() for i in range(5)]
         for i,elt in enumerate(quads): elt.translate([5+i,0])
         quads=MEDCouplingUMesh.MergeUMeshes(quads)
         m=MEDCouplingUMesh.MergeUMeshes(tris,quads)
@@ -3392,7 +3650,8 @@ class MEDLoaderTest(unittest.TestCase):
         f.setArray(vals)
         f1ts.setFieldProfile(f,mm,0,pfl)
         pass
-    
+
+    @WriteInTmpDir
     def testWRMeshWithNoCells(self):
         fname="Pyfile71.med"
         a=DataArrayDouble(4) ; a.iota()
@@ -3400,7 +3659,7 @@ class MEDLoaderTest(unittest.TestCase):
         m00=MEDCouplingUMesh("mesh",1) ; m00.setCoords(m0.getCoords()) ; m00.allocateCells(0)
         m=MEDFileUMesh()
         m.setMeshAtLevel(0,m00)
-        m.setRenumFieldArr(1,DataArrayInt(range(10,26)))
+        m.setRenumFieldArr(1,DataArrayInt(list(range(10,26))))
         m.setFamilyFieldArr(1,DataArrayInt([-1,-1,-1,-1,-1,-2,-2,-2,-2,-2,-2,0,-1,-3,-3,-3]))
         m.write(fname,2)
         del m,a,c,m0,m00
@@ -3408,24 +3667,25 @@ class MEDLoaderTest(unittest.TestCase):
         m=MEDFileMesh.New(fname)
         self.assertEqual((),m.getNonEmptyLevels())
         self.assertTrue(m.getCoords().isEqual(DataArrayDouble([(0,0),(1,0),(2,0),(3,0),(0,1),(1,1),(2,1),(3,1),(0,2),(1,2),(2,2),(3,2),(0,3),(1,3),(2,3),(3,3)]),1e-12))
-        self.assertTrue(m.getNumberFieldAtLevel(1).isEqual(DataArrayInt(range(10,26))))
+        self.assertTrue(m.getNumberFieldAtLevel(1).isEqual(DataArrayInt(list(range(10,26)))))
         self.assertTrue(m.getFamilyFieldAtLevel(1).isEqual(DataArrayInt([-1,-1,-1,-1,-1,-2,-2,-2,-2,-2,-2,0,-1,-3,-3,-3])))
         pass
 
+    @WriteInTmpDir
     def testWRQPolyg1(self):
         fname="Pyfile72.med"
         m=MEDCoupling1SGTUMesh("mesh",NORM_QUAD4) ; m.allocateCells()
         m.insertNextCell([0,2,1,3])
         m.setCoords(DataArrayDouble([0.,0.,1.,1.,1.,0.,0.,1.],4,2))
         #
-        ms=[m.deepCopy() for i in xrange(4)]
+        ms = [m.deepCopy() for i in range(4)]
         for i,elt in enumerate(ms):
             elt.translate([float(i)*1.5,0.])
             pass
         m0=MEDCoupling1SGTUMesh.Merge1SGTUMeshes(ms).buildUnstructured()
         m0.convertAllToPoly()
         #
-        ms=[m.deepCopy() for i in xrange(5)]
+        ms = [m.deepCopy() for i in range(5)]
         for i,elt in enumerate(ms):
             elt.translate([float(i)*1.5,1.5])
             pass
@@ -3467,6 +3727,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(f_read.isEqual(f,1e-12,1e-12))
         pass
 
+    @WriteInTmpDir
     def testLoadIfNecessaryOnFromScratchFields0(self):
         """
         This test checks that a call to loadArraysIfNecessary works (does nothing) on field data structure whatever its level 1TS, MTS, Fields.
@@ -3521,7 +3782,8 @@ class MEDLoaderTest(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.
         """
@@ -3592,8 +3854,9 @@ class MEDLoaderTest(unittest.TestCase):
         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 convertion is performed in memory and a preparation is done then.
+        """ 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.
         This preparation makes access to internal MEDCouplingMesh pointers whose name must be updated.
         """
         fname="Pyfile79.med"
@@ -3628,6 +3891,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertEqual(mm.getMeshAtLevel(0).getName(),"abc")
         pass
 
+    @WriteInTmpDir
     def testMEDFileFieldsUnloadArraysWithoutDataLoss1(self):
         fileName="Pyfile80.med"
         m=MEDCouplingCMesh() ; m.setName("cmesh")
@@ -3643,7 +3907,7 @@ class MEDLoaderTest(unittest.TestCase):
         #
         fmts=MEDFileFieldMultiTS()
         #
-        for i in xrange(nbCells):
+        for i in range(nbCells):
             t=(float(i)+0.1,i+1,-i-2)
             f.setTime(*t)
             arr2=DataArrayDouble(nbCells)
@@ -3691,8 +3955,9 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(f1ts.getUndergroundDataArray().isEqual(DataArrayDouble([0.,1.,2.,3.,4.,5.,6.,7.,8.,9.,10.,11.,12.,13.,14.,15.,16.,17.,18.,19.,20.,21.,22.,23.,24.]),1e-12))
         pass
 
+    @WriteInTmpDir
     def testMEDFileUMeshLoadPart1(self):
-        """ This method tests MEDFileUMesh.LoadPart that loads only a part of a specified mesh in a MED file. The part is specfied using a slice of cell ids. Only nodes on which cells lies are loaded to reduce at most the amount of
+        """ This method tests MEDFileUMesh.LoadPart that loads only a part of a specified mesh in a MED file. The part is specified using a slice of cell ids. Only nodes on which cells lies are loaded to reduce at most the amount of
         memory of the returned instance.
         """
         fileName="Pyfile81.med"
@@ -3706,13 +3971,13 @@ class MEDLoaderTest(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])
         famField0=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])
         namesCellL0=DataArrayAsciiChar(25,16)
-        namesCellL0[:]=["Cell#%.3d        "%(i) for i in xrange(25)]
+        namesCellL0[:] = ["Cell#%.3d        " % (i) for i in range(25)]
         renumM1=DataArrayInt([3,4,0,2,1])
         famFieldM1=DataArrayInt([-3,-4,0,-2,-1])
         mm.setRenumFieldArr(0,renum0)
@@ -3723,7 +3988,7 @@ class MEDLoaderTest(unittest.TestCase):
         renum1=DataArrayInt([13,16,17,20,21,10,12,11,19,18,15,14,22,23,24,34,33,32,31,30,29,28,27,26,25,45,44,43,42,41,40,39,38,37,36,35])
         famField1=DataArrayInt([-13,-16,-17,-20,-21,-10,-12,-11,-19,-18,-15,-14,-22,-23,-24,-34,-33,-32,-31,-30,-29,-28,-27,-26,-25,-45,-44,-43,-42,-41,-40,-39,-38,-37,-36,-35])
         namesNodes=DataArrayAsciiChar(36,16)
-        namesNodes[:]=["Node#%.3d        "%(i) for i in xrange(36)]
+        namesNodes[:] = ["Node#%.3d        " % (i) for i in range(36)]
         mm.setRenumFieldArr(1,renum1)
         mm.setFamilyFieldArr(1,famField1)
         mm.setNameFieldAtLevel(1,namesNodes)
@@ -3774,6 +4039,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(mm2.getNameFieldAtLevel(1).isEqual(namesNodes[:18]))
         pass
 
+    @WriteInTmpDir
     def testMEDFileFieldsLoadPart1(self):
         """This method tests partial loading on fields on CELL. It is the same principle than those in testMEDFileUMeshLoadPart1.
         """
@@ -3791,15 +4057,15 @@ class MEDLoaderTest(unittest.TestCase):
         f=MEDCouplingFieldDouble(ON_CELLS,ONE_TIME) ; f.setMesh(m)
         f.setName("Field")
         arr=DataArrayDouble(25,2) ; arr.setInfoOnComponents(compos)
-        arr[:,0]=range(25)
-        arr[:,1]=range(100,125)
+        arr[:,0]=list(range(25))
+        arr[:,1]=list(range(100,125))
         f.setArray(arr)
-        WriteField(fileName,f,2)
+        WriteField(fileName,f,True)
         f=MEDCouplingFieldDouble(ON_NODES,ONE_TIME) ; f.setMesh(m)
         f.setName("FieldNode")
         arr=DataArrayDouble(36,2) ; arr.setInfoOnComponents(compos)
-        arr[:,0]=range(200,236)
-        arr[:,1]=range(300,336)
+        arr[:,0]=list(range(200,236))
+        arr[:,1]=list(range(300,336))
         f.setArray(arr)
         f.checkConsistencyLight()
         WriteFieldUsingAlreadyWrittenMesh(fileName,f)
@@ -3816,15 +4082,16 @@ class MEDLoaderTest(unittest.TestCase):
         fs=MEDFileFields.LoadPartOf(fileName,False,ms)
         fs=fs.deepCopy()
         fs[0][0].loadArrays()
-        arr=DataArrayDouble(12,2) ; arr[:,0]=range(3,15) ; arr[:,1]=range(103,115)
+        arr = DataArrayDouble(12, 2) ; arr[:, 0] = list(range(3, 15)) ; arr[:, 1] = list(range(103, 115))
         arr.setInfoOnComponents(compos)
         self.assertTrue(fs[0][0].getUndergroundDataArray().isEqual(arr,1e-12))
         fs[1][0].loadArrays()
-        arr=DataArrayDouble(21,2) ; arr[:,0]=range(203,224) ; arr[:,1]=range(303,324)
+        arr = DataArrayDouble(21, 2) ; arr[:, 0] = list(range(203, 224)) ; arr[:, 1] = list(range(303, 324))
         arr.setInfoOnComponents(compos)
         self.assertTrue(fs[1][0].getUndergroundDataArray().isEqual(arr,1e-12))
         pass
 
+    @WriteInTmpDir
     def testMEDFileWithoutCells1(self):
         fileName="Pyfile83.med"
         coo=DataArrayDouble([(0,0,0),(1,0,0),(2,0,0)])
@@ -3839,6 +4106,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(mm.getCoords().isEqual(coo,1e-12))
         pass
 
+    @WriteInTmpDir
     def testZipCoordsWithLoadPart1(self):
         """ Test close to Pyfile82.med except that here zipCoords on MEDFileUMesh is invoked here to see if the PartDef is correctly updated.
         """
@@ -3856,15 +4124,15 @@ class MEDLoaderTest(unittest.TestCase):
         f=MEDCouplingFieldDouble(ON_CELLS,ONE_TIME) ; f.setMesh(m)
         f.setName("Field")
         arr=DataArrayDouble(25,2) ; arr.setInfoOnComponents(compos)
-        arr[:,0]=range(25)
-        arr[:,1]=range(100,125)
+        arr[:,0]=list(range(25))
+        arr[:,1]=list(range(100,125))
         f.setArray(arr)
-        WriteField(fileName,f,2)
+        WriteField(fileName,f,True)
         f=MEDCouplingFieldDouble(ON_NODES,ONE_TIME) ; f.setMesh(m)
         f.setName("FieldNode")
         arr=DataArrayDouble(36,2) ; arr.setInfoOnComponents(compos)
-        arr[:,0]=range(200,236)
-        arr[:,1]=range(300,336)
+        arr[:,0]=list(range(200,236))
+        arr[:,1]=list(range(300,336))
         f.setArray(arr)
         f.checkConsistencyLight()
         WriteFieldUsingAlreadyWrittenMesh(fileName,f)
@@ -3892,8 +4160,31 @@ class MEDLoaderTest(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
     def testMEDFileCMeshSetGroupsAtLevel(self):
         """ Non regression test to check that setGroupsAtLevel is available with MEDFileCMesh.
         """
@@ -3905,6 +4196,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(mm.getFamilyFieldAtLevel(0).isEqual(DataArrayInt([-1,-2,-1,-2,-2,-2,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1])))
         pass
 
+    @WriteInTmpDir
     def testMEDFileUMeshBuildExtrudedMesh1(self):
         """ New functionality of MEDFileUMesh.buildExtrudedMesh."""
         fileName="Pyfile85.med"
@@ -3987,8 +4279,8 @@ class MEDLoaderTest(unittest.TestCase):
         pass
 
     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
+    @WriteInTmpDir
     def testMEDFileUMeshPickeling1(self):
-        import cPickle
         outFileName="Pyfile86.med"
         c=DataArrayDouble([-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)
         c.setInfoOnComponents(["aa","bbb"])
@@ -4050,10 +4342,10 @@ class MEDLoaderTest(unittest.TestCase):
         g2_1.setName("G2")
         mm.setGroupsAtLevel(-1,[g1_1,g2_1],False)
         g1_N=DataArrayInt.New()
-        g1_N.setValues(range(8),8,1)
+        g1_N.setValues(list(range(8)),8,1)
         g1_N.setName("G1")
         g2_N=DataArrayInt.New()
-        g2_N.setValues(range(9),9,1)
+        g2_N.setValues(list(range(9)),9,1)
         g2_N.setName("G2")
         mm.setGroupsAtLevel(1,[g1_N,g2_N],False)
         mm.createGroupOnAll(0,"GrpOnAllCell")
@@ -4073,18 +4365,19 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(mm.existsGroup("GrpOnAllCell"));
         t=mm.getGroupArr(0,"GrpOnAllCell")
         #
-        st=cPickle.dumps(mm,cPickle.HIGHEST_PROTOCOL)
-        mm2=cPickle.loads(st)
+        st=pickle.dumps(mm,pickle.HIGHEST_PROTOCOL)
+        mm2=pickle.loads(st)
         self.assertTrue(mm.isEqual(mm2,1e-12)[0])
         self.assertEqual(mm.getAxisType(),AX_CART)
         #
         mm.setAxisType(AX_CYL)
-        st=cPickle.dumps(mm,cPickle.HIGHEST_PROTOCOL)
-        mm2=cPickle.loads(st)
+        st=pickle.dumps(mm,pickle.HIGHEST_PROTOCOL)
+        mm2=pickle.loads(st)
         self.assertTrue(mm.isEqual(mm2,1e-12)[0])
         self.assertEqual(mm2.getAxisType(),AX_CYL)
         pass
 
+    @WriteInTmpDir
     def testMEDFileFieldsLoadSpecificEntities1(self):
         nbNodes=11
         fieldName="myField"
@@ -4099,7 +4392,7 @@ class MEDLoaderTest(unittest.TestCase):
         m.setName(meshName)
         #
         fmts=MEDFileFieldMultiTS()
-        for i in xrange(nbPdt):
+        for i in range(nbPdt):
             f=MEDCouplingFieldDouble(ON_NODES)
             f.setMesh(m)
             arr=DataArrayDouble(nbNodes) ; arr.iota() ; arr*=i
@@ -4117,14 +4410,14 @@ class MEDLoaderTest(unittest.TestCase):
         fs2=MEDFileFields.LoadSpecificEntities(fileName,[(ON_NODES,NORM_ERROR)],False)
         fs.loadArraysIfNecessary()
         fs2.loadArraysIfNecessary()
-        for i in xrange(nbPdt):
+        for i in range(nbPdt):
             self.assertTrue(fs[fieldName][i].getUndergroundDataArray().isEqual(fs2[fieldName][i].getUndergroundDataArray(),1e-12))
             pass
         m1=MEDCouplingCMesh() ; m1.setCoords(DataArrayDouble([0,1,2,3]),DataArrayDouble([0,1])) ; m1=m1.buildUnstructured() ; m1.simplexize(0)
         m2=MEDCouplingCMesh() ; m2.setCoords(DataArrayDouble([3,4,5]),DataArrayDouble([0,1])) ; m2=m2.buildUnstructured()
         m3=MEDCouplingUMesh.MergeUMeshes(m1,m2) ; m3.setName(meshName)
         fmts=MEDFileFieldMultiTS()
-        for i in xrange(nbPdt):
+        for i in range(nbPdt):
             f=MEDCouplingFieldDouble(ON_CELLS)
             f.setMesh(m3)
             arr=DataArrayDouble(8) ; arr.iota() ; arr*=i
@@ -4147,13 +4440,14 @@ class MEDLoaderTest(unittest.TestCase):
         fs2.loadArraysIfNecessary()
         fs3.loadArraysIfNecessary()
         fs4.loadArraysIfNecessary()
-        for i in xrange(nbPdt):
+        for i in range(nbPdt):
             self.assertTrue(fs[fieldName][i].getUndergroundDataArray()[:6].isEqual(fs2[fieldName][i].getUndergroundDataArray(),1e-12))
             self.assertTrue(fs[fieldName][i].getUndergroundDataArray()[6:8].isEqual(fs3[i].getUndergroundDataArray(),1e-12))
             self.assertTrue(fs[fieldName][i].getUndergroundDataArray().isEqual(fs4[fieldName][i].getUndergroundDataArray(),1e-12))
             pass
         pass
 
+    @WriteInTmpDir
     def testMEDFileLotsOfTSRW1(self):
         nbNodes=11
         fieldName="myField"
@@ -4168,12 +4462,12 @@ class MEDLoaderTest(unittest.TestCase):
         m=m.buildUnstructured()
         m.setName(meshName)
         #
-        nbOfField=nbPdt/maxPdt
+        nbOfField=nbPdt//maxPdt
         fs=MEDFileFields()
-        for j in xrange(nbOfField):
+        for j in range(nbOfField):
             fmts=MEDFileFieldMultiTS()
             s=DataArray.GetSlice(slice(0,nbPdt,1),j,nbOfField)
-            for i in xrange(s.start,s.stop,s.step):
+            for i in range(s.start, s.stop, s.step):
                 f=MEDCouplingFieldDouble(ON_NODES)
                 f.setMesh(m)
                 arr=DataArrayDouble(nbNodes) ; arr.iota() ; arr*=i
@@ -4221,15 +4515,16 @@ class MEDLoaderTest(unittest.TestCase):
             fmts2.reverse()
             zeResu=fmts2.pop()
             nbIter=len(fmts2)
-            for ii in xrange(nbIter):
+            for ii in range(nbIter):
                 zeResu.pushBackTimeSteps(fmts2.pop())
                 pass
             zeResu.setName(k)
             fs2.pushField(zeResu)
             pass
-        self.assertEqual(fs2[0].getTimeSteps(),[(i,0,float(i)) for i in xrange(nbPdt)])
+        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."""
         fileName="Pyfile89.med"
@@ -4289,6 +4584,7 @@ class MEDLoaderTest(unittest.TestCase):
             self.assertEqual(mm.getFamilyId(elt),eltId)
         pass
 
+    @WriteInTmpDir
     def testNonRegrCMeshSetFieldPfl1(self):
         """ Non regression test. For structured mesh, push a false partial field in MEDFileField1TS using setFieldProfile."""
         ff=MEDFileField1TS()
@@ -4330,6 +4626,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(field.isEqual(field2,1e-12,1e-12))
         pass
 
+    @WriteInTmpDir
     def testMEDFileUMeshLinearToQuadraticAndRev1(self):
         meshName="mesh"
         fileName="Pyfile90.med"
@@ -4373,6 +4670,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue(mm.isEqual(mmOut2,1e-12)[0])
         pass
 
+    @WriteInTmpDir
     def testMEDFileMeshAddGroup1(self):
         m=MEDCouplingCMesh()
         arrX=DataArrayDouble(9) ; arrX.iota()
@@ -4410,7 +4708,7 @@ class MEDLoaderTest(unittest.TestCase):
             self.assertTrue(mm.getGroupArr(1,"%s_node"%grp.getName()).isEqual(grpExp))
         pass
 
-    pass
+    @WriteInTmpDir
     def testMEDFileJoint1(self):
         fileName="Pyfile92.med"
         coo=DataArrayDouble([(0,0,0),(1,0,0),(2,0,0)])
@@ -4448,8 +4746,9 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertRaises( InterpKernelException, jointsR.getJointAtPos,1)
         self.assertRaises( InterpKernelException, jointsR.destroyJointAtPos,1)
         jointsR.destroyJointAtPos(0)
-        
-    pass
+        pass
+
+    @WriteInTmpDir
     def testMEDFileJoint2(self):
         fileNameWr="Pyfile93.med"
         coo=DataArrayDouble([(0,0,0),(1,0,0),(2,0,0)])
@@ -4498,6 +4797,7 @@ class MEDLoaderTest(unittest.TestCase):
         self.assertTrue( jointR2.isEqual( two_joint ))
         pass
 
+    @WriteInTmpDir
     def testMEDFileJoint1(self):
         node_correspond=MEDFileJointCorrespondence(DataArrayInt([1,2,3,4,5,6,7,8]))
         cell_correspond=MEDFileJointCorrespondence(DataArrayInt([9,10,11,12]),NORM_TRI3,NORM_TRI3)
@@ -4538,36 +4838,12 @@ class MEDLoaderTest(unittest.TestCase):
         pass
 
     @unittest.skipUnless('linux'==platform.system().lower(),"stderr redirection not ported on Windows ?")
+    @WriteInTmpDir
     def testMEDFileSafeCall0(self):
         """ EDF11242 : check status of MED file calls to detect problems immediately. Sorry this test generates awful messages !"""
         fname="Pyfile94.med"
         errfname="Pyfile94.err"
-        class StdOutRedirect(object):
-            def __init__(self,fileName):
-                import os,sys
-                sys.stderr.flush()
-                self.stdoutOld=os.dup(2)
-                self.fdOfSinkFile=os.open(fileName,os.O_CREAT | os.O_RDWR)
-                fd2=os.dup2(self.fdOfSinkFile,2)
-                self.origPyVal=sys.stderr
-                class FlushFile(object):
-                    def __init__(self,f):
-                        self.f=f
-                    def write(self,st):
-                        self.f.write(st)
-                        self.f.flush()
-                    def flush(self):
-                        return self.f.flush()
-                    def isatty(self):
-                        return self.f.isatty()
-                sys.stderr=FlushFile(os.fdopen(self.fdOfSinkFile,"w"))
-            def __del__(self):
-                import os,sys
-                sys.stderr=self.origPyVal
-                #os.fsync(self.fdOfSinkFile)
-                os.fsync(2)
-                os.dup2(self.stdoutOld,2)
-                os.close(self.stdoutOld)
+
         import os
         # first clean file if needed
         if os.path.exists(fname):
@@ -4582,7 +4858,7 @@ class MEDLoaderTest(unittest.TestCase):
         mm.setName("mesh")
         mm.write(fname,2)
         # third : change permissions to remove write access on created file
-        os.chmod(fname,0444)
+        os.chmod(fname, 0o444)
         # four : try to append data on file -> check that it raises Exception
         f=MEDCouplingFieldDouble(ON_CELLS)
         f.setName("field")
@@ -4602,6 +4878,7 @@ class MEDLoaderTest(unittest.TestCase):
         #
         pass
 
+    @WriteInTmpDir
     def testUnivStatus1(self):
         """ Non regression test to check the effectiveness of univ write status."""
         fname="Pyfile95.med"
@@ -4618,10 +4895,11 @@ class MEDLoaderTest(unittest.TestCase):
         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]))
@@ -4650,15 +4928,15 @@ class MEDLoaderTest(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])
-      
-      import cPickle
-      st=cPickle.dumps(mesh,2)
-      mm=cPickle.loads(st)
-      st2=cPickle.dumps(mm,2)
-      mm2=cPickle.loads(st2)
+
+      st=pickle.dumps(mesh,2)
+      mm=pickle.loads(st)
+      st2=pickle.dumps(mm,2)
+      mm2=pickle.loads(st2)
       self.assertTrue(mesh.isEqual(mm2,1e-12)[0])
       pass
 
+    @WriteInTmpDir
     def testMEDFileEquivalence1(self):
       """ First check of equivalence implementation in MEDFileMesh"""
       fileName="Pyfile97.med"
@@ -4676,14 +4954,14 @@ class MEDLoaderTest(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))
@@ -4715,6 +4993,7 @@ class MEDLoaderTest(unittest.TestCase):
       self.assertTrue(mm.isEqual(mm3,1e-12)[0])
       pass
 
+    @WriteInTmpDir
     def testMEDFileForFamiliesPlayer1(self):
       """Non regression bug EDF11911. For serial killers using same family name to store both cells and nodes ! Only sky is the limit."""
       fileName="Pyfile98.med"
@@ -4739,13 +5018,14 @@ class MEDLoaderTest(unittest.TestCase):
       self.assertEqual(mm.getFamiliesIdsOnGroup("RID"),(-4,3))
       mm.write(fileName,2)
       # now read such funny file !
-      mm2=MEDFileMesh.New(fileName) # <- normaly mdump of Pyfile98.med must contain only RID and FAMILLE_ZERO families.
+      mm2=MEDFileMesh.New(fileName) # <- normally mdump of Pyfile98.med must contain only RID and FAMILLE_ZERO families.
       self.assertTrue(mm.isEqual(mm2,1e-16))
       self.assertEqual(mm2.getFamiliesNames(),("FAMILLE_ZERO",'RIDF!/__\\!0000','RIDF!/__\\!0001'))
       self.assertEqual(mm2.getFamiliesNamesWithFilePointOfView(),("FAMILLE_ZERO","RIDF","RIDF"))
       self.assertEqual(mm2.getFamiliesIdsOnGroup("RID"),(-4,3))# <- very important too !
       pass
 
+    @WriteInTmpDir
     def testCartesianizer1(self):
       """ This test is advanced to be sure that no unnecessary copies had been made during cartesianization process. """
       # UMesh non cart
@@ -4852,7 +5132,1690 @@ class MEDLoaderTest(unittest.TestCase):
       self.assertTrue(mm.getHiddenCppPointer()==mm2.getHiddenCppPointer()) # optimization
       pass
 
+    @WriteInTmpDir
+    def testCheckCoherency(self):
+      m2 = MEDCouplingUMesh("2d", 2)
+      m2.setCoords(DataArrayDouble([(0.0, 1.0)] * 4, 4,2))  # whatever
+      m2.setConnectivity(DataArrayInt([NORM_TRI3, 0,1,2,NORM_TRI3, 1,2,3]), DataArrayInt(([0,4,8])))
+      m1 , _, _ , _, _ = m2.buildDescendingConnectivity()
+      mum = MEDFileUMesh()
+      mum.setMeshAtLevel(0, m2)
+      mum.setMeshAtLevel(-1, m1)
+      mum.checkConsistency()
+      mum2 = mum.deepCopy()
+
+      # Nodes
+      arr = DataArrayInt([2]*4)
+      mum.setFamilyFieldArr(1, arr); arr.reAlloc(35);
+      self.assertRaises(InterpKernelException, mum.checkConsistency)
+      mum=mum2; mum2=mum.deepCopy();
+      arr = DataArrayInt([2]*4)
+      mum.setRenumFieldArr(1, arr); arr.reAlloc(35);
+      self.assertRaises(InterpKernelException, mum.checkConsistency)
+      mum=mum2; mum2=mum.deepCopy();
+      mum.setRenumFieldArr(1, DataArrayInt([2]*4))
+      self.assertRaises(InterpKernelException, mum.checkConsistency)
+      mum=mum2; mum2=mum.deepCopy();
+      arr = DataArrayAsciiChar(['tutu           x']*4)
+      mum.setNameFieldAtLevel(1, arr); arr.reAlloc(35);
+      self.assertRaises(InterpKernelException, mum.checkConsistency)
+
+      # 2D
+      mum=mum2; mum2=mum.deepCopy();
+      arr = DataArrayInt([2]*2)
+      mum.setFamilyFieldArr(0, arr); arr.reAlloc(35);
+      self.assertRaises(InterpKernelException, mum.checkConsistency)
+      mum=mum2; mum2=mum.deepCopy();
+      arr = DataArrayInt([2]*2)
+      mum.setRenumFieldArr(0, arr); arr.reAlloc(35);
+      self.assertRaises(InterpKernelException, mum.checkConsistency)
+      mum=mum2; mum2=mum.deepCopy();
+      mum.setRenumFieldArr(0, DataArrayInt([2]*2))
+      self.assertRaises(InterpKernelException, mum.checkConsistency)
+      mum=mum2; mum2=mum.deepCopy();
+      arr = DataArrayAsciiChar(['tutu           x']*2)
+      mum.setNameFieldAtLevel(0, arr); arr.reAlloc(35);
+      self.assertRaises(InterpKernelException, mum.checkConsistency)
+
+      # 1D
+      mum=mum2; mum2=mum.deepCopy();
+      arr = DataArrayInt([2]*5)
+      mum.setFamilyFieldArr(-1, arr); arr.reAlloc(35);
+      self.assertRaises(InterpKernelException, mum.checkConsistency)
+      mum=mum2; mum2=mum.deepCopy();
+      arr = DataArrayInt([2]*5)
+      mum.setRenumFieldArr(-1, arr); arr.reAlloc(35);
+      self.assertRaises(InterpKernelException, mum.checkConsistency)
+      mum=mum2; mum2=mum.deepCopy();
+      mum.setRenumFieldArr(-1, DataArrayInt([2]*5))
+      self.assertRaises(InterpKernelException, mum.checkConsistency)
+      mum=mum2; mum2=mum.deepCopy();
+      arr = DataArrayAsciiChar(['tutu           x']*5)
+      mum.setNameFieldAtLevel(-1, arr); arr.reAlloc(35);
+      self.assertRaises(InterpKernelException, mum.checkConsistency)
+
+    @WriteInTmpDir
+    def testCheckSMESHConsistency(self):
+      m2 = MEDCouplingUMesh("2d", 2)
+      m2.setCoords(DataArrayDouble([(0.0, 1.0)] * 4, 4,2))  # whatever
+      m2.setConnectivity(DataArrayInt([NORM_TRI3, 0,1,2,NORM_TRI3, 1,2,3]), DataArrayInt(([0,4,8])))
+      m1 , _, _ , _, _ = m2.buildDescendingConnectivity()
+      mum = MEDFileUMesh()
+      mum.setMeshAtLevel(0, m2)
+      mum.setMeshAtLevel(-1, m1)
+      mum.checkConsistency()
+      mum.checkSMESHConsistency()
+      n2 = DataArrayInt(m2.getNumberOfCells(), 1); n2.iota(1)
+      n1 = DataArrayInt(m1.getNumberOfCells(), 1); n1.iota(1)
+      mum.setRenumFieldArr(0, n2)
+      mum.setRenumFieldArr(-1, n1)
+      self.assertRaises(InterpKernelException, mum.checkSMESHConsistency)
+      mum.setRenumFieldArr(-1, n1+100)
+      mum.checkSMESHConsistency()
+      pass
+
+    @WriteInTmpDir
+    def testClearNodeAndCellNumbers(self):
+      m2 = MEDCouplingUMesh("2d", 2)
+      m2.setCoords(DataArrayDouble([(0.0, 1.0)] * 4, 4,2))  # whatever
+      m2.setConnectivity(DataArrayInt([NORM_TRI3, 0,1,2,NORM_TRI3, 1,2,3]), DataArrayInt(([0,4,8])))
+      m1 , _, _ , _, _ = m2.buildDescendingConnectivity()
+      mum = MEDFileUMesh()
+      mum.setMeshAtLevel(0, m2)
+      mum.setMeshAtLevel(-1, m1)
+      mum.checkConsistency()
+      n2 = DataArrayInt(m2.getNumberOfCells(), 1); n2.iota(1)
+      n1 = DataArrayInt(m1.getNumberOfCells(), 1); n1.iota(1)
+      mum.setRenumFieldArr(0, n2)
+      mum.setRenumFieldArr(-1, n1)
+      mum.clearNodeAndCellNumbers()
+      mum.checkSMESHConsistency()
+      pass
+
+    @WriteInTmpDir
+    def testCMeshSetFamilyFieldArrNull(self):
+      meshName="mesh"
+      fname="Pyfile99.med"
+      arrX=DataArrayDouble([0,1,2,3])
+      arrY=DataArrayDouble([0,1,2])
+      m=MEDCouplingCMesh() ; m.setCoords(arrX,arrY) ; m.setName(meshName)
+      mm=MEDFileCMesh() ; mm.setMesh(m)
+      famCellIds=DataArrayInt([0,-2,-2,-1,-2,0])
+      famNodeIds=DataArrayInt([0,0,0,3,4,1,2,7,2,1,0,0])
+      mm.setFamilyFieldArr(0,famCellIds)
+      mm.setFamilyFieldArr(1,famNodeIds)
+      mm.write(fname,2)
+      mm=MEDFileMesh.New(fname)
+      self.assertTrue(mm.getFamilyFieldAtLevel(0) is not None)
+      self.assertTrue(mm.getFamilyFieldAtLevel(1) is not None)
+      mm.setFamilyFieldArr(0,None)#<- bug was here
+      mm.setFamilyFieldArr(1,None)#<- bug was here
+      self.assertTrue(mm.getFamilyFieldAtLevel(0) is None)
+      self.assertTrue(mm.getFamilyFieldAtLevel(1) is None)
+      mm3=mm.deepCopy()
+      self.assertTrue(mm3.getFamilyFieldAtLevel(0) is None)
+      self.assertTrue(mm3.getFamilyFieldAtLevel(1) is None)
+      mm.write(fname,2)
+      mm2=MEDFileMesh.New(fname)
+      self.assertTrue(mm2.getFamilyFieldAtLevel(0) is None)
+      self.assertTrue(mm2.getFamilyFieldAtLevel(1) is None)
+      pass
+
+    @WriteInTmpDir
+    def testAppendFieldProfileOnIntField(self):
+      fname="Pyfile100.med"
+      arrX=DataArrayDouble([0,1,2,3])
+      arrY=DataArrayDouble([0,1,2])
+      mesh=MEDCouplingCMesh() ; mesh.setCoords(arrX,arrY) ; mesh.setName("Mesh")
+      mm=MEDFileCMesh()
+      mm.setMesh(mesh)
+      #
+      fmts=MEDFileIntFieldMultiTS()
+      pflName="PFL"
+      pfl=DataArrayInt([1,3,5]) ; pfl.setName(pflName)
+      f=MEDCouplingFieldInt(ON_CELLS) ; f.setMesh(mesh)
+      fieldName="FieldOnCell"
+      f.setTime(1.2,1,1) ; f.setName(fieldName)
+      arr=DataArrayInt32([101,102,103]) ; f.setArray(arr)
+      fmts.appendFieldProfile(f,mm,0,pfl)
+      #
+      mm.write(fname,2)
+      fmts.write(fname,0)
+      #
+      mm=MEDFileMesh.New(fname)
+      fmts=MEDFileAnyTypeFieldMultiTS.New(fname)
+      self.assertTrue(isinstance(fmts,MEDFileIntFieldMultiTS))
+      self.assertEqual(fmts.getName(),fieldName)
+      self.assertEqual(len(fmts),1)
+      f1ts=fmts[0]
+      ftest,pfltest=f1ts.getFieldWithProfile(ON_CELLS,0,mm)
+      self.assertEqual(pfltest.getName(),pflName)
+      self.assertEqual(ftest.getName(),fieldName)
+      self.assertTrue(ftest.isEqualWithoutConsideringStr(arr))
+      ftest2=f1ts.getFieldOnMeshAtLevel(ON_CELLS,0,mm)
+      self.assertTrue(ftest2.getArray().isEqualWithoutConsideringStr(arr))
+      self.assertEqual(ftest2.getTime(),f.getTime())
+      self.assertEqual(ftest2.getMesh().getNumberOfCells(),len(arr))
+      pass
+
+    @WriteInTmpDir
+    def testMEDFileFieldEasyField1(self):
+      """Check for all spatial discretization of field (cells,nodes,elno,gauss) for double field that all is OK. Here no profile and only top level is considered."""
+      ## Basic test on cells on top level
+      fname="Pyfile101.med"
+      fieldName="field1"
+      mm=MEDFileUMesh()
+      coo=DataArrayDouble([(3,2,1),(8,7,6),(5,9,10)])
+      m=MEDCouplingUMesh("mesh",2) ; m.setCoords(coo)
+      m.allocateCells()
+      m.insertNextCell(NORM_TRI3,[0,1,2])
+      m.insertNextCell(NORM_TRI3,[3,4,5])
+      m.insertNextCell(NORM_TRI3,[6,7,8])
+      m.insertNextCell(NORM_TRI3,[9,10,11])
+      m.insertNextCell(NORM_QUAD4,[100,101,102,103])
+      m.insertNextCell(NORM_QUAD4,[104,105,106,107])
+      mm[0]=m
+      mm.write(fname,2)
+      arr0=DataArrayDouble([10,11,12,13,100,101])
+      f=MEDCouplingFieldDouble(ON_CELLS) ; f.setArray(arr0) ; f.setMesh(m)
+      f.setName(fieldName) ; f.setTime(2.,6,7)
+      f0=f.deepCopy()
+      ff=MEDFileFieldMultiTS() ; ff.appendFieldNoProfileSBT(f)
+      ff.write(fname,0)
+      arr2=arr0+1000 ; f.setArray(arr2)
+      f.setTime(3.,8,9) ; ff=MEDFileField1TS() ; ff.setFieldNoProfileSBT(f)
+      ff.write(fname,0)
+      f1=f.deepCopy()
+      ##
+      mm=MEDFileMesh.New(fname)
+      f1ts=MEDFileField1TS(fname,fieldName,6,7)
+      ftst0=f1ts.field(mm)
+      self.assertTrue(f0.isEqual(ftst0,1e-12,1e-12))
+      f1ts=MEDFileField1TS(fname,fieldName,8,9)
+      ftst1=f1ts.field(mm)
+      self.assertTrue(f1.isEqual(ftst1,1e-12,1e-12))
+      fmts=MEDFileFieldMultiTS(fname,fieldName)
+      self.assertTrue(f1.isEqual(fmts.field(8,9,mm),1e-12,1e-12))
+      ## Basic test on nodes on top level
+      f2=MEDCouplingFieldDouble(ON_NODES) ; arr2=DataArrayDouble([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=MEDFileField1TS() ; ff.setFieldNoProfileSBT(f2) ; ff.write(fname,0)
+      #
+      mm=MEDFileMesh.New(fname)
+      f1ts=MEDFileField1TS(fname,fieldName,23,24)
+      self.assertTrue(f2.isEqual(f1ts.field(mm),1e-12,1e-12))
+      fmts=MEDFileFieldMultiTS(fname,fieldName)
+      self.assertTrue(f2.isEqual(fmts.field(23,24,mm),1e-12,1e-12))
+      ## Node on elements
+      f3=MEDCouplingFieldDouble(ON_GAUSS_NE) ; f3.setMesh(m) ; arr3=DataArrayDouble([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=MEDFileField1TS() ; ff.setFieldNoProfileSBT(f3) ; ff.write(fname,0)
+      #
+      mm=MEDFileMesh.New(fname)
+      f1ts=MEDFileField1TS(fname,fieldName,2,3)
+      self.assertTrue(f3.isEqual(f1ts.field(mm),1e-12,1e-12))
+      ## Gauss
+      f4=MEDCouplingFieldDouble(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=DataArrayDouble([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=MEDFileField1TS() ; ff.setFieldNoProfileSBT(f4) ; ff.write(fname,0)
+      #
+      mm=MEDFileMesh.New(fname)
+      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.
+        Check for all spatial discretization of field (cells,nodes,elno,gauss) for int field that all is OK. Here no profile and only top level is considered."""
+        ## Basic test on cells on top level
+        fname="Pyfile102.med"
+        fieldName="field1"
+        mm=MEDFileUMesh()
+        coo=DataArrayDouble([(3,2,1),(8,7,6),(5,9,10)])
+        m=MEDCouplingUMesh("mesh",2) ; m.setCoords(coo)
+        m.allocateCells()
+        m.insertNextCell(NORM_TRI3,[0,1,2])
+        m.insertNextCell(NORM_TRI3,[3,4,5])
+        m.insertNextCell(NORM_TRI3,[6,7,8])
+        m.insertNextCell(NORM_TRI3,[9,10,11])
+        m.insertNextCell(NORM_QUAD4,[100,101,102,103])
+        m.insertNextCell(NORM_QUAD4,[104,105,106,107])
+        mm[0]=m
+        mm.write(fname,2)
+        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()
+        ff=MEDFileIntFieldMultiTS() ; ff.appendFieldNoProfileSBT(f)
+        ff.write(fname,0)
+        arr2=arr0+1000 ; f.setArray(arr2)
+        f.setTime(3.,8,9) ; ff=MEDFileIntField1TS() ; ff.setFieldNoProfileSBT(f)
+        ff.write(fname,0)
+        f1=f.deepCopy()
+        ##
+        mm=MEDFileMesh.New(fname)
+        f1ts=MEDFileIntField1TS(fname,fieldName,6,7)
+        ftst0=f1ts.field(mm)
+        self.assertTrue(f0.isEqual(ftst0,1e-12,0))
+        f1ts=MEDFileIntField1TS(fname,fieldName,8,9)
+        ftst1=f1ts.field(mm)
+        self.assertTrue(f1.isEqual(ftst1,1e-12,0))
+        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=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)
+        #
+        mm=MEDFileMesh.New(fname)
+        f1ts=MEDFileIntField1TS(fname,fieldName,23,24)
+        self.assertTrue(f2.isEqual(f1ts.field(mm),1e-12,0))
+        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=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)
+        #
+        mm=MEDFileMesh.New(fname)
+        f1ts=MEDFileIntField1TS(fname,fieldName,2,3)
+        self.assertTrue(f3.isEqual(f1ts.field(mm),1e-12,0))
+        ## Gauss
+        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=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)
+        self.assertTrue(f4.isEqual(f1ts.field(mm),1e-12,0))
+        pass
+
+    @WriteInTmpDir
+    def testMEDFileFieldEasyField3(self):
+        """Here a multi level mesh. And field on cells lying on different level of this mesh. Show how "field" method deal with that. Here on field double are considered."""
+        fname="Pyfile103.med"
+        fieldName="field1"
+        mm=MEDFileUMesh()
+        coo=DataArrayDouble([(3,2,1),(8,7,6),(5,9,10)])
+        m=MEDCouplingUMesh("mesh",2) ; m.setCoords(coo)
+        m.allocateCells()
+        m.insertNextCell(NORM_TRI3,[0,1,2])
+        m.insertNextCell(NORM_TRI3,[3,4,5])
+        m.insertNextCell(NORM_TRI3,[6,7,8])
+        m.insertNextCell(NORM_TRI3,[9,10,11])
+        m.insertNextCell(NORM_QUAD4,[100,101,102,103])
+        m.insertNextCell(NORM_QUAD4,[104,105,106,107])
+        mm[-1]=m
+        m0=MEDCouplingUMesh("mesh",3) ; m0.setCoords(coo)
+        m0.allocateCells()
+        m0.insertNextCell(NORM_TETRA4,[3,2,5,0])
+        m0.insertNextCell(NORM_TETRA4,[7,6,3,2])
+        mm[0]=m0
+        mm.write(fname,2)
+        # start slowly
+        f1=MEDCouplingFieldDouble(ON_CELLS) ; f1.setName(fieldName) ; f1.setArray(DataArrayDouble([(0,100),(1,101)])) ; f1.setMesh(mm[0]) ; f1.setTime(4.,1,2)
+        f1ts=MEDFileField1TS() ; f1ts.setFieldNoProfileSBT(f1) ; f1ts.write(fname,0)
+        #
+        mm=MEDFileMesh.New(fname) ; f1ts=MEDFileField1TS(fname,fieldName,1,2)
+        self.assertTrue(f1.isEqual(f1ts.field(mm),1e-12,1e-12))
+        # here f1 lying on level -1 not 0 check if "field" method detect it !
+        f1=MEDCouplingFieldDouble(ON_CELLS) ; f1.setName(fieldName) ; f1.setArray(DataArrayDouble([(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()
+        mm.write(fname,2)
+        f1ts=MEDFileField1TS() ; f1ts.setFieldNoProfileSBT(f1) ; f1ts.write(fname,0)
+        #
+        mm=MEDFileMesh.New(fname) ; f1ts=MEDFileField1TS(fname,fieldName,3,4)
+        self.assertTrue(f1.isEqual(f1ts.field(mm),1e-12,1e-12))
+        # nodes on elements
+        f3=MEDCouplingFieldDouble(ON_GAUSS_NE)
+        f3.setMesh(mm[-1]) # this line is important
+        arr3=DataArrayDouble([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=MEDFileField1TS() ; ff.setFieldNoProfileSBT(f3) ; ff.write(fname,0)
+        #
+        mm=MEDFileMesh.New(fname) ; f1ts=MEDFileField1TS(fname,fieldName,2,3)
+        self.assertTrue(f3.isEqual(f1ts.field(mm),1e-12,1e-12))
+        # gauss
+        f4=MEDCouplingFieldDouble(ON_GAUSS_PT)
+        f4.setMesh(mm[-1]) # this line is important
+        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=DataArrayDouble([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=MEDFileField1TS() ; ff.setFieldNoProfileSBT(f4) ; ff.write(fname,0)
+        mm=MEDFileMesh.New(fname) ; f1ts=MEDFileField1TS(fname,fieldName,4,5)
+        self.assertTrue(f4.isEqual(f1ts.field(mm),1e-12,1e-12))
+        pass
+
+    @WriteInTmpDir
+    def testMEDFileFieldEasyField4(self):
+        """ Same than testMEDFileFieldEasyField3 but with integers"""
+        fname="Pyfile104.med"
+        fieldName="field1"
+        mm=MEDFileUMesh()
+        coo=DataArrayDouble([(3,2,1),(8,7,6),(5,9,10)])
+        m=MEDCouplingUMesh("mesh",2) ; m.setCoords(coo)
+        m.allocateCells()
+        m.insertNextCell(NORM_TRI3,[0,1,2])
+        m.insertNextCell(NORM_TRI3,[3,4,5])
+        m.insertNextCell(NORM_TRI3,[6,7,8])
+        m.insertNextCell(NORM_TRI3,[9,10,11])
+        m.insertNextCell(NORM_QUAD4,[100,101,102,103])
+        m.insertNextCell(NORM_QUAD4,[104,105,106,107])
+        mm[-1]=m
+        m0=MEDCouplingUMesh("mesh",3) ; m0.setCoords(coo)
+        m0.allocateCells()
+        m0.insertNextCell(NORM_TETRA4,[3,2,5,0])
+        m0.insertNextCell(NORM_TETRA4,[7,6,3,2])
+        mm[0]=m0
+        mm.write(fname,2)
+        # start slowly
+        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(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()
+        mm.write(fname,2)
+        f1ts=MEDFileIntField1TS() ; f1ts.setFieldNoProfileSBT(f1) ; f1ts.write(fname,0)
+        #
+        mm=MEDFileMesh.New(fname) ; f1ts=MEDFileIntField1TS(fname,fieldName,3,4)
+        self.assertTrue(f1.isEqual(f1ts.field(mm),1e-12,0))
+        # nodes on elements
+        f3=MEDCouplingFieldInt(ON_GAUSS_NE)
+        f3.setMesh(mm[-1]) # this line is important
+        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)
+        #
+        mm=MEDFileMesh.New(fname) ; f1ts=MEDFileIntField1TS(fname,fieldName,2,3)
+        self.assertTrue(f3.isEqual(f1ts.field(mm),1e-12,0))
+        # gauss
+        f4=MEDCouplingFieldInt(ON_GAUSS_PT)
+        f4.setMesh(mm[-1]) # this line is important
+        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=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)
+        self.assertTrue(f4.isEqual(f1ts.field(mm),1e-12,0))
+        pass
+
+    @WriteInTmpDir
+    def testMEDFileFieldEasyField5(self):
+        """More and more difficult now look at how profiles are managed by "field" method."""
+        fname="Pyfile105.med"
+        fieldName="field1"
+        mm=MEDFileUMesh()
+        coo=DataArrayDouble([(3,2,1),(8,7,6),(5,9,10)])
+        m=MEDCouplingUMesh("mesh",2) ; m.setCoords(coo)
+        m.allocateCells()
+        m.insertNextCell(NORM_TRI3,[0,1,2])
+        m.insertNextCell(NORM_TRI3,[3,4,5])
+        m.insertNextCell(NORM_TRI3,[6,7,8])
+        m.insertNextCell(NORM_TRI3,[9,10,11])
+        m.insertNextCell(NORM_QUAD4,[100,101,102,103])
+        m.insertNextCell(NORM_QUAD4,[104,105,106,107])
+        mm[0]=m
+        mm.write(fname,2)
+        pfl=DataArrayInt([0,2,3,5]) ; pfl.setName("pfl")
+        m2=m.deepCopy()[pfl] ; m2.setName(m.getName())
+        #
+        arr0=DataArrayDouble([10,11,12,13])
+        f=MEDCouplingFieldDouble(ON_CELLS) ; f.setArray(arr0) ; f.setMesh(m2)
+        f.setName(fieldName) ; f.setTime(2.,6,7) ; f.checkConsistencyLight()
+        ff=MEDFileFieldMultiTS() ; ff.appendFieldProfile(f,mm,0,pfl) # ff is a field on profile
+        ff.write(fname,0)
+        #
+        mm=MEDFileMesh.New(fname) ; f1ts=MEDFileField1TS(fname,fieldName,6,7)
+        self.assertTrue(f.isEqual(f1ts.field(mm),1e-12,1e-12))
+        # more complicated -> multi level
+        m0=MEDCouplingUMesh("mesh",3) ; m0.setCoords(coo)
+        m0.allocateCells()
+        m0.insertNextCell(NORM_TETRA4,[3,2,5,0])
+        m0.insertNextCell(NORM_TETRA4,[7,6,3,2])
+        mm2=MEDFileUMesh()
+        mm2[0]=m0 ; mm2[-1]=m
+        #
+        ff=MEDFileField1TS() ; ff.setFieldProfile(f,mm2,-1,pfl)
+        #
+        mm=MEDFileMesh.New(fname) ; f1ts=MEDFileField1TS(fname,fieldName,6,7)
+        self.assertTrue(f.isEqual(f1ts.field(mm),1e-12,1e-12))
+        pass
+
+    @WriteInTmpDir
+    def testExtractPart1(self):
+        coo=DataArrayDouble([(0,0),(1,0),(2,0),(3,0),(4,0),(0,1),(1,1),(2,1),(3,1),(4,1),(0,2),(1,2),(2,2),(3,2),(4,2)])
+        meshName="mesh"
+        m0=MEDCouplingUMesh(meshName,2) ; m0.setCoords(coo) ; m0.allocateCells()
+        m0.insertNextCell(NORM_TRI3,[8,4,3])
+        m0.insertNextCell(NORM_TRI3,[8,9,4])
+        m0.insertNextCell(NORM_TRI3,[7,13,8])
+        m0.insertNextCell(NORM_TRI3,[7,12,13])
+        m0.insertNextCell(NORM_TRI3,[0,6,1])
+        m0.insertNextCell(NORM_TRI3,[0,5,6])
+        m0.insertNextCell(NORM_QUAD4,[1,6,7,2])
+        m0.insertNextCell(NORM_QUAD4,[2,7,8,3])
+        m0.insertNextCell(NORM_QUAD4,[8,13,14,9])
+        m0.insertNextCell(NORM_QUAD4,[6,11,12,7])
+        m0.insertNextCell(NORM_QUAD4,[5,10,11,6])
+        #
+        m1=MEDCouplingUMesh(meshName,1) ; m1.setCoords(coo) ; m1.allocateCells()
+        m1.insertNextCell(NORM_SEG2,[10,5])
+        m1.insertNextCell(NORM_SEG2,[5,0])
+        m1.insertNextCell(NORM_SEG2,[0,1])
+        m1.insertNextCell(NORM_SEG2,[1,2])
+        m1.insertNextCell(NORM_SEG2,[2,3])
+        m1.insertNextCell(NORM_SEG2,[3,4])
+        m1.insertNextCell(NORM_SEG2,[4,9])
+        m1.insertNextCell(NORM_SEG2,[9,14])
+        m1.insertNextCell(NORM_SEG2,[14,13])
+        m1.insertNextCell(NORM_SEG2,[13,12])
+        m1.insertNextCell(NORM_SEG2,[12,11])
+        m1.insertNextCell(NORM_SEG2,[11,10])
+        mm=MEDFileUMesh()
+        mm[0]=m0 ; mm[-1]=m1
+        arr0=DataArrayInt([0,1,2,3,4,6,7,8,12,13])
+        tab={} #
+        tab[0]=DataArrayInt([0,2,3,4,6,7])
+        tab[-1]=DataArrayInt([2,3,4,5,9])
+        fs=MEDFileFields()
+        self.assertTrue(mm.deduceNodeSubPartFromCellSubPart(tab).isEqual(arr0))
+        tab[1]=arr0
+        #
+        fname0="Field0"
+        fmts=MEDFileFieldMultiTS() ; fs.pushField(fmts)
+        t0=(16.5,3,4)
+        ic=["toto [m]"]
+        arr0_0=DataArrayDouble([100,101,102,103,104,105,106,107,108,109,110]) ; arr0_0.setInfoOnComponents(ic)
+        f0=MEDCouplingFieldDouble(ON_CELLS) ; f0.setTime(*t0) ; f0.setArray(arr0_0)
+        f0.setMesh(m0) ; f0.setName(fname0)
+        f1=MEDCouplingFieldDouble(ON_CELLS) ; f1.setTime(*t0) ; f1.setArray(DataArrayDouble([200,201,202,203,204,205,206,207,208,209,210,211]))
+        f1.setMesh(m1) ; f1.setName(fname0) ; f1.getArray().setInfoOnComponents(ic)
+        f2=MEDCouplingFieldDouble(ON_NODES) ; f2.setTime(*t0) ; f2.setArray(DataArrayDouble([300,301,302,303,304,305,306,307,308,309,310,311,312,313,314]))
+        f2.setMesh(m0) ; f2.setName(fname0) ; f2.getArray().setInfoOnComponents(ic)
+        f1ts=MEDFileField1TS() ; f1ts.setFieldNoProfileSBT(f0) ; f1ts.setFieldNoProfileSBT(f1) ; f1ts.setFieldNoProfileSBT(f2)
+        fmts.pushBackTimeStep(f1ts)
+        #
+        mmOut=mm.extractPart(tab)
+        #
+        fsPart0=fs.extractPart(tab,mm)
+        self.assertEqual(len(fsPart0),1)
+        fmtsP=fsPart0[0]
+        self.assertEqual(len(fmtsP),1)
+        f1ts=fmtsP[0]
+        self.assertRaises(InterpKernelException,f1ts.field,mmOut)
+        #
+        self.assertTrue(mmOut[0].computeCellCenterOfMass().isEqual(m0[tab[0]].computeCellCenterOfMass(),1e-12))
+        self.assertTrue(mmOut[-1].computeCellCenterOfMass().isEqual(m1[tab[-1]].computeCellCenterOfMass(),1e-12))
+        #
+        m0Part=m0.deepCopy()[tab[0]] ; m0Part.renumberNodes(tab[1].invertArrayN2O2O2N(mm.getNumberOfNodes()),len(tab[1])) ; m0Part.setName(m0.getName())
+        self.assertTrue(mmOut[0].isEqual(m0Part,1e-12))
+        m1Part=m1.deepCopy()[tab[-1]] ; m1Part.renumberNodes(tab[1].invertArrayN2O2O2N(mm.getNumberOfNodes()),len(tab[1])) ; m1Part.setName(m0.getName())
+        self.assertTrue(mmOut[0].isEqual(m0Part,1e-12))
+        self.assertTrue(mmOut[-1].isEqual(m1Part,1e-12))
+        #
+        f0Part=f1ts.getFieldOnMeshAtLevel(ON_CELLS,0,mmOut) ; f0Part.checkConsistencyLight()
+        self.assertEqual(f0Part.getTypeOfField(),ON_CELLS)
+        self.assertTrue(f0Part.getMesh().isEqual(m0Part,1e-12))
+        arr0Exp=DataArrayDouble([100,102,103,104,106,107]) ; arr0Exp.setInfoOnComponents(ic)
+        self.assertTrue(f0Part.getArray().isEqual(arr0Exp,1e-12)) ; self.assertEqual(f0Part.getTime(),list(t0))
+        f1Part=f1ts.getFieldOnMeshAtLevel(ON_CELLS,-1,mmOut) ; f1Part.checkConsistencyLight()
+        self.assertEqual(f1Part.getTypeOfField(),ON_CELLS)
+        self.assertTrue(f1Part.getMesh().isEqual(m1Part,1e-12))
+        arr1Exp=DataArrayDouble([202,203,204,205,209]) ; arr1Exp.setInfoOnComponents(ic)
+        self.assertTrue(f1Part.getArray().isEqual(arr1Exp,1e-12)) ; self.assertEqual(f1Part.getTime(),list(t0))
+        #
+        f2Part=f1ts.getFieldOnMeshAtLevel(ON_NODES,0,mmOut) ; f2Part.checkConsistencyLight()
+        arr2Exp=DataArrayDouble([300,301,302,303,304,306,307,308,312,313]) ; arr2Exp.setInfoOnComponents(ic)
+        self.assertTrue(f2Part.getArray().isEqual(arr2Exp,1e-12)) ; self.assertEqual(f2Part.getTime(),list(t0))
+        # multisteps
+        fs=MEDFileFields() ; fmts=MEDFileFieldMultiTS() ; fs.pushField(fmts)
+        tss=[(16.5,3,4),(17.5,4,5),(18.5,5,6)]
+        for i,tt in enumerate(tss):
+            f0=MEDCouplingFieldDouble(ON_CELLS) ; f0.setTime(*tt)
+            myarr=arr0_0+i*1000.
+            f0.setArray(myarr)
+            f0.setMesh(m0) ; f0.setName(fname0) ; f0.getArray().setInfoOnComponents(ic)
+            f1ts=MEDFileField1TS() ; f1ts.setFieldNoProfileSBT(f0) ; fmts.pushBackTimeStep(f1ts)
+            pass
+        fsPart1=fs.extractPart(tab,mm)
+        self.assertEqual(len(fsPart1),1)
+        fmtsP=fsPart1[0]
+        self.assertEqual(len(fmtsP),len(tss))
+        for i,(f1tsP,tt) in enumerate(zip(fmtsP,tss)):
+            fPart=f1tsP.field(mmOut) ; fPart.checkConsistencyLight()
+            self.assertEqual(fPart.getTypeOfField(),ON_CELLS)
+            arr0Exp=DataArrayDouble([100,102,103,104,106,107]) ; arr0Exp.setInfoOnComponents(ic) ; arr0Exp+=i*1000.
+            self.assertTrue(fPart.getMesh().isEqual(m0Part,1e-12))
+            self.assertTrue(fPart.getArray().isEqual(arr0Exp,1e-12))
+            self.assertEqual(fPart.getTime(),list(tt))
+            pass
+        pass
+
+    @WriteInTmpDir
+    def testSymmetryPlusAggregationMFD1(self):
+        """ Testing of MEDFileData::Aggregate and MEDFileUMesh::Aggregate and MEDFileUMesh::getAllDistributionOfType """
+        fname1="Pyfile106_1.med"
+        fname2="Pyfile106_2.med"
+        fname3="Pyfile106_3.med"
+        meshName="mesh"
+        mm1=MEDFileUMesh()
+        da1=DataArrayDouble([1,2,10,3,4,11,5,6,12,7,8,13],4,3) ; da1.setInfoOnComponents(["aa [m]","bbb [kg]","cccc [MW]"])
+        mm1.setCoords(da1)
+        mm1_0=MEDCouplingUMesh(meshName,3) ; mm1_0.allocateCells()
+        mm1_0.setCoords(da1)
+        mm1_0.insertNextCell(NORM_TETRA4,[0,1,2,3])
+        mm1_0.insertNextCell(NORM_TETRA4,[4,5,6,7])
+        mm1_0.insertNextCell(NORM_PENTA6,[8,9,10,11,12,13])
+        mm1_0.insertNextCell(NORM_PENTA6,[14,15,16,17,18,19])
+        mm1_0.insertNextCell(NORM_PENTA6,[20,21,22,23,24,25])
+        mm1[0]=mm1_0
+        mm1.setFamilyFieldArr(0,DataArrayInt([1,2,3,4,5]))
+        mm1.setRenumFieldArr(0,DataArrayInt([11,12,13,14,15]))
+        #
+        mm1_1=MEDCouplingUMesh(meshName,2) ; mm1_1.allocateCells()
+        mm1_1.setCoords(da1)
+        mm1_1.insertNextCell(NORM_TRI3,[0,1,2])
+        mm1_1.insertNextCell(NORM_TRI3,[3,4,5])
+        mm1_1.insertNextCell(NORM_QUAD4,[6,7,8,9])
+        mm1_1.insertNextCell(NORM_QUAD4,[10,11,12,13])
+        mm1_1.insertNextCell(NORM_QUAD4,[14,15,16,17])
+        mm1_1.insertNextCell(NORM_QUAD4,[18,19,20,21])
+        mm1[-1]=mm1_1
+        mm1.setFamilyFieldArr(-1,DataArrayInt([6,7,8,9,10,11]))
+        mm1.setRenumFieldArr(-1,DataArrayInt([16,17,18,19,20,21]))
+        for i in range(1,10):
+            mm1.setFamilyId("F%d"%i,i)
+        mm1.setFamilyId("FAMILLE_ZERO",0)
+        mm1.setFamilyId("H1",100)
+        mm1.setFamiliesOnGroup("myGRP",["F2","F6"])
+        mm1.setFamiliesOnGroup("myGRP1",["F2","F6"])
+        mm1.setFamilyFieldArr(1,DataArrayInt([12,13,14,15]))
+        mm1.setRenumFieldArr(1,DataArrayInt([22,23,24,25]))
+        ##############
+        mm2=MEDFileUMesh()
+        da1=DataArrayDouble([9,10,30,11,12,31,13,14,32,15,16,33,17,18,34],5,3) ; da1.setInfoOnComponents(["aa [m]","bbb [kg]","cccc [MW]"])
+        mm2.setCoords(da1)
+        mm2_0=MEDCouplingUMesh(meshName,3) ; mm2_0.allocateCells()
+        mm2_0.setCoords(da1)
+        mm2_0.insertNextCell(NORM_TETRA4,[100,101,102,103])
+        mm2_0.insertNextCell(NORM_TETRA4,[104,105,106,107])
+        mm2_0.insertNextCell(NORM_TETRA4,[108,109,110,111])
+        mm2_0.insertNextCell(NORM_PENTA6,[112,113,114,115,116,117])
+        mm2[0]=mm2_0
+        mm2.setFamilyFieldArr(0,DataArrayInt([40,41,42,43]))
+        mm2.setRenumFieldArr(0,DataArrayInt([50,51,52,53]))
+        #
+        mm2_1=MEDCouplingUMesh(meshName,2) ; mm2_1.allocateCells()
+        mm2_1.setCoords(da1)
+        mm2_1.insertNextCell(NORM_TRI3,[100,101,102])
+        mm2_1.insertNextCell(NORM_TRI3,[103,104,105])
+        mm2_1.insertNextCell(NORM_TRI3,[106,107,108])
+        mm2_1.insertNextCell(NORM_QUAD4,[109,110,111,112])
+        mm2_1.insertNextCell(NORM_QUAD4,[113,114,115,116])
+        mm2_1.insertNextCell(NORM_QUAD4,[117,118,119,120])
+        mm2_1.insertNextCell(NORM_QUAD4,[121,122,123,124])
+        mm2_1.insertNextCell(NORM_QUAD4,[125,126,127,128])
+        mm2[-1]=mm2_1
+        mm2.setFamilyFieldArr(-1,DataArrayInt([200,201,202,203,204,205,206,207]))
+        mm2.setRenumFieldArr(-1,DataArrayInt([300,301,302,303,304,305,306,307]))
+        for i in range(1,12):
+            mm2.setFamilyId("G%d"%i,i+30)
+        mm2.setFamilyId("H1",100)
+        mm2.setFamilyId("FAMILLE_ZERO",0)
+        mm2.setFamiliesOnGroup("myGRP",["G2","G6"])
+        mm2.setFamiliesOnGroup("myGRP2",["G4","G7"])
+        mm2.setFamilyFieldArr(1,DataArrayInt([112,113,114,115,116]))
+        mm2.setRenumFieldArr(1,DataArrayInt([122,123,124,125,126]))
+        #
+        mm=MEDFileUMesh.Aggregate([mm1,mm2])
+        #######
+        def CheckMesh(tester,mm):
+            cooExp=DataArrayDouble([(1,2,10),(3,4,11),(5,6,12),(7,8,13),(9,10,30),(11,12,31),(13,14,32),(15,16,33),(17,18,34)]) ; cooExp.setInfoOnComponents(["aa [m]","bbb [kg]","cccc [MW]"])
+            tester.assertTrue(mm.getCoords().isEqual(cooExp,1e-12))
+            tester.assertTrue(mm[0].getNodalConnectivity().isEqual(DataArrayInt([14,0,1,2,3,14,4,5,6,7,14,104,105,106,107,14,108,109,110,111,14,112,113,114,115,16,8,9,10,11,12,13,16,14,15,16,17,18,19,16,20,21,22,23,24,25,16,116,117,118,119,120,121])))
+            tester.assertTrue(mm[0].getNodalConnectivityIndex().isEqual(DataArrayInt([0,5,10,15,20,25,32,39,46,53])))
+            tester.assertTrue(mm[-1].getNodalConnectivity().isEqual(DataArrayInt([3,0,1,2,3,3,4,5,3,104,105,106,3,107,108,109,3,110,111,112,4,6,7,8,9,4,10,11,12,13,4,14,15,16,17,4,18,19,20,21,4,113,114,115,116,4,117,118,119,120,4,121,122,123,124,4,125,126,127,128,4,129,130,131,132])))
+            tester.assertTrue(mm[-1].getNodalConnectivityIndex().isEqual(DataArrayInt([0,4,8,12,16,20,25,30,35,40,45,50,55,60,65])))
+            tester.assertTrue(mm.getFamilyFieldAtLevel(0).isEqual(DataArrayInt([1,2,40,41,42,3,4,5,43])))
+            tester.assertTrue(mm.getNumberFieldAtLevel(0).isEqual(DataArrayInt([11,12,50,51,52,13,14,15,53])))
+            tester.assertTrue(mm.getFamilyFieldAtLevel(-1).isEqual(DataArrayInt([6,7,200,201,202,8,9,10,11,203,204,205,206,207])))
+            tester.assertTrue(mm.getNumberFieldAtLevel(-1).isEqual(DataArrayInt([16,17,300,301,302,18,19,20,21,303,304,305,306,307])))
+            refFamIds=[("FAMILLE_ZERO",0),('F1',1),('F2',2),('F3',3),('F4',4),('F5',5),('F6',6),('F7',7),('F8',8),('F9',9),('G1',31),('G10',40),('G11',41),('G2',32),('G3',33),('G4',34),('G5',35),('G6',36),('G7',37),('G8',38),('G9',39),("H1",100)]
+            tester.assertEqual(set(mm.getFamiliesNames()),set([elt[0] for elt in refFamIds]))
+            tester.assertEqual(set([mm.getFamilyId(elt) for elt in mm.getFamiliesNames()]),set([elt[1] for elt in refFamIds]))
+            tester.assertEqual(mm.getGroupsNames(),('myGRP','myGRP1','myGRP2'))
+            tester.assertEqual(mm.getAllDistributionOfTypes(),[(NORM_TRI3,5),(NORM_QUAD4,9),(NORM_TETRA4,5),(NORM_PENTA6,4),(NORM_ERROR,9)])
+            pass
+        CheckMesh(self,mm)
+        ##
+        fieldName="zeField"
+        t1=(2.3,3,5)
+        t2=(5.6,7,12)
+        infoc=["dd [W]","eee [kA]"]
+        ##
+        fmts1=MEDFileFieldMultiTS()
+        f1ts1=MEDFileField1TS()
+        f1_1=MEDCouplingFieldDouble(ON_CELLS) ; f1_1.setMesh(mm1[0]) ; f1_1.setName(fieldName)
+        arr1=DataArrayDouble([(10,110),(11,111),(12,112),(13,113),(14,114)])
+        arr1.setInfoOnComponents(infoc)
+        f1_1.setArray(arr1) ; f1_1.setTime(*t1) ; f1_1.setTimeUnit("ms")
+        f1_1.checkConsistencyLight()
+        f1ts1.setFieldNoProfileSBT(f1_1)
+        #
+        f1_2=MEDCouplingFieldDouble(ON_CELLS) ; f1_2.setMesh(mm1[-1]) ; f1_2.setName(fieldName)
+        arr2=DataArrayDouble([(15,115),(16,116),(17,117),(18,118),(19,119),(20,120)])
+        arr2.setInfoOnComponents(infoc)
+        f1_2.setArray(arr2) ; f1_2.setTime(*t1) ; f1_2.setTimeUnit("ms")
+        f1_2.checkConsistencyLight()
+        f1ts1.setFieldNoProfileSBT(f1_2)
+        f1_3=MEDCouplingFieldDouble(ON_NODES) ; f1_3.setMesh(mm1[0]) ; f1_3.setName(fieldName)
+        arr3=DataArrayDouble([(21,121),(22,122),(23,123),(24,124)])
+        arr3.setInfoOnComponents(infoc)
+        f1_3.setArray(arr3) ; f1_3.setTime(*t1) ; f1_3.setTimeUnit("ms")
+        f1_3.checkConsistencyLight()
+        f1ts1.setFieldNoProfileSBT(f1_3)
+        fmts1.pushBackTimeStep(f1ts1)
+        #
+        f1ts2=f1ts1.deepCopy()
+        f1ts2.setTime(t2[1],t2[2],t2[0])
+        f1ts2.getUndergroundDataArray()[:]+=2000
+        fmts1.pushBackTimeStep(f1ts2)
+        ### fmts2
+        fmts2=MEDFileFieldMultiTS()
+        f1ts3=MEDFileField1TS()
+        f2_1=MEDCouplingFieldDouble(ON_CELLS) ; f2_1.setMesh(mm2[0]) ; f2_1.setName(fieldName)
+        arr4=DataArrayDouble([(50,150),(51,151),(52,152),(53,153)])
+        arr4.setInfoOnComponents(infoc)
+        f2_1.setArray(arr4) ; f2_1.setTime(*t1) ; f2_1.setTimeUnit("ms")
+        f2_1.checkConsistencyLight()
+        f1ts3.setFieldNoProfileSBT(f2_1)
+        f2_2=MEDCouplingFieldDouble(ON_CELLS) ; f2_2.setMesh(mm2[-1]) ; f2_2.setName(fieldName)
+        arr5=DataArrayDouble([(54,154),(55,155),(56,156),(57,157),(158,158),(59,159),(60,160),(61,161)])
+        arr5.setInfoOnComponents(infoc)
+        f2_2.setArray(arr5) ; f2_2.setTime(*t1) ; f2_2.setTimeUnit("ms")
+        f2_2.checkConsistencyLight()
+        f1ts3.setFieldNoProfileSBT(f2_2)
+        f2_3=MEDCouplingFieldDouble(ON_NODES) ; f2_3.setMesh(mm2[0]) ; f2_3.setName(fieldName)
+        arr6=DataArrayDouble([(62,162),(63,163),(64,164),(65,165),(66,166)])
+        arr6.setInfoOnComponents(infoc)
+        f2_3.setArray(arr6) ; f2_3.setTime(*t1) ; f2_3.setTimeUnit("ms")
+        f2_3.checkConsistencyLight()
+        f1ts3.setFieldNoProfileSBT(f2_3)
+        fmts2.pushBackTimeStep(f1ts3)
+        #
+        f1ts4=f1ts3.deepCopy()
+        f1ts4.setTime(t2[1],t2[2],t2[0])
+        f1ts4.getUndergroundDataArray()[:]+=2000
+        fmts2.pushBackTimeStep(f1ts4)
+        #
+        mfd1=MEDFileData()
+        mfd1.setMeshes(MEDFileMeshes())
+        mfd1.getMeshes().pushMesh(mm1)
+        mfd1.setFields(MEDFileFields())
+        mfd1.getFields().pushField(fmts1)
+        #
+        mfd2=MEDFileData()
+        mfd2.setMeshes(MEDFileMeshes())
+        mfd2.getMeshes().pushMesh(mm2)
+        mfd2.setFields(MEDFileFields())
+        mfd2.getFields().pushField(fmts2)
+        # ze Call !
+        mfd=MEDFileData.Aggregate([mfd1,mfd2])
+        def CheckMFD(tester,mfd):
+            tester.assertEqual(len(mfd.getMeshes()),1)
+            tester.assertEqual(len(mfd.getFields()),1)
+            CheckMesh(self,mfd.getMeshes()[0])
+            tester.assertEqual(len(mfd.getFields()[0]),2)
+            zeF1=mfd.getFields()[0][0]
+            zeF1_1=zeF1.getFieldOnMeshAtLevel(ON_CELLS,0,mfd.getMeshes()[0])
+            ref=MEDCouplingFieldDouble.MergeFields([f1_1,f2_1])
+            o2n=ref.getMesh().deepCopy().sortCellsInMEDFileFrmt()
+            ref.renumberCells(o2n)
+            tester.assertTrue(ref.isEqual(zeF1_1,1e-12,1e-12))
+            zeF1_2=zeF1.getFieldOnMeshAtLevel(ON_CELLS,-1,mfd.getMeshes()[0])
+            ref=MEDCouplingFieldDouble.MergeFields([f1_2,f2_2])
+            o2n=ref.getMesh().deepCopy().sortCellsInMEDFileFrmt()
+            ref.renumberCells(o2n)
+            tester.assertTrue(ref.isEqual(zeF1_2,1e-12,1e-12))
+            zeF1_3=zeF1.getFieldOnMeshAtLevel(ON_NODES,0,mfd.getMeshes()[0])
+            ref=MEDCouplingFieldDouble.MergeFields([f1_3,f2_3])
+            o2n=ref.getMesh().deepCopy().sortCellsInMEDFileFrmt()
+            ref.renumberCells(o2n)
+            tester.assertTrue(ref.isEqual(zeF1_3,1e-12,1e-12))
+            #
+            zeF2=mfd.getFields()[0][1]
+            zeF2_1=zeF2.getFieldOnMeshAtLevel(ON_CELLS,0,mfd.getMeshes()[0])
+            ref=MEDCouplingFieldDouble.MergeFields([f1_1,f2_1])
+            o2n=ref.getMesh().deepCopy().sortCellsInMEDFileFrmt()
+            ref.renumberCells(o2n)
+            ref.setTime(*t2) ; ref.getArray()[:]+=2000
+            tester.assertTrue(ref.isEqual(zeF2_1,1e-12,1e-12))
+            zeF2_2=zeF2.getFieldOnMeshAtLevel(ON_CELLS,-1,mfd.getMeshes()[0])
+            ref=MEDCouplingFieldDouble.MergeFields([f1_2,f2_2])
+            o2n=ref.getMesh().deepCopy().sortCellsInMEDFileFrmt()
+            ref.renumberCells(o2n)
+            ref.setTime(*t2) ; ref.getArray()[:]+=2000
+            tester.assertTrue(ref.isEqual(zeF2_2,1e-12,1e-12))
+            zeF2_3=zeF2.getFieldOnMeshAtLevel(ON_NODES,0,mfd.getMeshes()[0])
+            ref=MEDCouplingFieldDouble.MergeFields([f1_3,f2_3])
+            o2n=ref.getMesh().deepCopy().sortCellsInMEDFileFrmt()
+            ref.renumberCells(o2n)
+            ref.setTime(*t2) ; ref.getArray()[:]+=2000
+            tester.assertTrue(ref.isEqual(zeF2_3,1e-12,1e-12))
+        CheckMFD(self,mfd)
+        mfd1.write(fname1,2) ; mfd2.write(fname2,2)
+        mfd=MEDFileData.Aggregate([MEDFileData(fname1),MEDFileData(fname2)])
+        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"
+        arrX=DataArrayDouble([0,1,2,3]) ; arrY=DataArrayDouble([0,1,2,3,4]) ; arrZ=DataArrayDouble([0,1,2,3,4,5])
+        mesh3D=MEDCouplingCMesh() ; mesh3D.setCoords(arrX,arrY,arrZ) ; mesh3D.setName("mesh")
+        ex=MEDCouplingMappedExtrudedMesh(mesh3D)
+        mm=MEDFileUMesh(ex)
+        mm.write(fname,2)
+        ex2=mm.convertToExtrudedMesh()
+        mm2=MEDFileMesh.New(fname)
+        ex3=mm2.convertToExtrudedMesh()
+        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):
+        fname="Pyfile108.med"
+        fname2="Pyfile109.med"
+        m=MEDCouplingUMesh("mesh",1) ; m.setCoords(DataArrayDouble([0,0,1,1],2,2)) ; m.allocateCells() ; m.insertNextCell(NORM_SEG2,[1,0])
+        mm=MEDFileUMesh() ; mm[0]=m
+        mm.setFamilyId("FAMILLE_ZERO",0)
+        #
+        mm.write33(fname,2)
+        assert(LooseVersion(MEDFileVersionOfFileStr(fname)).version[:2]==[3,3]) # checks that just written MED file has a version == 3.0.x
+        mm2=MEDFileUMesh(fname)
+        self.assertTrue(mm.isEqual(mm2,1e-12))
+        #
+        mm.write(fname2,2)
+        assert(LooseVersion(MEDFileVersionOfFileStr(fname2)).version[:2]==list(MEDFileVersion()[:2])) # checks that MED file version of written mesh is thoose of the current MED file lib
+        pass
+
+    @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
+    @WriteInTmpDir
+    def testPickelizationOfMEDFileObjects1(self):
+        fname="Pyfile110.med"
+        coo=DataArrayDouble([0.,0.,0.5,0.,1.,0.,0.,0.5,0.5,0.5,1.,0.5,0.,1.,0.5,1.,1.,1.],9,2)
+        m0=MEDCouplingUMesh("Mesh",2)
+        m0.allocateCells(5)
+        m0.insertNextCell(NORM_TRI3,[1,4,2])
+        m0.insertNextCell(NORM_TRI3,[4,5,2])
+        m0.insertNextCell(NORM_QUAD4,[0,3,4,1])
+        m0.insertNextCell(NORM_QUAD4,[3,6,7,4])
+        m0.insertNextCell(NORM_QUAD4,[4,7,8,5])
+        m0.finishInsertingCells()
+        m0.setCoords(coo)
+        m1=MEDCouplingUMesh(m0.getName(),1)
+        m1.allocateCells(9)
+        conn1=[0,1,0,3,3,4,4,1,5,4,2,4,1,2,3,6,5,8]
+        for i in range(9):
+            m1.insertNextCell(NORM_SEG2,conn1[2*i:2*i+2])
+            pass
+        m1.finishInsertingCells()
+        m1.setCoords(coo)
+        #
+        m=MEDFileUMesh()
+        m.setMeshAtLevel(0,m0)
+        m.setMeshAtLevel(-1,m1)
+        #
+        dt=3 ; it=2 ; tim=4.5
+        fieldNode0=MEDCouplingFieldDouble(ON_NODES,ONE_TIME)
+        fieldNode0.setName("fieldNode0")
+        fieldNode0.setTime(tim,dt,it)
+        pfl0=DataArrayInt([0,1,2,3,4]) ; pfl0.setName("PflIdentity0") # important to keep like that
+        arr=DataArrayDouble([10,11,12,13,14])
+        fieldNode0.setArray(arr)
+        f0=MEDFileField1TS()
+        f0.setFieldProfile(fieldNode0,m,0,pfl0)
+        fieldNode1=MEDCouplingFieldDouble(ON_NODES,ONE_TIME)
+        fieldNode1.setName("fieldNode1")
+        fieldNode1.setTime(tim,dt,it)
+        pfl1=DataArrayInt([0,1,2,3,4,5,6]) ; pfl1.setName("PflIdentity1")
+        arr1=DataArrayDouble([20,21,22,23,24,25,26])
+        fieldNode1.setArray(arr1)
+        f1=MEDFileField1TS()
+        f1.setFieldProfile(fieldNode1,m,-1,pfl1)
+        mfd=MEDFileData()
+        mfd.setMeshes(MEDFileMeshes()) ; mfd.setFields(MEDFileFields())
+        mfd.getMeshes().pushMesh(m)
+        fmts=MEDFileFieldMultiTS() ; fmts.pushBackTimeStep(f0)
+        mfd.getFields().pushField(fmts)
+        # first start gently
+        d=mfd.serialize()
+        mfd2=MEDFileData(d)
+        self.assertEqual(len(mfd2.getMeshes()),1)
+        self.assertEqual(len(mfd2.getFields()),1)
+        self.assertEqual(len(mfd2.getFields()[0]),1)
+        self.assertTrue(mfd2.getMeshes()[0].isEqual(mfd.getMeshes()[0],1e-12))
+        ff2=mfd2.getFields()[0][0].field(mfd2.getMeshes()[0])
+        ff =mfd.getFields()[0][0].field(mfd.getMeshes()[0])
+        self.assertTrue(ff2.isEqual(ff,1e-12,1e-12))
+        # OK now end of joke -> serialization of MEDFileData
+        st=pickle.dumps(mfd,pickle.HIGHEST_PROTOCOL)
+        mfd3=pickle.loads(st)
+        # check of object
+        self.assertEqual(len(mfd3.getMeshes()),1)
+        self.assertEqual(len(mfd3.getFields()),1)
+        self.assertEqual(len(mfd3.getFields()[0]),1)
+        self.assertTrue(mfd3.getMeshes()[0].isEqual(mfd.getMeshes()[0],1e-12))
+        ff3=mfd3.getFields()[0][0].field(mfd3.getMeshes()[0])
+        self.assertTrue(ff3.isEqual(ff,1e-12,1e-12))
+        # serialization of MEDFileFields
+        st=pickle.dumps(mfd.getFields(),pickle.HIGHEST_PROTOCOL)
+        fs4=pickle.loads(st)
+        ff4=fs4[0][0].field(mfd3.getMeshes()[0])
+        self.assertTrue(ff4.isEqual(ff,1e-12,1e-12))
+        # serialization of MEDFileFieldMulitTS
+        st=pickle.dumps(mfd.getFields()[0],pickle.HIGHEST_PROTOCOL)
+        fmts5=pickle.loads(st)
+        ff5=fmts5[0].field(mfd3.getMeshes()[0])
+        self.assertTrue(ff5.isEqual(ff,1e-12,1e-12))
+        # serialization of MEDFileField1TS
+        st=pickle.dumps(mfd.getFields()[0][0],pickle.HIGHEST_PROTOCOL)
+        f1ts6=pickle.loads(st)
+        ff6=f1ts6.field(mfd3.getMeshes()[0])
+        self.assertTrue(ff6.isEqual(ff,1e-12,1e-12))
+        # serialization of MEDFileMeshes
+        st=pickle.dumps(mfd.getMeshes(),pickle.HIGHEST_PROTOCOL)
+        ms7=pickle.loads(st)
+        self.assertEqual(len(ms7),1)
+        self.assertTrue(ms7[0].isEqual(mfd.getMeshes()[0],1e-12))
+        pass
+
+    @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
+    @WriteInTmpDir
+    def testPickelizationOfMEDFileObjects2(self):
+        # CMesh
+        self.internalMEDMesh6() # generates MEDFileMesh5.med file
+        mm=MEDFileMesh.New("MEDFileMesh5.med")
+        self.assertTrue(isinstance(mm,MEDFileCMesh))
+        st=pickle.dumps(mm,pickle.HIGHEST_PROTOCOL)
+        mm2=pickle.loads(st)
+        self.assertTrue(isinstance(mm2,MEDFileCMesh))
+        self.assertTrue(mm.getMesh().isEqual(mm2.getMesh(),1e-12))
+        # CurveLinear
+        self.internalCurveLinearMesh1() # generates Pyfile55.med
+        mm=MEDFileMesh.New("Pyfile55.med")
+        self.assertTrue(isinstance(mm,MEDFileCurveLinearMesh))
+        st=pickle.dumps(mm,pickle.HIGHEST_PROTOCOL)
+        mm3=pickle.loads(st)
+        self.assertTrue(isinstance(mm3,MEDFileCurveLinearMesh))
+        self.assertTrue(mm.getMesh().isEqual(mm3.getMesh(),1e-12))
+        self.internalInt32InMEDFileFieldStar1()# generates Pyfile63.med
+        # MEDFileIntFieldMultiTS
+        fs4=MEDFileFields("Pyfile63.med")
+        ms4=MEDFileMeshes("Pyfile63.med")
+        self.assertTrue(isinstance(fs4[0],MEDFileIntFieldMultiTS))
+        st=pickle.dumps(fs4[0],pickle.HIGHEST_PROTOCOL)
+        fmts5=pickle.loads(st)
+        self.assertEqual(len(fs4[0]),len(fmts5))
+        self.assertTrue(isinstance(fmts5,MEDFileIntFieldMultiTS))
+        self.assertTrue(fmts5[0].field(ms4[0]).isEqual((fs4[0][0]).field(ms4[0]),1e-12,0))
+        # MEDFileIntField1TS
+        st=pickle.dumps(fs4[0][0],pickle.HIGHEST_PROTOCOL)
+        f1ts6=pickle.loads(st)
+        self.assertTrue(isinstance(f1ts6,MEDFileIntField1TS))
+        self.assertTrue(f1ts6.field(ms4[0]).isEqual((fs4[0][0]).field(ms4[0]),1e-12,0))
+        # MEDFileParameters
+        self.internalParameters1()# generates Pyfile56.med
+        params=MEDFileParameters("Pyfile56.med")
+        st=pickle.dumps(params,pickle.HIGHEST_PROTOCOL)
+        params7=pickle.loads(st)
+        self.assertEqual(len(params),len(params7))
+        for i in range(len(params)):
+            self.assertTrue(params[i].isEqual(params7[i],1e-12)[0])
+            pass
+        pass
+
+    @WriteInTmpDir
+    def testGlobalNumOnNodes1(self):
+        """Test global number on nodes here. Used by partitionners."""
+        fname="Pyfile112.med"
+        arr=DataArrayDouble(5) ; arr.iota()
+        m=MEDCouplingUMesh.Build1DMeshFromCoords(arr)
+        m.setName("mesh")
+        mm=MEDFileUMesh()
+        mm[0]=m
+        self.assertTrue(not mm.getGlobalNumFieldAtLevel(1))
+        d=DataArrayInt([7,8,9,2,0])
+        dRef=d.deepCopy()
+        mm.setGlobalNumFieldAtLevel(1,d)
+        mm.checkConsistency()
+        self.assertRaises(InterpKernelException,mm.setGlobalNumFieldAtLevel,1,d[::2])
+        mm.checkConsistency()
+        self.assertEqual(d.getHiddenCppPointer(),mm.getGlobalNumFieldAtLevel(1).getHiddenCppPointer())
+        self.assertTrue(mm.getGlobalNumFieldAtLevel(1).isEqual(dRef))
+        mm.write(fname,2)
+        mm2=MEDFileMesh.New(fname)
+        self.assertTrue(mm.isEqual(mm2,1e-12)[0])
+        self.assertTrue(mm2.getGlobalNumFieldAtLevel(1).isEqual(dRef))
+        mm2.getGlobalNumFieldAtLevel(1).setIJ(0,0,10)
+        self.assertTrue(not mm.isEqual(mm2,1e-12)[0])
+        mm2.getGlobalNumFieldAtLevel(1).setIJ(0,0,7)
+        self.assertTrue(mm.isEqual(mm2,1e-12)[0])
+        pass
+
+    @WriteInTmpDir
+    def testPartialReadOfEntities1(self):
+        """Test for advanced API on read to speed up read phase for users with "huge" number of time steps (more than 10 000)."""
+        fname="Pyfile113.med"
+        arr=DataArrayDouble(5) ; arr.iota()
+        m=MEDCouplingUMesh.Build1DMeshFromCoords(arr)
+        m.setName("mesh")
+        mm=MEDFileUMesh()
+        mm[0]=m
+        #
+        fieldName="Field"
+        ts1=(5.,1,2)
+        f1=MEDCouplingFieldDouble(ON_NODES) ; f1.setMesh(m) ; f1.setName(fieldName)
+        f1.setArray(DataArrayDouble([0.,0.1,0.2,0.3,0.4]))
+        f1.setTime(*ts1)
+        f2=MEDCouplingFieldDouble(ON_CELLS) ; f2.setMesh(m) ; f2.setName(fieldName)
+        f2.setArray(DataArrayDouble([1.,1.1,1.2,1.3]))
+        f2.setTime(*ts1)
+        f1ts=MEDFileField1TS()
+        f1ts.setFieldNoProfileSBT(f1)
+        f1ts.setFieldNoProfileSBT(f2)
+        self.assertEqual(set(f1ts.getTypesOfFieldAvailable()),set([ON_NODES,ON_CELLS]))
+        f1ts_2=f1ts.deepCopy()
+        f1ts_2.getUndergroundDataArray()[:]+=2
+        f1ts_2.setTime(3,4,6.)
+        fmts=MEDFileFieldMultiTS()
+        fmts.pushBackTimeStep(f1ts)
+        fmts.pushBackTimeStep(f1ts_2)
+        #
+        mm.write(fname,2)
+        fmts.write(fname,0)
+        #
+        ent=MEDFileEntities.BuildFrom([(ON_NODES,NORM_ERROR)])
+        mm=MEDFileMesh.New(fname)
+        fs=MEDFileFields(fname,False,ent) # the important line is here - We specify to MEDFileFields to read only nodes part to speed up read phase (by avoiding to scan all entities time geo types)
+        fs.loadArrays()
+        self.assertEqual(len(fs),1)
+        fmts=fs[0]
+        self.assertEqual(len(fmts),2)
+        ff0=fmts[0] ; ff1=fmts[1]
+        self.assertEqual(ff0.getTypesOfFieldAvailable(),[ON_NODES]) # only NODES have been loaded
+        self.assertTrue(ff0.field(mm).isEqual(f1,1e-12,1e-12))
+        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 :)"""
+        fname="Pyfile114.med"
+        f1=MEDLoaderDataForTest.buildVecFieldOnCells_1();
+        f1=f1.convertToFloatField()
+        m1=f1.getMesh()
+        mm1=MEDFileUMesh.New()
+        mm1.setCoords(m1.getCoords())
+        mm1.setMeshAtLevel(0,m1)
+        mm1.setName(m1.getName())
+        mm1.write(fname,2)
+        ff1=MEDFileFloatField1TS()
+        ff1.setFieldNoProfileSBT(f1)
+        a=ff1.getFieldOnMeshAtLevel(0,ON_CELLS,mm1)
+        self.assertEqual(a.getArray().getInfoOnComponents(),['power [MW/m^3]','density [g/cm^3]','temperature [K]'])
+        self.assertTrue(a.isEqual(f1,1e-12,1e-12))
+        ff1.write(fname,0)
+        a,b=ff1.getUndergroundDataArrayExt()
+        self.assertEqual(a.getHiddenCppPointer(),ff1.getUndergroundDataArray().getHiddenCppPointer())
+        self.assertEqual(b,[((3,0),(0,2)),((4,0),(2,4)),((6,0),(4,5)),((5,0),(5,6))])
+        ff2=MEDFileAnyTypeField1TS.New(fname)
+        self.assertEqual(ff2.getName(),"VectorFieldOnCells")
+        self.assertEqual(ff2.getTime(),[0,1,2.0])
+        self.assertTrue(isinstance(ff2,MEDFileFloatField1TS))
+        a=ff1.getFieldOnMeshAtLevel(ON_CELLS,0,mm1)
+        self.assertEqual(a.getArray().getInfoOnComponents(),['power [MW/m^3]','density [g/cm^3]','temperature [K]'])
+        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
+        ffs1=MEDFileAnyTypeFieldMultiTS.New(fname,"VectorFieldOnCells")
+        self.assertEqual(ffs1.getTimeSteps(),[(0, 1, 2.0), (1, 2, 3.0)])
+        self.assertEqual(len(ffs1),2)
+        self.assertTrue(isinstance(ffs1,MEDFileFloatFieldMultiTS))
+        a=ffs1[2.].getFieldOnMeshAtLevel(ON_CELLS,0,mm1)
+        self.assertTrue(a.isEqual(f1,1e-12,1e-12))
+        a=ffs1.getFieldOnMeshAtLevel(ON_CELLS,0,1,0,mm1)
+        self.assertTrue(a.isEqual(f1,1e-12,1e-12))
+        it=ffs1.__iter__() ; it.next() ; ff2bis=it.next()
+        a=ff2bis.getFieldOnMeshAtLevel(0,ON_CELLS,mm1)
+        self.assertTrue(a.getArray().isEqual(2*f1.getArray(),1e-7))
+        f1.setTime(3.,1,2) ; f1.getArray()[:]*=2
+        self.assertTrue(a.isEqual(f1,1e-12,1e-12)) ; f1.getArray()[:]/=2
+        bc=DataArrayFloat(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()
+            pass
+        self.assertTrue(bc.isEqual(3*f1.getArray(),1e-7))
+        nf1=MEDCouplingFieldFloat(ON_NODES)
+        nf1.setTime(9.,10,-1)
+        nf1.setMesh(f1.getMesh())
+        narr=DataArrayFloat(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=MEDFileFloatField1TS.New()
+        nff1.setFieldNoProfileSBT(nf1)
+        self.assertEqual(nff1.getInfo(),('aa [u1]','bbbvv [ppp]'))
+        self.assertEqual(nff1.getTime(),[10,-1,9.0])
+        nff1.write(fname,0)
+        #
+        nf2=MEDCouplingFieldFloat(ON_NODES)
+        nf2.setTime(19.,20,-11)
+        nf2.setMesh(f1.getMesh())
+        narr2=DataArrayFloat(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=MEDFileFloatField1TS.New()
+        npfl=DataArrayInt([1,2,4,5,6,7,10,11]) ; npfl.setName("npfl")
+        nff2.setFieldProfile(nf2,mm1,0,npfl)
+        nff2.getFieldWithProfile(ON_NODES,0,mm1)
+        a,b=nff2.getFieldWithProfile(ON_NODES,0,mm1) ; b.setName(npfl.getName())
+        self.assertTrue(b.isEqual(npfl))
+        self.assertTrue(a.isEqual(narr2,1e-7))
+        nff2.write(fname,0)
+        nff2bis=MEDFileFloatField1TS(fname,"VectorFieldOnNodesPfl")
+        a,b=nff2bis.getFieldWithProfile(ON_NODES,0,mm1) ; b.setName(npfl.getName())
+        self.assertTrue(b.isEqual(npfl))
+        self.assertTrue(a.isEqual(narr2,1e-7))
+        #
+        nf3=MEDCouplingFieldDouble(ON_NODES)
+        nf3.setName("VectorFieldOnNodesDouble")
+        nf3.setTime(29.,30,-21)
+        nf3.setMesh(f1.getMesh())
+        nf3.setArray(f1.getMesh().getCoords())
+        nff3=MEDFileField1TS.New()
+        nff3.setFieldNoProfileSBT(nf3)
+        nff3.write(fname,0)
+        fs=MEDFileFields(fname)
+        self.assertEqual(len(fs),4)
+        ffs=[it for it in fs]
+        self.assertTrue(isinstance(ffs[0],MEDFileFloatFieldMultiTS))
+        self.assertTrue(isinstance(ffs[1],MEDFileFloatFieldMultiTS))
+        self.assertTrue(isinstance(ffs[2],MEDFileFieldMultiTS))
+        self.assertTrue(isinstance(ffs[3],MEDFileFloatFieldMultiTS))
+        #
+        self.assertTrue(fs["VectorFieldOnCells"][0].getUndergroundDataArray().isEqualWithoutConsideringStr(f1.getArray(),1e-7))
+        self.assertTrue(fs["VectorFieldOnCells"][1,2].getUndergroundDataArray().isEqualWithoutConsideringStr(2*f1.getArray(),1e-7))
+        self.assertTrue(fs["VectorFieldOnNodesPfl"][0].getUndergroundDataArray().isEqualWithoutConsideringStr(narr2,1e-7))
+        self.assertTrue(fs["VectorFieldOnNodes"][9.].getUndergroundDataArray().isEqualWithoutConsideringStr(narr,1e-7))
+        self.assertTrue(fs["VectorFieldOnNodesDouble"][29.].getUndergroundDataArray().isEqualWithoutConsideringStr(f1.getMesh().getCoords(),1e-12))
+        #
+        nf3_read=MEDFileFieldMultiTS(fname,"VectorFieldOnNodesDouble")
+        self.assertTrue(nf3_read[29.].getUndergroundDataArray().isEqualWithoutConsideringStr(f1.getMesh().getCoords(),1e-12))
+        self.assertRaises(InterpKernelException,MEDFileFloatFieldMultiTS.New,fname,"VectorFieldOnNodesDouble")# exception because trying to read a double field with int instance
+        self.assertRaises(InterpKernelException,MEDFileFieldMultiTS.New,fname,"VectorFieldOnNodes")# exception because trying to read a int field with double instance
+        MEDFileField1TS.New(fname,"VectorFieldOnNodesDouble",30,-21)
+        self.assertRaises(InterpKernelException,MEDFileFloatField1TS.New,fname,"VectorFieldOnNodesDouble",30,-21)# exception because trying to read a double field with int instance
+        MEDFileFloatField1TS.New(fname,"VectorFieldOnNodes",10,-1)
+        self.assertRaises(InterpKernelException,MEDFileField1TS.New,fname,"VectorFieldOnNodes",10,-1)# exception because trying to read a double field with int instance
+        #
+        self.assertEqual(fs.getMeshesNames(),('3DSurfMesh_1','3DSurfMesh_1','3DSurfMesh_1','3DSurfMesh_1'))
+        self.assertTrue(fs.changeMeshNames([('3DSurfMesh_1','3DSurfMesh')]))
+        self.assertEqual(fs.getMeshesNames(),('3DSurfMesh','3DSurfMesh','3DSurfMesh','3DSurfMesh'))
+        self.assertTrue(not fs.changeMeshNames([('3DSurfMesh_1','3DSurfMesh')]))
+        pass
+
+    @WriteInTmpDir
+    def testPenta18_1(self):
+        """EDF8478 : Test of read/write of penta18"""
+        fname="Pyfile115.med"
+        arr=DataArrayDouble([
+            (0.,1.,1.),(0.,0.,1.),(1.,0.,1.),
+            (0.,1.,0.),(0.,0.,0.),(1.,0.,0.),
+            (0.,0.5,1.),(0.5,0.,1.),(0.5,0.5,1.),
+            (0.,0.5,0.),(0.5,0.,0.),(0.5,0.5,0.),
+            (0.,1.,0.5),(0.,0.,0.5),(1.,0.,0.5),
+            (0.,0.5,0.5),(0.5,0.,0.5),(0.5,0.5,0.5)])
+        m=MEDCouplingUMesh("mesh",3)
+        m.setCoords(arr)
+        m.allocateCells(1)
+        m.insertNextCell(NORM_PENTA18,list(range(18)))
+        m.checkConsistencyLight()
+        #
+        f=MEDCouplingFieldDouble(ON_NODES)
+        f.setMesh(m)
+        f.setName("FieldOnPenta18")
+        f.setArray(DataArrayDouble(list(range(18))))
+        f.checkConsistencyLight()
+        #
+        m2,d,di,rd,rdi=m.buildDescendingConnectivity()
+        #
+        f2=MEDCouplingFieldDouble(ON_NODES)
+        f2.setMesh(m)
+        f2.setName("FieldOnPenta18Sub")
+        f2.setArray(DataArrayDouble(list(range(18))))
+        f2.checkConsistencyLight()
+        WriteField(fname,f2,True)
+        f3=ReadField(fname)
+        self.assertTrue(f2.isEqual(f3,1e-12,1e-12))
+        self.assertEqual(f3.getMesh().getNumberOfCells(),1)
+        self.assertEqual(f3.getMesh().getTypeOfCell(0),NORM_PENTA18)
+        pass
+
+    @WriteInTmpDir
+    def testFieldsLinearToQuadratic(self):
+        fname="Pyfile117.med"
+        arr=DataArrayDouble([0,1])
+        m=MEDCouplingCMesh();
+        m.setCoords(arr,arr,arr)
+        m=m.buildUnstructured()
+        m2=m.deepCopy()
+        m2.translate([2,0,0])
+        m3=MEDCouplingUMesh.MergeUMeshes([m,m2])
+        m3.setName("mesh")
+        mm=MEDFileUMesh()
+        mm[0]=m3
+        mmq=mm.linearToQuadratic(0)
+        mms=MEDFileMeshes() ; mms.pushMesh(mm)
+        mmsq=MEDFileMeshes() ; mmsq.pushMesh(mmq)
+        #
+        f=MEDCouplingFieldDouble(ON_NODES)
+        f.setName("field")
+        f.setMesh(m3)
+        f.setTime(3.,1,2)
+        arr=DataArrayDouble(m3.getNumberOfNodes())
+        arr.iota()
+        f.setArray(arr)
+        f1ts=MEDFileField1TS()
+        f1ts.setFieldNoProfileSBT(f)
+        fmts=MEDFileFieldMultiTS()
+        fmts.pushBackTimeStep(f1ts)
+        f1ts_2=f1ts.deepCopy()
+        f1ts_2.setTime(3,4,5.)
+        f1ts_2.getUndergroundDataArray()[:]*=2.
+        fmts.pushBackTimeStep(f1ts_2)
+        fs=MEDFileFields()
+        fs.pushField(fmts)
+        fs2=fs.linearToQuadratic(mms,mmsq)
+        self.myTester1(fs2,mmsq[0])
+        # A small Write/Read and test again
+        mms.write(fname,2) ; fs.write(fname,0)
+        mms=MEDFileMeshes(fname) ; fs=MEDFileFields(fname)
+        mmq=mms[0].linearToQuadratic(0) ; mmqs=MEDFileMeshes() ; mmqs.pushMesh(mmq)
+        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])
+        dataExp2=DataArrayDouble([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0.5,1,2.5,2,4.5,5,6.5,6,3,2,4,5,8.5,9,10.5,10,12.5,13,14.5,14,11,10,12,13])
+        fToTest=fs2[0][0].field(mmq)
+        self.assertEqual(fToTest.getTime(),[3.,1,2])
+        mTest=MEDCoupling1SGTUMesh(fToTest.getMesh())
+        self.assertTrue(mTest.getNodalConnectivity().isEqual(dataExp1))
+        self.assertTrue(mTest.getCoords().isEqual(dataExp,1e-12))
+        self.assertTrue(fToTest.getArray().isEqual(dataExp2,1e-12))
+        # testing 2nd timestep
+        fToTest=fs2[0][1].field(mmq)
+        self.assertEqual(fToTest.getTime(),[5.,3,4])
+        mTest=MEDCoupling1SGTUMesh(fToTest.getMesh())
+        self.assertTrue(mTest.getNodalConnectivity().isEqual(dataExp1))
+        self.assertTrue(mTest.getCoords().isEqual(dataExp,1e-12))
+        self.assertTrue(fToTest.getArray().isEqual(2*dataExp2,1e-12))
+        pass
+
+    @WriteInTmpDir
+    def testFieldsLinearToQuadratic2(self):
+        """Same than testFieldsLinearToQuadratic but with profile on NODES"""
+        GeneratePyfile18(self)
+        fname="Pyfile118.med"
+        arr=DataArrayDouble([0,1])
+        m=MEDCouplingCMesh();
+        m.setCoords(arr,arr,arr)
+        m=m.buildUnstructured()
+        m2=m.deepCopy()
+        m2.translate([2,0,0])
+        m3=MEDCouplingUMesh.MergeUMeshes([m,m2])
+        m3.setName("mesh")
+        # add a point for fun
+        m3.setCoords(DataArrayDouble.Aggregate(m3.getCoords(),DataArrayDouble([1.5,1.5,1.5],1,3)))
+        #
+        mm=MEDFileUMesh()
+        mm[0]=m3
+        mmq=mm.linearToQuadratic(0)
+        mms=MEDFileMeshes() ; mms.pushMesh(mm)
+        mmsq=MEDFileMeshes() ; mmsq.pushMesh(mmq)
+        #
+        f=MEDCouplingFieldDouble(ON_NODES)
+        f.setName("field")
+        f.setMesh(m3)
+        f.setTime(3.,1,2)
+        arr=DataArrayDouble(8) ; arr.iota()
+        arr.iota()
+        f.setArray(arr)
+        f1ts=MEDFileField1TS()
+        pfl=DataArrayInt([8,9,10,11,12,13,14,15]) ; pfl.setName("pfl")
+        f1ts.setFieldProfile(f,mm,0,pfl) # f lying on 8 nodes of cell #1
+        f1ts_2=f1ts.deepCopy()
+        f1ts_2.setTime(3,4,5.)
+        f1ts_2.getUndergroundDataArray()[:]*=4.
+        fmts=MEDFileFieldMultiTS()
+        fmts.pushBackTimeStep(f1ts)
+        fmts.pushBackTimeStep(f1ts_2)
+        fs=MEDFileFields()
+        fs.pushField(fmts)
+        fs2=fs.linearToQuadratic(mms,mmsq)
+        mms.write(fname,2) ; fs.write(fname,0)
+        #
+        self.myTester2(fs2,mmq)
+        # Read/write
+        mms=MEDFileMeshes(fname) ; fs=MEDFileFields(fname)
+        mmq=mms[0].linearToQuadratic(0) ; mmqs=MEDFileMeshes() ; mmqs.pushMesh(mmq)
+        fs2=fs.linearToQuadratic(mms,mmqs)
+        self.myTester2(fs2,mmq)
+        ## More vicious add single node 16
+        mm=MEDFileUMesh()
+        mm[0]=m3
+        mmq=mm.linearToQuadratic(0)
+        mms=MEDFileMeshes() ; mms.pushMesh(mm)
+        mmsq=MEDFileMeshes() ; mmsq.pushMesh(mmq)
+        #
+        f=MEDCouplingFieldDouble(ON_NODES)
+        f.setName("field")
+        f.setMesh(m3)
+        f.setTime(3.,1,2)
+        arr=DataArrayDouble(9) ; arr.iota()
+        arr.iota()
+        f.setArray(arr)
+        f1ts=MEDFileField1TS()
+        pfl=DataArrayInt([8,9,10,11,12,13,14,15,16]) ; pfl.setName("pfl")
+        f1ts.setFieldProfile(f,mm,0,pfl) # f lying on 9 nodes of cell #1 + orphan node
+        fmts=MEDFileFieldMultiTS()
+        fmts.pushBackTimeStep(f1ts)
+        fs=MEDFileFields()
+        fs.pushField(fmts)
+        fs2=fs.linearToQuadratic(mms,mmsq)
+        #
+        pflExpected=DataArrayInt([8,9,10,11,12,13,14,15,16,29,30,31,32,33,34,35,36,37,38,39,40]) ; pflExpected.setName("pfl_NODE")
+        f1tsToTest=fs2[0][0]
+        exp1=DataArrayDouble([0,1,2,3,4,5,6,7,8,0.5,1,2.5,2,4.5,5,6.5,6,3,2,4,5])
+        assert(f1tsToTest.getProfile("pfl_NODE").isEqual(pflExpected))
+        assert(f1tsToTest.getUndergroundDataArray().isEqual(exp1,1e-12))
+        assert(f1tsToTest.getFieldSplitedByType()==[(40,[(1,(0,21),'pfl_NODE','')])])
+        pass
+
+    def myTester2(self,fs2,mmq):
+        pflExpected=DataArrayInt([8,9,10,11,12,13,14,15,29,30,31,32,33,34,35,36,37,38,39,40]) ; pflExpected.setName("pfl_NODE")
+        f1tsToTest=fs2[0][0]
+        exp1=DataArrayDouble([0,1,2,3,4,5,6,7,0.5,1,2.5,2,4.5,5,6.5,6,3,2,4,5])
+        self.assertTrue(f1tsToTest.getProfile("pfl_NODE").isEqual(pflExpected))
+        self.assertTrue(f1tsToTest.getUndergroundDataArray().isEqual(exp1,1e-12))
+        self.assertEqual(f1tsToTest.getFieldSplitedByType(),[(NORM_ERROR,[(1,(0,20),'pfl_NODE','')])])
+        fToTest=fs2[0][0].field(mmq)
+        self.assertEqual(fToTest.getTime(),[3.,1,2])
+        mTest=MEDCoupling1SGTUMesh(fToTest.getMesh())
+        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(exp1,1e-12))
+        # 2nd Time step
+        f1tsToTest=fs2[0][1]
+        self.assertTrue(f1tsToTest.getProfile("pfl_NODE").isEqual(pflExpected))
+        self.assertTrue(f1tsToTest.getUndergroundDataArray().isEqual(4*exp1,1e-12))
+        self.assertEqual(f1tsToTest.getFieldSplitedByType(),[(NORM_ERROR,[(1,(0,20),'pfl_NODE','')])])
+        fToTest=fs2[0][1].field(mmq)
+        self.assertEqual(fToTest.getTime(),[5.,3,4])
+        mTest=MEDCoupling1SGTUMesh(fToTest.getMesh())
+        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
+    def testSetFieldProfileFlatly1(self):
+        """ Sometimes for downstream code fan of profiles, profile are requested unconditionally. setFieldProfile try to reduce at most profile usage. So setFieldProfileFlatly has been added to always create
+        a profile."""
+        arr=DataArrayDouble(10) ; arr.iota()
+        m=MEDCouplingCMesh() ; m.setCoords(arr,arr)
+        m=m.buildUnstructured()
+        m2=m.deepCopy()
+        m2.simplexize(0)
+        m=MEDCouplingUMesh.MergeUMeshes(m2,m)
+        m.setName("mesh")
+        mm=MEDFileUMesh()
+        mm[0]=m
+        f=MEDCouplingFieldDouble(ON_CELLS)
+        f.setMesh(m)
+        arr=DataArrayDouble(m.getNumberOfCells())
+        arr.iota()
+        f.setArray(arr)
+        f.setName("field")
+        pfl=DataArrayInt(m.getNumberOfCells()) ; pfl.iota() ; pfl.setName("pfl")
+        #
+        refSp=[(3,[(0,(0,162),'','')]),(4,[(0,(162,243),'','')])]
+        refSp1=[(3,[(0,(0,162),'pfl_NORM_TRI3','')]),(4,[(0,(162,243),'pfl_NORM_QUAD4','')])]
+        #
+        f1ts=MEDFileField1TS()
+        f1ts.setFieldProfile(f,mm,0,pfl)
+        self.assertEqual(f1ts.getPfls(),()) # here setFieldProfile has detected useless pfl -> no pfl
+        self.assertEqual(f1ts.getFieldSplitedByType(),refSp)
+        self.assertTrue(f1ts.field(mm).isEqual(f,1e-12,1e-12)) # the essential
+        #
+        f1ts=MEDFileField1TS()
+        f1ts.setFieldProfileFlatly(f,mm,0,pfl) # no optimization attempt. Create pfl unconditionally
+        self.assertEqual(f1ts.getPfls(),("%s_NORM_TRI3"%pfl.getName(),"%s_NORM_QUAD4"%pfl.getName()))
+        self.assertEqual(f1ts.getFieldSplitedByType(),refSp1)
+        self.assertTrue(f1ts.field(mm).isEqual(f,1e-12,1e-12)) # the essential
+        self.assertTrue(f1ts.getProfile("pfl_NORM_TRI3").isIota(162))
+        self.assertTrue(f1ts.getProfile("pfl_NORM_QUAD4").isIota(81))
+        pass
+
+    @WriteInTmpDir
+    def testRmGroupAtSpeLevelAndMultiLevGrpCreation(self):
+        """ Here multi level groups are created"""
+        arr=DataArrayDouble(11) ; arr.iota()
+        m=MEDCouplingCMesh() ; m.setCoords(arr,arr)
+        m=m.buildUnstructured()
+        m.setName("mesh")
+        m1=m.buildDescendingConnectivity()[0]
+        mm=MEDFileUMesh()
+        mm[0]=m ; mm[-1]=m1
+        ################
+        grpName="grp0"
+        grp0_0=DataArrayInt([0,1,2,6]) ; grp0_0.setName(grpName)
+        grp0_1=DataArrayInt([0,1,2,7]) ; grp0_1.setName(grpName)
+        grp1=DataArrayInt([1,2,3,5,6]) ; grp1.setName("grp1")
+        grp2=DataArrayInt([2,3,5,8]) ; grp2.setName("grp2")
+        ################ ajouter un groupe sur plusieurs niveau
+        mm.addGroup(0,grp1)
+        mm.addGroup(-1,grp2)
+        mm.addGroup(0,grp0_0)
+        mm.addGroup(-1,grp0_1)
+        self.assertEqual(mm.getGrpNonEmptyLevels(grpName),(0,-1))
+        self.assertTrue(mm.getGroupArr(0,grpName).isEqual(grp0_0))
+        self.assertTrue(mm.getGroupArr(-1,grpName).isEqual(grp0_1))
+        self.assertTrue(mm.getGroupArr(0,"grp1").isEqual(grp1))
+        self.assertTrue(mm.getGroupArr(-1,"grp2").isEqual(grp2))
+        self.assertRaises(InterpKernelException,mm.addGroup,-1,grp0_1) # raise
+        self.assertTrue(mm.getGroupArr(0,grpName).isEqual(grp0_0))
+        self.assertTrue(mm.getGroupArr(-1,grpName).isEqual(grp0_1))
+        self.assertTrue(mm.getGroupArr(0,"grp1").isEqual(grp1))
+        self.assertTrue(mm.getGroupArr(-1,"grp2").isEqual(grp2))
+        mm.removeGroupAtLevel(0,grpName)
+        self.assertEqual(mm.getGrpNonEmptyLevels(grpName),(-1,))
+        self.assertTrue(mm.getGroupArr(-1,grpName).isEqual(grp0_1))
+        self.assertTrue(mm.getGroupArr(0,"grp1").isEqual(grp1))
+        self.assertTrue(mm.getGroupArr(-1,"grp2").isEqual(grp2))
+        mm.removeGroupAtLevel(-1,grpName)
+        self.assertEqual(mm.getGrpNonEmptyLevels(grpName),())
+        self.assertRaises(InterpKernelException,mm.removeGroupAtLevel,-2,grpName)
+        mm.addGroup(-1,grp0_1)
+        mm.addGroup(0,grp0_0)
+        self.assertEqual(mm.getGrpNonEmptyLevels(grpName),(0,-1))
+        self.assertTrue(mm.getGroupArr(0,grpName).isEqual(grp0_0))
+        self.assertTrue(mm.getGroupArr(-1,grpName).isEqual(grp0_1))
+        self.assertTrue(mm.getGroupArr(0,"grp1").isEqual(grp1))
+        self.assertTrue(mm.getGroupArr(-1,"grp2").isEqual(grp2))
+        pass
+
+    @WriteInTmpDir
+    def testYutaka(self):
+        """ Thank you to Yutaka Nishizawa for having report this bug. At level -1, adding a first group on all entities leads to a group lying on family 0...
+        Then rearrange method removes unused entites by putting 0 on them -> Previously group has been modified by rearrange. Should not !"""
+        mn="mesh"
+        m=MEDCouplingCMesh()
+        arr=DataArrayDouble(4) ; arr.iota()
+        m.setCoords(arr,arr,arr)
+        m=m.buildUnstructured()
+        m.setName(mn)
+        #
+        m=m.buildUnstructured()
+        m1=m.buildDescendingConnectivity()[0]
+        #
+        mm=MEDFileUMesh()
+        mm[0]=m
+        mm[-1]=m1
+        #
+        grp0=DataArrayInt([0,1,2]) ; grp0.setName("grp0")
+        mm.addGroup(0,grp0)
+        grp1=DataArrayInt([3,4,5,6]) ; grp1.setName("grp1")
+        mm.addGroup(0,grp1)
+        grp2=DataArrayInt([7,8,9]) ; grp2.setName("grp2")
+        mm.addGroup(0,grp2)
+        grp3=DataArrayInt.Range(0,m1.getNumberOfCells(),1) ; grp3.setName("grp3")
+        mm.addGroup(-1,grp3)
+        self.assertNotIn(0,mm.getFamiliesIdsOnGroup("grp3")) # bug was here !
+        grp4=DataArrayInt([3,5,8,10]) ; grp4.setName("grp4")
+        mm.addNodeGroup(grp4)
+        mm.rearrangeFamilies()
+        self.assertEqual(mm.getGrpNonEmptyLevelsExt("grp0"),(0,))
+        self.assertEqual(mm.getGrpNonEmptyLevelsExt("grp1"),(0,))
+        self.assertEqual(mm.getGrpNonEmptyLevelsExt("grp2"),(0,))
+        self.assertEqual(mm.getGrpNonEmptyLevelsExt("grp3"),(-1,))
+        self.assertEqual(mm.getGrpNonEmptyLevelsExt("grp4"),(1,))
+
+        for grp in [grp0,grp1,grp2,grp3,grp4]:
+            self.assertTrue(mm.getGroupArr(mm.getGrpNonEmptyLevelsExt(grp.getName())[0],grp.getName()).isEqual(grp))
+            pass
+        pass
+
+    @WriteInTmpDir
+    def testContxtMger1TS(self):
+        fname="Pyfile119.med"
+        coo=DataArrayDouble(1000) ; coo.iota()
+        m=MEDCouplingUMesh.Build0DMeshFromCoords(coo)
+        m.setName("mesh")
+        WriteMesh(fname,m,True)
+        f=MEDCouplingFieldDouble(ON_CELLS)
+        f.setMesh(m)
+        f.setName("Field")
+        arr=DataArrayDouble(m.getNumberOfCells())
+        f.setArray(arr)
+        f.checkConsistencyLight()
+        for i in range(10):
+            arr[:]=float(i+1)
+            f.setTime(float(i),i,0)
+            WriteFieldUsingAlreadyWrittenMesh(fname,f)
+            pass
+        #
+        mm=MEDFileMesh.New(fname)
+        fmts=MEDFileFieldMultiTS(fname,False)
+        refSize=fmts.getHeapMemorySize()
+        for f1ts in fmts:
+            with f1ts:
+                f=f1ts.field(mm)
+                pass
+            pass
+        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__":
-  unittest.main()
+    unittest.main()