]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
[spns#34841] Intersect2DMeshWith1DLine : throw exception if any node within mesh1D...
authorkaradaniz <karadaniz@phimeca.com>
Thu, 15 Feb 2024 14:53:27 +0000 (15:53 +0100)
committerabn <adrien.bruneton@cea.fr>
Fri, 3 May 2024 11:51:59 +0000 (13:51 +0200)
src/MEDCoupling/MEDCouplingUMesh_intersection.cxx
src/MEDCoupling_Swig/MEDCouplingIntersectTest.py

index 8b569163d81018ac52ac1e63ad736a86b05e9605..036af8970cc344c9415c810721368db7c63c4037 100644 (file)
@@ -1791,8 +1791,22 @@ void MEDCouplingUMesh::Intersect2DMeshWith1DLine(const MEDCouplingUMesh *mesh2D,
 {
   if(!mesh2D || !mesh1D)
     throw INTERP_KERNEL::Exception("MEDCouplingUMesh::Intersect2DMeshWith1DLine : input meshes must be not NULL !");
+  
   mesh2D->checkFullyDefined();
   mesh1D->checkFullyDefined();
+
+  { // (In a scope to free mem early)
+      // Check if any node within mesh1D is connected to more than two edges
+      DataArrayIdType *mesh1DDesc1(DataArrayIdType::New()),*mesh1DDescIndx1(DataArrayIdType::New()),*mesh1DRevDesc1(DataArrayIdType::New()),*mesh1DRevDescIndx1(DataArrayIdType::New());
+      MCAuto<DataArrayIdType> m1dd1(mesh1DDesc1),m1dd2(mesh1DDescIndx1),m1dd3(mesh1DRevDesc1),m1dd4(mesh1DRevDescIndx1);
+      MCAuto<MEDCouplingUMesh> mesh1Desc(mesh1D->buildDescendingConnectivity(mesh1DDesc1,mesh1DDescIndx1,mesh1DRevDesc1,mesh1DRevDescIndx1));
+      MCAuto<DataArrayIdType> dsi=mesh1DRevDescIndx1->deltaShiftIndex();
+      MCAuto<DataArrayIdType> tpls = dsi->findIdsGreaterOrEqualTo(3);
+      if(tpls->getNumberOfTuples() != 0)
+        throw INTERP_KERNEL::Exception("MEDCouplingUMesh::Intersect2DMeshWith1DLine : Certain nodes of the 1D mesh are connected to more than 2 edges !\
+                                                                                  If the 1D mesh consists of mutiple lines, make sure those lines are not overlapping. ");
+  }
+
   const std::vector<std::string>& compNames(mesh2D->getCoords()->getInfoOnComponents());
   if(mesh2D->getMeshDimension()!=2 || mesh2D->getSpaceDimension()!=2 || mesh1D->getMeshDimension()!=1 || mesh1D->getSpaceDimension()!=2)
     throw INTERP_KERNEL::Exception("MEDCouplingUMesh::Intersect2DMeshWith1DLine works with mesh2D with spacedim=meshdim=2 and mesh1D with meshdim=1 spaceDim=2 !");
index 42e4c34891ae11c1d3e0d2c6cfd2a44032ea579d..a67c8be966c75262dd78fad3053ab83e8bb2bddd 100644 (file)
@@ -1293,7 +1293,17 @@ class MEDCouplingIntersectTest(unittest.TestCase):
         self.assertEqual(resToSelf.getValues(), [0, 1, 1])
         self.assertEqual(mapLeftRight.getValues(), [-1, -1, 1, 0, 1, 2, -1, -1])
 
-
+    def testSwig2Intersect2DMeshWith1DLine22(self):
+        """ Simple check that an execption is thrown if 1D mesh is not a single line (one point
+        connected to more than 2 edges. """
+        m2 = MEDCouplingCMesh.New()
+        da = DataArrayDouble(3)
+        da.iota()
+        m2.setCoords(da, da)
+        m2 = m2.buildUnstructured()
+        m1,_,_,_,_ = m2.buildDescendingConnectivity() # m1 will have it central point connected to 4 edges
+        # MEDCouplingUMesh.Intersect2DMeshWith1DLine(m2, m1, 1.0e-8)
+        self.assertRaises(InterpKernelException, MEDCouplingUMesh.Intersect2DMeshWith1DLine, m2, m1, 1.0e-8)
 
     def testSwig2Conformize2D1(self):
         eps = 1.0e-8