X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDCoupling_Swig%2FMEDCouplingRemapperTest.py;h=9293976d45b190864fbf07d0d2e454b6f44e1670;hb=b7e277ad50223814bc479c5bd64cf12abe8fc959;hp=061af89b7f7ad78a03ecb40d05528fd70ffb80fc;hpb=9fda818a38b3b3350b25d22e17176cc7f0d52e81;p=tools%2Fmedcoupling.git diff --git a/src/MEDCoupling_Swig/MEDCouplingRemapperTest.py b/src/MEDCoupling_Swig/MEDCouplingRemapperTest.py index 061af89b7..9293976d4 100644 --- a/src/MEDCoupling_Swig/MEDCouplingRemapperTest.py +++ b/src/MEDCoupling_Swig/MEDCouplingRemapperTest.py @@ -333,7 +333,7 @@ class MEDCouplingBasicsTest(unittest.TestCase): cc=MEDCouplingCMesh() cc.setCoords(c,c,c) um=cc.buildUnstructured() - f=um.getMeasureField(ON_CELLS) + f=um.getMeasureField(False) # n2o=um.simplexize(PLANAR_FACE_5) f.setArray(f.getArray()[n2o]) @@ -605,11 +605,11 @@ class MEDCouplingBasicsTest(unittest.TestCase): pt_c = coo.deepCopy(); pt_c[:,0] = 1.0; pt_c[:,1] = 0.0 # P = x*C+y*A + xy(B-A-C) + ORIGIN coo2 = coo[:,0]*pt_c + coo[:, 1]*pt_a + coo[:, 0]*coo[:, 1]*(pt_b - pt_a - pt_c) + orig - + tgt.setCoords(coo2) - + sCoo = DataArrayDouble([0.0,0.0, -0.3,1.0, 2.0,3.0, 1.0,0.0],4,2) - sCoo[:,0] += 10.0; sCoo[:,1] += 15.0; + sCoo[:,0] += 10.0; sCoo[:,1] += 15.0; sConn = DataArrayInt([0,1,2,3]) s = MEDCoupling1SGTUMesh("source",NORM_QUAD4) ; s.setCoords(sCoo) s.setNodalConnectivity(sConn) @@ -623,11 +623,11 @@ class MEDCouplingBasicsTest(unittest.TestCase): srcField.setMesh(s); srcField.setName("field") srcField.setArray(DataArrayDouble([1.0,2.0,3.0,4.0])) tgtF = aRemapper.transferField(srcField, 1e+300) - 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, + 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, 2.125, 2.5, 2.875, 3.25, 2.0, 2.25, 2.5, 2.75, 3.0] val = tgtF.getArray().getValues() for i, ref_v in enumerate(ref): - self.assertAlmostEqual(ref_v, val[i]) + self.assertAlmostEqual(ref_v, val[i]) pass def testSwig2MappedBarycentricP1P13_1(self): @@ -658,10 +658,10 @@ class MEDCouplingBasicsTest(unittest.TestCase): pt_1 = coo.deepCopy(); pt_1[:,0] = 0.0; pt_1[:,1] = 0.0; pt_1[:,2] = 1.0 pt_2 = coo.deepCopy(); pt_2[:,0] = 1.0; pt_2[:,1] = 0.0; pt_2[:,2] = 1.0 pt_3 = coo.deepCopy(); pt_3[:,0] = 2.0; pt_3[:,1] = 3.0; pt_3[:,2] = 1.0 - + pt_4 = coo.deepCopy(); pt_4[:,0] = -0.3; pt_4[:,1] = 1.0; pt_4[:,2] = 0.0 orig = coo.deepCopy(); orig[:,0] = 10.0; orig[:,1] = 15.0; orig[:,2] = 20.0 - pt_6 = coo.deepCopy(); pt_6[:,0] = 1.0; pt_6[:,1] = 0.0; pt_6[:,2] = 0.0 + pt_6 = coo.deepCopy(); pt_6[:,0] = 1.0; pt_6[:,1] = 0.0; pt_6[:,2] = 0.0 pt_7 = coo.deepCopy(); pt_7[:,0] = 2.0; pt_7[:,1] = 3.0; pt_7[:,2] = 0.0 # 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) x,y,z = coo[:,0],coo[:,1],coo[:,2] @@ -669,10 +669,10 @@ class MEDCouplingBasicsTest(unittest.TestCase): x*y*(pt_7 - pt_6 - pt_4) + x*z*(pt_2 - pt_1 - pt_6) + y*z*(pt_0 - pt_4 - pt_1) + \ x*y*z*(pt_3 - pt_7 - pt_2 - pt_0 + pt_6 + pt_1 + pt_4) + orig tgt.setCoords(coo2) - - 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, + + 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, -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) - sCoo[:, 0] += 10.0; sCoo[:, 1] += 15.0; sCoo[:, 2] += 20.0; + sCoo[:, 0] += 10.0; sCoo[:, 1] += 15.0; sCoo[:, 2] += 20.0; sConn = DataArrayInt([0,1,2,3,4, 5,6,7]) s = MEDCoupling1SGTUMesh("source",NORM_HEXA8) ; s.setCoords(sCoo) s.setNodalConnectivity(sConn) @@ -687,28 +687,28 @@ class MEDCouplingBasicsTest(unittest.TestCase): srcField.setArray(DataArrayDouble([1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0])) tgtF = aRemapper.transferField(srcField, 1e+300) # print tgtF.getArray().getValues() - ref = [6.0, 6.251802698104413, 6.502397834044702, 6.7517940736426665, 7.0, 5.740554726834594, - 6.1761835575796935, 6.6052985689637564, 7.009392769824465, 7.383488834310164, - 5.487562931129931, 6.140664596972973, 6.720290674177548, 7.220534970454015, 7.651092836860121, - 5.2407867837524345, 6.125759809889516, 6.82853486793175, 7.390880823876876, 7.848445254819061, - 5.0, 6.12211344611157, 6.925740671133115, 7.529623182840827, 8.0, 5.0, 5.251802698104413, - 5.502397834044702, 5.751794073642667, 6.0, 4.740554726834594, 5.1761835575796935, + ref = [6.0, 6.251802698104413, 6.502397834044702, 6.7517940736426665, 7.0, 5.740554726834594, + 6.1761835575796935, 6.6052985689637564, 7.009392769824465, 7.383488834310164, + 5.487562931129931, 6.140664596972973, 6.720290674177548, 7.220534970454015, 7.651092836860121, + 5.2407867837524345, 6.125759809889516, 6.82853486793175, 7.390880823876876, 7.848445254819061, + 5.0, 6.12211344611157, 6.925740671133115, 7.529623182840827, 8.0, 5.0, 5.251802698104413, + 5.502397834044702, 5.751794073642667, 6.0, 4.740554726834594, 5.1761835575796935, 5.6052985689637564, 6.009392769824465, 6.383488834310163, 4.487562931129931, 5.140664596972973, - 5.720290674177548, 6.220534970454015, 6.651092836860121, 4.2407867837524345, 5.125759809889516, - 5.828534867931749, 6.390880823876876, 6.848445254819061, 4.0, 5.122113446111569, 5.925740671133115, - 6.529623182840827, 7.0, 4.0, 4.251802698104413, 4.502397834044702, 4.751794073642667, 5.0, 3.740554726834594, - 4.176183557579693, 4.6052985689637564, 5.009392769824464, 5.383488834310164, 3.487562931129931, - 4.140664596972973, 4.720290674177548, 5.220534970454015, 5.651092836860121, 3.240786783752434, 4.125759809889516, 4.82853486793175, - 5.390880823876876, 5.848445254819061, 3.0, 4.122113446111569, 4.925740671133115, 5.529623182840827, 6.0, 3.0, - 3.2518026981044135, 3.502397834044702, 3.7517940736426674, 4.0, 2.7405547268345933, 3.176183557579693, - 3.6052985689637564, 4.009392769824465, 4.383488834310164, 2.487562931129931, 3.140664596972973, 3.7202906741775474, 4.220534970454015, 4.65109283686012, 2.2407867837524345, 3.1257598098895154, 3.828534867931749, - 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, - 3.0093927698244642, 3.3834888343101635, 1.4875629311299305, 2.1406645969729734, 2.720290674177548, + 5.720290674177548, 6.220534970454015, 6.651092836860121, 4.2407867837524345, 5.125759809889516, + 5.828534867931749, 6.390880823876876, 6.848445254819061, 4.0, 5.122113446111569, 5.925740671133115, + 6.529623182840827, 7.0, 4.0, 4.251802698104413, 4.502397834044702, 4.751794073642667, 5.0, 3.740554726834594, + 4.176183557579693, 4.6052985689637564, 5.009392769824464, 5.383488834310164, 3.487562931129931, + 4.140664596972973, 4.720290674177548, 5.220534970454015, 5.651092836860121, 3.240786783752434, 4.125759809889516, 4.82853486793175, + 5.390880823876876, 5.848445254819061, 3.0, 4.122113446111569, 4.925740671133115, 5.529623182840827, 6.0, 3.0, + 3.2518026981044135, 3.502397834044702, 3.7517940736426674, 4.0, 2.7405547268345933, 3.176183557579693, + 3.6052985689637564, 4.009392769824465, 4.383488834310164, 2.487562931129931, 3.140664596972973, 3.7202906741775474, 4.220534970454015, 4.65109283686012, 2.2407867837524345, 3.1257598098895154, 3.828534867931749, + 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, + 3.0093927698244642, 3.3834888343101635, 1.4875629311299305, 2.1406645969729734, 2.720290674177548, 3.2205349704540143, 3.6510928368601205, 1.2407867837524345, 2.125759809889516, 2.8285348679317495, 3.390880823876876, 3.848445254819061, 1.0, 2.1221134461115687, 2.9257406711331146, 3.529623182840827, 4.0] val = tgtF.getArray().getValues() for i, ref_v in enumerate(ref): - self.assertAlmostEqual(ref_v, val[i]) + self.assertAlmostEqual(ref_v, val[i]) pass @unittest.skipUnless(MEDCouplingHasNumPyBindings() and MEDCouplingHasSciPyBindings(),"requires numpy AND scipy") @@ -769,7 +769,7 @@ class MEDCouplingBasicsTest(unittest.TestCase): self.assertAlmostEqual(m_1[2,3],0.3,12) self.assertEqual(m_1.getnnz(),7) pass - + @unittest.skipUnless(MEDCouplingHasNumPyBindings() and MEDCouplingHasSciPyBindings(),"requires numpy AND scipy") def testP0P1Bary_1(self): a=MEDCouplingUMesh("a",2) @@ -836,7 +836,7 @@ class MEDCouplingBasicsTest(unittest.TestCase): # rem=MEDCouplingRemapper() rem.setMaxDistance3DSurfIntersect(1e-12) - rem.setMinDotBtwPlane3DSurfIntersect(0.99)# this line is important it is to tell to remapper to select only cells with very close orientation + rem.setMinDotBtwPlane3DSurfIntersect(0.99)# this line is important it is to tell to remapper to select only cells with very close orientation rem.prepare(skinAndNonConformCells,skinAndNonConformCells,"P0P0") mat=rem.getCrudeCSRMatrix() indptr=DataArrayInt(mat.indptr) @@ -909,7 +909,7 @@ 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.""" @@ -977,7 +977,7 @@ class MEDCouplingBasicsTest(unittest.TestCase): 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]) @@ -1018,7 +1018,143 @@ class MEDCouplingBasicsTest(unittest.TestCase): rem.prepare(mt,ms,"P0P0") self.assertEqual(rem.getCrudeMatrix(),[{0:1.},{1:1.}]) pass - + + def test3D1DPointLocatorBBoxAdjusted(self): + """ In case a 1D segment lies exactly on the interface between two 2D (or 3D) faces, the default + bounding box logic will make it non-intersecting with the surrounding 2D (or 3D) faces. + Test bounding box adjustment allowing to widen the BB to capture this. + """ + m = MEDCouplingCMesh("source") + di, dd = DataArrayInt, DataArrayDouble + m.setCoordsAt(0, dd([0.0, 1.0, 2.0])) + m.setCoordsAt(1, dd([0.0, 1.0])) + m.setCoordsAt(2, dd([0.0, 1.0])) + m3d = m.buildUnstructured() + m1d = MEDCouplingUMesh("target", 1) + m1d.setCoords(dd([1.0,0.5,0.2 , 1.0,0.5,0.8], 2,3)) + m1d.setConnectivity(di([NORM_SEG2, 0, 1]), di([0,3])) + + rem = MEDCouplingRemapper() + rem.setPrecision(1e-12) + rem.setIntersectionType(PointLocator) + rem.prepare(m3d, m1d,"P0P1") + self.assertEqual(rem.getCrudeMatrix(), [{0: 1.0, 1: 1.0}, {0: 1.0, 1: 1.0}]) + + rem = MEDCouplingRemapper() + rem.setPrecision(1e-12) + rem.setIntersectionType(PointLocator) + rem.setBoundingBoxAdjustment(0.0) + rem.setBoundingBoxAdjustmentAbs(0.0) + rem.prepare(m3d, m1d,"P0P1") + self.assertEqual(rem.getCrudeMatrix(), [{}, {}]) + pass + + def testPointLocator3DTo2D(self): + """Target mesh has spaceDim==3 and meshDim==2. Source has spaceDim==3 and meshDim==3. Here we are on pointlocator alg. + The test evaluates on each nodes of target mesh the bary coor into source mesh.""" + src=MEDCouplingCMesh() + arr=DataArrayDouble([0,1,2]) + src.setCoords(arr,arr,arr) + src=src.buildUnstructured() + src.simplexize(PLANAR_FACE_5) + fsrc=MEDCouplingFieldDouble(ON_NODES) ; fsrc.setMesh(src) + 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])) + # + trg=MEDCouplingCMesh() + arr=DataArrayDouble([0,1]) + trg.setCoords(arr,arr) + trg=trg.buildUnstructured() + trg.changeSpaceDimension(3,0.) + trg.translate([0.5,0.5,0.5]) + # + arrTrg=fsrc.getValueOnMulti(trg.getCoords()) + ftrg=MEDCouplingFieldDouble(ON_NODES) + ftrg.setMesh(trg) + ftrg.setArray(arrTrg) + ftrg.checkConsistencyLight() + ftrg.setNature(IntensiveMaximum) + # + fsrc.setNature(IntensiveMaximum) + remap=MEDCouplingRemapper() + remap.setIntersectionType(PointLocator) + self.assertEqual(remap.prepare(src,trg,"P1P1"),1) + ftrg2=remap.transferField(fsrc,1e300) + self.assertTrue(ftrg.isEqual(ftrg2,1e-12,1e-12)) + pass + + def testExtrudedOnDiffZLev1(self): + """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""" + arrX=DataArrayDouble([0,1]) ; arrY=DataArrayDouble([0,1]) ; arrZ=DataArrayDouble([0,1,2]) + src=MEDCouplingCMesh() ; src.setCoords(arrX,arrY,arrZ) + arrX=DataArrayDouble([0.5,1.5]) ; arrY=DataArrayDouble([0.5,1.5]) ; arrZ=DataArrayDouble([0.5,2]) + trg=MEDCouplingCMesh() ; trg.setCoords(arrX,arrY,arrZ) + # + src=MEDCouplingMappedExtrudedMesh(src) ; trg=MEDCouplingMappedExtrudedMesh(trg) + pt1=src.getMesh2D().getCoords().getHiddenCppPointer() ; pt2=trg.getMesh2D().getCoords().getHiddenCppPointer() + # + rem=MEDCouplingRemapper() + rem.prepare(src,trg,"P0P0") + self.checkMatrix(rem.getCrudeMatrix(),[{0:0.125,1:0.25}],src.getNumberOfCells(),1e-12) + # + self.assertEqual(src.getMesh2D().getSpaceDimension(),3) + self.assertEqual(trg.getMesh2D().getSpaceDimension(),3) + self.assertEqual(src.getMesh2D().getCoords().getHiddenCppPointer(),pt1) + self.assertEqual(trg.getMesh2D().getCoords().getHiddenCppPointer(),pt2) + # + rem2=MEDCouplingRemapper() + rem2.setIntersectionType(Geometric2D) + rem2.prepare(src,trg,"P0P0") + self.checkMatrix(rem2.getCrudeMatrix(),[{0:0.125,1:0.25}],src.getNumberOfCells(),1e-12) + pass + + def testP0P0WithHEXGP12(self): + """ Test that HEXGP12 are correclty remapped (elements with polygonal faces were not properly handled) """ + # From Astrid, two disjoint hexagonal prisms: + 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] + 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] + 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] + cI1 = [0, 44] + 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] + cI2 = [0, 44] + mTgt = MEDCouplingUMesh("target", 3) + mSrc = MEDCouplingUMesh("src", 3) + mTgt.setCoords(DataArrayDouble(coo1, len(coo1)/3, 3)) + mSrc.setCoords(DataArrayDouble(coo2, len(coo2)/3, 3)) + mTgt.setConnectivity(DataArrayInt(conn1), DataArrayInt(cI1)) + mSrc.setConnectivity(DataArrayInt(conn2), DataArrayInt(cI2)) + + # Recognize the HEXGP12: + mTgt.unPolyze() + mSrc.unPolyze() + + rmp = MEDCouplingRemapper() + rmp.setIntersectionType(Triangulation) + rmp.prepare(mSrc, mTgt, "P0P0") + mat = rmp.getCrudeMatrix() + self.assertEqual(len(mat[0]), 0) + self.assertEqual(len(mat), 1) + pass + + def checkMatrix(self,mat1,mat2,nbCols,eps): + self.assertEqual(len(mat1),len(mat2)) + for i in xrange(len(mat1)): + self.assertTrue(max(mat2[i].keys())=0) + self.assertTrue(min(mat1[i].keys())>=0) + s1=set(mat1[i].keys()) ; s2=set(mat2[i].keys()) + for elt in s1.intersection(s2): + self.assertTrue(abs(mat1[i][elt]-mat2[i][elt])