1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2023 CEA, EDF
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 from medcoupling import *
24 from MEDCouplingDataForTest import MEDCouplingDataForTest
26 if MEDCouplingHasNumPyBindings():
30 from platform import architecture
31 from sys import getrefcount
33 import os, gc, weakref, unittest
35 if sys.version_info.major < 3:
36 import cPickle as pickle
40 class MEDCouplingPickleTest(unittest.TestCase):
41 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
43 """ Test of a simple DataArrayDouble."""
44 x=DataArrayDouble(10,1) ; x.iota() ; x.rearrange(2) ; x.setInfoOnComponents(["aa","bbb"])
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"])
52 pickled=pickle.dumps(x,pickle.HIGHEST_PROTOCOL)
53 xx=pickle.loads(pickled)
54 self.assertTrue(xx.isEqual(x,1e-16))
57 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
59 """ Test of a simple DataArrayInt."""
60 x=DataArrayInt(10) ; x.iota() ; x.rearrange(2) ; x.setInfoOnComponents(["aa","bbb"])
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"])
68 pickled=pickle.dumps(x,pickle.HIGHEST_PROTOCOL)
69 xx=pickle.loads(pickled)
70 self.assertTrue(xx.isEqual(x))
73 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
75 """ Test of a MEDCouplingUMesh pickeling."""
76 arr=DataArrayDouble(10) ; arr.iota()
77 m=MEDCouplingCMesh() ; m.setCoords(arr,arr,arr)
78 m=m.buildUnstructured()
80 m.getCoords().setInfoOnComponents(["aa","bbb","ddddd"])
81 m.checkConsistencyLight()
82 st=pickle.dumps(m,pickle.HIGHEST_PROTOCOL)
84 self.assertTrue(m2.isEqual(m,1e-16))
87 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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()
94 m.getCoords().setInfoOnComponents(["aa","bbb","ddddd"])
95 m.checkConsistencyLight()
97 a0,a1,a2=m.getTinySerializationInformation()
100 m2.unserialization(a0,a1,b0,b1,a2);
101 self.assertTrue(m2.isEqual(m,1e-16))
104 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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"])
111 m=MEDCouplingCMesh() ; m.setCoords(arrX,arrY,arrZ)
113 m.checkConsistencyLight()
114 st=pickle.dumps(m,pickle.HIGHEST_PROTOCOL)
116 self.assertTrue(m2.isEqual(m,1e-16))
117 self.assertTrue(m2.getCoordsAt(0).isEqual(arrX,1e-16))
120 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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)
129 self.assertTrue(m2.isEqual(m,1e-16))
132 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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)
142 self.assertTrue(m2.isEqual(m,1e-16))
145 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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
154 m=MEDCouplingCMesh() ; m.setCoords(arrX,arrY)
155 mesh2D=m.buildUnstructured() ; del m
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)
162 self.assertTrue(m2.isEqual(mesh,1e-16))
165 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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()
173 mesh=MEDCouplingCurveLinearMesh() ; mesh.setCoords(m.getCoords()) ; del m
174 mesh.setNodeGridStructure([10,5])
175 st=pickle.dumps(mesh,pickle.HIGHEST_PROTOCOL)
177 self.assertTrue(m2.isEqual(mesh,1e-16))
180 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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)
187 self.assertTrue(m2.isEqual(m,1e-16))
188 self.assertEqual(m2.getName(),m.getName())
191 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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)
200 b=a[:] ; b.iota(7000.)
201 f.setArray(DataArrayDouble.Meld(a,b))
202 f.getArray().setInfoOnComponents(["u1","vv2"])
203 f.checkConsistencyLight();
205 st=pickle.dumps(f,pickle.HIGHEST_PROTOCOL)
207 self.assertTrue(f2.isEqual(f,1e-16,1e-16))
208 self.assertTrue(f2.getMesh().isEqual(f.getMesh(),1e-16))
210 ft=MEDCouplingFieldTemplate(f)
211 ft2=pickle.loads(pickle.dumps(ft,pickle.HIGHEST_PROTOCOL))
212 self.assertTrue(ft2.isEqual(ft,1e-16))
215 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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 ]
230 m=MEDCouplingDataForTest.build2DTargetMesh_1();
231 f=MEDCouplingFieldDouble.New(ON_GAUSS_PT,NO_TIME);
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. ]
243 f.setGaussLocalizationOnType(NORM_QUAD4,_refCoo2,_gsCoo1,_wg1);
244 self.assertEqual(2,f.getNbOfGaussLocalization());
245 array=DataArrayDouble.New();
247 for i in range(18 * 2):
249 array.setValues(ptr,18,2);
250 ptr=array.getPointer();
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);
257 f.clearGaussLocalizations();
258 self.assertEqual(0,f.getNbOfGaussLocalization());
259 self.assertRaises(InterpKernelException,f.checkConsistencyLight);
261 self.assertRaises(InterpKernelException,f.setGaussLocalizationOnCells,ids1,_refCoo2,_gsCoo1,_wg1);
262 self.assertEqual(0,f.getNbOfGaussLocalization());
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);
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
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);
287 f.checkConsistencyLight();
289 st=pickle.dumps(f,pickle.HIGHEST_PROTOCOL)
291 self.assertTrue(f2.isEqual(f,1e-16,1e-16))
292 self.assertTrue(f2.getMesh().isEqual(f.getMesh(),1e-16))
294 ft=MEDCouplingFieldTemplate(f)
295 ft2=pickle.loads(pickle.dumps(ft,pickle.HIGHEST_PROTOCOL))
296 self.assertTrue(ft2.isEqual(ft,1e-16))
300 eStr="This is an exception."
301 e=InterpKernelException(eStr)
302 self.assertEqual(e.what(),eStr)
303 st=pickle.dumps(e,pickle.HIGHEST_PROTOCOL)
305 self.assertTrue(e is not e2)
306 self.assertTrue(isinstance(e2,InterpKernelException))
307 self.assertEqual(e2.what(),eStr)
310 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
312 """Pickelization of DataArrayBytes"""
313 x=DataArrayByte(256,1)
317 x.rearrange(2) ; x.setInfoOnComponents(["aa","bbb"])
319 st=pickle.dumps(x,pickle.HIGHEST_PROTOCOL)
321 self.assertTrue(x2.isEqual(x))
324 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
326 """Pickelization of DataArrayFloat"""
327 x=DataArrayFloat(256) ; x.iota()
328 x.rearrange(2) ; x.setInfoOnComponents(["aa","bbb"])
330 st = pickle.dumps(x, pickle.HIGHEST_PROTOCOL)
331 x2 = pickle.loads(st)
332 self.assertTrue(x2.isEqual(x,1e-7))
335 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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))
346 b=a[:] ; b.iota(7000)
347 f.setArray(DataArrayInt32.Meld(a,b))
348 f.getArray().setInfoOnComponents(["u1","vv2"])
349 f.checkConsistencyLight();
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))
357 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
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))
369 b=a[:] ; b.iota(7000.)
370 f.setArray(DataArrayFloat.Meld(a,b))
371 f.getArray().setInfoOnComponents(["u1","vv2"])
372 f.checkConsistencyLight();
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))
384 if __name__=="__main__":