X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDCoupling_Swig%2FMEDCouplingRemapperTest.py;h=50157d00b6251da826b9cd5d7bf06e35a8205da5;hb=0d89ead3756a73241e61fc46b60e59104b4be02c;hp=ef181bc32813541d9f2385c290f52875c3624564;hpb=1a9af3cb21941312cdda3f0466677b61beba7ade;p=tools%2Fmedcoupling.git diff --git a/src/MEDCoupling_Swig/MEDCouplingRemapperTest.py b/src/MEDCoupling_Swig/MEDCouplingRemapperTest.py index ef181bc32..50157d00b 100644 --- a/src/MEDCoupling_Swig/MEDCouplingRemapperTest.py +++ b/src/MEDCoupling_Swig/MEDCouplingRemapperTest.py @@ -1,10 +1,10 @@ # -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2013 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 # License as published by the Free Software Foundation; either -# version 2.1 of the License. +# version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -760,6 +760,140 @@ class MEDCouplingBasicsTest(unittest.TestCase): 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.]) self.assertTrue(f2Test.getArray().isEqual(expArr2,1e-12)) pass + + def testRemapperAMR1(self): + """ This test is the origin of the ref values for MEDCouplingBasicsTest.testAMR2""" + coarse=DataArrayDouble(35) ; coarse.iota(0) #X=5,Y=7 + fine=DataArrayDouble(3*2*4*4) ; fine.iota(0) #X=3,Y=2 refined by 4 + MEDCouplingIMesh.CondenseFineToCoarse([5,7],fine,[(1,4),(2,4)],[4,4],coarse) + # + m=MEDCouplingCartesianAMRMesh("mesh",2,[6,8],[0.,0.],[1.,1.]) + trgMesh=m.buildUnstructured() + m.addPatch([(1,4),(2,4)],[4,4]) + srcMesh=m[0].getMesh().buildUnstructured() + srcField=MEDCouplingFieldDouble(ON_CELLS) + fine2=DataArrayDouble(3*2*4*4) ; fine2.iota(0) ; srcField.setArray(fine2) + srcField.setMesh(srcMesh) ; srcField.setNature(Integral) + # + trgField=MEDCouplingFieldDouble(ON_CELLS) + coarse2=DataArrayDouble(35) ; coarse2.iota(0) ; trgField.setArray(coarse2) + trgField.setMesh(trgMesh) ; trgField.setNature(Integral) + # + rem=MEDCouplingRemapper() + rem.prepare(srcMesh,trgMesh,"P0P0") + rem.partialTransfer(srcField,trgField) + # + 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]