Salome HOME
Fix computation height of isocel triangle with base equal zero : NaN
[tools/medcoupling.git] / src / MEDCoupling_Swig / MEDCouplingNumPyTest.py
index 427211046ca574076ee3154bb7f2a64c0a697be9..1fc1fbce4126620aae4f1c806ca2d1bb38e28c5c 100644 (file)
@@ -1,5 +1,5 @@
 #  -*- coding: iso-8859-1 -*-
-# Copyright (C) 2007-2016  CEA/DEN, EDF R&D
+# Copyright (C) 2007-2023  CEA, EDF
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -18,7 +18,9 @@
 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
 
-from MEDCoupling import *
+
+import sys
+from medcoupling import *
 
 if MEDCouplingHasNumPyBindings():
     from numpy import *
@@ -41,10 +43,10 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         a=a.cumsum(dtype=int32)
         a=array(a,dtype=int64) ; a=array(a,dtype=int32)
         self.assertEqual(getrefcount(a),2)
-        d=DataArrayInt(a)
+        d=DataArrayInt32(a)
         d[:]=2
         #
-        e=DataArrayInt(sz) ; e.fillWithValue(2)
+        e=DataArrayInt32(sz) ; e.fillWithValue(2)
         self.assertTrue(d.isEqual(e))
         #
         a[:]=4 ; e.fillWithValue(4)
@@ -61,9 +63,9 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         self.assertEqual(getrefcount(a),3)
         self.assertEqual(getrefcount(b),2)
         b[:]=5
-        d=DataArrayInt(b)
+        d=DataArrayInt32(b)
         #
-        e=DataArrayInt(sz*2) ; e.fillWithValue(5)
+        e=DataArrayInt32(sz*2) ; e.fillWithValue(5)
         self.assertTrue(d.isEqual(e))
         pass
     
@@ -76,16 +78,16 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         c=a.reshape(2,sz)
         b[:]=6
         b[7:17]=7
-        d=DataArrayInt(b)
-        self.assertTrue(d.isEqual(DataArrayInt([6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,6,6,6])))
+        d=DataArrayInt32(b)
+        self.assertTrue(d.isEqual(DataArrayInt32([6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,6,6,6])))
         #
         a=zeros((10,2),dtype=int32)
         b=a.T
         c=b.view()
         a.shape=20
         a[3:]=10.
-        d=DataArrayInt(a)
-        self.assertTrue(d.isEqual(DataArrayInt([0,0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10])))
+        d=DataArrayInt32(a)
+        self.assertTrue(d.isEqual(DataArrayInt32([0,0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10])))
         pass
     
     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
@@ -99,7 +101,7 @@ class MEDCouplingNumPyTest(unittest.TestCase):
     def test5(self):
         a=arange(20,dtype=int32)
         self.assertEqual(weakref.getweakrefcount(a),0)
-        d=DataArrayInt(a)
+        d=DataArrayInt32(a)
         self.assertEqual(weakref.getweakrefcount(a),1)
         self.assertTrue(not a.flags["OWNDATA"])
         self.assertTrue(d.isIota(20))
@@ -111,14 +113,14 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         gc.collect()
         self.assertTrue(a.flags["OWNDATA"])
         a[:]=4 # a can be used has usual
-        self.assertTrue(DataArrayInt(a).isUniform(4))
+        self.assertTrue(DataArrayInt32(a).isUniform(4))
         pass
     
     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
     def test6(self):
         a=arange(20,dtype=int32)
-        d=DataArrayInt(a) # d owns data of a
-        e=DataArrayInt(a) # a not owned -> e only an access to chunk of a 
+        d=DataArrayInt32(a) # d owns data of a
+        e=DataArrayInt32(a) # a not owned -> e only an access to chunk of a 
         self.assertTrue(d.isIota(d.getNumberOfTuples()))
         self.assertTrue(e.isIota(e.getNumberOfTuples()))
         a[:]=6
@@ -137,9 +139,9 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         a=array(0,dtype=int32) ; a.resize(10,2)
         b=a.reshape(20)
         c=a.reshape(2,10)
-        d=DataArrayInt(b) # d owns data of a
-        e=DataArrayInt(b) # a not owned -> e only an access to chunk of a
-        f=DataArrayInt(b) # a not owned -> e only an access to chunk of a
+        d=DataArrayInt32(b) # d owns data of a
+        e=DataArrayInt32(b) # a not owned -> e only an access to chunk of a
+        f=DataArrayInt32(b) # a not owned -> e only an access to chunk of a
         del d # d removed -> a ownes again data
         ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called 
         import gc
@@ -172,11 +174,11 @@ class MEDCouplingNumPyTest(unittest.TestCase):
     def test8(self):
         a=arange(20,dtype=int32)
         self.assertTrue(a.flags["OWNDATA"])
-        d=DataArrayInt(a) # d owns data of a
+        d=DataArrayInt32(a) # d owns data of a
         self.assertTrue(not a.flags["OWNDATA"])
         d.pushBackSilent(20)# d pushBack so release of chunk of data -> a becomes owner of its data again
         self.assertTrue(a.flags["OWNDATA"])
-        self.assertTrue(d.isEqual(DataArrayInt([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20])))
+        self.assertTrue(d.isEqual(DataArrayInt32([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20])))
         self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19])
         pass
 
@@ -386,16 +388,16 @@ class MEDCouplingNumPyTest(unittest.TestCase):
     def test19(self):
         sz=20
         a=array(0,dtype=int32)
-        a.resize(sz/2,2)
+        a.resize(sz//2,2)
         a[:]=4
         self.assertEqual(getrefcount(a),2)
-        d=DataArrayInt(a)
+        d=DataArrayInt32(a)
         self.assertEqual(10,d.getNumberOfTuples())
         self.assertEqual(2,d.getNumberOfComponents())
         self.assertEqual(sz,d.getNbOfElems())
-        self.assertTrue(d.isEqual(DataArrayInt([(4,4),(4,4),(4,4),(4,4),(4,4),(4,4),(4,4),(4,4),(4,4),(4,4)])))
+        self.assertTrue(d.isEqual(DataArrayInt32([(4,4),(4,4),(4,4),(4,4),(4,4),(4,4),(4,4),(4,4),(4,4),(4,4)])))
         a[:]=7
-        self.assertTrue(d.isEqual(DataArrayInt([(7,7),(7,7),(7,7),(7,7),(7,7),(7,7),(7,7),(7,7),(7,7),(7,7)])))
+        self.assertTrue(d.isEqual(DataArrayInt32([(7,7),(7,7),(7,7),(7,7),(7,7),(7,7),(7,7),(7,7),(7,7),(7,7)])))
         #
         b=a.reshape((2,5,2))
         self.assertRaises(InterpKernelException,DataArrayInt.New,b) # b has not dimension in [0,1] !
@@ -405,7 +407,7 @@ class MEDCouplingNumPyTest(unittest.TestCase):
     def test20(self):
         sz=20
         a=array(0,dtype=float64)
-        a.resize(sz/2,2)
+        a.resize(sz//2,2)
         a[:]=4
         self.assertEqual(getrefcount(a),2)
         d=DataArrayDouble(a)
@@ -422,10 +424,10 @@ class MEDCouplingNumPyTest(unittest.TestCase):
 
     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
     def test21(self):
-        #tests that only DataArray*(npArray) contructor is available
+        #tests that only DataArray*(npArray) constructor is available
         a=array(0,dtype=int32)
         a.resize(20)
-        DataArrayInt(a)
+        DataArrayInt32(a)
         self.assertRaises(InterpKernelException,DataArrayInt.New,a,20)
         self.assertRaises(InterpKernelException,DataArrayInt.New,a,20,1)
         a=array(0,dtype=float64)
@@ -559,9 +561,9 @@ class MEDCouplingNumPyTest(unittest.TestCase):
     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
     def test25(self):
         a=arange(10,dtype=int32)
-        b=DataArrayInt(a)
-        c=DataArrayInt(a)
-        d=DataArrayInt(a)
+        b=DataArrayInt32(a)
+        c=DataArrayInt32(a)
+        d=DataArrayInt32(a)
         self.assertTrue(b.isIota(10))
         self.assertTrue(c.isIota(10))
         self.assertTrue(d.isIota(10))
@@ -579,8 +581,8 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         self.assertTrue(c.isIota(11))
         #
         a=arange(10,dtype=int32)
-        b=DataArrayInt(a)
-        c=DataArrayInt(a)
+        b=DataArrayInt32(a)
+        c=DataArrayInt32(a)
         self.assertTrue(b.isIota(10))
         self.assertTrue(c.isIota(10))
         b.pushBackSilent(10) # c and a,b are dissociated
@@ -639,9 +641,9 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         self.assertEqual(a.ndim,2)
         self.assertEqual(a.size,15)
         self.assertEqual(a.shape,(5,3))
-        self.assertEqual(a.strides,(12,4))
-        self.assertEqual(a.nbytes,60)
-        self.assertEqual(a.itemsize,4)
+        self.assertEqual(a.strides,(3*MEDCouplingSizeOfIDs()//8,MEDCouplingSizeOfIDs()//8))
+        self.assertEqual(a.nbytes,15*MEDCouplingSizeOfIDs()//8)
+        self.assertEqual(a.itemsize,MEDCouplingSizeOfIDs()//8)
         self.assertEqual(a.tolist(),[[0,1,2],[3,4,5],[6,7,8],[9,10,11],[12,13,14]])
         #
         d2=d.convertToDblArr()
@@ -668,11 +670,11 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         """Test on DataArrayBytes"""
         # use case 1
         d=DataArrayByte(256)
-        for i in xrange(len(d)):
+        for i in range(len(d)):
             d[i]=-128+i
             pass
         arr=d.toNumPyArray()
-        for i in xrange(len(d)):
+        for i in range(len(d)):
             self.assertEqual(int(arr[i]),-128+i)
             pass
         d[0]=7
@@ -685,11 +687,11 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         gc.collect()
         # use case 2
         d=DataArrayByte(256)
-        for i in xrange(len(d)):
+        for i in range(len(d)):
             d[i]=-128+i
             pass
         arr=d.toNumPyArray()
-        for i in xrange(len(d)):
+        for i in range(len(d)):
             self.assertEqual(int(arr[i]),-128+i)
             pass
         del d
@@ -698,7 +700,7 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         gc.collect()
         # use case 3
         d=DataArrayByte(256)
-        for i in xrange(len(d)):
+        for i in range(len(d)):
             d[i]=-128+i
             pass
         arr1=d.toNumPyArray()
@@ -708,20 +710,20 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         self.assertEqual(int(arr1[0]),10) ; self.assertEqual(int(arr2[0]),10) ; self.assertEqual(int(arr3[0]),10)
         arr2[0]=15 ; self.assertEqual(int(d.getIJ(0,0)),15) ; self.assertEqual(int(arr1[0]),15) ; self.assertEqual(int(arr3[0]),15)
         arr1[0]=-128
-        for i in xrange(len(d)):
+        for i in range(len(d)):
             self.assertEqual(int(arr1[i]),-128+i)
             self.assertEqual(int(arr2[i]),-128+i)
             self.assertEqual(int(arr3[i]),-128+i)
             pass
         del arr2
         gc.collect()
-        for i in xrange(len(d)):
+        for i in range(len(d)):
             self.assertEqual(int(arr1[i]),-128+i)
             self.assertEqual(int(arr3[i]),-128+i)
             pass
         del arr1
         gc.collect()
-        for i in xrange(len(d)):
+        for i in range(len(d)):
             self.assertEqual(int(arr3[i]),-128+i)
             pass
         del arr3
@@ -729,11 +731,11 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         # use case 4
         arr=array(0,dtype=int8)
         arr.resize(256)
-        for i in xrange(256):
+        for i in range(256):
             arr[i]=-128+i
             pass
         d=DataArrayByte(arr)
-        for i in xrange(256):
+        for i in range(256):
             self.assertEqual(int(d.getIJ(i,0)),-128+i)
             pass
         del arr
@@ -743,11 +745,11 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         # use case 5
         arr=array(0,dtype=int8)
         arr.resize(256)
-        for i in xrange(256):
+        for i in range(256):
             arr[i]=-128+i
             pass
         d=DataArrayByte(arr)
-        for i in xrange(256):
+        for i in range(256):
             self.assertEqual(int(d.getIJ(i,0)),-128+i)
             pass
         del d
@@ -918,7 +920,7 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         """Same as test20 with float32"""
         sz=20
         a=array(0,dtype=float32)
-        a.resize(sz/2,2)
+        a.resize(sz//2,2)
         a[:]=4
         self.assertEqual(getrefcount(a),2)
         d=DataArrayFloat(a)
@@ -1057,6 +1059,22 @@ class MEDCouplingNumPyTest(unittest.TestCase):
         self.assertTrue(not b.flags["OWNDATA"])
         pass
 
+    @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
+    def test41(self):
+        """ This non regression test is focused on a numpy subarray of a bigger numpy array. Typically a 1D array coming from a 2D array. When medcoupling takes the ownership, medcoupling must store an offset to deallocate correctly the pointer. The pointer of medcoupling array is NOT the pointer to be transmited to free. The offset is typically the distance between the start of the main 2D array and the start of 1D array medcouplingized."""
+        import numpy as np
+        array = np.array([[1,2,3,10],[4,5,6,20],[7,8,9,30]],dtype=np.float64) # create a 2D array 
+        b = array[2] # b data pointer starts at array+2*4*sizeof(float64) so offset is expected to be equal to -2*4*sizeof(float64)=-64
+        self.assertTrue(array.flags["OWNDATA"])
+        self.assertTrue(not b.flags["OWNDATA"])
+        d=DataArrayDouble(b)
+        self.assertTrue(not array.flags["OWNDATA"])
+        self.assertTrue(not b.flags["OWNDATA"])
+        del b ; gc.collect()
+        del array ; gc.collect()
+        del d ; gc.collect() # important : destroy d after b and array to be sure to let the ownership to d.
+        pass
+
     def setUp(self):
         pass
     pass