1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2021 CEA/DEN, EDF R&D
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.
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.
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
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 if sys.platform == "win32":
24 from MEDCouplingCompat import *
26 from medcoupling import *
27 from MEDCouplingDataForTest import MEDCouplingDataForTest
29 if MEDCouplingHasNumPyBindings():
33 from platform import architecture
34 from sys import getrefcount
36 import os, gc, weakref, unittest
38 if sys.version_info.major < 3:
39 import cPickle as pickle
43 class MEDCouplingPickleTest(unittest.TestCase):
44 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
46 """ Test of a simple DataArrayDouble."""
47 x=DataArrayDouble(10,1) ; x.iota() ; x.rearrange(2) ; x.setInfoOnComponents(["aa","bbb"])
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"])
55 pickled=pickle.dumps(x,pickle.HIGHEST_PROTOCOL)
56 xx=pickle.loads(pickled)
57 self.assertTrue(xx.isEqual(x,1e-16))
60 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
62 """ Test of a simple DataArrayInt."""
63 x=DataArrayInt(10) ; x.iota() ; x.rearrange(2) ; x.setInfoOnComponents(["aa","bbb"])
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"])
71 pickled=pickle.dumps(x,pickle.HIGHEST_PROTOCOL)
72 xx=pickle.loads(pickled)
73 self.assertTrue(xx.isEqual(x))
76 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
78 """ Test of a MEDCouplingUMesh pickeling."""
79 arr=DataArrayDouble(10) ; arr.iota()
80 m=MEDCouplingCMesh() ; m.setCoords(arr,arr,arr)
81 m=m.buildUnstructured()
83 m.getCoords().setInfoOnComponents(["aa","bbb","ddddd"])
84 m.checkConsistencyLight()
85 st=pickle.dumps(m,pickle.HIGHEST_PROTOCOL)
87 self.assertTrue(m2.isEqual(m,1e-16))
90 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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()
97 m.getCoords().setInfoOnComponents(["aa","bbb","ddddd"])
98 m.checkConsistencyLight()
100 a0,a1,a2=m.getTinySerializationInformation()
102 m2=MEDCouplingUMesh()
103 m2.unserialization(a0,a1,b0,b1,a2);
104 self.assertTrue(m2.isEqual(m,1e-16))
107 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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"])
114 m=MEDCouplingCMesh() ; m.setCoords(arrX,arrY,arrZ)
116 m.checkConsistencyLight()
117 st=pickle.dumps(m,pickle.HIGHEST_PROTOCOL)
119 self.assertTrue(m2.isEqual(m,1e-16))
120 self.assertTrue(m2.getCoordsAt(0).isEqual(arrX,1e-16))
123 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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)
132 self.assertTrue(m2.isEqual(m,1e-16))
135 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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)
145 self.assertTrue(m2.isEqual(m,1e-16))
148 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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
157 m=MEDCouplingCMesh() ; m.setCoords(arrX,arrY)
158 mesh2D=m.buildUnstructured() ; del m
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)
165 self.assertTrue(m2.isEqual(mesh,1e-16))
168 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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()
176 mesh=MEDCouplingCurveLinearMesh() ; mesh.setCoords(m.getCoords()) ; del m
177 mesh.setNodeGridStructure([10,5])
178 st=pickle.dumps(mesh,pickle.HIGHEST_PROTOCOL)
180 self.assertTrue(m2.isEqual(mesh,1e-16))
183 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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)
190 self.assertTrue(m2.isEqual(m,1e-16))
191 self.assertEqual(m2.getName(),m.getName())
194 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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)
203 b=a[:] ; b.iota(7000.)
204 f.setArray(DataArrayDouble.Meld(a,b))
205 f.getArray().setInfoOnComponents(["u1","vv2"])
206 f.checkConsistencyLight();
208 st=pickle.dumps(f,pickle.HIGHEST_PROTOCOL)
210 self.assertTrue(f2.isEqual(f,1e-16,1e-16))
211 self.assertTrue(f2.getMesh().isEqual(f.getMesh(),1e-16))
213 ft=MEDCouplingFieldTemplate(f)
214 ft2=pickle.loads(pickle.dumps(ft,pickle.HIGHEST_PROTOCOL))
215 self.assertTrue(ft2.isEqual(ft,1e-16))
218 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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 ]
233 m=MEDCouplingDataForTest.build2DTargetMesh_1();
234 f=MEDCouplingFieldDouble.New(ON_GAUSS_PT,NO_TIME);
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. ]
246 f.setGaussLocalizationOnType(NORM_QUAD4,_refCoo2,_gsCoo1,_wg1);
247 self.assertEqual(2,f.getNbOfGaussLocalization());
248 array=DataArrayDouble.New();
250 for i in range(18 * 2):
252 array.setValues(ptr,18,2);
253 ptr=array.getPointer();
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);
260 f.clearGaussLocalizations();
261 self.assertEqual(0,f.getNbOfGaussLocalization());
262 self.assertRaises(InterpKernelException,f.checkConsistencyLight);
264 self.assertRaises(InterpKernelException,f.setGaussLocalizationOnCells,ids1,_refCoo2,_gsCoo1,_wg1);
265 self.assertEqual(0,f.getNbOfGaussLocalization());
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);
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
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);
290 f.checkConsistencyLight();
292 st=pickle.dumps(f,pickle.HIGHEST_PROTOCOL)
294 self.assertTrue(f2.isEqual(f,1e-16,1e-16))
295 self.assertTrue(f2.getMesh().isEqual(f.getMesh(),1e-16))
297 ft=MEDCouplingFieldTemplate(f)
298 ft2=pickle.loads(pickle.dumps(ft,pickle.HIGHEST_PROTOCOL))
299 self.assertTrue(ft2.isEqual(ft,1e-16))
303 eStr="This is an exception."
304 e=InterpKernelException(eStr)
305 self.assertEqual(e.what(),eStr)
306 st=pickle.dumps(e,pickle.HIGHEST_PROTOCOL)
308 self.assertTrue(e is not e2)
309 self.assertTrue(isinstance(e2,InterpKernelException))
310 self.assertEqual(e2.what(),eStr)
313 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
315 """Pickelization of DataArrayBytes"""
316 x=DataArrayByte(256,1)
320 x.rearrange(2) ; x.setInfoOnComponents(["aa","bbb"])
322 st=pickle.dumps(x,pickle.HIGHEST_PROTOCOL)
324 self.assertTrue(x2.isEqual(x))
327 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
329 """Pickelization of DataArrayFloat"""
330 x=DataArrayFloat(256) ; x.iota()
331 x.rearrange(2) ; x.setInfoOnComponents(["aa","bbb"])
333 st = pickle.dumps(x, pickle.HIGHEST_PROTOCOL)
334 x2 = pickle.loads(st)
335 self.assertTrue(x2.isEqual(x,1e-7))
338 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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))
349 b=a[:] ; b.iota(7000)
350 f.setArray(DataArrayInt32.Meld(a,b))
351 f.getArray().setInfoOnComponents(["u1","vv2"])
352 f.checkConsistencyLight();
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))
360 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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))
372 b=a[:] ; b.iota(7000.)
373 f.setArray(DataArrayFloat.Meld(a,b))
374 f.getArray().setInfoOnComponents(["u1","vv2"])
375 f.checkConsistencyLight();
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))
387 if __name__=="__main__":