Salome HOME
Copyright update 2020
[tools/medcoupling.git] / src / MEDCoupling_Swig / MEDCouplingPickleTest.py
1 #  -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2020  CEA/DEN, EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20
21
22 import sys
23 if sys.platform == "win32":
24     from MEDCouplingCompat import *
25 else:
26     from medcoupling import *
27 from MEDCouplingDataForTest import MEDCouplingDataForTest
28
29 if MEDCouplingHasNumPyBindings():
30     from numpy import *
31     pass
32
33 from platform import architecture
34 from sys import getrefcount
35
36 import os, gc, weakref, unittest
37 import sys
38 if sys.version_info.major < 3:
39   import cPickle as pickle
40 else:
41   import pickle
42
43 class MEDCouplingPickleTest(unittest.TestCase):
44     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
45     def test1(self):
46         """ Test of a simple DataArrayDouble."""
47         x=DataArrayDouble(10,1) ; x.iota() ; x.rearrange(2) ; x.setInfoOnComponents(["aa","bbb"])
48         x.setName("toto")
49         pickled=pickle.dumps(x,pickle.HIGHEST_PROTOCOL)
50         xx=pickle.loads(pickled)
51         self.assertTrue(xx.isEqual(x,1e-16))
52         # Bigger to check that the behavior is OK for large strings.
53         x=DataArrayDouble(1200) ; x.iota() ; x.setInfoOnComponents(["aa"])
54         x.setName("titi")
55         pickled=pickle.dumps(x,pickle.HIGHEST_PROTOCOL)
56         xx=pickle.loads(pickled)
57         self.assertTrue(xx.isEqual(x,1e-16))
58         pass
59
60     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
61     def test2(self):
62         """ Test of a simple DataArrayInt."""
63         x=DataArrayInt(10) ; x.iota() ; x.rearrange(2) ; x.setInfoOnComponents(["aa","bbb"])
64         x.setName("toto")
65         pickled=pickle.dumps(x,pickle.HIGHEST_PROTOCOL)
66         xx=pickle.loads(pickled)
67         self.assertTrue(xx.isEqual(x))
68         # Bigger to check that the behavior is OK for large strings.
69         x=DataArrayInt(1200) ; x.iota() ; x.setInfoOnComponents(["aa"])
70         x.setName("titi")
71         pickled=pickle.dumps(x,pickle.HIGHEST_PROTOCOL)
72         xx=pickle.loads(pickled)
73         self.assertTrue(xx.isEqual(x))
74         pass
75
76     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
77     def test3(self):
78         """ Test of a MEDCouplingUMesh pickeling."""
79         arr=DataArrayDouble(10) ; arr.iota()
80         m=MEDCouplingCMesh() ; m.setCoords(arr,arr,arr)
81         m=m.buildUnstructured()
82         m.setName("mesh")
83         m.getCoords().setInfoOnComponents(["aa","bbb","ddddd"])
84         m.checkConsistencyLight()
85         st=pickle.dumps(m,pickle.HIGHEST_PROTOCOL)
86         m2=pickle.loads(st)
87         self.assertTrue(m2.isEqual(m,1e-16))
88         pass
89
90     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
91     def test4(self):
92         """ Idem test3 except that here serialization/deserialization is done explicitly."""
93         arr=DataArrayDouble(10) ; arr.iota()
94         m=MEDCouplingCMesh() ; m.setCoords(arr,arr,arr)
95         m=m.buildUnstructured()
96         m.setName("mesh")
97         m.getCoords().setInfoOnComponents(["aa","bbb","ddddd"])
98         m.checkConsistencyLight()
99         #
100         a0,a1,a2=m.getTinySerializationInformation()
101         b0,b1=m.serialize()
102         m2=MEDCouplingUMesh()
103         m2.unserialization(a0,a1,b0,b1,a2);
104         self.assertTrue(m2.isEqual(m,1e-16))
105         pass
106
107     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
108     def test5(self):
109         """ Test of a MEDCouplingCMesh pickeling."""
110         arrX=DataArrayDouble(10) ; arrX.iota() ; arrX.setInfoOnComponents(["aa"])
111         arrY=DataArrayDouble(5) ; arrY.iota() ; arrY.setInfoOnComponents(["bbb"])
112         arrZ=DataArrayDouble(7) ; arrZ.iota() ; arrZ.setInfoOnComponents(["cccc"])
113         #
114         m=MEDCouplingCMesh() ; m.setCoords(arrX,arrY,arrZ)
115         m.setName("mesh")
116         m.checkConsistencyLight()
117         st=pickle.dumps(m,pickle.HIGHEST_PROTOCOL)
118         m2=pickle.loads(st)
119         self.assertTrue(m2.isEqual(m,1e-16))
120         self.assertTrue(m2.getCoordsAt(0).isEqual(arrX,1e-16))
121         pass
122
123     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
124     def test6(self):
125         """ Test of a MEDCoupling1SGTUMesh pickeling."""
126         arr=DataArrayDouble(10) ; arr.iota()
127         m=MEDCouplingCMesh() ; m.setCoords(arr,arr)
128         m=m.build1SGTUnstructured()
129         self.assertTrue(isinstance(m,MEDCoupling1SGTUMesh))
130         st=pickle.dumps(m,pickle.HIGHEST_PROTOCOL)
131         m2=pickle.loads(st)
132         self.assertTrue(m2.isEqual(m,1e-16))
133         pass
134
135     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
136     def test7(self):
137         """ Test of a MEDCoupling1DGTUMesh pickeling."""
138         arr=DataArrayDouble(10) ; arr.iota()
139         m=MEDCouplingCMesh() ; m.setCoords(arr,arr)
140         m=m.buildUnstructured() ; m.convertAllToPoly()
141         m=MEDCoupling1DGTUMesh(m)
142         self.assertTrue(isinstance(m,MEDCoupling1DGTUMesh))
143         st=pickle.dumps(m,pickle.HIGHEST_PROTOCOL)
144         m2=pickle.loads(st)
145         self.assertTrue(m2.isEqual(m,1e-16))
146         pass
147
148     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
149     def test8(self):
150         """ Test of a MEDCouplingMappedExtrudedMesh pickeling."""
151         arrX=DataArrayDouble(10) ; arrX.iota() ; arrX.setInfoOnComponents(["aa"])
152         arrY=DataArrayDouble(5) ; arrY.iota() ; arrY.setInfoOnComponents(["bbb"])
153         arrZ=DataArrayDouble(7) ; arrZ.iota() ; arrZ.setInfoOnComponents(["cccc"])
154         m=MEDCouplingCMesh() ; m.setCoords(arrX,arrY,arrZ)
155         mesh3D=m.buildUnstructured() ; del m
156         #
157         m=MEDCouplingCMesh() ; m.setCoords(arrX,arrY)
158         mesh2D=m.buildUnstructured() ; del m
159         #
160         mesh2D.setCoords(mesh3D.getCoords())
161         mesh=MEDCouplingMappedExtrudedMesh(mesh3D,mesh2D,0) ; del mesh3D,mesh2D
162         self.assertTrue(isinstance(mesh,MEDCouplingMappedExtrudedMesh))
163         st=pickle.dumps(mesh,pickle.HIGHEST_PROTOCOL)
164         m2=pickle.loads(st)
165         self.assertTrue(m2.isEqual(mesh,1e-16))
166         pass
167
168     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
169     def test9(self):
170         """ Test of a MEDCouplingCurveLinearMesh pickeling."""
171         arrX=DataArrayDouble(10) ; arrX.iota() ; arrX.setInfoOnComponents(["aa"])
172         arrY=DataArrayDouble(5) ; arrY.iota() ; arrY.setInfoOnComponents(["bbb"])
173         m=MEDCouplingCMesh() ; m.setCoords(arrX,arrY)
174         m=m.buildUnstructured()
175         #
176         mesh=MEDCouplingCurveLinearMesh() ; mesh.setCoords(m.getCoords()) ; del m
177         mesh.setNodeGridStructure([10,5])
178         st=pickle.dumps(mesh,pickle.HIGHEST_PROTOCOL)
179         m2=pickle.loads(st)
180         self.assertTrue(m2.isEqual(mesh,1e-16))
181         pass
182
183     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
184     def test10(self):
185         """ Test of a MEDCouplingIMesh pickeling."""
186         m=MEDCouplingIMesh("mesh",3,DataArrayInt([3,1,4]),DataArrayDouble([1.5,2.5,3.5]),DataArrayDouble((0.5,1.,0.25))) ; m.setAxisUnit("km")
187         m.checkConsistencyLight()
188         st=pickle.dumps(m,pickle.HIGHEST_PROTOCOL)
189         m2=pickle.loads(st)
190         self.assertTrue(m2.isEqual(m,1e-16))
191         self.assertEqual(m2.getName(),m.getName())
192         pass
193
194     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
195     def test11(self):
196         """  Test of MEDCouplingFieldDouble lying on MEDCouplingCMesh pickeling. """
197         arrX=DataArrayDouble(10) ; arrX.iota() ; arrX.setInfoOnComponents(["aa"])
198         arrY=DataArrayDouble(5) ; arrY.iota() ; arrY.setInfoOnComponents(["bbb"])
199         m=MEDCouplingCMesh() ; m.setCoords(arrX,arrY)
200         f=m.getMeasureField(True)
201         f.setName("aname")
202         a=f.getArray()
203         b=a[:] ; b.iota(7000.)
204         f.setArray(DataArrayDouble.Meld(a,b))
205         f.getArray().setInfoOnComponents(["u1","vv2"])
206         f.checkConsistencyLight();
207         #
208         st=pickle.dumps(f,pickle.HIGHEST_PROTOCOL)
209         f2=pickle.loads(st)
210         self.assertTrue(f2.isEqual(f,1e-16,1e-16))
211         self.assertTrue(f2.getMesh().isEqual(f.getMesh(),1e-16))
212         ###
213         ft=MEDCouplingFieldTemplate(f)
214         ft2=pickle.loads(pickle.dumps(ft,pickle.HIGHEST_PROTOCOL))
215         self.assertTrue(ft2.isEqual(ft,1e-16))
216         pass
217
218     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
219     def test12(self):
220         """  Test of MEDCouplingFieldDouble on Gauss Points lying on MEDCouplingUMesh pickeling."""
221         _a=0.446948490915965;
222         _b=0.091576213509771;
223         _p1=0.11169079483905;
224         _p2=0.0549758718227661;
225         refCoo1=[ 0.,0., 1.,0., 0.,1. ]
226         gsCoo1=[ 2*_b-1, 1-4*_b, 2*_b-1, 2.07*_b-1, 1-4*_b,
227                  2*_b-1, 1-4*_a, 2*_a-1, 2*_a-1, 1-4*_a, 2*_a-1, 2*_a-1 ]
228         wg1=[ 4*_p2, 4*_p2, 4*_p2, 4*_p1, 4*_p1, 4*_p1 ]
229         _refCoo1=refCoo1
230         _gsCoo1=gsCoo1
231         _wg1=wg1
232         #
233         m=MEDCouplingDataForTest.build2DTargetMesh_1();
234         f=MEDCouplingFieldDouble.New(ON_GAUSS_PT,NO_TIME);
235         f.setMesh(m);
236         self.assertEqual(5,f.getNumberOfMeshPlacesExpected());
237         self.assertEqual(0,f.getNbOfGaussLocalization());
238         f.setGaussLocalizationOnType(NORM_TRI3,_refCoo1,_gsCoo1,_wg1);
239         f.setGaussLocalizationOnType(NORM_TRI3,_refCoo1,_gsCoo1,_wg1); # not a bug only to check that it works well
240         self.assertRaises(InterpKernelException,f.setGaussLocalizationOnType,NORM_QUAD4,_refCoo1,_gsCoo1,_wg1)
241         self.assertEqual(1,f.getNbOfGaussLocalization());
242         refCoo2=[ 0.,0., 1.,0., 1.,1., 0.,1. ]
243         _refCoo2=refCoo2
244         _gsCoo1=_gsCoo1[0:4]
245         _wg1=_wg1[0:2]
246         f.setGaussLocalizationOnType(NORM_QUAD4,_refCoo2,_gsCoo1,_wg1);
247         self.assertEqual(2,f.getNbOfGaussLocalization());
248         array=DataArrayDouble.New();
249         ptr=18*2*[None]
250         for i in range(18 * 2):
251             ptr[i]=float(i+1)
252         array.setValues(ptr,18,2);
253         ptr=array.getPointer();
254         f.setArray(array);
255         f.setName("MyFirstFieldOnGaussPoint");
256         f.checkConsistencyLight();
257         self.assertAlmostEqual(27.,f.getIJK(2,5,0),14);
258         self.assertAlmostEqual(16.,f.getIJK(1,5,1),14);
259         #
260         f.clearGaussLocalizations();
261         self.assertEqual(0,f.getNbOfGaussLocalization());
262         self.assertRaises(InterpKernelException,f.checkConsistencyLight);
263         ids1=[0,1,3,4]
264         self.assertRaises(InterpKernelException,f.setGaussLocalizationOnCells,ids1,_refCoo2,_gsCoo1,_wg1);
265         self.assertEqual(0,f.getNbOfGaussLocalization());
266         ids2=[0,4]
267         f.setGaussLocalizationOnCells(ids2,_refCoo2,_gsCoo1,_wg1);
268         self.assertEqual(1,f.getNbOfGaussLocalization());
269         self.assertEqual(0,f.getGaussLocalizationIdOfOneCell(0));
270         self.assertRaises(InterpKernelException,f.getGaussLocalizationIdOfOneCell,1);
271         ids3=[1,2]
272         f.setGaussLocalizationOnCells(ids3,_refCoo1,_gsCoo1,_wg1);
273         self.assertEqual(2,f.getNbOfGaussLocalization());
274         self.assertEqual(0,f.getGaussLocalizationIdOfOneCell(0));
275         self.assertEqual(1,f.getGaussLocalizationIdOfOneCell(1));
276         self.assertEqual(1,f.getGaussLocalizationIdOfOneCell(2));
277         self.assertRaises(InterpKernelException,f.checkConsistencyLight);#<- cell 3 has no localization
278         ids4=[3]
279         _gsCoo2=_gsCoo1;
280         _wg2=_wg1;
281         _gsCoo2[0]=0.8888777776666;
282         _wg2[0]=0.1234567892377;
283         f.setGaussLocalizationOnCells(ids4,_refCoo2,_gsCoo2,_wg2);
284         self.assertEqual(3,f.getNbOfGaussLocalization());
285         tmpIds=f.getCellIdsHavingGaussLocalization(0);
286         self.assertEqual(ids2,list(tmpIds.getValues()));
287         self.assertRaises(InterpKernelException,f.checkConsistencyLight);#<- it's always not ok because undelying array not with the good size.
288         array2=f.getArray().subArray(0,10);
289         f.setArray(array2);
290         f.checkConsistencyLight();
291         ####
292         st=pickle.dumps(f,pickle.HIGHEST_PROTOCOL)
293         f2=pickle.loads(st)
294         self.assertTrue(f2.isEqual(f,1e-16,1e-16))
295         self.assertTrue(f2.getMesh().isEqual(f.getMesh(),1e-16))
296         ###
297         ft=MEDCouplingFieldTemplate(f)
298         ft2=pickle.loads(pickle.dumps(ft,pickle.HIGHEST_PROTOCOL))
299         self.assertTrue(ft2.isEqual(ft,1e-16))
300         pass
301
302     def test13(self):
303         eStr="This is an exception."
304         e=InterpKernelException(eStr)
305         self.assertEqual(e.what(),eStr)
306         st=pickle.dumps(e,pickle.HIGHEST_PROTOCOL)
307         e2=pickle.loads(st)
308         self.assertTrue(e is not e2)
309         self.assertTrue(isinstance(e2,InterpKernelException))
310         self.assertEqual(e2.what(),eStr)
311         pass
312
313     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
314     def test14(self):
315         """Pickelization of DataArrayBytes"""
316         x=DataArrayByte(256,1)
317         for i in range(256):
318             x[i]=-128+i
319             pass
320         x.rearrange(2) ; x.setInfoOnComponents(["aa","bbb"])
321         x.setName("toto")
322         st=pickle.dumps(x,pickle.HIGHEST_PROTOCOL)
323         x2=pickle.loads(st)
324         self.assertTrue(x2.isEqual(x))
325         pass
326
327     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
328     def test15(self):
329         """Pickelization of DataArrayFloat"""
330         x=DataArrayFloat(256) ; x.iota()
331         x.rearrange(2) ; x.setInfoOnComponents(["aa","bbb"])
332         x.setName("toto")
333         st = pickle.dumps(x, pickle.HIGHEST_PROTOCOL)
334         x2 = pickle.loads(st)
335         self.assertTrue(x2.isEqual(x,1e-7))
336         pass
337
338     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
339     def test16(self):
340         """  Test of MEDCouplingFieldInt lying on MEDCouplingCMesh pickeling. """
341         arrX=DataArrayDouble(10) ; arrX.iota() ; arrX.setInfoOnComponents(["aa"])
342         arrY=DataArrayDouble(5) ; arrY.iota() ; arrY.setInfoOnComponents(["bbb"])
343         m=MEDCouplingCMesh() ; m.setCoords(arrX,arrY)
344         f=m.getMeasureField(True)
345         f=f.convertToIntField()
346         self.assertTrue(isinstance(f,MEDCouplingFieldInt))
347         f.setName("aname")
348         a=f.getArray()
349         b=a[:] ; b.iota(7000)
350         f.setArray(DataArrayInt32.Meld(a,b))
351         f.getArray().setInfoOnComponents(["u1","vv2"])
352         f.checkConsistencyLight();
353         #
354         st = pickle.dumps(f, pickle.HIGHEST_PROTOCOL)
355         f2 = pickle.loads(st)
356         self.assertTrue(f2.isEqual(f,1e-16,0))
357         self.assertTrue(f2.getMesh().isEqual(f.getMesh(),1e-16))
358         pass
359
360     @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
361     def test17(self):
362         """  Test of MEDCouplingFieldInt lying on MEDCouplingCMesh pickeling. """
363         arrX=DataArrayDouble(10) ; arrX.iota() ; arrX.setInfoOnComponents(["aa"])
364         arrY=DataArrayDouble(5) ; arrY.iota() ; arrY.setInfoOnComponents(["bbb"])
365         m=MEDCouplingCMesh() ; m.setCoords(arrX,arrY)
366         f2=m.getMeasureField(True)
367         f=MEDCouplingFieldFloat(ON_CELLS)
368         f.setMesh(m) ; f.setArray(f2.getArray().convertToFloatArr())
369         self.assertTrue(isinstance(f,MEDCouplingFieldFloat))
370         f.setName("aname")
371         a=f.getArray()
372         b=a[:] ; b.iota(7000.)
373         f.setArray(DataArrayFloat.Meld(a,b))
374         f.getArray().setInfoOnComponents(["u1","vv2"])
375         f.checkConsistencyLight();
376         #
377         st = pickle.dumps(f, pickle.HIGHEST_PROTOCOL)
378         f2 = pickle.loads(st)
379         self.assertTrue(f2.isEqual(f,1e-16,0))
380         self.assertTrue(f2.getMesh().isEqual(f.getMesh(),1e-16))
381         pass
382
383     def setUp(self):
384         pass
385     pass
386
387 if __name__=="__main__":
388     unittest.main()