]> SALOME platform Git repositories - tools/medcoupling.git/blob - src/MEDCoupling_Swig/MEDCouplingRemapperTest.py
Salome HOME
Remapper deals with 3D to 3DSurf in P1P1 using PointLocator intersection type.
[tools/medcoupling.git] / src / MEDCoupling_Swig / MEDCouplingRemapperTest.py
1 #  -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2016  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 from MEDCouplingDataForTest import MEDCouplingDataForTest
22 from MEDCouplingRemapper import *
23 from math import *
24 import unittest
25
26 class MEDCouplingBasicsTest(unittest.TestCase):
27     def testRemapper1(self):
28         sourceMesh=self.build2DSourceMesh_1();
29         targetMesh=self.build2DTargetMesh_1();
30         remapper=MEDCouplingRemapper()
31         remapper.setPrecision(1e-12);
32         remapper.setIntersectionType(Triangulation);
33         self.failUnless(remapper.prepare(sourceMesh,targetMesh,"P0P0")==1);
34         srcField=MEDCouplingFieldDouble.New(ON_CELLS);
35         srcField.setNature(IntensiveMaximum);
36         srcField.setMesh(sourceMesh);
37         array=DataArrayDouble.New();
38         ptr=sourceMesh.getNumberOfCells()*[None]
39         for i in xrange(sourceMesh.getNumberOfCells()):
40             ptr[i]=float(i+7)
41             pass
42         array.setValues(ptr,sourceMesh.getNumberOfCells(),1);
43         srcField.setArray(array);
44         srcField.setName("abc") ; srcField.setDescription("def")
45         srcField.setTime(7.7,9,10)
46         trgfield=remapper.transferField(srcField,4.57);
47         self.assertEqual("abc",trgfield.getName())
48         self.assertEqual("def",trgfield.getDescription())
49         a,b,c=trgfield.getTime()
50         self.assertAlmostEqual(7.7,a,14)
51         self.assertEqual(b,9)
52         self.assertEqual(c,10)
53         values=trgfield.getArray().getValues();
54         valuesExpected=[7.5 ,7. ,7.,8.,7.5];
55         for i in xrange(targetMesh.getNumberOfCells()):
56             self.failUnless(abs(values[i]-valuesExpected[i])<1e-12);
57             pass
58         self.failUnless(1==trgfield.getArray().getNumberOfComponents());
59         pass
60
61     def testPrepareEx1(self):
62         sourceMesh=self.build2DSourceMesh_1();
63         targetMesh=self.build2DTargetMesh_3();
64         #
65         remapper=MEDCouplingRemapper();
66         remapper.setPrecision(1e-12);
67         remapper.setIntersectionType(Triangulation);
68         srcFt=MEDCouplingFieldTemplate.New(ON_CELLS);
69         trgFt=MEDCouplingFieldTemplate.New(ON_CELLS);
70         srcFt.setMesh(sourceMesh);
71         trgFt.setMesh(targetMesh);
72         self.assertEqual(1,remapper.prepareEx(srcFt,trgFt));
73         srcField=MEDCouplingFieldDouble.New(ON_CELLS);
74         srcField.setNature(IntensiveMaximum);
75         srcField.setMesh(sourceMesh);
76         array=DataArrayDouble.New();
77         ptr=sourceMesh.getNumberOfCells()*[None]
78         for i in xrange(sourceMesh.getNumberOfCells()):
79             ptr[i]=float(i+7);
80             pass
81         array.setValues(ptr,sourceMesh.getNumberOfCells(),1);
82         srcField.setArray(array);
83         trgfield=remapper.transferField(srcField,4.220173);
84         values=trgfield.getArray().getValues();
85         valuesExpected=[7.75, 7.0625, 4.220173,8.0]
86         self.assertEqual(4,trgfield.getArray().getNumberOfTuples());
87         self.assertEqual(1,trgfield.getArray().getNumberOfComponents());
88         for i0 in xrange(4):
89             self.assertAlmostEqual(valuesExpected[i0],values[i0],12);
90             pass
91         pass
92
93     def testPartialTransfer1(self):
94         sourceMesh=self.build2DSourceMesh_1();
95         targetMesh=self.build2DTargetMesh_3();
96         #
97         remapper=MEDCouplingRemapper();
98         remapper.setPrecision(1e-12);
99         remapper.setIntersectionType(Triangulation);
100         srcFt=MEDCouplingFieldTemplate.New(ON_CELLS);
101         trgFt=MEDCouplingFieldTemplate.New(ON_CELLS);
102         srcFt.setMesh(sourceMesh);
103         trgFt.setMesh(targetMesh);
104         self.assertEqual(1,remapper.prepareEx(srcFt,trgFt));
105         srcField=MEDCouplingFieldDouble.New(ON_CELLS);
106         srcField.setNature(IntensiveMaximum);
107         srcField.setMesh(sourceMesh);
108         array=DataArrayDouble.New();
109         ptr=sourceMesh.getNumberOfCells()*[None]
110         for i in xrange(sourceMesh.getNumberOfCells()):
111             ptr[i]=float(i+7);
112             pass
113         array.setValues(ptr,sourceMesh.getNumberOfCells(),1);
114         srcField.setArray(array);
115         trgfield=MEDCouplingFieldDouble.New(ON_CELLS);
116         trgfield.setNature(IntensiveMaximum);
117         trgfield.setMesh(targetMesh);
118         array=DataArrayDouble.New();
119         ptr=targetMesh.getNumberOfCells()*[None]
120         for i in xrange(targetMesh.getNumberOfCells()):
121             ptr[i]=4.220173;
122             pass
123         array.setValues(ptr,targetMesh.getNumberOfCells(),1);
124         trgfield.setArray(array);
125         remapper.partialTransfer(srcField,trgfield);
126         values=trgfield.getArray().getValues();
127         valuesExpected=[7.75, 7.0625, 4.220173,8.0]
128         self.assertEqual(4,trgfield.getArray().getNumberOfTuples());
129         self.assertEqual(1,trgfield.getArray().getNumberOfComponents());
130         for i0 in xrange(4):
131             self.assertAlmostEqual(valuesExpected[i0],values[i0],12);
132             pass
133         pass
134
135     def testPrepareUC(self):
136         # 1D
137         coords=DataArrayDouble([0.,0.5,0.7])
138         src=MEDCouplingUMesh("",1) ; src.setCoords(coords)
139         src.allocateCells(2) ; src.insertNextCell(NORM_SEG2,[0,1]) ; src.insertNextCell(NORM_SEG2,[1,2]) ; src.finishInsertingCells()
140         trg=MEDCouplingCMesh() ; arr=DataArrayDouble([-0.7,-0.1,0.2,0.7,2.,2.3])
141         trg.setCoordsAt(0,arr)
142         fieldSrc=MEDCouplingFieldDouble(ON_CELLS,NO_TIME) ; fieldSrc.setMesh(src) ; arrSrc=DataArrayDouble([10.,30.])
143         fieldSrc.setNature(ExtensiveMaximum) ;  fieldSrc.setArray(arrSrc)
144         rem=MEDCouplingRemapper()
145         rem.prepare(src,trg,"P0P0")
146         trgField=rem.transferField(fieldSrc,-7.)
147         expected1=[-7.,4.,36.,-7.,-7.]
148         self.assertEqual(5,trgField.getArray().getNumberOfTuples())
149         self.assertEqual(5,len(expected1))
150         for i,val in enumerate(expected1):
151             self.assertAlmostEqual(expected1[i],trgField.getArray().getIJ(i,0),12);
152             pass
153         # 2D
154         coords=DataArrayDouble([0.,0.,0.,1.,1.,1.,1.,0.,0.5,-0.2],5,2)
155         src=MEDCouplingUMesh("",2) ; src.setCoords(coords)
156         src.allocateCells(2) ; src.insertNextCell(NORM_TRI3,[0,1,2]) ; src.insertNextCell(NORM_TRI3,[3,4,0]) ; src.finishInsertingCells()
157         trg=MEDCouplingCMesh() ; arr=DataArrayDouble([-0.7,-0.1,0.2,0.7,2.,2.3])
158         trg.setCoordsAt(0,arr) ; trg.setCoordsAt(1,arr)
159         fieldSrc=MEDCouplingFieldDouble(ON_CELLS,NO_TIME) ; fieldSrc.setMesh(src) ; arrSrc=DataArrayDouble([10.,30.])
160         fieldSrc.setNature(ExtensiveMaximum) ;  fieldSrc.setArray(arrSrc)
161         rem=MEDCouplingRemapper()
162         rem.prepare(src,trg,"P0P0")
163         trgField=rem.transferField(fieldSrc,-7.)
164         expected2=[-7.,-7.,7.35,0.15,-7.,-7.,2.8,14.85,5.25,-7.,-7.,2.,2.5,-7.,-7.,-7.,1.2,3.,0.9,-7.,-7.,-7.,-7.,-7.,-7.]
165         self.assertEqual(25,trgField.getArray().getNumberOfTuples())
166         self.assertEqual(25,len(expected2))
167         for i,val in enumerate(expected2):
168             self.assertAlmostEqual(expected2[i],trgField.getArray().getIJ(i,0),12);
169             pass
170         # 3D
171         coords=DataArrayDouble([0.,0.,0.,0.,1.,0.,1.,1.,0.,1.,0.,0.,0.5,-0.2,0.,0.1,0.8,1.,0.5,0.,1.],7,3)
172         src=MEDCouplingUMesh("",3) ; src.setCoords(coords)
173         src.allocateCells(2) ; src.insertNextCell(NORM_TETRA4,[0,1,2,5]) ; src.insertNextCell(NORM_TETRA4,[3,4,0,6]) ; src.finishInsertingCells()
174         trg=MEDCouplingCMesh() ; arr=DataArrayDouble([-0.7,-0.1,0.2,0.7,2.,2.3]) ; arr2=DataArrayDouble([-0.7,0.2,0.6,1.2,2.])
175         trg.setCoordsAt(0,arr) ; trg.setCoordsAt(1,arr) ; trg.setCoordsAt(2,arr2)
176         src.checkConsistency(1e-10)
177         trg.checkConsistencyLight()
178         fieldSrc=MEDCouplingFieldDouble(ON_CELLS,NO_TIME) ; fieldSrc.setMesh(src) ; arrSrc=DataArrayDouble([10.,30.])
179         fieldSrc.setNature(ExtensiveMaximum) ;  fieldSrc.setArray(arrSrc)
180         rem=MEDCouplingRemapper()
181         rem.prepare(src,trg,"P0P0")
182         trgField=rem.transferField(fieldSrc,-7.)
183         expected3=[-7.,-7.,2.925,0.015,-7.,-7.,0.9392,8.595,2.265,-7.,-7.,1.1008,1.1192,-7.,-7.,-7.,0.6392,1.6408,0.2808,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,0.81,-7.,-7.,-7.,0.1208,11.55,0.96,-7.,-7.,1.1752,0.6592,-7.,-7.,-7.,0.8512,1.7744,0.0192,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,1.92,-7.,-7.,-7.,0.12578571428571422,0.007314285714285673,-7.,-7.,-7.,0.3189253968253971,0.1879746031746033,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.,-7.]
184         self.assertEqual(100,trgField.getArray().getNumberOfTuples())
185         self.assertEqual(100,len(expected3))
186         for i,val in enumerate(expected3):
187             self.assertAlmostEqual(expected3[i],trgField.getArray().getIJ(i,0),12);
188             pass
189         pass
190
191     def testPrepareCU(self):
192         # 1D
193         coords=DataArrayDouble([0.,0.5,0.7])
194         trg=MEDCouplingUMesh("",1) ; trg.setCoords(coords)
195         trg.allocateCells(2) ; trg.insertNextCell(NORM_SEG2,[0,1]) ; trg.insertNextCell(NORM_SEG2,[1,2]) ; trg.finishInsertingCells()
196         src=MEDCouplingCMesh() ; arr=DataArrayDouble([-0.7,-0.1,0.2,0.7,2.,2.3])
197         src.setCoordsAt(0,arr)
198         fieldSrc=MEDCouplingFieldDouble(ON_CELLS,NO_TIME) ; fieldSrc.setMesh(src) ; arrTrg=DataArrayDouble([10.,30.,40.,70.,80.])
199         fieldSrc.setNature(ExtensiveMaximum) ;  fieldSrc.setArray(arrTrg)
200         rem=MEDCouplingRemapper()
201         rem.prepare(src,trg,"P0P0")
202         trgField=rem.transferField(fieldSrc,-7.)
203         expected1=[44.,16.]
204         self.assertEqual(2.,trgField.getArray().getNumberOfTuples())
205         self.assertEqual(2,len(expected1))
206         for i,val in enumerate(expected1):
207             self.assertAlmostEqual(expected1[i],trgField.getArray().getIJ(i,0),12);
208             pass
209         # 2D
210         coords=DataArrayDouble([0.,0.,0.,1.,1.,1.,1.,0.,0.5,-0.2],5,2)
211         trg=MEDCouplingUMesh("",2) ; trg.setCoords(coords)
212         trg.allocateCells(2) ; trg.insertNextCell(NORM_TRI3,[0,1,2]) ; trg.insertNextCell(NORM_TRI3,[3,4,0]) ; trg.finishInsertingCells()
213         src=MEDCouplingCMesh() ; arr=DataArrayDouble([-0.7,-0.1,0.2,0.7,2.,2.3])
214         src.setCoordsAt(0,arr) ; src.setCoordsAt(1,arr)
215         fieldSrc=MEDCouplingFieldDouble(ON_CELLS,NO_TIME) ; fieldSrc.setMesh(src) ; arrSrc=DataArrayDouble([10.,30.,40.,70.,80.,110.,130.,140.,170.,180.,210.,230.,240.,270.,280.,310.,330.,340.,370.,380.,410.,430.,440.,470.,480.])
216         fieldSrc.setNature(ExtensiveMaximum) ;  fieldSrc.setArray(arrSrc)
217         rem=MEDCouplingRemapper()
218         rem.prepare(src,trg,"P0P0")
219         trgField=rem.transferField(fieldSrc,-7.)
220         expected2=[441.3050624589086,68.69529914529915]
221         self.assertEqual(2,trgField.getArray().getNumberOfTuples())
222         self.assertEqual(2,len(expected2))
223         for i,val in enumerate(expected2):
224             self.assertAlmostEqual(expected2[i],trgField.getArray().getIJ(i,0),12);
225             pass
226         # 3D
227         coords=DataArrayDouble([0.,0.,0.,0.,1.,0.,1.,1.,0.,1.,0.,0.,0.5,-0.2,0.,0.1,0.8,1.,0.5,0.,1.],7,3)
228         trg=MEDCouplingUMesh("",3) ; trg.setCoords(coords)
229         trg.allocateCells(2) ; trg.insertNextCell(NORM_TETRA4,[0,1,2,5]) ; trg.insertNextCell(NORM_TETRA4,[3,4,0,6]) ; trg.finishInsertingCells()
230         src=MEDCouplingCMesh() ; arr=DataArrayDouble([-0.7,-0.1,0.2,0.7,2.,2.3]) ; arr2=DataArrayDouble([-0.7,0.2,0.6,1.2,2.])
231         src.setCoordsAt(0,arr) ; src.setCoordsAt(1,arr) ; src.setCoordsAt(2,arr2)
232         trg.checkConsistency(1e-10)
233         src.checkConsistencyLight()
234         fieldSrc=MEDCouplingFieldDouble(ON_CELLS,NO_TIME) ; fieldSrc.setMesh(src) ; arrSrc=DataArrayDouble(100) ; arrSrc.iota(7.7)
235         fieldSrc.setNature(ExtensiveMaximum) ;  fieldSrc.setArray(arrSrc)
236         rem=MEDCouplingRemapper()
237         rem.prepare(src,trg,"P0P0")
238         trgField=rem.transferField(fieldSrc,-7.)
239         expected3=[39.635196634558845,12.13422356758468]
240         self.assertEqual(2,trgField.getArray().getNumberOfTuples())
241         self.assertEqual(2,len(expected3))
242         for i,val in enumerate(expected3):
243             self.assertAlmostEqual(expected3[i],trgField.getArray().getIJ(i,0),12);
244             pass
245         pass
246
247     def testPrepareCC(self):
248         # 1D
249         src=MEDCouplingCMesh() ; arr=DataArrayDouble([-0.7,-0.1,0.2,0.7,2.,2.3])
250         src.setCoordsAt(0,arr)
251         trg=MEDCouplingCMesh() ; arr=DataArrayDouble([-0.9,-0.1,0.15])
252         trg.setCoordsAt(0,arr)
253         fieldSrc=MEDCouplingFieldDouble(ON_CELLS,NO_TIME) ; fieldSrc.setMesh(src) ; arrTrg=DataArrayDouble([10.,30.,40.,70.,80.])
254         fieldSrc.setNature(ExtensiveMaximum) ;  fieldSrc.setArray(arrTrg)
255         rem=MEDCouplingRemapper()
256         rem.prepare(src,trg,"P0P0")
257         trgField=rem.transferField(fieldSrc,-7.)
258         expected1=[10.,25.]
259         self.assertEqual(2.,trgField.getArray().getNumberOfTuples())
260         self.assertEqual(2,len(expected1))
261         for i,val in enumerate(expected1):
262             self.assertAlmostEqual(expected1[i],trgField.getArray().getIJ(i,0),12);
263             pass
264         # 2D
265         src=MEDCouplingCMesh() ; arr=DataArrayDouble([-0.7,-0.1,0.2,0.7,2.,2.3])
266         src.setCoordsAt(0,arr) ; src.setCoordsAt(1,arr)
267         trg=MEDCouplingCMesh() ; arr=DataArrayDouble([-0.9,-0.1,0.15])
268         trg.setCoordsAt(0,arr) ; trg.setCoordsAt(1,arr)
269         fieldSrc=MEDCouplingFieldDouble(ON_CELLS,NO_TIME) ; fieldSrc.setMesh(src) ; arrSrc=DataArrayDouble([10.,30.,40.,70.,80.,110.,130.,140.,170.,180.,210.,230.,240.,270.,280.,310.,330.,340.,370.,380.,410.,430.,440.,470.,480.])
270         fieldSrc.setNature(ExtensiveMaximum) ;  fieldSrc.setArray(arrSrc)
271         rem=MEDCouplingRemapper()
272         rem.prepare(src,trg,"P0P0")
273         trgField=rem.transferField(fieldSrc,-7.)
274         expected2=[10.,25.,91.66666666666666,90.27777777777777]
275         self.assertEqual(4,trgField.getArray().getNumberOfTuples())
276         self.assertEqual(4,len(expected2))
277         for i,val in enumerate(expected2):
278             self.assertAlmostEqual(expected2[i],trgField.getArray().getIJ(i,0),12);
279             pass
280         # 3D
281         src=MEDCouplingCMesh() ; arr=DataArrayDouble([-0.7,-0.1,0.2,0.7,2.,2.3])
282         src.setCoordsAt(0,arr) ; src.setCoordsAt(1,arr) ; src.setCoordsAt(2,arr)
283         trg=MEDCouplingCMesh() ; arr=DataArrayDouble([-0.9,-0.1,0.15])
284         trg.setCoordsAt(0,arr) ; trg.setCoordsAt(1,arr) ; trg.setCoordsAt(2,arr)
285         fieldSrc=MEDCouplingFieldDouble(ON_CELLS,NO_TIME) ; fieldSrc.setMesh(src) ; arrSrc=DataArrayDouble(125) ; arrSrc.iota(7.7)
286         fieldSrc.setNature(ExtensiveMaximum) ;  fieldSrc.setArray(arrSrc) ; fieldSrc.checkConsistencyLight()
287         rem=MEDCouplingRemapper()
288         rem.prepare(src,trg,"P0P0")
289         trgField=rem.transferField(fieldSrc,-7.)
290         expected3=[7.7, 7.249999999999999, 10.583333333333332, 9.513888888888886, 27.25, 23.40277777777777, 26.180555555555546, 22.39583333333333]
291         self.assertEqual(8,trgField.getArray().getNumberOfTuples())
292         self.assertEqual(8,len(expected3))
293         for i,val in enumerate(expected3):
294             self.assertAlmostEqual(expected3[i],trgField.getArray().getIJ(i,0),12);
295             pass
296         pass
297
298     # Bug when source mesh is not homogeneously oriented in source mesh
299     def testNonRegressionNonHomegenousOrriented3DCells(self):
300         csrc=DataArrayDouble([-0.15240000188350677,0,0,-0.1086929515004158,0,0,-0.15240000188350677,0.018142856657505035,0,-0.13054648041725159,0.0090714283287525177,0.019050000235438347,-0.13054648041725159,0.0090714283287525177,0],5,3)
301         src1=MEDCouplingUMesh("src",3) ; src1.allocateCells(0) ; src1.insertNextCell(NORM_TETRA4,[0,1,4,3]) ; src1.insertNextCell(NORM_TETRA4,[2,0,4,3])
302         src2=MEDCouplingUMesh("src",3) ; src2.allocateCells(0) ; src2.insertNextCell(NORM_TETRA4,[0,4,1,3]) ; src2.insertNextCell(NORM_TETRA4,[2,0,4,3])
303         src1.setCoords(csrc) ; src2.setCoords(csrc)
304         ctrg=DataArrayDouble([-0.15240000188350677,-0.038100000470876694,0,0.32379999756813049,-0.038100000470876694,0,-0.15240000188350677,0.076200000941753387,0,0.32379999756813049,0.076200000941753387,0,-0.15240000188350677,-0.038100000470876694,0.076200000941753387,0.32379999756813049,-0.038100000470876694,0.076200000941753387,-0.15240000188350677,0.076200000941753387,0.076200000941753387,0.32379999756813049,0.076200000941753387,0.076200000941753387],8,3)
305         trg=MEDCouplingUMesh("trg",3) ; trg.allocateCells(0) ; trg.insertNextCell(NORM_HEXA8,[0,1,3,2,4,5,7,6])
306         trg.setCoords(ctrg)
307         rem1=MEDCouplingRemapper() ; rem1.setSplittingPolicy(PLANAR_FACE_5) ; rem1.prepare(src1,trg,"P0P0")
308         rem2=MEDCouplingRemapper() ; rem2.setSplittingPolicy(PLANAR_FACE_5) ; rem2.prepare(src1,trg,"P0P0")
309         mat1=rem1.getCrudeMatrix() ; mat2=rem2.getCrudeMatrix()
310         self.assertEqual(1,len(mat1)) ; self.assertEqual(1,len(mat2))
311         self.assertEqual(mat1[0].keys(),mat2[0].keys()) ; self.assertEqual([0,1],mat1[0].keys())
312         self.assertAlmostEqual(1.25884108122e-06,mat1[0][0],16) ; self.assertAlmostEqual(1.25884108122e-06,mat2[0][0],16)
313         self.assertAlmostEqual(1.25884086663e-06,mat1[0][1],16) ; self.assertAlmostEqual(1.25884086663e-06,mat2[0][1],16)
314         #
315         d=DataArrayDouble([13.45,27.67],2,1)
316         f1=MEDCouplingFieldDouble(ON_CELLS,ONE_TIME) ; f1.setMesh(src1) ; f1.setArray(d) ; f1.setNature(IntensiveConservation)
317         f2=MEDCouplingFieldDouble(ON_CELLS,ONE_TIME) ; f2.setMesh(src2) ; f2.setArray(d) ; f2.setNature(IntensiveConservation)
318         f11=rem1.transferField(f1,1e300) ; f22=rem2.transferField(f2,1e300)
319         expected1=DataArrayDouble([0.012480539537637884])
320         self.assertTrue(f11.getArray().isEqual(expected1,1e-15))
321         self.assertTrue(f22.getArray().isEqual(expected1,1e-15))
322         #
323         f1.setNature(ExtensiveMaximum) ; f2.setNature(ExtensiveMaximum)
324         f11=rem1.transferField(f1,1e300) ; f22=rem2.transferField(f2,1e300)
325         #
326         expected2=DataArrayDouble([41.12])
327         self.assertTrue(f11.getArray().isEqual(expected2,1e-13))
328         self.assertTrue(f22.getArray().isEqual(expected2,1e-13))
329         pass
330
331     def testCellToNodeReverse3D(self):
332         c=DataArrayDouble([0.,1.,2.5])
333         cc=MEDCouplingCMesh()
334         cc.setCoords(c,c,c)
335         um=cc.buildUnstructured()
336         f=um.getMeasureField(False)
337         #
338         n2o=um.simplexize(PLANAR_FACE_5)
339         f.setArray(f.getArray()[n2o])
340         f.checkConsistencyLight()
341         f.setNature(IntensiveMaximum)
342         f.setTime(5.6,7,8)
343         f.setName("toto") ; f.setDescription("aDescription")
344         p=MEDCouplingRemapper()
345         p.setIntersectionType(Barycentric)
346         p.prepare(um,um,"P1P0")
347         fNode=p.reverseTransferField(f,1e300)
348         self.assertEqual("toto",fNode.getName())
349         self.assertEqual("aDescription",fNode.getDescription())
350         a,b,c=fNode.getTime()
351         self.assertAlmostEqual(5.6,a,14)
352         self.assertEqual(7,b) ; self.assertEqual(8,c)
353         #
354         integExpected=34.328125
355         self.assertAlmostEqual(fNode.integral(False)[0],integExpected,14)
356         self.assertAlmostEqual(f.integral(False)[0],integExpected,14)
357         pass
358
359     def testGauss2Gauss2DValidated(self):
360         srcFt=MEDCouplingDataForTest.buildFieldOnGauss_1()
361         trgFt=MEDCouplingDataForTest.buildFieldOnGauss_2()
362         src=MEDCouplingFieldDouble(srcFt)
363         self.assertEqual(srcFt.getMesh().getHiddenCppPointer(),src.getMesh().getHiddenCppPointer())
364         self.assertEqual(srcFt.getDiscretization().getHiddenCppPointer(),src.getDiscretization().getHiddenCppPointer())
365         #values given by ASTER usecase
366         src.setArray(DataArrayDouble([1.,1.,0.,0.,1.,1.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,0.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,0.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,0.,0.,0.,0.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,0.,0.,0.,0.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.]))
367         src.getArray().setInfoOnComponents(["DOMA"])
368         rem=MEDCouplingRemapper()
369         rem.setIntersectionType(PointLocator)
370         rem.prepareEx(srcFt,trgFt)
371         trg=rem.transferField(src,1e300)
372         self.assertEqual(trg.getMesh().getHiddenCppPointer(),trgFt.getMesh().getHiddenCppPointer())
373         self.assertEqual(trg.getDiscretization().getHiddenCppPointer(),trgFt.getDiscretization().getHiddenCppPointer())
374         #values given after interpolation in ASTER
375         arrExpected=DataArrayDouble([1.,1.,1.,0.,0.,0.,1.,1.,1.,1.,1.,0.,0.,0.,1.,1.,1.,1.,1.,0.,0.,0.,1.,1.,1.,1.,1.,0.,0.,0.,1.,1.,1.,1.,1.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,1.,1.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,1.,1.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,1.,1.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,1.,1.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,1.,1.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,1.,0.,0.,0.,0.,1.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,1.,0.,0.,0.,0.,1.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,1.,0.,0.,0.,0.,1.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,1.,0.,0.,0.,0.,1.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,1.,0.,0.,0.,0.,1.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,0.,0.,1.,0.,0.,1.,1.,0.,0.,1.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,0.,0.,1.,0.,0.,1.,1.,0.,0.,1.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,0.,0.,1.,0.,0.,1.,1.,0.,0.,1.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,0.,0.,1.,0.,0.,1.,1.,0.,0.,1.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,0.,0.,1.,0.,0.,1.,1.,0.,0.,1.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.]) ; arrExpected.setInfoOnComponents(["DOMA"])
376         self.assertTrue(trg.getArray().isEqual(arrExpected,1e-12))
377         #
378         # second part of the test : reverse source and target
379         #
380         rem.prepareEx(trgFt,srcFt)# sorry trgFt is in the place of source and srcFt in the place of target it is not a bug
381         trg=MEDCouplingFieldDouble(trgFt)
382         #values given after interpolation in ASTER
383         trg.setArray(DataArrayDouble([1.,1.,0.,0.,1.,0.,1.,1.,1.,1.,0.,0.,1.,0.,1.,1.,1.,1.,0.,0.,1.,0.,1.,1.,1.,1.,0.,0.,1.,0.,1.,1.,1.,1.,0.,0.,1.,0.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,1.,1.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,1.,1.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,1.,1.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,1.,1.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,1.,1.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,1.,0.,0.,0.,0.,1.,1.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,1.,0.,0.,0.,0.,1.,1.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,1.,0.,0.,0.,0.,1.,1.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,1.,0.,0.,0.,0.,1.,1.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,1.,0.,0.,0.,0.,1.,1.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,0.,0.,1.,0.,0.,1.,1.,0.,0.,1.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,0.,0.,1.,0.,0.,1.,1.,0.,0.,1.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,0.,0.,1.,0.,0.,1.,1.,0.,0.,1.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,0.,0.,1.,0.,0.,1.,1.,0.,0.,1.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,0.,0.,0.,1.,0.,0.,1.,1.,0.,0.,1.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.]))
384         trg.getArray().setInfoOnComponents(["DOMA"])
385         src=rem.transferField(trg,1e300)
386         #values given after interpolation in ASTER
387         arrExpected2=DataArrayDouble([1.,1.,0.,0.,1.,1.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,0.,0.,0.,0.,1.,1.,1., 1.,1.,1.,1.,1.,0.,0.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,0.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,0.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,0.,1.,1.,0.,1.,1.,1.,1.,0.,0.,0.,0.,1.,0.,0.,0.,1.,1.,1.,0.,1.,1.,1.,1.,1.,1.,0.,0.,1.,1.,0.,1.,1.,1.,0.,1.,0.,0.,0.,1.,0.,0.,0.,1.,1.,1.,0.,1.,1.,1.,1.,1.]) ; arrExpected2.setInfoOnComponents(["DOMA"])
388         # modification of values in ASTER due to modification of algorithm
389         # target PG 82 in target cell 32(C)/36 PG 1(C)/9 is in source cell 58(C)/120 source Gauss point 113 (1(C)/4). Values must be 1. and not 0.
390         arrExpected2.setIJ(82,0,1.)
391         self.assertTrue(src.getArray().isEqual(arrExpected2,1e-12))
392         pass
393
394     def testGauss2Gauss3DValidated(self):
395         srcFt=MEDCouplingDataForTest.buildFieldOnGauss_3()
396         trgFt=MEDCouplingDataForTest.buildFieldOnGauss_4()
397         src=MEDCouplingFieldDouble(srcFt)
398         self.assertEqual(srcFt.getMesh().getHiddenCppPointer(),src.getMesh().getHiddenCppPointer())
399         self.assertEqual(srcFt.getDiscretization().getHiddenCppPointer(),src.getDiscretization().getHiddenCppPointer())
400         #values given by ASTER usecase
401         src.setArray(DataArrayDouble([0.,1.,1.,1.,1.,1.,0.,0.,0.,0.,0.,0.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,0.,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,0.,0.,1.,1.,0.,0.]))
402         src.getArray().setInfoOnComponents(["DOMA"])
403         rem=MEDCouplingRemapper()
404         rem.setIntersectionType(PointLocator)
405         rem.prepareEx(srcFt,trgFt)
406         trg=rem.transferField(src,1e300)
407         self.assertEqual(trg.getMesh().getHiddenCppPointer(),trgFt.getMesh().getHiddenCppPointer())
408         self.assertEqual(trg.getDiscretization().getHiddenCppPointer(),trgFt.getDiscretization().getHiddenCppPointer())
409         #values given after interpolation in ASTER
410         arrExpected=DataArrayDouble([0.,1.,1.,1.,1.,1.,0.,0.,0.,0.,0.,0.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,1.,0.,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,0.,1.,1.,1.,0.,1.]) ; arrExpected.setInfoOnComponents(["DOMA"])
411         self.assertTrue(trg.getArray().isEqual(arrExpected,1e-12))
412         #
413         # second part of the test : reverse source and target
414         #
415         rem.prepareEx(trgFt,srcFt)# sorry trgFt is in the place of source and srcFt in the place of target it is not a bug
416         trg=MEDCouplingFieldDouble(trgFt)
417         #values given after interpolation in ASTER
418         trg.setArray(DataArrayDouble([0.,1.,1.,1.,1.,1.,0.,0.,0.,0.,0.,0.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,0.,1.,1.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.]))
419         trg.getArray().setInfoOnComponents(["DOMA"])
420         src=rem.transferField(trg,1e300)
421         #values given after interpolation in ASTER
422         arrExpected2=DataArrayDouble([0.,1.,1.,1.,1.,1.,0.,0.,0.,0.,0.,0.,0.,0.,0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.,1.,0.,1.,0.,1.,1.,1.,0.,1.,1.,1.,1.,0.,1.,1.,1.,0.,1.]) ; arrExpected2.setInfoOnComponents(["DOMA"])
423         self.assertTrue(src.getArray().isEqual(arrExpected2,1e-12))
424         pass
425
426     def testSwig2MixOfUMesh(self):
427         arr0=DataArrayDouble([0,1,1.5]) ; arr1=DataArrayDouble([0,1])
428         sc=MEDCouplingCMesh() ; sc.setCoords(arr0,arr1,arr1)
429         tc=sc.deepCopy() ; tc.translate([0.4,0.3,0.3])
430         # umesh-umesh
431         # 90 (umesh-1sgtumesh)
432         rem=MEDCouplingRemapper() ; rem.setIntersectionType(Triangulation)
433         s=sc.buildUnstructured() ; t=tc.build1SGTUnstructured()
434         self.assertTrue(isinstance(s,MEDCouplingUMesh))
435         self.assertTrue(isinstance(t,MEDCoupling1SGTUMesh))
436         rem.prepare(s,t,"P0P0")
437         mat=rem.getCrudeMatrix()
438         self.assertEqual(2,len(mat)) ; self.assertEqual(2,len(mat[0])) ; self.assertEqual(1,len(mat[1]))
439         self.assertAlmostEqual(0.294,mat[0][0],14) ; self.assertAlmostEqual(0.196,mat[0][1],14) ; self.assertAlmostEqual(0.049,mat[1][1],14)
440         del s,t
441         # 91 (umesh-1dgtumesh)
442         rem=MEDCouplingRemapper() ; rem.setIntersectionType(Triangulation)
443         s=sc.buildUnstructured() ; t=tc.buildUnstructured() ; t.convertAllToPoly() ; t=MEDCoupling1DGTUMesh(t)
444         self.assertTrue(isinstance(s,MEDCouplingUMesh))
445         self.assertTrue(isinstance(t,MEDCoupling1DGTUMesh))
446         rem.prepare(s,t,"P0P0")
447         mat=rem.getCrudeMatrix()
448         self.assertEqual(2,len(mat)) ; self.assertEqual(2,len(mat[0])) ; self.assertEqual(1,len(mat[1]))
449         self.assertAlmostEqual(0.294,mat[0][0],14) ; self.assertAlmostEqual(0.196,mat[0][1],14) ; self.assertAlmostEqual(0.049,mat[1][1],14)
450         del s,t
451         # 165 (1sgtumesh-umesh)
452         rem=MEDCouplingRemapper() ; rem.setIntersectionType(Triangulation)
453         s=sc.build1SGTUnstructured() ; t=tc.buildUnstructured()
454         self.assertTrue(isinstance(s,MEDCoupling1SGTUMesh))
455         self.assertTrue(isinstance(t,MEDCouplingUMesh))
456         rem.prepare(s,t,"P0P0")
457         mat=rem.getCrudeMatrix()
458         self.assertEqual(2,len(mat)) ; self.assertEqual(2,len(mat[0])) ; self.assertEqual(1,len(mat[1]))
459         self.assertAlmostEqual(0.294,mat[0][0],14) ; self.assertAlmostEqual(0.196,mat[0][1],14) ; self.assertAlmostEqual(0.049,mat[1][1],14)
460         del s,t
461         # 181 (1dgtumesh-umesh
462         rem=MEDCouplingRemapper() ; rem.setIntersectionType(Triangulation)
463         s=sc.buildUnstructured() ; s.convertAllToPoly() ; s=MEDCoupling1DGTUMesh(s) ; t=tc.buildUnstructured()
464         self.assertTrue(isinstance(s,MEDCoupling1DGTUMesh))
465         self.assertTrue(isinstance(t,MEDCouplingUMesh))
466         rem.prepare(s,t,"P0P0")
467         mat=rem.getCrudeMatrix()
468         self.assertEqual(2,len(mat)) ; self.assertEqual(2,len(mat[0])) ; self.assertEqual(1,len(mat[1]))
469         self.assertAlmostEqual(0.294,mat[0][0],14) ; self.assertAlmostEqual(0.196,mat[0][1],14) ; self.assertAlmostEqual(0.049,mat[1][1],14)
470         del s,t
471         # 170 (1sgtumesh-1sgtumesh)
472         rem=MEDCouplingRemapper() ; rem.setIntersectionType(Triangulation)
473         s=sc.build1SGTUnstructured() ; t=tc.build1SGTUnstructured()
474         self.assertTrue(isinstance(s,MEDCoupling1SGTUMesh))
475         self.assertTrue(isinstance(t,MEDCoupling1SGTUMesh))
476         rem.prepare(s,t,"P0P0")
477         mat=rem.getCrudeMatrix()
478         self.assertEqual(2,len(mat)) ; self.assertEqual(2,len(mat[0])) ; self.assertEqual(1,len(mat[1]))
479         self.assertAlmostEqual(0.294,mat[0][0],14) ; self.assertAlmostEqual(0.196,mat[0][1],14) ; self.assertAlmostEqual(0.049,mat[1][1],14)
480         del s,t
481         # 171 (1sgtumesh-1dgtumesh)
482         rem=MEDCouplingRemapper() ; rem.setIntersectionType(Triangulation)
483         s=sc.build1SGTUnstructured() ; t=tc.buildUnstructured() ; t.convertAllToPoly() ; t=MEDCoupling1DGTUMesh(t)
484         self.assertTrue(isinstance(s,MEDCoupling1SGTUMesh))
485         self.assertTrue(isinstance(t,MEDCoupling1DGTUMesh))
486         rem.prepare(s,t,"P0P0")
487         mat=rem.getCrudeMatrix()
488         self.assertEqual(2,len(mat)) ; self.assertEqual(2,len(mat[0])) ; self.assertEqual(1,len(mat[1]))
489         self.assertAlmostEqual(0.294,mat[0][0],14) ; self.assertAlmostEqual(0.196,mat[0][1],14) ; self.assertAlmostEqual(0.049,mat[1][1],14)
490         del s,t
491         # 186 (1dgtumesh-1sgtumesh)
492         rem=MEDCouplingRemapper() ; rem.setIntersectionType(Triangulation)
493         s=sc.buildUnstructured() ; s.convertAllToPoly() ; s=MEDCoupling1DGTUMesh(s) ; t=tc.build1SGTUnstructured()
494         self.assertTrue(isinstance(s,MEDCoupling1DGTUMesh))
495         self.assertTrue(isinstance(t,MEDCoupling1SGTUMesh))
496         rem.prepare(s,t,"P0P0")
497         mat=rem.getCrudeMatrix()
498         self.assertEqual(2,len(mat)) ; self.assertEqual(2,len(mat[0])) ; self.assertEqual(1,len(mat[1]))
499         self.assertAlmostEqual(0.294,mat[0][0],14) ; self.assertAlmostEqual(0.196,mat[0][1],14) ; self.assertAlmostEqual(0.049,mat[1][1],14)
500         del s,t
501         # 187 (1dgtumesh-1dgtumesh)
502         rem=MEDCouplingRemapper() ; rem.setIntersectionType(Triangulation)
503         s=sc.buildUnstructured() ; s.convertAllToPoly() ; s=MEDCoupling1DGTUMesh(s) ; t=tc.buildUnstructured() ; t.convertAllToPoly() ; t=MEDCoupling1DGTUMesh(t)
504         self.assertTrue(isinstance(s,MEDCoupling1DGTUMesh))
505         self.assertTrue(isinstance(t,MEDCoupling1DGTUMesh))
506         rem.prepare(s,t,"P0P0")
507         mat=rem.getCrudeMatrix()
508         self.assertEqual(2,len(mat)) ; self.assertEqual(2,len(mat[0])) ; self.assertEqual(1,len(mat[1]))
509         self.assertAlmostEqual(0.294,mat[0][0],14) ; self.assertAlmostEqual(0.196,mat[0][1],14) ; self.assertAlmostEqual(0.049,mat[1][1],14)
510         del s,t
511         # (umesh-cmesh)
512         # 167 (1sgtumesh-cmesh)
513         rem=MEDCouplingRemapper() ; rem.setIntersectionType(Triangulation)
514         s=sc.build1SGTUnstructured() ; t=tc.deepCopy()
515         self.assertTrue(isinstance(s,MEDCoupling1SGTUMesh))
516         self.assertTrue(isinstance(t,MEDCouplingCMesh))
517         rem.prepare(s,t,"P0P0")
518         mat=rem.getCrudeMatrix()
519         self.assertEqual(2,len(mat)) ; self.assertEqual(2,len(mat[0])) ; self.assertEqual(1,len(mat[1]))
520         self.assertAlmostEqual(0.294,mat[0][0],14) ; self.assertAlmostEqual(0.196,mat[0][1],14) ; self.assertAlmostEqual(0.049,mat[1][1],14)
521         del s,t
522         # 183 (1dgtumesh-cmesh)
523         #rem=MEDCouplingRemapper() ; rem.setIntersectionType(Triangulation)
524         #s=sc.buildUnstructured() ; s.convertAllToPoly() ; s=MEDCoupling1DGTUMesh(s) ; t=tc.deepCopy()
525         #self.assertTrue(isinstance(s,MEDCoupling1DGTUMesh))
526         #self.assertTrue(isinstance(t,MEDCouplingCMesh))
527         #rem.prepare(s,t,"P0P0")
528         #mat=rem.getCrudeMatrix()
529         #self.assertEqual(2,len(mat)) ; self.assertEqual(2,len(mat[0])) ; self.assertEqual(1,len(mat[1]))
530         #self.assertAlmostEqual(0.294,mat[0][0],14) ; self.assertAlmostEqual(0.196,mat[0][1],14) ; self.assertAlmostEqual(0.049,mat[1][1],14)
531         #del s,t
532         # (cmesh-umesh)
533         # 122 (cmesh-1sgtumesh)
534         rem=MEDCouplingRemapper() ; rem.setIntersectionType(Triangulation)
535         s=sc.deepCopy() ; t=tc.build1SGTUnstructured()
536         self.assertTrue(isinstance(s,MEDCouplingCMesh))
537         self.assertTrue(isinstance(t,MEDCoupling1SGTUMesh))
538         rem.prepare(s,t,"P0P0")
539         mat=rem.getCrudeMatrix()
540         self.assertEqual(2,len(mat)) ; self.assertEqual(2,len(mat[0])) ; self.assertEqual(1,len(mat[1]))
541         self.assertAlmostEqual(0.294,mat[0][0],14) ; self.assertAlmostEqual(0.196,mat[0][1],14) ; self.assertAlmostEqual(0.049,mat[1][1],14)
542         del s,t
543         # 123 (cmesh-1dgtumesh)
544         #rem=MEDCouplingRemapper() ; rem.setIntersectionType(Triangulation)
545         #s=sc.deepCopy() ; t=tc.buildUnstructured() ; t.convertAllToPoly() ; t=MEDCoupling1DGTUMesh(t)
546         #self.assertTrue(isinstance(s,MEDCouplingCMesh))
547         #self.assertTrue(isinstance(t,MEDCoupling1DGTUMesh))
548         #rem.prepare(s,t,"P0P0")
549         #mat=rem.getCrudeMatrix()
550         #self.assertEqual(2,len(mat)) ; self.assertEqual(2,len(mat[0])) ; self.assertEqual(1,len(mat[1]))
551         #self.assertAlmostEqual(0.294,mat[0][0],14) ; self.assertAlmostEqual(0.196,mat[0][1],14) ; self.assertAlmostEqual(0.049,mat[1][1],14)
552         #del s,t
553         pass
554
555     def testSwig2BarycentricP1P13D_1(self):
556         sCoo=DataArrayDouble([0.313,0.00218,6.90489,0.313,0.10692667,6.90489,0.313,0.10692667,6.96790167,0.313,0.00218,6.9773125,0.313,0.21167333,6.90489,0.313,0.21167333,6.95849083,0.313,0.31642,6.90489,0.313,0.31642,6.94908,0.313,0.09383333,7.04891667,0.313,0.00218,7.049735,0.313,0.18548667,7.04809833,0.313,0.27714,7.04728,0.313,0.05782667,7.133205,0.313,0.00218,7.1221575,0.313,0.11347333,7.1442525,0.313,0.16912,7.1553,0.313,0.02509333,7.19458,0.313,0.00218,7.19458,0.313,0.04800667,7.19458,0.313,0.07092,7.19458,0.31005609,0.00218,6.90460005,0.31005609,0.10692667,6.90460005,0.29776312,0.10692667,6.96640097,0.29592716,0.00218,6.97563097,0.31005609,0.21167333,6.90460005,0.29959908,0.21167333,6.95717096,0.31005609,0.31642,6.90460005,0.30143505,0.31642,6.94794095,0.28195788,0.09383333,7.04585928,0.28179823,0.00218,7.04666189,0.28211753,0.18548667,7.04505668,0.28227718,0.27714,7.04425407,0.26551404,0.05782667,7.12852804,0.2676693,0.00218,7.11769282,0.26335878,0.11347333,7.13936327,0.26120352,0.16912,7.15019849,0.25354037,0.02509333,7.18872374,0.25354037,0.00218,7.18872374,0.25354037,0.04800667,7.18872374,0.25354037,0.07092,7.18872374,0.30722531,0.00218,6.90374134,0.30722531,0.10692667,6.90374134,0.28311179,0.10692667,6.96195653,0.27951042,0.00218,6.97065101,0.30722531,0.21167333,6.90374134,0.28671316,0.21167333,6.95326205,0.30722531,0.31642,6.90374134,0.29031453,0.31642,6.94456758,0.25210869,0.09383333,7.03680463,0.25179553,0.00218,7.03756067,0.25242185,0.18548667,7.03604859,0.25273501,0.27714,7.03529255,0.21985294,0.05782667,7.1146769,0.22408063,0.00218,7.10447034,0.21562524,0.11347333,7.12488346,0.21139755,0.16912,7.13509002,0.19636574,0.02509333,7.17138,0.19636574,0.00218,7.17138,0.19636574,0.04800667,7.17138,0.19636574,0.07092,7.17138,0.30461645,0.00218,6.90234688,0.30461645,0.10692667,6.90234688,0.26960904,0.10692667,6.95473916,0.26438066,0.00218,6.96256398,0.30461645,0.21167333,6.90234688,0.27483742,0.21167333,6.94691434,0.30461645,0.31642,6.90234688,0.2800658,0.31642,6.93908952,0.22459952,0.09383333,7.02210067,0.22414487,0.00218,7.02278109,0.22505416,0.18548667,7.02142025,0.2255088,0.27714,7.02073983,0.17777143,0.05782667,7.09218386,0.18390909,0.00218,7.0829982,0.17163377,0.11347333,7.10136952,0.1654961,0.16912,7.11055518,0.1436733,0.02509333,7.14321531,0.1436733,0.00218,7.14321531,0.1436733,0.04800667,7.14321531,0.1436733,0.07092,7.14321531,0.30232976,0.00218,6.90047024,0.30232976,0.10692667,6.90047024,0.25777378,0.10692667,6.94502622,0.25111932,0.00218,6.95168068,0.30232976,0.21167333,6.90047024,0.26442825,0.21167333,6.93837175,0.30232976,0.31642,6.90047024,0.27108271,0.31642,6.93171729,0.20048753,0.09383333,7.00231247,0.19990888,0.00218,7.00289112,0.20106618,0.18548667,7.00173382,0.20164482,0.27714,7.00115518,0.14088667,0.05782667,7.06191333,0.14869844,0.00218,7.05410156,0.13307491,0.11347333,7.06972509,0.12526315,0.16912,7.07753685,0.097488,0.02509333,7.105312,0.097488,0.00218,7.105312,0.097488,0.04800667,7.105312,0.097488,0.07092,7.105312,0.30045312,0.00218,6.89818355,0.30045312,0.10692667,6.89818355,0.24806084,0.10692667,6.93319096,0.24023602,0.00218,6.93841934,0.30045312,0.21167333,6.89818355,0.25588566,0.21167333,6.92796258,0.30045312,0.31642,6.89818355,0.26371048,0.31642,6.9227342,0.18069933,0.09383333,6.97820048,0.18001891,0.00218,6.97865513,0.18137975,0.18548667,6.97774584,0.18206017,0.27714,6.9772912,0.11061614,0.05782667,7.02502857,0.1198018,0.00218,7.01889091,0.10143048,0.11347333,7.03116623,0.09224482,0.16912,7.0373039,0.05958469,0.02509333,7.0591267,0.05958469,0.00218,7.0591267,0.05958469,0.04800667,7.0591267,0.05958469,0.07092,7.0591267,0.29905866,0.00218,6.89557469,0.29905866,0.10692667,6.89557469,0.24084347,0.10692667,6.91968821,0.23214899,0.00218,6.92328958,0.29905866,0.21167333,6.89557469,0.24953795,0.21167333,6.91608684,0.29905866,0.31642,6.89557469,0.25823242,0.31642,6.91248547,0.16599537,0.09383333,6.95069131,0.16523933,0.00218,6.95100447,0.16675141,0.18548667,6.95037815,0.16750745,0.27714,6.95006499,0.0881231,0.05782667,6.98294706,0.09832966,0.00218,6.97871937,0.07791654,0.11347333,6.98717476,0.06770998,0.16912,6.99140245,0.03142,0.02509333,7.00643426,0.03142,0.00218,7.00643426,0.03142,0.04800667,7.00643426,0.03142,0.07092,7.00643426,0.29819995,0.00218,6.89274391,0.29819995,0.10692667,6.89274391,0.23639903,0.10692667,6.90503688,0.22716903,0.00218,6.90687284,0.29819995,0.21167333,6.89274391,0.24562904,0.21167333,6.90320092,0.29819995,0.31642,6.89274391,0.25485905,0.31642,6.90136495,0.15694072,0.09383333,6.92084212,0.15613811,0.00218,6.92100177,0.15774332,0.18548667,6.92068247,0.15854593,0.27714,6.92052282,0.07427196,0.05782667,6.93728596,0.08510718,0.00218,6.9351307,0.06343673,0.11347333,6.93944122,0.05260151,0.16912,6.94159648,0.01407626,0.02509333,6.94925963,0.01407626,0.00218,6.94925963,0.01407626,0.04800667,6.94925963,0.01407626,0.07092,6.94925963,0.29792818,0.00218,6.89054043,0.29792818,0.10692667,6.89054043,0.23499241,0.10692667,6.89363227,0.22559291,0.00218,6.89409403,0.29792818,0.21167333,6.89054043,0.24439191,0.21167333,6.8931705,0.29792818,0.31642,6.89054043,0.25379141,0.31642,6.89270873,0.154075,0.09383333,6.89760748,0.15325765,0.00218,6.89764764,0.15489234,0.18548667,6.89756733,0.15570969,0.27714,6.89752718,0.06988819,0.05782667,6.90174332,0.08092238,0.00218,6.90120124,0.058854,0.11347333,6.90228539,0.04781981,0.16912,6.90282747,0.00858712,0.02509333,6.90475485,0.00858712,0.00218,6.90475485,0.00858712,0.04800667,6.90475485,0.00858712,0.07092,6.90475485,0.29791,0.00218,6.820902,0.29791,0.10692667,6.820902,0.23489833,0.10692667,6.820902,0.2254875,0.00218,6.820902,0.29791,0.21167333,6.820902,0.24430917,0.21167333,6.820902,0.29791,0.31642,6.820902,0.25372,0.31642,6.820902,0.15388333,0.09383333,6.820902,0.153065,0.00218,6.820902,0.15470167,0.18548667,6.820902,0.15552,0.27714,6.820902,0.069595,0.05782667,6.820902,0.0806425,0.00218,6.820902,0.0585475,0.11347333,6.820902,0.0475,0.16912,6.820902,0.00822,0.02509333,6.820902,0.00822,0.00218,6.820902,0.00822,0.04800667,6.820902,0.00822,0.07092,6.820902],200,3)
557         sConn=DataArrayInt([0,1,2,3,20,21,22,23,1,4,5,2,21,24,25,22,4,6,7,5,24,26,27,25,3,2,8,9,23,22,28,29,2,5,10,8,22,25,30,28,5,7,11,10,25,27,31,30,9,8,12,13,29,28,32,33,8,10,14,12,28,30,34,32,10,11,15,14,30,31,35,34,13,12,16,17,33,32,36,37,12,14,18,16,32,34,38,36,14,15,19,18,34,35,39,38,20,21,22,23,40,41,42,43,21,24,25,22,41,44,45,42,24,26,27,25,44,46,47,45,23,22,28,29,43,42,48,49,22,25,30,28,42,45,50,48,25,27,31,30,45,47,51,50,29,28,32,33,49,48,52,53,28,30,34,32,48,50,54,52,30,31,35,34,50,51,55,54,33,32,36,37,53,52,56,57,32,34,38,36,52,54,58,56,34,35,39,38,54,55,59,58,40,41,42,43,60,61,62,63,41,44,45,42,61,64,65,62,44,46,47,45,64,66,67,65,43,42,48,49,63,62,68,69,42,45,50,48,62,65,70,68,45,47,51,50,65,67,71,70,49,48,52,53,69,68,72,73,48,50,54,52,68,70,74,72,50,51,55,54,70,71,75,74,53,52,56,57,73,72,76,77,52,54,58,56,72,74,78,76,54,55,59,58,74,75,79,78,60,61,62,63,80,81,82,83,61,64,65,62,81,84,85,82,64,66,67,65,84,86,87,85,63,62,68,69,83,82,88,89,62,65,70,68,82,85,90,88,65,67,71,70,85,87,91,90,69,68,72,73,89,88,92,93,68,70,74,72,88,90,94,92,70,71,75,74,90,91,95,94,73,72,76,77,93,92,96,97,72,74,78,76,92,94,98,96,74,75,79,78,94,95,99,98,80,81,82,83,100,101,102,103,81,84,85,82,101,104,105,102,84,86,87,85,104,106,107,105,83,82,88,89,103,102,108,109,82,85,90,88,102,105,110,108,85,87,91,90,105,107,111,110,89,88,92,93,109,108,112,113,88,90,94,92,108,110,114,112,90,91,95,94,110,111,115,114,93,92,96,97,113,112,116,117,92,94,98,96,112,114,118,116,94,95,99,98,114,115,119,118,100,101,102,103,120,121,122,123,101,104,105,102,121,124,125,122,104,106,107,105,124,126,127,125,103,102,108,109,123,122,128,129,102,105,110,108,122,125,130,128,105,107,111,110,125,127,131,130,109,108,112,113,129,128,132,133,108,110,114,112,128,130,134,132,110,111,115,114,130,131,135,134,113,112,116,117,133,132,136,137,112,114,118,116,132,134,138,136,114,115,119,118,134,135,139,138,120,121,122,123,140,141,142,143,121,124,125,122,141,144,145,142,124,126,127,125,144,146,147,145,123,122,128,129,143,142,148,149,122,125,130,128,142,145,150,148,125,127,131,130,145,147,151,150,129,128,132,133,149,148,152,153,128,130,134,132,148,150,154,152,130,131,135,134,150,151,155,154,133,132,136,137,153,152,156,157,132,134,138,136,152,154,158,156,134,135,139,138,154,155,159,158,140,141,142,143,160,161,162,163,141,144,145,142,161,164,165,162,144,146,147,145,164,166,167,165,143,142,148,149,163,162,168,169,142,145,150,148,162,165,170,168,145,147,151,150,165,167,171,170,149,148,152,153,169,168,172,173,148,150,154,152,168,170,174,172,150,151,155,154,170,171,175,174,153,152,156,157,173,172,176,177,152,154,158,156,172,174,178,176,154,155,159,158,174,175,179,178,160,161,162,163,180,181,182,183,161,164,165,162,181,184,185,182,164,166,167,165,184,186,187,185,163,162,168,169,183,182,188,189,162,165,170,168,182,185,190,188,165,167,171,170,185,187,191,190,169,168,172,173,189,188,192,193,168,170,174,172,188,190,194,192,170,171,175,174,190,191,195,194,173,172,176,177,193,192,196,197,172,174,178,176,192,194,198,196,174,175,179,178,194,195,199,198])
558         s=MEDCoupling1SGTUMesh("source",NORM_HEXA8) ; s.setCoords(sCoo)
559         s.setNodalConnectivity(sConn)
560         #
561         tCoo=DataArrayDouble([0.328,0.012,6.8598,0.328,0.168320184237353,6.8598,0.328,0.324640368474706,6.8598,0.328,0.0,6.8598,0.298,0.012,6.8598,0.1565,0.012,6.8598,0.180205346493166,0.144794653506834,6.8598,0.298,0.168320184237353,6.8598,0.0,0.012,6.8598,0.0916755774886107,0.233324422511389,6.8598,0.298,0.324640368474706,6.8598,0.298,0.0,6.8598,0.1565,0.0,6.8598,0.0,0.0,6.8598,0.328,0.012,7.2298,0.328,0.168320184237353,7.2298,0.328,0.324640368474706,7.2298,0.328,0.0,7.2298,0.298,0.012,7.2298,0.1565,0.012,7.2298,0.180205346493166,0.144794653506834,7.2298,0.298,0.168320184237353,7.2298,0.0,0.012,7.2298,0.0916755774886107,0.233324422511389,7.2298,0.298,0.324640368474706,7.2298,0.298,0.0,7.2298,0.1565,0.0,7.2298,0.0,0.0,7.2298],28,3)
562         tConn=DataArrayInt([4,5,6,7,18,19,20,21,5,8,9,6,19,22,23,20,6,9,10,7,20,23,24,21,11,12,5,4,25,26,19,18,12,13,8,5,26,27,22,19,3,11,4,0,17,25,18,14,0,4,7,1,14,18,21,15,1,7,10,2,15,21,24,16])
563         t=MEDCoupling1SGTUMesh("target",NORM_HEXA8) ; t.setCoords(tCoo)
564         t.setNodalConnectivity(tConn)
565         #
566         s.simplexize(PLANAR_FACE_5)
567         aRemapper=MEDCouplingRemapper()
568         aRemapper.setPrecision(1e-12)
569         aRemapper.setIntersectionType(Barycentric)
570         self.assertEqual(aRemapper.prepare(s,t,'P1P1'),1)
571         m=aRemapper.getCrudeMatrix()
572         self.assertEqual(len(m),28)
573         for i in xrange(28):
574             if i not in [5,6]:
575                 self.assertEqual(len(m[i]),0)
576                 pass
577             pass
578         self.assertEqual(len(m[5]),4)
579         self.assertEqual(len(m[6]),4)
580         self.assertAlmostEqual(0.10714286103952797,m[5][168],12)
581         self.assertAlmostEqual(0.35691534416938014,m[5][169],12)
582         self.assertAlmostEqual(0.04492099619713096,m[5][163],12)
583         self.assertAlmostEqual(0.49102079859396097,m[5][189],12)
584         self.assertAlmostEqual(0.14039089397104254,m[6][185],12)
585         self.assertAlmostEqual(0.16362822318261033,m[6][162],12)
586         self.assertAlmostEqual(0.3438363717836785 ,m[6][188],12)
587         self.assertAlmostEqual(0.3521445110626687 ,m[6][170],12)
588         pass
589
590     def testSwig2MappedBarycentricP1P12D_1(self):
591         """ Testing mapped barycentric P1P1 projection
592         (uses analytical mapping from square to arbitrary convex quadrangle)
593         """
594         n = 5
595         sCoo = DataArrayDouble(n,1)
596         sCoo.iota(0.0);     sCoo /= float(n-1)
597         m = MEDCouplingCMesh("target")
598         m.setCoordsAt(0, sCoo)
599         m.setCoordsAt(1, sCoo)
600         tgt = m.buildUnstructured()
601         coo = tgt.getCoords()
602         orig = coo.deepCopy();   orig[:,0] = 10.0; orig[:,1] = 15.0
603         pt_a = coo.deepCopy();   pt_a[:,0] = -0.3; pt_a[:,1] = 1.0
604         pt_b = coo.deepCopy();   pt_b[:,0] = 2.0;  pt_b[:,1] = 3.0
605         pt_c = coo.deepCopy();   pt_c[:,0] = 1.0;  pt_c[:,1] = 0.0
606         # P = x*C+y*A + xy(B-A-C) + ORIGIN
607         coo2 = coo[:,0]*pt_c + coo[:, 1]*pt_a + coo[:, 0]*coo[:, 1]*(pt_b - pt_a - pt_c) + orig
608
609         tgt.setCoords(coo2)
610
611         sCoo = DataArrayDouble([0.0,0.0,  -0.3,1.0,  2.0,3.0,  1.0,0.0],4,2)
612         sCoo[:,0] += 10.0;  sCoo[:,1] += 15.0;
613         sConn = DataArrayInt([0,1,2,3])
614         s = MEDCoupling1SGTUMesh("source",NORM_QUAD4) ; s.setCoords(sCoo)
615         s.setNodalConnectivity(sConn)
616         #
617         aRemapper=MEDCouplingRemapper()
618         aRemapper.setPrecision(1e-12)
619         aRemapper.setIntersectionType(MappedBarycentric)
620         self.assertEqual(aRemapper.prepare(s,tgt,'P1P1'),1)
621         srcField = MEDCouplingFieldDouble(ON_NODES, ONE_TIME)
622         srcField.setNature(IntensiveMaximum)
623         srcField.setMesh(s); srcField.setName("field")
624         srcField.setArray(DataArrayDouble([1.0,2.0,3.0,4.0]))
625         tgtF = aRemapper.transferField(srcField, 1e+300)
626         ref = [1.0, 1.75, 2.5, 3.25, 4.0, 1.25, 1.875, 2.5, 3.125, 3.75, 1.5, 2.0, 2.5, 3.0, 3.5, 1.75,
627          2.125, 2.5, 2.875, 3.25, 2.0, 2.25, 2.5, 2.75, 3.0]
628         val = tgtF.getArray().getValues()
629         for i, ref_v in enumerate(ref):
630             self.assertAlmostEqual(ref_v, val[i])
631         pass
632
633     def testSwig2MappedBarycentricP1P13_1(self):
634         """ Testing mapped barycentric P1P1 projection in 3D (uses orthogonal distances to 
635         HEXA8 faces).
636         Convention:
637               0 ------ 3
638              /|       /|
639             / |      / |
640            1 ------ 2  |
641            |  |     |  |
642            |  |     |  |
643            |  4-----|- 7
644            | /      | /
645            5 ------ 6
646         """
647         n = 5
648         sCoo = DataArrayDouble(n,1)
649         sCoo.iota(0.0)
650         sCoo /= float(n-1)
651         m = MEDCouplingCMesh("target")
652         m.setCoordsAt(0, sCoo)
653         m.setCoordsAt(1, sCoo)
654         m.setCoordsAt(2, sCoo)
655         tgt = m.buildUnstructured()
656         coo = tgt.getCoords()
657         pt_0 = coo.deepCopy(); pt_0[:,0] = -0.3; pt_0[:,1] = 1.0; pt_0[:,2] = 1.0
658         pt_1 = coo.deepCopy(); pt_1[:,0] = 0.0; pt_1[:,1] = 0.0; pt_1[:,2] = 1.0
659         pt_2 = coo.deepCopy(); pt_2[:,0] = 1.0; pt_2[:,1] = 0.0; pt_2[:,2] = 1.0
660         pt_3 = coo.deepCopy(); pt_3[:,0] = 2.0; pt_3[:,1] = 3.0; pt_3[:,2] = 1.0
661
662         pt_4 = coo.deepCopy(); pt_4[:,0] = -0.3; pt_4[:,1] = 1.0; pt_4[:,2] = 0.0
663         orig = coo.deepCopy(); orig[:,0] = 10.0; orig[:,1] = 15.0; orig[:,2] = 20.0
664         pt_6 = coo.deepCopy(); pt_6[:,0] = 1.0; pt_6[:,1] = 0.0; pt_6[:,2] = 0.0
665         pt_7 = coo.deepCopy(); pt_7[:,0] = 2.0; pt_7[:,1] = 3.0; pt_7[:,2] = 0.0
666         # P = x*p6 + y*p4 + z*p1 + xy*(p7-p6-p4) + xz*(p2-p1-p6) + yz*(p0-p4-p1) + xyz(p3-p7-p2-p0+p1+p6+p4)
667         x,y,z = coo[:,0],coo[:,1],coo[:,2]
668         coo2 = x*pt_6 + y*pt_4 + z*pt_1 + \
669                x*y*(pt_7 - pt_6 - pt_4) + x*z*(pt_2 - pt_1 - pt_6) + y*z*(pt_0 - pt_4 - pt_1) + \
670                x*y*z*(pt_3 - pt_7 - pt_2 - pt_0 + pt_6 + pt_1 + pt_4) + orig
671         tgt.setCoords(coo2)
672
673         sCoo = DataArrayDouble([-0.3,1.0,1.0,  0.0,0.0,1.0,  1.0,0.0,1.0,  2.0,3.0,1.0,
674                                 -0.3,1.0,0.0,  0.0,0.0,0.0,  1.0,0.0,0.0,  2.0,3.0,0.0,],8,3)
675         sCoo[:, 0] += 10.0; sCoo[:, 1] += 15.0; sCoo[:, 2] += 20.0;
676         sConn = DataArrayInt([0,1,2,3,4, 5,6,7])
677         s = MEDCoupling1SGTUMesh("source",NORM_HEXA8) ; s.setCoords(sCoo)
678         s.setNodalConnectivity(sConn)
679         #
680         aRemapper=MEDCouplingRemapper()
681         aRemapper.setPrecision(1e-12)
682         aRemapper.setIntersectionType(MappedBarycentric)
683         self.assertEqual(aRemapper.prepare(s,tgt,'P1P1'),1)
684         srcField = MEDCouplingFieldDouble(ON_NODES, ONE_TIME)
685         srcField.setNature(IntensiveMaximum)
686         srcField.setMesh(s); srcField.setName("field")
687         srcField.setArray(DataArrayDouble([1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]))
688         tgtF = aRemapper.transferField(srcField, 1e+300)
689 #        print tgtF.getArray().getValues()
690         ref = [6.0, 6.251802698104413, 6.502397834044702, 6.7517940736426665, 7.0, 5.740554726834594,
691                6.1761835575796935, 6.6052985689637564, 7.009392769824465, 7.383488834310164,
692                5.487562931129931, 6.140664596972973, 6.720290674177548, 7.220534970454015, 7.651092836860121,
693                5.2407867837524345, 6.125759809889516, 6.82853486793175, 7.390880823876876, 7.848445254819061,
694                5.0, 6.12211344611157, 6.925740671133115, 7.529623182840827, 8.0, 5.0, 5.251802698104413,
695                5.502397834044702, 5.751794073642667, 6.0, 4.740554726834594, 5.1761835575796935,
696                5.6052985689637564, 6.009392769824465, 6.383488834310163, 4.487562931129931, 5.140664596972973,
697                 5.720290674177548, 6.220534970454015, 6.651092836860121, 4.2407867837524345, 5.125759809889516,
698                 5.828534867931749, 6.390880823876876, 6.848445254819061, 4.0, 5.122113446111569, 5.925740671133115,
699                 6.529623182840827, 7.0, 4.0, 4.251802698104413, 4.502397834044702, 4.751794073642667, 5.0, 3.740554726834594,
700                 4.176183557579693, 4.6052985689637564, 5.009392769824464, 5.383488834310164, 3.487562931129931,
701                 4.140664596972973, 4.720290674177548, 5.220534970454015, 5.651092836860121, 3.240786783752434, 4.125759809889516, 4.82853486793175,
702                 5.390880823876876, 5.848445254819061, 3.0, 4.122113446111569, 4.925740671133115, 5.529623182840827, 6.0, 3.0,
703                 3.2518026981044135, 3.502397834044702, 3.7517940736426674, 4.0, 2.7405547268345933, 3.176183557579693,
704                 3.6052985689637564, 4.009392769824465, 4.383488834310164, 2.487562931129931, 3.140664596972973, 3.7202906741775474, 4.220534970454015, 4.65109283686012, 2.2407867837524345, 3.1257598098895154, 3.828534867931749,
705                 4.390880823876876, 4.848445254819061, 2.0, 3.1221134461115687, 3.9257406711331146, 4.529623182840826, 5.0, 2.0, 2.2518026981044135, 2.502397834044702, 2.7517940736426674, 3.0, 1.7405547268345936, 2.176183557579693, 2.6052985689637564,
706                 3.0093927698244642, 3.3834888343101635, 1.4875629311299305, 2.1406645969729734, 2.720290674177548,
707                 3.2205349704540143, 3.6510928368601205, 1.2407867837524345, 2.125759809889516, 2.8285348679317495, 3.390880823876876, 3.848445254819061, 1.0, 2.1221134461115687, 2.9257406711331146, 3.529623182840827, 4.0]
708
709         val = tgtF.getArray().getValues()
710         for i, ref_v in enumerate(ref):
711             self.assertAlmostEqual(ref_v, val[i])
712         pass
713
714     @unittest.skipUnless(MEDCouplingHasNumPyBindings() and MEDCouplingHasSciPyBindings(),"requires numpy AND scipy")
715     def testGetCrudeCSRMatrix1(self):
716         """ testing CSR matrix output using numpy/scipy.
717         """
718         from scipy.sparse import spdiags #diags
719         import scipy
720         from numpy import array
721         arr=DataArrayDouble(3) ; arr.iota()
722         m=MEDCouplingCMesh() ; m.setCoords(arr,arr)
723         src=m.buildUnstructured()
724         trg=src.deepCopy() ; trg=trg[[0,1,3]]
725         trg.getCoords()[:]*=0.5 ; trg.getCoords()[:]+=[0.3,0.25]
726         # Let's interpolate.
727         rem=MEDCouplingRemapper()
728         rem.prepare(src,trg,"P0P0")
729         # Internal crude sparse matrix computed. Let's manipulate it using CSR matrix in scipy.
730         for i in xrange(10):
731             m=rem.getCrudeCSRMatrix()
732             pass
733         m2=rem.getCrudeCSRMatrix()
734         diff=m-m2
735         self.assertTrue(isinstance(m,scipy.sparse.csr.csr_matrix))
736         self.assertEqual(m.getnnz(),7)
737         self.assertAlmostEqual(m[0,0],0.25,12)
738         self.assertAlmostEqual(m[1,0],0.1,12)
739         self.assertAlmostEqual(m[1,1],0.15,12)
740         self.assertAlmostEqual(m[2,0],0.05,12)
741         self.assertAlmostEqual(m[2,1],0.075,12)
742         self.assertAlmostEqual(m[2,2],0.05,12)
743         self.assertAlmostEqual(m[2,3],0.075,12)
744         self.assertEqual(diff.getnnz(),0)
745         # ExtensiveConservation (division by sum of cols)
746         colSum=m.sum(axis=0)
747         # version 0.12.0 # m_0=m*diags(array(1/colSum),[0])
748         m_0=m*spdiags(array(1/colSum),[0],colSum.shape[1],colSum.shape[1])
749         del colSum
750         self.assertAlmostEqual(m_0[0,0],0.625,12)
751         self.assertAlmostEqual(m_0[1,0],0.25,12)
752         self.assertAlmostEqual(m_0[1,1],0.6666666666666667,12)
753         self.assertAlmostEqual(m_0[2,0],0.125,12)
754         self.assertAlmostEqual(m_0[2,1],0.3333333333333333,12)
755         self.assertAlmostEqual(m_0[2,2],1.,12)
756         self.assertAlmostEqual(m_0[2,3],1.,12)
757         self.assertEqual(m_0.getnnz(),7)
758         # IntensiveMaximum (division by sum of rows)
759         rowSum=m.sum(axis=1)
760         # version 0.12.0 # m_1=diags(array(1/rowSum.transpose()),[0])*m
761         m_1=spdiags(array(1/rowSum.transpose()),[0],rowSum.shape[0],rowSum.shape[0])*m
762         del rowSum
763         self.assertAlmostEqual(m_1[0,0],1.,12)
764         self.assertAlmostEqual(m_1[1,0],0.4,12)
765         self.assertAlmostEqual(m_1[1,1],0.6,12)
766         self.assertAlmostEqual(m_1[2,0],0.2,12)
767         self.assertAlmostEqual(m_1[2,1],0.3,12)
768         self.assertAlmostEqual(m_1[2,2],0.2,12)
769         self.assertAlmostEqual(m_1[2,3],0.3,12)
770         self.assertEqual(m_1.getnnz(),7)
771         pass
772
773     @unittest.skipUnless(MEDCouplingHasNumPyBindings() and MEDCouplingHasSciPyBindings(),"requires numpy AND scipy")
774     def testP0P1Bary_1(self):
775         a=MEDCouplingUMesh("a",2)
776         a.allocateCells()
777         conna=[0,1,3,2,1,4,5,3,4,6,7,5,6,8,9,7,8,10,11,9,10,12,13,11,12,14,15,13,14,16,17,15,16,18,19,17,18,20,21,19,20,22,23,21,22,24,25,23,24,26,27,25]
778         a.setCoords(DataArrayDouble([1.54,0,-0.01,1.54,0.02,-0.01,1.54,0,0.01,1.54,0.02,0.01,1.54,0.04,-0.01,1.54,0.04,0.01,1.54,0.06,-0.01,1.54,0.06,0.01,1.54,0.08,-0.01,1.54,0.08,0.01,1.54,0.1,-0.01,1.54,0.1,0.01,1.54,0.12,-0.01,1.54,0.12,0.01,1.54,0.14,-0.01,1.54,0.14,0.01,1.54,0.16,-0.01,1.54,0.16,0.01,1.54,0.18,-0.01,1.54,0.18,0.01,1.54,0.2,-0.01,1.54,0.2,0.01,1.54,0.22,-0.01,1.54,0.22,0.01,1.54,0.24,-0.01,1.54,0.24,0.01,1.54,0.26,-0.01,1.54,0.26,0.01],28,3))
779         for i in xrange(13):
780             a.insertNextCell(NORM_QUAD4,conna[4*i:4*(i+1)])
781             pass
782         a.finishInsertingCells() ; a.simplexize(0)
783         #
784         connb=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,0,2,39,3,5,40,6,8,41,9,11,42,12,14,43,15,17,44,18,20,45,21,23,46,24,26,47,27,29,48,30,32,49,33,35,50,36,38,51,52,2,39,53,5,40,54,8,41,55,11,42,56,14,43,57,17,44,58,20,45,59,23,46,60,26,47,61,29,48,62,32,49,63,35,50,64,38,51,52,2,65,53,5,66,54,8,67,55,11,68,56,14,69,57,17,70,58,20,71,59,23,72,60,26,73,61,29,74,62,32,75,63,35,76,64,38,77,53,2,65,54,5,66,55,8,67,56,11,68,57,14,69,58,17,70,59,20,71,60,23,72,61,26,73,62,29,74,63,32,75,64,35,76,78,38,77,53,2,40,54,5,41,55,8,42,56,11,43,57,14,44,58,17,45,59,20,46,60,23,47,61,26,48,62,29,49,63,32,50,64,35,51,78,38,79,3,2,40,6,5,41,9,8,42,12,11,43,15,14,44,18,17,45,21,20,46,24,23,47,27,26,48,30,29,49,33,32,50,36,35,51,80,38,79,3,2,1,6,5,4,9,8,7,12,11,10,15,14,13,18,17,16,21,20,19,24,23,22,27,26,25,30,29,28,33,32,31,36,35,34,80,38,37]
785         b=MEDCouplingUMesh("b",2)
786         b.allocateCells()
787         for i in xrange(104):
788             b.insertNextCell(NORM_TRI3,connb[3*i:3*(i+1)])
789             pass
790         b.setCoords(DataArrayDouble([1.54,0,-0.01,1.54,0.01,-0.01,1.54,0.01,0,1.54,0.02,-0.01,1.54,0.03,-0.01,1.54,0.03,0,1.54,0.04,-0.01,1.54,0.05,-0.01,1.54,0.05,0,1.54,0.06,-0.01,1.54,0.07,-0.01,1.54,0.07,0,1.54,0.08,-0.01,1.54,0.09,-0.01,1.54,0.09,0,1.54,0.1,-0.01,1.54,0.11,-0.01,1.54,0.11,0,1.54,0.12,-0.01,1.54,0.13,-0.01,1.54,0.13,0,1.54,0.14,-0.01,1.54,0.15,-0.01,1.54,0.15,0,1.54,0.16,-0.01,1.54,0.17,-0.01,1.54,0.17,0,1.54,0.18,-0.01,1.54,0.19,-0.01,1.54,0.19,0,1.54,0.2,-0.01,1.54,0.21,-0.01,1.54,0.21,0,1.54,0.22,-0.01,1.54,0.23,-0.01,1.54,0.23,0,1.54,0.24,-0.01,1.54,0.25,-0.01,1.54,0.25,0,1.54,0,0,1.54,0.02,0,1.54,0.04,0,1.54,0.06,0,1.54,0.08,0,1.54,0.1,0,1.54,0.12,0,1.54,0.14,0,1.54,0.16,0,1.54,0.18,0,1.54,0.2,0,1.54,0.22,0,1.54,0.24,0,1.54,0,0.01,1.54,0.02,0.01,1.54,0.04,0.01,1.54,0.06,0.01,1.54,0.08,0.01,1.54,0.1,0.01,1.54,0.12,0.01,1.54,0.14,0.01,1.54,0.16,0.01,1.54,0.18,0.01,1.54,0.2,0.01,1.54,0.22,0.01,1.54,0.24,0.01,1.54,0.01,0.01,1.54,0.03,0.01,1.54,0.05,0.01,1.54,0.07,0.01,1.54,0.09,0.01,1.54,0.11,0.01,1.54,0.13,0.01,1.54,0.15,0.01,1.54,0.17,0.01,1.54,0.19,0.01,1.54,0.21,0.01,1.54,0.23,0.01,1.54,0.25,0.01,1.54,0.26,0.01,1.54,0.26,0,1.54,0.26,-0.01],81,3))
791         #
792         rem=MEDCouplingRemapper() ; rem.setIntersectionType(Barycentric)
793         rem.prepare(a,b,"P1P0")
794         m0=rem.getCrudeCSRMatrix()
795         self.assertEqual(m0.nnz,312)
796         #
797         ids=4*[None] ; vs=4*[None]
798         ids[0]=DataArrayInt([0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,158,161,164,167,170,173,176,179,182,185,188,191,194,197,200,203,206,209,212,215,218,221,224,227,230,233]) ; vs[0]=10./3.
799         ids[1]=DataArrayInt([1,2,4,5,7,8,10,11,13,14,16,17,19,20,22,23,25,26,28,29,31,32,34,35,37,38,40,41,43,44,46,47,49,50,52,53,55,56,58,59,61,62,64,65,67,68,70,71,73,74,76,77,80,83,86,89,92,95,98,101,104,107,110,113,116,117,120,123,126,129,132,135,138,141,144,147,150,153,156,157,159,160,162,163,165,166,168,169,171,172,174,175,177,178,180,181,183,184,186,187,189,190,192,193,195,196,198,199,201,202,204,205,207,208,210,211,213,214,216,217,219,220,222,223,225,226,228,229,231,232,234,237,240,243,246,249,252,255,258,261,264,267,270,275,278,281,284,287,290,293,296,299,302,305,308,311]) ; vs[1]=5./6.
800         ids[2]=DataArrayInt([78,81,84,87,90,93,96,99,102,105,108,111,114,119,122,125,128,131,134,137,140,143,146,149,152,155,236,239,242,245,248,251,254,257,260,263,266,269,272,273,276,279,282,285,288,291,294,297,300,303,306,309]) ; vs[2]=5./3.
801         ids[3]=DataArrayInt([79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130,133,136,139,142,145,148,151,154,235,238,241,244,247,250,253,256,259,262,265,268,271,274,277,280,283,286,289,292,295,298,301,304,307,310]) ; vs[3]=2.5
802         vals=DataArrayDouble(312,1)
803         for idd,v in zip(ids,vs):
804             vals[idd]=v
805             pass
806         vals*=1e-5
807         eps0=DataArrayDouble(m0.data)-vals ; eps0.abs()
808         self.assertTrue(eps0.findIdsInRange(1e-17,1e300).empty())
809         self.assertTrue(DataArrayInt(m0.indices).isEqual(DataArrayInt([0,1,3,1,4,5,4,6,7,6,8,9,8,10,11,10,12,13,12,14,15,14,16,17,16,18,19,18,20,21,20,22,23,22,24,25,24,26,27,0,2,3,1,3,5,4,5,7,6,7,9,8,9,11,10,11,13,12,13,15,14,15,17,16,17,19,18,19,21,20,21,23,22,23,25,24,25,27,0,2,3,1,3,5,4,5,7,6,7,9,8,9,11,10,11,13,12,13,15,14,15,17,16,17,19,18,19,21,20,21,23,22,23,25,24,25,27,0,2,3,1,3,5,4,5,7,6,7,9,8,9,11,10,11,13,12,13,15,14,15,17,16,17,19,18,19,21,20,21,23,22,23,25,24,25,27,0,2,3,1,3,5,4,5,7,6,7,9,8,9,11,10,11,13,12,13,15,14,15,17,16,17,19,18,19,21,20,21,23,22,23,25,24,25,27,0,1,3,1,4,5,4,6,7,6,8,9,8,10,11,10,12,13,12,14,15,14,16,17,16,18,19,18,20,21,20,22,23,22,24,25,24,26,27,0,1,3,1,4,5,4,6,7,6,8,9,8,10,11,10,12,13,12,14,15,14,16,17,16,18,19,18,20,21,20,22,23,22,24,25,24,26,27,0,1,3,1,4,5,4,6,7,6,8,9,8,10,11,10,12,13,12,14,15,14,16,17,16,18,19,18,20,21,20,22,23,22,24,25,24,26,27])))
810         self.assertTrue(DataArrayInt(m0.indptr).isEqual(DataArrayInt([0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288,291,294,297,300,303,306,309,312])))
811         #
812         rem2=MEDCouplingRemapper() ; rem2.setIntersectionType(Barycentric)
813         rem2.prepare(b,a,"P0P1")
814         m1=rem2.getCrudeCSRMatrix()
815         self.assertEqual(m1.nnz,312)
816         #
817         m1=rem2.getCrudeCSRMatrix()
818         m1t=m1.transpose()
819         delta=m0-m1t
820         self.assertTrue(DataArrayDouble(delta.data).isUniform(0.,1e-17))
821         pass
822
823     @unittest.skipUnless(MEDCouplingHasNumPyBindings() and MEDCouplingHasSciPyBindings(),"requires numpy AND scipy")
824     def testNonConformWithRemapper_1(self):
825         coo=DataArrayDouble([-0.396700000780411,-0.134843245350081,-0.0361311386958691,-0.407550009429364,-0.13484324535008,-0.0361311386958923,-0.396700000780411,-0.132191446077668,-0.0448729493559049,-0.407550009429364,-0.132191446077666,-0.0448729493559254,-0.396700000780411,-0.128973582738749,-0.0534226071577727,-0.407550009429364,-0.128973582738747,-0.0534226071577904,-0.396700000780411,-0.128348829636458,-0.0346583696473619,-0.407550009429364,-0.128348829636457,-0.0346583696473822,-0.396700000780411,-0.125874740261886,-0.0430683597970123,-0.407550009429364,-0.125874740261885,-0.0430683597970302,-0.396700000780411,-0.122905344829122,-0.051310216195766,-0.407550009429364,-0.12290534482912,-0.0513102161957814],12,3)
826         conn=DataArrayInt([2,9,3,11,2,3,5,11,2,8,9,11,2,10,8,11,2,5,4,11,2,4,10,11,3,0,1,6,3,1,7,6,3,2,0,6,3,8,2,6,3,7,9,6,3,9,8,6])
827         m=MEDCoupling1SGTUMesh("mesh",NORM_TETRA4)
828         m.setNodalConnectivity(conn)
829         m.setCoords(coo)
830         # m is ready
831         m1,d,di,rd,rdi=m.buildUnstructured().buildDescendingConnectivity()
832         rdi2=rdi.deltaShiftIndex()
833         cellIds=rdi2.findIdsEqual(1)
834         skinAndNonConformCells=m1[cellIds]
835         skinAndNonConformCells.zipCoords() # at this point skinAndNonConformCells contains non conform cells and skin cells. Now trying to split them in two parts.
836         #
837         rem=MEDCouplingRemapper()
838         rem.setMaxDistance3DSurfIntersect(1e-12)
839         rem.setMinDotBtwPlane3DSurfIntersect(0.99)# this line is important it is to tell to remapper to select only cells with very close orientation
840         rem.prepare(skinAndNonConformCells,skinAndNonConformCells,"P0P0")
841         mat=rem.getCrudeCSRMatrix()
842         indptr=DataArrayInt(mat.indptr)
843         indptr2=indptr.deltaShiftIndex()
844         cellIdsOfNonConformCells=indptr2.findIdsNotEqual(1)
845         cellIdsOfSkin=indptr2.findIdsEqual(1)
846         self.assertTrue(cellIdsOfSkin.isEqual(DataArrayInt([1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,17,19,20,21,23])))
847         self.assertTrue(cellIdsOfNonConformCells.isEqual(DataArrayInt([0,4,18,22])))
848         pass
849
850     def test3D1DOnP1P0_1(self):
851         """ This test focused on P1P0 interpolation with a source with meshDim=1 spaceDim=3 and a target with meshDim=3.
852         This test has revealed a bug in remapper. A reverse matrix is computed so a reverse method should be given in input.
853         """
854         target=MEDCouplingCMesh()
855         arrX=DataArrayDouble([0,1]) ; arrY=DataArrayDouble([0,1]) ; arrZ=DataArrayDouble(11) ; arrZ.iota()
856         target.setCoords(arrX,arrY,arrZ)
857         target=target.buildUnstructured() ; target.setName("TargetSecondaire")
858         #
859         sourceCoo=DataArrayDouble([(0.5,0.5,0.1),(0.5,0.5,1.2),(0.5,0.5,1.6),(0.5,0.5,1.8),(0.5,0.5,2.43),(0.5,0.5,2.55),(0.5,0.5,4.1),(0.5,0.5,4.4),(0.5,0.5,4.9),(0.5,0.5,5.1),(0.5,0.5,7.6),(0.5,0.5,7.7),(0.5,0.5,8.2),(0.5,0.5,8.4),(0.5,0.5,8.6),(0.5,0.5,8.8),(0.5,0.5,9.2),(0.5,0.5,9.6),(0.5,0.5,11.5)])
860         source=MEDCoupling1SGTUMesh("SourcePrimaire",NORM_SEG2)
861         source.setCoords(sourceCoo)
862         source.allocateCells()
863         for i in xrange(len(sourceCoo)-1):
864             source.insertNextCell([i,i+1])
865             pass
866         source=source.buildUnstructured()
867         fsource=MEDCouplingFieldDouble(ON_NODES) ; fsource.setName("field")
868         fsource.setMesh(source)
869         arr=DataArrayDouble(len(sourceCoo)) ; arr.iota(0.7) ; arr*=arr
870         fsource.setArray(arr)
871         fsource.setNature(IntensiveMaximum)
872         #
873         rem=MEDCouplingRemapper()
874         rem.setIntersectionType(PointLocator)
875         rem.prepare(source,target,"P1P0")
876         f2Test=rem.transferField(fsource,-27)
877         self.assertEqual(f2Test.getName(),fsource.getName())
878         self.assertEqual(f2Test.getMesh().getHiddenCppPointer(),target.getHiddenCppPointer())
879         expArr=DataArrayDouble([0.49,7.956666666666667,27.29,-27,59.95666666666667,94.09,-27,125.69,202.89,296.09])
880         self.assertTrue(f2Test.getArray().isEqual(expArr,1e-12))
881         f2Test=rem.reverseTransferField(f2Test,-36)
882         self.assertEqual(f2Test.getName(),fsource.getName())
883         self.assertEqual(f2Test.getMesh().getHiddenCppPointer(),source.getHiddenCppPointer())
884         expArr2=DataArrayDouble([0.49,7.956666666666667,7.956666666666667,7.956666666666667,27.29,27.29,59.95666666666667,59.95666666666667,59.95666666666667,94.09,125.69,125.69,202.89,202.89,202.89,202.89,296.09,296.09,-36.])
885         self.assertTrue(f2Test.getArray().isEqual(expArr2,1e-12))
886         pass
887
888     def testRemapperAMR1(self):
889         """ This test is the origin of the ref values for MEDCouplingBasicsTest.testAMR2"""
890         coarse=DataArrayDouble(35) ; coarse.iota(0) #X=5,Y=7
891         fine=DataArrayDouble(3*2*4*4) ; fine.iota(0) #X=3,Y=2 refined by 4
892         MEDCouplingIMesh.CondenseFineToCoarse([5,7],fine,[(1,4),(2,4)],[4,4],coarse)
893         #
894         m=MEDCouplingCartesianAMRMesh("mesh",2,[6,8],[0.,0.],[1.,1.])
895         trgMesh=m.buildUnstructured()
896         m.addPatch([(1,4),(2,4)],[4,4])
897         srcMesh=m[0].getMesh().buildUnstructured()
898         srcField=MEDCouplingFieldDouble(ON_CELLS)
899         fine2=DataArrayDouble(3*2*4*4) ; fine2.iota(0) ; srcField.setArray(fine2)
900         srcField.setMesh(srcMesh) ; srcField.setNature(ExtensiveMaximum)
901         #
902         trgField=MEDCouplingFieldDouble(ON_CELLS)
903         coarse2=DataArrayDouble(35) ; coarse2.iota(0) ; trgField.setArray(coarse2)
904         trgField.setMesh(trgMesh) ; trgField.setNature(ExtensiveMaximum)
905         #
906         rem=MEDCouplingRemapper()
907         rem.prepare(srcMesh,trgMesh,"P0P0")
908         rem.partialTransfer(srcField,trgField)
909         #
910         self.assertTrue(coarse.isEqual(trgField.getArray(),1e-12))
911         pass
912
913     @unittest.skipUnless(MEDCouplingHasNumPyBindings() and MEDCouplingHasSciPyBindings(),"requires numpy AND scipy")
914     def test1DPointLocator1(self):
915         """This test focuses on PointLocator for P1P1 in 1D and 2DCurve."""
916         from numpy import array
917         from scipy.sparse import diags,csr_matrix,identity
918         ## basic case 1D
919         arrS=DataArrayInt.Range(0,11,1).convertToDblArr()
920         arrT=DataArrayDouble([0.1,1.7,5.5,9.6])
921         mS=MEDCouplingCMesh() ; mS.setCoords(arrS)
922         mT=MEDCouplingCMesh() ; mT.setCoords(arrT)
923         rem=MEDCouplingRemapper()
924         rem.setIntersectionType(PointLocator)
925         self.assertEqual(rem.prepare(mS.buildUnstructured(),mT.buildUnstructured(),"P1P1"),1)
926         m=rem.getCrudeCSRMatrix()
927         rowSum=m.sum(axis=1)
928         m=diags(array(1/rowSum.transpose()),[0])*m
929         # expected matrix
930         row=array([0,0,1,1,2,2,3,3])
931         col=array([0,1,1,2,5,6,9,10])
932         data=array([0.9,0.1,0.3,0.7,0.5,0.5,0.4,0.6])
933         mExp0=csr_matrix((data,(row,col)),shape=(4,11))
934         # compute diff and check
935         diff=abs(m-mExp0)
936         self.assertAlmostEqual(diff.sum(),0.,14)
937         ## full specific case 1D where target=source
938         rem=MEDCouplingRemapper()
939         rem.setIntersectionType(PointLocator)
940         self.assertEqual(rem.prepare(mS.buildUnstructured(),mS.buildUnstructured(),"P1P1"),1)
941         m=rem.getCrudeCSRMatrix()
942         rowSum=m.sum(axis=1)
943         m=diags(array(1/rowSum.transpose()),[0])*m
944         # expected matrix
945         mExp1=identity(11)
946         diff=abs(m-mExp1)
947         self.assertAlmostEqual(diff.sum(),0.,14)
948         ## case where some points in target are not in source
949         arrT=DataArrayDouble([-0.2,0.1,1.7,5.5,10.3])
950         mT=MEDCouplingCMesh() ; mT.setCoords(arrT)
951         mT=mT.buildUnstructured()
952         rem=MEDCouplingRemapper()
953         rem.setIntersectionType(PointLocator)
954         self.assertEqual(rem.prepare(mS.buildUnstructured(),mT,"P1P1"),1)
955         m=rem.getCrudeCSRMatrix()
956         row=array([1,1,2,2,3,3])
957         col=array([0,1,1,2,5,6])
958         data=array([0.9,0.1,0.3,0.7,0.5,0.5])
959         mExp2=csr_matrix((data,(row,col)),shape=(5,11))
960         diff=abs(m-mExp2)
961         self.assertAlmostEqual(diff.sum(),0.,14)
962         ## basic case 2D Curve
963         arrS=DataArrayInt.Range(0,11,1).convertToDblArr()
964         arrT=DataArrayDouble([0.1,1.7,5.5,9.6])
965         mS=MEDCouplingCMesh() ; mS.setCoords(arrS)
966         mT=MEDCouplingCMesh() ; mT.setCoords(arrT)
967         mS=mS.buildUnstructured() ; mS.changeSpaceDimension(2)
968         mT=mT.buildUnstructured() ; mT.changeSpaceDimension(2)
969         mS.rotate([-1.,-1.],1.2)
970         mT.rotate([-1.,-1.],1.2)
971         rem=MEDCouplingRemapper()
972         rem.setIntersectionType(PointLocator)
973         self.assertEqual(rem.prepare(mS,mT,"P1P1"),1)
974         m=rem.getCrudeCSRMatrix()
975         rowSum=m.sum(axis=1)
976         m=diags(array(1/rowSum.transpose()),[0])*m
977         diff=abs(m-mExp0)
978         self.assertAlmostEqual(diff.sum(),0.,14)
979         pass
980
981     def test3D2Dand2D3DPointLocator1(self):
982         """ Non regression test solving SIGSEGV when using 3D<->3Dsurf pointlocator."""
983         arrX=DataArrayDouble([0,1,2])
984         arrY=DataArrayDouble([0,1])
985         arrZ=DataArrayDouble([0,1])
986         ms=MEDCouplingCMesh() ; ms.setCoords(arrX,arrY,arrZ)
987         ms=ms.buildUnstructured() ; ms.setName("source")
988         #
989         mt=MEDCouplingUMesh("target",2) ; mt.allocateCells()
990         mt.insertNextCell(NORM_TRI3,[0,4,6])
991         mt.insertNextCell(NORM_TRI3,[1,5,7])
992         mt.setCoords(ms.getCoords()[:])
993         mt.zipCoords()
994         #
995         rem=MEDCouplingRemapper()
996         rem.setIntersectionType(PointLocator)
997         rem.prepare(ms,mt,"P0P0")
998         self.assertEqual(rem.getCrudeMatrix(),[{0: 1.0}, {1: 1.0}])
999         rem2=MEDCouplingRemapper()
1000         rem2.setIntersectionType(PointLocator)
1001         rem2.prepare(mt,ms,"P0P0") # reverse mt<->ms
1002         self.assertEqual(rem2.getCrudeMatrix(),[{0: 1.0}, {1: 1.0}])
1003         pass
1004
1005     def test2D1Dand1D2DPointLocator1(self):
1006         arrX=DataArrayDouble([0,1,2])
1007         arrY=DataArrayDouble([0,1])
1008         ms=MEDCouplingCMesh() ; ms.setCoords(arrX,arrY) ; ms=ms.buildUnstructured()
1009         mt=MEDCouplingUMesh("target",1) ; mt.setCoords(ms.getCoords()[:])
1010         mt.allocateCells()
1011         mt.insertNextCell(NORM_SEG2,[0,4]) ; mt.insertNextCell(NORM_SEG2,[1,5])
1012         rem=MEDCouplingRemapper()
1013         rem.setIntersectionType(PointLocator)
1014         rem.prepare(ms,mt,"P0P0")
1015         self.assertEqual(rem.getCrudeMatrix(),[{0:1.},{1:1.}])
1016         rem=MEDCouplingRemapper()
1017         rem.setIntersectionType(PointLocator)
1018         rem.prepare(mt,ms,"P0P0")
1019         self.assertEqual(rem.getCrudeMatrix(),[{0:1.},{1:1.}])
1020         pass
1021
1022     def test3D1DPointLocatorBBoxAdjusted(self):
1023         """ In case a 1D segment lies exactly on the interface between two 2D (or 3D) faces, the default
1024         bounding box logic will make it non-intersecting with the surrounding 2D (or 3D) faces.
1025         Test bounding box adjustment allowing to widen the BB to capture this.
1026         """
1027         m = MEDCouplingCMesh("source")
1028         di, dd = DataArrayInt, DataArrayDouble
1029         m.setCoordsAt(0, dd([0.0, 1.0, 2.0]))
1030         m.setCoordsAt(1, dd([0.0, 1.0]))
1031         m.setCoordsAt(2, dd([0.0, 1.0]))
1032         m3d = m.buildUnstructured()
1033         m1d = MEDCouplingUMesh("target", 1)
1034         m1d.setCoords(dd([1.0,0.5,0.2  ,  1.0,0.5,0.8], 2,3))
1035         m1d.setConnectivity(di([NORM_SEG2, 0, 1]), di([0,3]))
1036
1037         rem = MEDCouplingRemapper()
1038         rem.setPrecision(1e-12)
1039         rem.setIntersectionType(PointLocator)
1040         rem.prepare(m3d, m1d,"P0P1")
1041         self.assertEqual(rem.getCrudeMatrix(), [{0: 1.0, 1: 1.0}, {0: 1.0, 1: 1.0}])
1042
1043         rem = MEDCouplingRemapper()
1044         rem.setPrecision(1e-12)
1045         rem.setIntersectionType(PointLocator)
1046         rem.setBoundingBoxAdjustment(0.0)
1047         rem.setBoundingBoxAdjustmentAbs(0.0)
1048         rem.prepare(m3d, m1d,"P0P1")
1049         self.assertEqual(rem.getCrudeMatrix(), [{}, {}])
1050         pass
1051
1052     def testPointLocator3DTo2D(self):
1053         """Target mesh has spaceDim==3 and meshDim==2. Source has spaceDim==3 and meshDim==3. Here we are on pointlocator alg.
1054         The test evaluates on each nodes of target mesh the bary coor into source mesh."""
1055         src=MEDCouplingCMesh()
1056         arr=DataArrayDouble([0,1,2])
1057         src.setCoords(arr,arr,arr)
1058         src=src.buildUnstructured()
1059         src.simplexize(PLANAR_FACE_5)
1060         fsrc=MEDCouplingFieldDouble(ON_NODES) ; fsrc.setMesh(src)
1061         fsrc.setArray(DataArrayDouble([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]))
1062         #
1063         trg=MEDCouplingCMesh()
1064         arr=DataArrayDouble([0,1])
1065         trg.setCoords(arr,arr)
1066         trg=trg.buildUnstructured()
1067         trg.changeSpaceDimension(3,0.)
1068         trg.translate([0.5,0.5,0.5])
1069         #
1070         arrTrg=fsrc.getValueOnMulti(trg.getCoords())
1071         ftrg=MEDCouplingFieldDouble(ON_NODES)
1072         ftrg.setMesh(trg)
1073         ftrg.setArray(arrTrg)
1074         ftrg.checkConsistencyLight()
1075         ftrg.setNature(IntensiveMaximum)
1076         #
1077         fsrc.setNature(IntensiveMaximum)
1078         remap=MEDCouplingRemapper()
1079         remap.setIntersectionType(PointLocator)
1080         self.assertEqual(remap.prepare(src,trg,"P1P1"),1)
1081         ftrg2=remap.transferField(fsrc,1e300)
1082         self.assertTrue(ftrg.isEqual(ftrg2,1e-12,1e-12))
1083         pass
1084
1085     def testExtrudedOnDiffZLev1(self):
1086         """Non regression bug : This test is base on P0P0 ExtrudedExtruded. This test checks that if the input meshes are not based on a same plane // OXY the interpolation works"""
1087         arrX=DataArrayDouble([0,1]) ; arrY=DataArrayDouble([0,1]) ; arrZ=DataArrayDouble([0,1,2])
1088         src=MEDCouplingCMesh() ; src.setCoords(arrX,arrY,arrZ)
1089         arrX=DataArrayDouble([0.5,1.5]) ; arrY=DataArrayDouble([0.5,1.5]) ; arrZ=DataArrayDouble([0.5,2])
1090         trg=MEDCouplingCMesh() ; trg.setCoords(arrX,arrY,arrZ)
1091         #
1092         src=MEDCouplingMappedExtrudedMesh(src) ; trg=MEDCouplingMappedExtrudedMesh(trg)
1093         pt1=src.getMesh2D().getCoords().getHiddenCppPointer() ; pt2=trg.getMesh2D().getCoords().getHiddenCppPointer()
1094         #
1095         rem=MEDCouplingRemapper()
1096         rem.prepare(src,trg,"P0P0")
1097         self.checkMatrix(rem.getCrudeMatrix(),[{0:0.125,1:0.25}],src.getNumberOfCells(),1e-12)
1098         #
1099         self.assertEqual(src.getMesh2D().getSpaceDimension(),3)
1100         self.assertEqual(trg.getMesh2D().getSpaceDimension(),3)
1101         self.assertEqual(src.getMesh2D().getCoords().getHiddenCppPointer(),pt1)
1102         self.assertEqual(trg.getMesh2D().getCoords().getHiddenCppPointer(),pt2)
1103         #
1104         rem2=MEDCouplingRemapper()
1105         rem2.setIntersectionType(Geometric2D)
1106         rem2.prepare(src,trg,"P0P0")
1107         self.checkMatrix(rem2.getCrudeMatrix(),[{0:0.125,1:0.25}],src.getNumberOfCells(),1e-12)
1108         pass
1109
1110     def checkMatrix(self,mat1,mat2,nbCols,eps):
1111         self.assertEqual(len(mat1),len(mat2))
1112         for i in xrange(len(mat1)):
1113             self.assertTrue(max(mat2[i].keys())<nbCols)
1114             self.assertTrue(max(mat1[i].keys())<nbCols)
1115             self.assertTrue(min(mat2[i].keys())>=0)
1116             self.assertTrue(min(mat1[i].keys())>=0)
1117             s1=set(mat1[i].keys()) ; s2=set(mat2[i].keys())
1118             for elt in s1.intersection(s2):
1119                 self.assertTrue(abs(mat1[i][elt]-mat2[i][elt])<eps)
1120                 pass
1121             for elt in s1.difference(s2):
1122                 self.assertTrue(abs(mat1[i][elt])<eps)
1123                 pass
1124             for elt in s2.difference(s1):
1125                 self.assertTrue(abs(mat2[i][elt])<eps)
1126                 pass
1127             pass
1128         pass
1129
1130     def build2DSourceMesh_1(self):
1131         sourceCoords=[-0.3,-0.3, 0.7,-0.3, -0.3,0.7, 0.7,0.7]
1132         sourceConn=[0,3,1,0,2,3]
1133         sourceMesh=MEDCouplingUMesh.New("my name of mesh 2D",2)
1134         sourceMesh.allocateCells(2);
1135         sourceMesh.insertNextCell(NORM_TRI3,3,sourceConn[0:3]);
1136         sourceMesh.insertNextCell(NORM_TRI3,3,sourceConn[3:6]);
1137         sourceMesh.finishInsertingCells();
1138         myCoords=DataArrayDouble.New();
1139         myCoords.setValues(sourceCoords,4,2);
1140         sourceMesh.setCoords(myCoords);
1141         return sourceMesh;
1142
1143     def build2DTargetMesh_1(self):
1144         targetCoords=[-0.3,-0.3, 0.2,-0.3, 0.7,-0.3, -0.3,0.2, 0.2,0.2, 0.7,0.2, -0.3,0.7, 0.2,0.7, 0.7,0.7 ]
1145         targetConn=[0,3,4,1, 1,4,2, 4,5,2, 6,7,4,3, 7,8,5,4]
1146         targetMesh=MEDCouplingUMesh.New();
1147         targetMesh.setMeshDimension(2);
1148         targetMesh.allocateCells(5);
1149         targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[0:4]);
1150         targetMesh.insertNextCell(NORM_TRI3,3,targetConn[4:7]);
1151         targetMesh.insertNextCell(NORM_TRI3,3,targetConn[7:10]);
1152         targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[10:14]);
1153         targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[14:18]);
1154         targetMesh.finishInsertingCells();
1155         myCoords=DataArrayDouble.New();
1156         myCoords.setValues(targetCoords,9,2);
1157         targetMesh.setCoords(myCoords);
1158         return targetMesh;
1159
1160     def build2DTargetMesh_3(self):
1161         targetCoords=[-0.6,-0.4, -0.1,-0.4, 1.1,-0.4, 2.1,-0.4, -0.6,0.1,  -0.1,0.1,  1.1,0.1,  2.1,0.1, -0.6,1.1,  -0.1,1.1]
1162         targetConn=[0,4,5,1, 1,5,6,2, 2,6,7,3, 4,8,9,5]
1163         targetMesh=MEDCouplingUMesh.New();
1164         targetMesh.setMeshDimension(2);
1165         targetMesh.allocateCells(4);
1166         for i in xrange(4):
1167             targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[4*i:4*(i+1)])
1168             pass
1169         targetMesh.finishInsertingCells();
1170         myCoords=DataArrayDouble.New();
1171         myCoords.setValues(targetCoords,10,2);
1172         targetMesh.setCoords(myCoords);
1173         return targetMesh;
1174         pass
1175
1176     def setUp(self):
1177         pass
1178     pass
1179
1180 if __name__ == "__main__":
1181   unittest.main()