X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDCoupling_Swig%2FMEDCouplingRemapperTest.py;h=50157d00b6251da826b9cd5d7bf06e35a8205da5;hb=0d89ead3756a73241e61fc46b60e59104b4be02c;hp=44b0f8bd399674ba33bb3df3185dee4b7b90e099;hpb=6bfd8d6afb47fa46fd8fa0bc98d7fe057790460c;p=tools%2Fmedcoupling.git diff --git a/src/MEDCoupling_Swig/MEDCouplingRemapperTest.py b/src/MEDCoupling_Swig/MEDCouplingRemapperTest.py index 44b0f8bd3..50157d00b 100644 --- a/src/MEDCoupling_Swig/MEDCouplingRemapperTest.py +++ b/src/MEDCoupling_Swig/MEDCouplingRemapperTest.py @@ -1,5 +1,5 @@ # -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2014 CEA/DEN, EDF R&D +# Copyright (C) 2007-2015 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -786,6 +786,115 @@ class MEDCouplingBasicsTest(unittest.TestCase): self.assertTrue(coarse.isEqual(trgField.getArray(),1e-12)) pass + @unittest.skipUnless(MEDCouplingHasNumPyBindings() and MEDCouplingHasSciPyBindings(),"requires numpy AND scipy") + def test1DPointLocator1(self): + """This test focuses on PointLocator for P1P1 in 1D and 2DCurve.""" + from numpy import array + from scipy.sparse import diags,csr_matrix,identity + ## basic case 1D + arrS=DataArrayInt.Range(0,11,1).convertToDblArr() + arrT=DataArrayDouble([0.1,1.7,5.5,9.6]) + mS=MEDCouplingCMesh() ; mS.setCoords(arrS) + mT=MEDCouplingCMesh() ; mT.setCoords(arrT) + rem=MEDCouplingRemapper() + rem.setIntersectionType(PointLocator) + self.assertEqual(rem.prepare(mS.buildUnstructured(),mT.buildUnstructured(),"P1P1"),1) + m=rem.getCrudeCSRMatrix() + rowSum=m.sum(axis=1) + m=diags(array(1/rowSum.transpose()),[0])*m + # expected matrix + row=array([0,0,1,1,2,2,3,3]) + col=array([0,1,1,2,5,6,9,10]) + data=array([0.9,0.1,0.3,0.7,0.5,0.5,0.4,0.6]) + mExp0=csr_matrix((data,(row,col)),shape=(4,11)) + # compute diff and check + diff=abs(m-mExp0) + self.assertAlmostEqual(diff.sum(),0.,14) + ## full specific case 1D where target=source + rem=MEDCouplingRemapper() + rem.setIntersectionType(PointLocator) + self.assertEqual(rem.prepare(mS.buildUnstructured(),mS.buildUnstructured(),"P1P1"),1) + m=rem.getCrudeCSRMatrix() + rowSum=m.sum(axis=1) + m=diags(array(1/rowSum.transpose()),[0])*m + # expected matrix + mExp1=identity(11) + diff=abs(m-mExp1) + self.assertAlmostEqual(diff.sum(),0.,14) + ## case where some points in target are not in source + arrT=DataArrayDouble([-0.2,0.1,1.7,5.5,10.3]) + mT=MEDCouplingCMesh() ; mT.setCoords(arrT) + mT=mT.buildUnstructured() + rem=MEDCouplingRemapper() + rem.setIntersectionType(PointLocator) + self.assertEqual(rem.prepare(mS.buildUnstructured(),mT,"P1P1"),1) + m=rem.getCrudeCSRMatrix() + row=array([1,1,2,2,3,3]) + col=array([0,1,1,2,5,6]) + data=array([0.9,0.1,0.3,0.7,0.5,0.5]) + mExp2=csr_matrix((data,(row,col)),shape=(5,11)) + diff=abs(m-mExp2) + self.assertAlmostEqual(diff.sum(),0.,14) + ## basic case 2D Curve + arrS=DataArrayInt.Range(0,11,1).convertToDblArr() + arrT=DataArrayDouble([0.1,1.7,5.5,9.6]) + mS=MEDCouplingCMesh() ; mS.setCoords(arrS) + mT=MEDCouplingCMesh() ; mT.setCoords(arrT) + mS=mS.buildUnstructured() ; mS.changeSpaceDimension(2) + mT=mT.buildUnstructured() ; mT.changeSpaceDimension(2) + mS.rotate([-1.,-1.],1.2) + mT.rotate([-1.,-1.],1.2) + rem=MEDCouplingRemapper() + rem.setIntersectionType(PointLocator) + self.assertEqual(rem.prepare(mS,mT,"P1P1"),1) + m=rem.getCrudeCSRMatrix() + rowSum=m.sum(axis=1) + m=diags(array(1/rowSum.transpose()),[0])*m + diff=abs(m-mExp0) + self.assertAlmostEqual(diff.sum(),0.,14) + pass + + def test3D2Dand2D3DPointLocator1(self): + """ Non regression test solving SIGSEGV when using 3D<->3Dsurf pointlocator.""" + arrX=DataArrayDouble([0,1,2]) + arrY=DataArrayDouble([0,1]) + arrZ=DataArrayDouble([0,1]) + ms=MEDCouplingCMesh() ; ms.setCoords(arrX,arrY,arrZ) + ms=ms.buildUnstructured() ; ms.setName("source") + # + mt=MEDCouplingUMesh("target",2) ; mt.allocateCells() + mt.insertNextCell(NORM_TRI3,[0,4,6]) + mt.insertNextCell(NORM_TRI3,[1,5,7]) + mt.setCoords(ms.getCoords()[:]) + mt.zipCoords() + # + rem=MEDCouplingRemapper() + rem.setIntersectionType(PointLocator) + rem.prepare(ms,mt,"P0P0") + self.assertEqual(rem.getCrudeMatrix(),[{0: 1.0}, {1: 1.0}]) + rem2=MEDCouplingRemapper() + rem2.setIntersectionType(PointLocator) + rem2.prepare(mt,ms,"P0P0") # reverse mt<->ms + self.assertEqual(rem2.getCrudeMatrix(),[{0: 1.0}, {1: 1.0}]) + pass + + def test2D1Dand1D2DPointLocator1(self): + arrX=DataArrayDouble([0,1,2]) + arrY=DataArrayDouble([0,1]) + ms=MEDCouplingCMesh() ; ms.setCoords(arrX,arrY) ; ms=ms.buildUnstructured() + mt=MEDCouplingUMesh("target",1) ; mt.setCoords(ms.getCoords()[:]) + mt.allocateCells() + mt.insertNextCell(NORM_SEG2,[0,4]) ; mt.insertNextCell(NORM_SEG2,[1,5]) + rem=MEDCouplingRemapper() + rem.setIntersectionType(PointLocator) + rem.prepare(ms,mt,"P0P0") + self.assertEqual(rem.getCrudeMatrix(),[{0:1.},{1:1.}]) + rem=MEDCouplingRemapper() + rem.setIntersectionType(PointLocator) + rem.prepare(mt,ms,"P0P0") + self.assertEqual(rem.getCrudeMatrix(),[{0:1.},{1:1.}]) + pass + def build2DSourceMesh_1(self): sourceCoords=[-0.3,-0.3, 0.7,-0.3, -0.3,0.7, 0.7,0.7] sourceConn=[0,3,1,0,2,3]