]> SALOME platform Git repositories - tools/medcoupling.git/blob - src/MEDCoupling_Swig/MEDCouplingRemapperTest.py
Salome HOME
Copyright update 2020
[tools/medcoupling.git] / src / MEDCoupling_Swig / MEDCouplingRemapperTest.py
1 #  -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2020  CEA/DEN, EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20
21 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.assertTrue(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 range(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 range(targetMesh.getNumberOfCells()):
56             self.assertTrue(abs(values[i]-valuesExpected[i])<1e-12);
57             pass
58         self.assertTrue(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 range(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 range(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 range(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 range(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 range(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(list(mat1[0].keys()),list(mat2[0].keys())) ; self.assertEqual([0,1],list(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 range(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 range(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 range(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 range(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(DataArrayInt32(m0.indices).isEqual(DataArrayInt32([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(DataArrayInt32(m0.indptr).isEqual(DataArrayInt32([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=DataArrayInt32(mat.indptr) #not depend on MEDCouplingUse64BitIDs()
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 range(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([1.8,0.2,0.6,1.4,1.0,1.0])
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         ##
1002         # 2D to 3D with point locator does not make sense:
1003         ##
1004         self.assertRaises(InterpKernelException, rem2.prepare,mt,ms,"P0P0")
1005         pass
1006
1007     def test2D1Dand1D2DPointLocator1(self):
1008         arrX=DataArrayDouble([0,1,2])
1009         arrY=DataArrayDouble([0,1])
1010         ms=MEDCouplingCMesh() ; ms.setCoords(arrX,arrY) ; ms=ms.buildUnstructured()
1011         mt=MEDCouplingUMesh("target",1) ; mt.setCoords(ms.getCoords()[:])
1012         mt.allocateCells()
1013         mt.insertNextCell(NORM_SEG2,[0,4]) ; mt.insertNextCell(NORM_SEG2,[1,5])
1014         rem=MEDCouplingRemapper()
1015         rem.setIntersectionType(PointLocator)
1016         rem.prepare(ms,mt,"P0P0")
1017         self.assertEqual(rem.getCrudeMatrix(),[{0:1.},{1:1.}])
1018         rem=MEDCouplingRemapper()
1019         rem.setIntersectionType(PointLocator)
1020         rem.prepare(mt,ms,"P0P0")
1021         self.assertEqual(rem.getCrudeMatrix(),[{0:1.},{1:1.}])
1022         pass
1023
1024     def test3D1DPointLocatorBBoxAdjusted(self):
1025         """ In case a 1D segment lies exactly on the interface between two 2D (or 3D) faces, the default
1026         bounding box logic will make it non-intersecting with the surrounding 2D (or 3D) faces.
1027         Test bounding box adjustment allowing to widen the BB to capture this.
1028         """
1029         m = MEDCouplingCMesh("source")
1030         di, dd = DataArrayInt, DataArrayDouble
1031         m.setCoordsAt(0, dd([0.0, 1.0, 2.0]))
1032         m.setCoordsAt(1, dd([0.0, 1.0]))
1033         m.setCoordsAt(2, dd([0.0, 1.0]))
1034         m3d = m.buildUnstructured()
1035         m1d = MEDCouplingUMesh("target", 1)
1036         m1d.setCoords(dd([1.0,0.5,0.2  ,  1.0,0.5,0.8], 2,3))
1037         m1d.setConnectivity(di([NORM_SEG2, 0, 1]), di([0,3]))
1038
1039         rem = MEDCouplingRemapper()
1040         rem.setPrecision(1e-12)
1041         rem.setIntersectionType(PointLocator)
1042         rem.prepare(m3d, m1d,"P0P1")
1043         self.assertEqual(rem.getCrudeMatrix(), [{0: 1.0, 1: 1.0}, {0: 1.0, 1: 1.0}])
1044
1045         rem = MEDCouplingRemapper()
1046         rem.setPrecision(1e-12)
1047         rem.setIntersectionType(PointLocator)
1048         rem.setBoundingBoxAdjustment(0.0)
1049         rem.setBoundingBoxAdjustmentAbs(0.0)
1050         rem.prepare(m3d, m1d,"P0P1")
1051         self.assertEqual(rem.getCrudeMatrix(), [{}, {}])
1052         pass
1053
1054     def testPointLocator3DTo2D(self):
1055         """Target mesh has spaceDim==3 and meshDim==2. Source has spaceDim==3 and meshDim==3. Here we are on pointlocator alg.
1056         The test evaluates on each nodes of target mesh the bary coor into source mesh."""
1057         src=MEDCouplingCMesh()
1058         arr=DataArrayDouble([0,1,2])
1059         src.setCoords(arr,arr,arr)
1060         src=src.buildUnstructured()
1061         src.simplexize(PLANAR_FACE_5)
1062         fsrc=MEDCouplingFieldDouble(ON_NODES) ; fsrc.setMesh(src)
1063         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]))
1064         #
1065         trg=MEDCouplingCMesh()
1066         arr=DataArrayDouble([0,1])
1067         trg.setCoords(arr,arr)
1068         trg=trg.buildUnstructured()
1069         trg.changeSpaceDimension(3,0.)
1070         trg.translate([0.5,0.5,0.5])
1071         #
1072         arrTrg=fsrc.getValueOnMulti(trg.getCoords())
1073         ftrg=MEDCouplingFieldDouble(ON_NODES)
1074         ftrg.setMesh(trg)
1075         ftrg.setArray(arrTrg)
1076         ftrg.checkConsistencyLight()
1077         ftrg.setNature(IntensiveMaximum)
1078         #
1079         fsrc.setNature(IntensiveMaximum)
1080         remap=MEDCouplingRemapper()
1081         remap.setIntersectionType(PointLocator)
1082         self.assertEqual(remap.prepare(src,trg,"P1P1"),1)
1083         ftrg2=remap.transferField(fsrc,1e300)
1084         self.assertTrue(ftrg.isEqual(ftrg2,1e-12,1e-12))
1085         pass
1086
1087     def testExtrudedOnDiffZLev1(self):
1088         """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"""
1089         arrX=DataArrayDouble([0,1]) ; arrY=DataArrayDouble([0,1]) ; arrZ=DataArrayDouble([0,1,2])
1090         src=MEDCouplingCMesh() ; src.setCoords(arrX,arrY,arrZ)
1091         arrX=DataArrayDouble([0.5,1.5]) ; arrY=DataArrayDouble([0.5,1.5]) ; arrZ=DataArrayDouble([0.5,2])
1092         trg=MEDCouplingCMesh() ; trg.setCoords(arrX,arrY,arrZ)
1093         #
1094         src=MEDCouplingMappedExtrudedMesh(src) ; trg=MEDCouplingMappedExtrudedMesh(trg)
1095         pt1=src.getMesh2D().getCoords().getHiddenCppPointer() ; pt2=trg.getMesh2D().getCoords().getHiddenCppPointer()
1096         #
1097         rem=MEDCouplingRemapper()
1098         rem.prepare(src,trg,"P0P0")
1099         self.checkMatrix(rem.getCrudeMatrix(),[{0:0.125,1:0.25}],src.getNumberOfCells(),1e-12)
1100         #
1101         self.assertEqual(src.getMesh2D().getSpaceDimension(),3)
1102         self.assertEqual(trg.getMesh2D().getSpaceDimension(),3)
1103         self.assertEqual(src.getMesh2D().getCoords().getHiddenCppPointer(),pt1)
1104         self.assertEqual(trg.getMesh2D().getCoords().getHiddenCppPointer(),pt2)
1105         #
1106         rem2=MEDCouplingRemapper()
1107         rem2.setIntersectionType(Geometric2D)
1108         rem2.prepare(src,trg,"P0P0")
1109         self.checkMatrix(rem2.getCrudeMatrix(),[{0:0.125,1:0.25}],src.getNumberOfCells(),1e-12)
1110         pass
1111
1112     def testP0P0WithHEXGP12(self):
1113         """ Test that HEXGP12 are correctly remapped (elements with polygonal faces were not properly handled) """
1114         # From Astrid, two disjoint hexagonal prisms:
1115         coo1 = [-4.991193077144312, 8.644999999999998, 0.0, -9.982386154288623, 6.112246755425186e-16, 0.0, -4.991193077144315, -8.644999999999998, 0.0, 4.991193077144309, -8.645000000000005, 0.0, 9.982386154288626, 1.1651321638577316e-15, 0.0, 4.991193077144314, 8.645, 0.0, -4.991193077144312, 8.644999999999998, 7.561799999999991, -9.982386154288623, 6.112246755425186e-16, 7.561799999999991, -4.991193077144315, -8.644999999999998, 7.561799999999991, 4.991193077144309, -8.645000000000005, 7.561799999999991, 9.982386154288626, 1.1651321638577316e-15, 7.561799999999991, 4.991193077144314, 8.645, 7.561799999999991]
1116         coo2 = [-4.991193077144313, -8.645, 0.0, -9.982386154288626, -1.3992140779350848e-15, 0.0, -19.964772308577256, 0.0, 0.0, -24.95596538572157, -8.644999999999998, 0.0, -19.96477230857726, -17.289999999999996, 0.0, -9.982386154288626, -17.289999999999996, 0.0, -4.991193077144313, -8.645, 5.041200000000004, -9.982386154288626, -1.3992140779350848e-15, 5.041200000000004, -19.964772308577256, 0.0, 5.041200000000004, -24.95596538572157, -8.644999999999998, 5.041200000000004, -19.96477230857726, -17.289999999999996, 5.041200000000004, -9.982386154288626, -17.289999999999996, 5.041200000000004]
1117         conn1 = [31, 0, 5, 4, 3, 2, 1, -1, 11, 6, 7, 8, 9, 10, -1, 1, 7, 6, 0, -1, 2, 8, 7, 1, -1, 3, 9, 8, 2, -1, 4, 10, 9, 3, -1, 5, 11, 10, 4, -1, 0, 6, 11, 5]
1118         cI1 = [0, 44]
1119         conn2 = [31, 0, 5, 4, 3, 2, 1, -1, 6, 7, 8, 9, 10, 11, -1, 0, 1, 7, 6, -1, 1, 2, 8, 7, -1, 2, 3, 9, 8, -1, 3, 4, 10, 9, -1, 4, 5, 11, 10, -1, 5, 0, 6, 11]
1120         cI2 = [0, 44]
1121         mTgt = MEDCouplingUMesh("target", 3)
1122         mSrc = MEDCouplingUMesh("src", 3)
1123         mTgt.setCoords(DataArrayDouble(coo1, len(coo1) // 3, 3))
1124         mSrc.setCoords(DataArrayDouble(coo2, len(coo2) // 3, 3))
1125         mTgt.setConnectivity(DataArrayInt(conn1), DataArrayInt(cI1))
1126         mSrc.setConnectivity(DataArrayInt(conn2), DataArrayInt(cI2))
1127
1128         # Recognize the HEXGP12:
1129         mTgt.unPolyze()
1130         mSrc.unPolyze()
1131
1132         rmp = MEDCouplingRemapper()
1133         rmp.setIntersectionType(Triangulation)
1134         rmp.prepare(mSrc, mTgt, "P0P0")
1135         mat = rmp.getCrudeMatrix()
1136         self.assertEqual(len(mat[0]), 0)
1137         self.assertEqual(len(mat), 1)
1138         pass
1139
1140     def testP0P0KillerTet(self):
1141         """ The killer tetrahedron detected by LMEC!"""
1142         mesh = MEDCouplingUMesh('SupportOf_ECHIA1_Tin', 3)
1143 #         # was OK:
1144 #         coo = DataArrayDouble([(-4.50135,1.95352,4.59608),(-4.50409,1.86642,4.54551), (-4.55175,1.92167,4.64844),(-4.58813,1.94795,4.5283)])
1145         # was KO:
1146         coo = DataArrayDouble([(-4.501352938826142847,1.953517433537110159,4.596082552008083688),(-4.504092113061189728,1.866415526007169978,4.545507396150389567),(-4.551750368181751050,1.921669328035479962,4.648439577911889664),(-4.588131417812300050,1.947948377683889953,4.528298931319220344)])
1147         mesh.setCoords(coo)
1148         c = DataArrayInt([14, 2, 0, 3, 1]); cI = DataArrayInt([0, 5])
1149         mesh.setConnectivity(c, cI)
1150         mesh_src, mesh_tgt = mesh.deepCopy(), mesh.deepCopy()
1151         field_src = mesh_src.fillFromAnalytic(ON_CELLS, 1, "1")
1152         field_src.setNature(IntensiveMaximum)
1153         rmp = MEDCouplingRemapper()
1154         rmp.setIntersectionType(Triangulation)
1155         rmp.prepare(mesh_src, mesh_tgt, "P0P0")
1156         self.assertEqual(1, len(rmp.getCrudeMatrix()))
1157         self.assertEqual(1, len(rmp.getCrudeMatrix()[0]))
1158         pass
1159
1160     @unittest.skipUnless(MEDCouplingHasNumPyBindings() and MEDCouplingHasSciPyBindings(),"requires numpy AND scipy AND C++11")
1161     def testP1P1PL3DSpaceFrom1DTo0D(self):
1162         from scipy.sparse import csr_matrix
1163         from numpy import array
1164
1165         def generateTrg(eps):
1166             trgArr=DataArrayDouble([(0.5,0.5,0.5),(0.2,0.2,0.2),(0.9,0.9,0.9),(0.7+eps*sqrt(3),0.7-eps*sqrt(3),0.7)])
1167             trg=MEDCouplingUMesh("trg",0) ; trg.setCoords(trgArr)
1168             trg.allocateCells()
1169             RenumTrg=[2,3,0,1]
1170             for rt in RenumTrg:
1171                 trg.insertNextCell(NORM_POINT1,[rt])
1172             return trg
1173
1174         srcArr=DataArrayDouble([(0.,0.,1.),(0.,0.,0.),(1.,1.,1.)])
1175         src=MEDCouplingUMesh("src",1) ; src.setCoords(srcArr)
1176         src.allocateCells()
1177         src.insertNextCell(NORM_SEG2,[1,2])
1178         #
1179         trg=generateTrg(1e-7)# trg point 3 of trg cell 1 is NOT closer enough to source edge #1 -> not intercepted
1180         #
1181         rem=MEDCouplingRemapper()
1182         rem.setIntersectionType(PointLocator)
1183         self.assertEqual(rem.prepare(src,trg,"P1P1"),1)
1184         mat=rem.getCrudeCSRMatrix()
1185         row=array([2,2, 0,0, 1,1]) # here no ref to point 3 !
1186         col=array([1,2, 1,2, 1,2])
1187         data=array([0.1,0.9, 0.5,0.5, 0.8,0.2])
1188         mExp=csr_matrix((data,(row,col)),shape=(4,3))
1189         delta=abs(mExp-mat)
1190         self.assertAlmostEqual(delta.sum(),0.,14)
1191         #
1192         trg=generateTrg(1e-14) # trg point 3 of trg cell 1 is closer enough to source edge #1 -> intercepted
1193         rem=MEDCouplingRemapper()
1194         rem.setIntersectionType(PointLocator)
1195         self.assertEqual(rem.prepare(src,trg,"P1P1"),1)
1196         mat=rem.getCrudeCSRMatrix()
1197         row=array([2,2, 3,3, 0,0, 1,1]) # here ref to target point 3
1198         col=array([1,2, 1,2, 1,2, 1,2])
1199         data=array([0.1,0.9, 0.3,0.7, 0.5,0.5, 0.8,0.2])
1200         mExp2=csr_matrix((data,(row,col)),shape=(4,3))
1201         delta2=abs(mExp2-mat)
1202         self.assertAlmostEqual(delta2.sum(),0.,14)
1203         pass
1204
1205     def testSetMatrix1(self):
1206         """ Remapper has now setCrudeMatrix method to reload matrix to skip prepare phase """
1207         cooS=DataArrayDouble([1,1, 7,1, 7,2, 1,2],4,2)
1208         cooT=DataArrayDouble([0,0, 3,0, 3,3, 0,3, 6,0, 12,0, 12,3, 6,3],8,2)
1209         ms=MEDCouplingUMesh("source",2) ; ms.allocateCells(1) ; ms.insertNextCell(NORM_QUAD4,[0,1,2,3]) ; ms.setCoords(cooS)
1210         mt=MEDCouplingUMesh("target",2) ; mt.allocateCells(2) ; mt.insertNextCell(NORM_QUAD4,[0,1,2,3]) ; mt.insertNextCell(NORM_QUAD4,[4,5,6,7]) ; mt.setCoords(cooT)
1211         rem=MEDCouplingRemapper()
1212         self.assertEqual(rem.prepare(ms,mt,"P0P0"),1) # [{0: 2.0}, {0: 1.0}]
1213         fs=MEDCouplingFieldDouble(ON_CELLS)
1214         fs.setMesh(ms)
1215         fs.setArray(DataArrayDouble([10]))
1216         fs.checkConsistencyLight()
1217         #
1218         fs.setNature(ExtensiveConservation)
1219         self.assertTrue(rem.transferField(fs,1e300).getArray().isEqual(DataArrayDouble([20./3,10./3.]),1e-12))# sum is equal to 10. First value is twice than second value
1220         #
1221         fs.setNature(ExtensiveMaximum)
1222         self.assertTrue(rem.transferField(fs,1e300).getArray().isEqual(DataArrayDouble([20./6.,10./6.]),1e-12))#sum is equal to 5 (10/2. because only half part on input cell is intercepted by the target cells). First value is twice than second value
1223         #
1224         fs.setNature(IntensiveConservation)
1225         self.assertTrue(rem.transferField(fs,1e300).getArray().isEqual(DataArrayDouble([2./9.*10.,1./18.*10.]),1e-12))#
1226         #
1227         fs.setNature(IntensiveMaximum)
1228         self.assertTrue(rem.transferField(fs,1e300).getArray().isEqual(DataArrayDouble([10.,10.]),1e-12))#
1229         ####
1230         rem2=MEDCouplingRemapper()
1231         rem2.setCrudeMatrix(ms,mt,"P0P0",rem.getCrudeMatrix())
1232         fs.setNature(ExtensiveConservation)
1233         self.assertTrue(rem2.transferField(fs,1e300).getArray().isEqual(DataArrayDouble([20./3,10./3.]),1e-12))
1234         #
1235         fs.setNature(ExtensiveMaximum)
1236         self.assertTrue(rem2.transferField(fs,1e300).getArray().isEqual(DataArrayDouble([20./6.,10./6.]),1e-12))
1237         #
1238         fs.setNature(IntensiveConservation)
1239         self.assertTrue(rem2.transferField(fs,1e300).getArray().isEqual(DataArrayDouble([2./9.*10.,1./18.*10.]),1e-12))
1240         #
1241         fs.setNature(IntensiveMaximum)
1242         self.assertTrue(rem2.transferField(fs,1e300).getArray().isEqual(DataArrayDouble([10.,10.]),1e-12))
1243         #
1244         srcFt=MEDCouplingFieldTemplate.New(ON_CELLS);
1245         trgFt=MEDCouplingFieldTemplate.New(ON_CELLS);
1246         srcFt.setMesh(ms);
1247         trgFt.setMesh(mt);
1248         rem3=MEDCouplingRemapper()
1249         rem3.setCrudeMatrixEx(srcFt,trgFt,rem.getCrudeMatrix())
1250         fs.setNature(ExtensiveConservation)
1251         self.assertTrue(rem3.transferField(fs,1e300).getArray().isEqual(DataArrayDouble([20./3,10./3.]),1e-12))
1252         pass
1253
1254     @unittest.skipUnless(MEDCouplingHasNumPyBindings() and MEDCouplingHasSciPyBindings(),"requires numpy AND scipy")
1255     def testSetMatrix2(self):
1256         """ Remapper has now setCrudeMatrix method to reload matrix to skip prepare phase. Same as testSetMatrix1 but with CSR scipy matrix """
1257         arrx_s=DataArrayDouble(6) ; arrx_s.iota()
1258         arry_s=DataArrayDouble(6) ; arry_s.iota()
1259         ms=MEDCouplingCMesh() ; ms.setCoords(arrx_s,arry_s)
1260         ms=ms.buildUnstructured()
1261         #
1262         arrx_t=DataArrayDouble([2.5,4.5,5.5])
1263         arry_t=DataArrayDouble([2.5,3.5,5.5])
1264         mt=MEDCouplingCMesh() ; mt.setCoords(arrx_t,arry_t)
1265         mt=mt.buildUnstructured()
1266         #
1267         rem=MEDCouplingRemapper()
1268         self.assertEqual(rem.prepare(ms,mt,"P0P0"),1)
1269         #
1270         fs=MEDCouplingFieldDouble(ON_CELLS)
1271         fs.setMesh(ms)
1272         arr=DataArrayDouble(25) ; arr.iota()
1273         fs.setArray(arr)
1274         fs.checkConsistencyLight()
1275         #
1276         fs.setNature(ExtensiveConservation)
1277         self.assertTrue(rem.transferField(fs,1e300).getArray().isEqual(DataArrayDouble([54.25,11.75,79.25,16.75]),1e-12))
1278         mat=rem.getCrudeCSRMatrix()
1279         rem2=MEDCouplingRemapper()
1280         rem2.setCrudeMatrix(ms,mt,"P0P0",mat)
1281         self.assertTrue(rem2.transferField(fs,1e300).getArray().isEqual(DataArrayDouble([54.25,11.75,79.25,16.75]),1e-12))
1282         pass
1283
1284     def testSmallTetraCell(self):
1285         """This test is a non regression test. When using tetra/tetra P0P0 interpolation on very small cells the
1286         3x3 matrix in the TetraAffine contains very small values and so the determinant is small (cubic).
1287         So the tetra was detected as flat. Now the infinite norm of matrix is considered to establish if matrix is inversible or not."""
1288         coords = [(-0.019866666666666668, 0.02, 0.002), (-0.020000073463967143, 0.019999926535763005, 0.0018666666666666673), (-0.020000073463967143, 0.019999926535763005, 0.002), (-0.020000072974206463, 0.019866593202430387, 0.002)]
1289         m=MEDCouplingUMesh("mesh",3)
1290         m.allocateCells()
1291         m.insertNextCell(NORM_TETRA4,[0,1,2,3])
1292         m.setCoords(DataArrayDouble(coords))
1293         rem=MEDCouplingRemapper()
1294         rem.setPrecision(1e-12)
1295         rem.prepare(m,m,"P0P0")
1296         mat=rem.getCrudeMatrix()
1297         self.assertTrue(len(mat)==1)
1298         self.assertTrue(len(mat[0])==1)
1299         self.assertTrue(list(mat[0].keys())==[0])
1300         res=list(mat[0].values())[0]
1301         ref=float(m.getMeasureField(True).getArray())
1302         self.assertTrue(abs(res-ref)/ref<1e-12)
1303         pass
1304
1305     def test3D0DPointLocator(self):
1306         """
1307         For pointlocator fans, Remapper support following intersection
1308         IntersectionType == PointLocator
1309         - source == 3D
1310         - target == 0D
1311         """
1312         src = MEDCouplingUMesh("src",3)
1313         src.allocateCells()
1314         src.setCoords( DataArrayDouble([(0,0,0),(1,0,0),(0,1,0),(0,0,1)]) )
1315         src.insertNextCell(NORM_TETRA4,[0,1,2,3])
1316         trg = MEDCouplingUMesh.Build0DMeshFromCoords( DataArrayDouble([(0.4,0.3,0.07)]) )
1317         # P1P1
1318         rem=MEDCouplingRemapper()
1319         rem.setIntersectionType(PointLocator)
1320         rem.prepare(src,trg,"P1P1")
1321         self.checkMatrix(rem.getCrudeMatrix(),[{0:0.23,1:0.4,2:0.3,3:0.07}],src.getNumberOfNodes(),1e-12)
1322         # P1P0
1323         rem=MEDCouplingRemapper()
1324         rem.setIntersectionType(PointLocator)
1325         rem.prepare(src,trg,"P1P0")
1326         self.checkMatrix(rem.getCrudeMatrix(),[{0:0.23,1:0.4,2:0.3,3:0.07}],src.getNumberOfNodes(),1e-12)
1327         # P0P1
1328         rem=MEDCouplingRemapper()
1329         rem.setIntersectionType(PointLocator)
1330         rem.prepare(src,trg,"P0P1")
1331         self.checkMatrix(rem.getCrudeMatrix(),[{0:1.0}],src.getNumberOfCells(),1e-12)
1332         # P0P0
1333         rem=MEDCouplingRemapper()
1334         rem.setIntersectionType(PointLocator)
1335         rem.prepare(src,trg,"P0P0")
1336         self.checkMatrix(rem.getCrudeMatrix(),[{0:1.0}],src.getNumberOfCells(),1e-12)
1337         pass
1338     
1339     def test2D0DPointLocator(self):
1340         """
1341         For pointlocator fans, Remapper support following intersection
1342         IntersectionType == PointLocator
1343         - source == 2D
1344         - target == 0D
1345         """
1346         src = MEDCouplingUMesh("src",2)
1347         src.allocateCells()
1348         src.setCoords( DataArrayDouble([(0,0),(1,0),(0,1)]) )
1349         src.insertNextCell(NORM_TRI3,[0,1,2])
1350         trg = MEDCouplingUMesh.Build0DMeshFromCoords( DataArrayDouble([(0.4,0.3)]) )
1351         # P1P1
1352         rem=MEDCouplingRemapper()
1353         rem.setIntersectionType(PointLocator)
1354         rem.prepare(src,trg,"P1P1")
1355         self.checkMatrix(rem.getCrudeMatrix(),[{0:0.3,1:0.4,2:0.3}],src.getNumberOfNodes(),1e-12)
1356         # P1P0
1357         rem=MEDCouplingRemapper()
1358         rem.setIntersectionType(PointLocator)
1359         rem.prepare(src,trg,"P1P0")
1360         self.checkMatrix(rem.getCrudeMatrix(),[{0:0.3,1:0.4,2:0.3}],src.getNumberOfNodes(),1e-12)
1361         # P0P1
1362         rem=MEDCouplingRemapper()
1363         rem.setIntersectionType(PointLocator)
1364         rem.prepare(src,trg,"P0P1")
1365         self.checkMatrix(rem.getCrudeMatrix(),[{0:1.0}],src.getNumberOfNodes(),1e-12)
1366         # P0P0
1367         rem=MEDCouplingRemapper()
1368         rem.setIntersectionType(PointLocator)
1369         rem.prepare(src,trg,"P0P0")
1370         self.checkMatrix(rem.getCrudeMatrix(),[{0:1.0}],src.getNumberOfNodes(),1e-12)
1371         pass
1372
1373     def test1D0DPointLocator(self):
1374         """
1375         For pointlocator fans, Remapper support following intersection
1376         IntersectionType == PointLocator
1377         - source == 1D
1378         - target == 0D
1379         """
1380         # P1P1 - 0
1381         src = MEDCouplingUMesh("src",1)
1382         src.allocateCells()
1383         src.setCoords( DataArrayDouble([0,1]) )
1384         src.insertNextCell(NORM_SEG2,[0,1])
1385         trg = MEDCouplingUMesh.Build0DMeshFromCoords( DataArrayDouble([0.4]) )
1386         rem=MEDCouplingRemapper()
1387         rem.setIntersectionType(PointLocator)
1388         rem.prepare(src,trg,"P1P1")
1389         self.checkMatrix(rem.getCrudeMatrix(),[{0:0.6,1:0.4}],src.getNumberOfNodes(),1e-12)
1390         # P1P1 - 1
1391         src = MEDCouplingUMesh("src",1)
1392         src.allocateCells()
1393         src.setCoords( DataArrayDouble([0,1]) )
1394         src.insertNextCell(NORM_SEG2,[1,0]) # permutation
1395         trg = MEDCouplingUMesh.Build0DMeshFromCoords( DataArrayDouble([0.4]) )
1396         rem=MEDCouplingRemapper()
1397         rem.setIntersectionType(PointLocator)
1398         rem.prepare(src,trg,"P1P1")
1399         self.checkMatrix(rem.getCrudeMatrix(),[{0:0.6,1:0.4}],src.getNumberOfNodes(),1e-12)
1400         # P1P1 - 2
1401         src = MEDCouplingUMesh("src",1)
1402         src.allocateCells()
1403         src.setCoords( DataArrayDouble([1,0]) )
1404         src.insertNextCell(NORM_SEG2,[0,1])
1405         trg = MEDCouplingUMesh.Build0DMeshFromCoords( DataArrayDouble([0.4]) )
1406         rem=MEDCouplingRemapper()
1407         rem.setIntersectionType(PointLocator)
1408         rem.prepare(src,trg,"P1P1")
1409         self.checkMatrix(rem.getCrudeMatrix(),[{0:0.4,1:0.6}],src.getNumberOfNodes(),1e-12)
1410         # P1P1 - 3 - 2DCurve
1411         src = MEDCouplingUMesh("src",1)
1412         src.allocateCells()
1413         src.setCoords( DataArrayDouble([0,1]) )
1414         src.insertNextCell(NORM_SEG2,[0,1])
1415         trg = MEDCouplingUMesh.Build0DMeshFromCoords( DataArrayDouble([0.4]) )
1416         src.changeSpaceDimension(2) ; trg.changeSpaceDimension(2)
1417         src.rotate([-1.,-1.],1.2)
1418         trg.rotate([-1.,-1.],1.2)
1419         rem=MEDCouplingRemapper()
1420         rem.setIntersectionType(PointLocator)
1421         rem.prepare(src,trg,"P1P1")
1422         self.checkMatrix(rem.getCrudeMatrix(),[{0:0.6,1:0.4}],src.getNumberOfNodes(),1e-12)
1423         # P1P1 - 4
1424         src = MEDCouplingUMesh("src",1)
1425         src.allocateCells()
1426         src.setCoords( DataArrayDouble([1.1,7.6,2.3,5.4]) )
1427         src.insertNextCell(NORM_SEG2,[0,2])
1428         src.insertNextCell(NORM_SEG2,[2,3])
1429         src.insertNextCell(NORM_SEG2,[3,1])
1430         for eps in [0,1e-13,-1e-13]:
1431             trg = MEDCouplingUMesh.Build0DMeshFromCoords( DataArrayDouble([0.4,2.3+eps,4.,7.]) )
1432             rem=MEDCouplingRemapper()
1433             rem.setIntersectionType(PointLocator)
1434             rem.prepare(src,trg,"P1P1")
1435             rem.nullifiedTinyCoeffInCrudeMatrixAbs(1e-12)
1436             self.checkMatrix(rem.getCrudeMatrix(),[{}, {2: 2.0}, {2: 0.4516129032258065, 3: 0.5483870967741935}, {1: 0.7272727272727273, 3: 0.27272727272727265}],src.getNumberOfNodes(),1e-12)
1437         # P1P1 - 5 - descending order of coords in source mesh
1438         src = MEDCouplingUMesh("src",1)
1439         src.allocateCells()
1440         src.setCoords( DataArrayDouble([3.,1.]) )
1441         src.insertNextCell(NORM_SEG2,[0,1])
1442         trg = MEDCouplingUMesh.Build0DMeshFromCoords( DataArrayDouble([2.3]) )
1443         rem=MEDCouplingRemapper()
1444         rem.setIntersectionType(PointLocator)
1445         rem.prepare(src,trg,"P1P1")
1446         self.checkMatrix(rem.getCrudeMatrix(),[{0:0.65,1:0.35}],src.getNumberOfNodes(),1e-12)
1447         pass
1448
1449     def checkMatrix(self,mat1,mat2,nbCols,eps):
1450         self.assertEqual(len(mat1),len(mat2))
1451         for i in range(len(mat1)):
1452             if len(mat2[i].keys())>0:
1453                 self.assertTrue(max(mat2[i].keys())<nbCols)
1454             if len(mat1[i].keys())>0:
1455                 self.assertTrue(max(mat1[i].keys())<nbCols)
1456             if len(mat2[i].keys())>0:
1457                 self.assertTrue(min(mat2[i].keys())>=0)
1458             if len(mat1[i].keys())>0:
1459                 self.assertTrue(min(mat1[i].keys())>=0)
1460             s1=set(mat1[i].keys()) ; s2=set(mat2[i].keys())
1461             for elt in s1.intersection(s2):
1462                 self.assertTrue(abs(mat1[i][elt]-mat2[i][elt])<eps)
1463                 pass
1464             for elt in s1.difference(s2):
1465                 self.assertTrue(abs(mat1[i][elt])<eps)
1466                 pass
1467             for elt in s2.difference(s1):
1468                 self.assertTrue(abs(mat2[i][elt])<eps)
1469                 pass
1470             pass
1471         pass
1472
1473     def build2DSourceMesh_1(self):
1474         sourceCoords=[-0.3,-0.3, 0.7,-0.3, -0.3,0.7, 0.7,0.7]
1475         sourceConn=[0,3,1,0,2,3]
1476         sourceMesh=MEDCouplingUMesh.New("my name of mesh 2D",2)
1477         sourceMesh.allocateCells(2);
1478         sourceMesh.insertNextCell(NORM_TRI3,3,sourceConn[0:3]);
1479         sourceMesh.insertNextCell(NORM_TRI3,3,sourceConn[3:6]);
1480         sourceMesh.finishInsertingCells();
1481         myCoords=DataArrayDouble.New();
1482         myCoords.setValues(sourceCoords,4,2);
1483         sourceMesh.setCoords(myCoords);
1484         return sourceMesh;
1485
1486     def build2DTargetMesh_1(self):
1487         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 ]
1488         targetConn=[0,3,4,1, 1,4,2, 4,5,2, 6,7,4,3, 7,8,5,4]
1489         targetMesh=MEDCouplingUMesh.New();
1490         targetMesh.setMeshDimension(2);
1491         targetMesh.allocateCells(5);
1492         targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[0:4]);
1493         targetMesh.insertNextCell(NORM_TRI3,3,targetConn[4:7]);
1494         targetMesh.insertNextCell(NORM_TRI3,3,targetConn[7:10]);
1495         targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[10:14]);
1496         targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[14:18]);
1497         targetMesh.finishInsertingCells();
1498         myCoords=DataArrayDouble.New();
1499         myCoords.setValues(targetCoords,9,2);
1500         targetMesh.setCoords(myCoords);
1501         return targetMesh;
1502
1503     def build2DTargetMesh_3(self):
1504         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]
1505         targetConn=[0,4,5,1, 1,5,6,2, 2,6,7,3, 4,8,9,5]
1506         targetMesh=MEDCouplingUMesh.New();
1507         targetMesh.setMeshDimension(2);
1508         targetMesh.allocateCells(4);
1509         for i in range(4):
1510             targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[4*i:4*(i+1)])
1511             pass
1512         targetMesh.finishInsertingCells();
1513         myCoords=DataArrayDouble.New();
1514         myCoords.setValues(targetCoords,10,2);
1515         targetMesh.setCoords(myCoords);
1516         return targetMesh;
1517         pass
1518
1519     def setUp(self):
1520         pass
1521     pass
1522
1523 if __name__ == "__main__":
1524   unittest.main()