1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2020 CEA/DEN, EDF R&D
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 from MEDCouplingDataForTest import MEDCouplingDataForTest
22 from MEDCouplingRemapper import *
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()):
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)
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);
58 self.assertTrue(1==trgfield.getArray().getNumberOfComponents());
61 def testPrepareEx1(self):
62 sourceMesh=self.build2DSourceMesh_1();
63 targetMesh=self.build2DTargetMesh_3();
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()):
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());
89 self.assertAlmostEqual(valuesExpected[i0],values[i0],12);
93 def testPartialTransfer1(self):
94 sourceMesh=self.build2DSourceMesh_1();
95 targetMesh=self.build2DTargetMesh_3();
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()):
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()):
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());
131 self.assertAlmostEqual(valuesExpected[i0],values[i0],12);
135 def testPrepareUC(self):
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);
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);
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);
191 def testPrepareCU(self):
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.)
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);
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);
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);
247 def testPrepareCC(self):
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.)
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);
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);
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);
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])
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)
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))
323 f1.setNature(ExtensiveMaximum) ; f2.setNature(ExtensiveMaximum)
324 f11=rem1.transferField(f1,1e300) ; f22=rem2.transferField(f2,1e300)
326 expected2=DataArrayDouble([41.12])
327 self.assertTrue(f11.getArray().isEqual(expected2,1e-13))
328 self.assertTrue(f22.getArray().isEqual(expected2,1e-13))
331 def testCellToNodeReverse3D(self):
332 c=DataArrayDouble([0.,1.,2.5])
333 cc=MEDCouplingCMesh()
335 um=cc.buildUnstructured()
336 f=um.getMeasureField(False)
338 n2o=um.simplexize(PLANAR_FACE_5)
339 f.setArray(f.getArray()[n2o])
340 f.checkConsistencyLight()
341 f.setNature(IntensiveMaximum)
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)
354 integExpected=34.328125
355 self.assertAlmostEqual(fNode.integral(False)[0],integExpected,14)
356 self.assertAlmostEqual(f.integral(False)[0],integExpected,14)
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))
378 # second part of the test : reverse source and target
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))
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))
413 # second part of the test : reverse source and target
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))
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])
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
575 self.assertEqual(len(m[i]),0)
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)
590 def testSwig2MappedBarycentricP1P12D_1(self):
591 """ Testing mapped barycentric P1P1 projection
592 (uses analytical mapping from square to arbitrary convex quadrangle)
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
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)
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])
633 def testSwig2MappedBarycentricP1P13_1(self):
634 """ Testing mapped barycentric P1P1 projection in 3D (uses orthogonal distances to
648 sCoo = DataArrayDouble(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
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
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)
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]
709 val = tgtF.getArray().getValues()
710 for i, ref_v in enumerate(ref):
711 self.assertAlmostEqual(ref_v, val[i])
714 @unittest.skipUnless(MEDCouplingHasNumPyBindings() and MEDCouplingHasSciPyBindings(),"requires numpy AND scipy")
715 def testGetCrudeCSRMatrix1(self):
716 """ testing CSR matrix output using numpy/scipy.
718 from scipy.sparse import spdiags #diags
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]
727 rem=MEDCouplingRemapper()
728 rem.prepare(src,trg,"P0P0")
729 # Internal crude sparse matrix computed. Let's manipulate it using CSR matrix in scipy.
731 m=rem.getCrudeCSRMatrix()
733 m2=rem.getCrudeCSRMatrix()
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)
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])
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)
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
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)
773 @unittest.skipUnless(MEDCouplingHasNumPyBindings() and MEDCouplingHasSciPyBindings(),"requires numpy AND scipy")
774 def testP0P1Bary_1(self):
775 a=MEDCouplingUMesh("a",2)
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))
780 a.insertNextCell(NORM_QUAD4,conna[4*i:4*(i+1)])
782 a.finishInsertingCells() ; a.simplexize(0)
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)
788 b.insertNextCell(NORM_TRI3,connb[3*i:3*(i+1)])
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))
792 rem=MEDCouplingRemapper() ; rem.setIntersectionType(Barycentric)
793 rem.prepare(a,b,"P1P0")
794 m0=rem.getCrudeCSRMatrix()
795 self.assertEqual(m0.nnz,312)
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):
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])))
812 rem2=MEDCouplingRemapper() ; rem2.setIntersectionType(Barycentric)
813 rem2.prepare(b,a,"P0P1")
814 m1=rem2.getCrudeCSRMatrix()
815 self.assertEqual(m1.nnz,312)
817 m1=rem2.getCrudeCSRMatrix()
820 self.assertTrue(DataArrayDouble(delta.data).isUniform(0.,1e-17))
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)
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.
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])))
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.
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")
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])
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)
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))
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)
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)
902 trgField=MEDCouplingFieldDouble(ON_CELLS)
903 coarse2=DataArrayDouble(35) ; coarse2.iota(0) ; trgField.setArray(coarse2)
904 trgField.setMesh(trgMesh) ; trgField.setNature(ExtensiveMaximum)
906 rem=MEDCouplingRemapper()
907 rem.prepare(srcMesh,trgMesh,"P0P0")
908 rem.partialTransfer(srcField,trgField)
910 self.assertTrue(coarse.isEqual(trgField.getArray(),1e-12))
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
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()
928 m=diags(array(1/rowSum.transpose()),[0])*m
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
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()
943 m=diags(array(1/rowSum.transpose()),[0])*m
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))
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()
976 m=diags(array(1/rowSum.transpose()),[0])*m
978 self.assertAlmostEqual(diff.sum(),0.,14)
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")
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()[:])
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)
1002 # 2D to 3D with point locator does not make sense:
1004 self.assertRaises(InterpKernelException, rem2.prepare,mt,ms,"P0P0")
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()[:])
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.}])
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.
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]))
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}])
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(), [{}, {}])
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]))
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])
1072 arrTrg=fsrc.getValueOnMulti(trg.getCoords())
1073 ftrg=MEDCouplingFieldDouble(ON_NODES)
1075 ftrg.setArray(arrTrg)
1076 ftrg.checkConsistencyLight()
1077 ftrg.setNature(IntensiveMaximum)
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))
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)
1094 src=MEDCouplingMappedExtrudedMesh(src) ; trg=MEDCouplingMappedExtrudedMesh(trg)
1095 pt1=src.getMesh2D().getCoords().getHiddenCppPointer() ; pt2=trg.getMesh2D().getCoords().getHiddenCppPointer()
1097 rem=MEDCouplingRemapper()
1098 rem.prepare(src,trg,"P0P0")
1099 self.checkMatrix(rem.getCrudeMatrix(),[{0:0.125,1:0.25}],src.getNumberOfCells(),1e-12)
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)
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)
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]
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]
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))
1128 # Recognize the HEXGP12:
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)
1140 def testP0P0KillerTet(self):
1141 """ The killer tetrahedron detected by LMEC!"""
1142 mesh = MEDCouplingUMesh('SupportOf_ECHIA1_Tin', 3)
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)])
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)])
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]))
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
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)
1171 trg.insertNextCell(NORM_POINT1,[rt])
1174 srcArr=DataArrayDouble([(0.,0.,1.),(0.,0.,0.),(1.,1.,1.)])
1175 src=MEDCouplingUMesh("src",1) ; src.setCoords(srcArr)
1177 src.insertNextCell(NORM_SEG2,[1,2])
1179 trg=generateTrg(1e-7)# trg point 3 of trg cell 1 is NOT closer enough to source edge #1 -> not intercepted
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))
1190 self.assertAlmostEqual(delta.sum(),0.,14)
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)
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)
1215 fs.setArray(DataArrayDouble([10]))
1216 fs.checkConsistencyLight()
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
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
1224 fs.setNature(IntensiveConservation)
1225 self.assertTrue(rem.transferField(fs,1e300).getArray().isEqual(DataArrayDouble([2./9.*10.,1./18.*10.]),1e-12))#
1227 fs.setNature(IntensiveMaximum)
1228 self.assertTrue(rem.transferField(fs,1e300).getArray().isEqual(DataArrayDouble([10.,10.]),1e-12))#
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))
1235 fs.setNature(ExtensiveMaximum)
1236 self.assertTrue(rem2.transferField(fs,1e300).getArray().isEqual(DataArrayDouble([20./6.,10./6.]),1e-12))
1238 fs.setNature(IntensiveConservation)
1239 self.assertTrue(rem2.transferField(fs,1e300).getArray().isEqual(DataArrayDouble([2./9.*10.,1./18.*10.]),1e-12))
1241 fs.setNature(IntensiveMaximum)
1242 self.assertTrue(rem2.transferField(fs,1e300).getArray().isEqual(DataArrayDouble([10.,10.]),1e-12))
1244 srcFt=MEDCouplingFieldTemplate.New(ON_CELLS);
1245 trgFt=MEDCouplingFieldTemplate.New(ON_CELLS);
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))
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()
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()
1267 rem=MEDCouplingRemapper()
1268 self.assertEqual(rem.prepare(ms,mt,"P0P0"),1)
1270 fs=MEDCouplingFieldDouble(ON_CELLS)
1272 arr=DataArrayDouble(25) ; arr.iota()
1274 fs.checkConsistencyLight()
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))
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)
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)
1305 def test3D0DPointLocator(self):
1307 For pointlocator fans, Remapper support following intersection
1308 IntersectionType == PointLocator
1312 src = MEDCouplingUMesh("src",3)
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)]) )
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)
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)
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)
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)
1339 def test2D0DPointLocator(self):
1341 For pointlocator fans, Remapper support following intersection
1342 IntersectionType == PointLocator
1346 src = MEDCouplingUMesh("src",2)
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)]) )
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)
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)
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)
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)
1373 def test1D0DPointLocator(self):
1375 For pointlocator fans, Remapper support following intersection
1376 IntersectionType == PointLocator
1381 src = MEDCouplingUMesh("src",1)
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)
1391 src = MEDCouplingUMesh("src",1)
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)
1401 src = MEDCouplingUMesh("src",1)
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)
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)
1424 src = MEDCouplingUMesh("src",1)
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)
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)
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)
1464 for elt in s1.difference(s2):
1465 self.assertTrue(abs(mat1[i][elt])<eps)
1467 for elt in s2.difference(s1):
1468 self.assertTrue(abs(mat2[i][elt])<eps)
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);
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);
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);
1510 targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[4*i:4*(i+1)])
1512 targetMesh.finishInsertingCells();
1513 myCoords=DataArrayDouble.New();
1514 myCoords.setValues(targetCoords,10,2);
1515 targetMesh.setCoords(myCoords);
1523 if __name__ == "__main__":