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