]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
[EDF25207] : Fix bbox computation in the polhedron with more than 255 nodes context
authorAnthony Geay <anthony.geay@edf.fr>
Mon, 11 Apr 2022 12:13:25 +0000 (14:13 +0200)
committerAnthony Geay <anthony.geay@edf.fr>
Mon, 11 Apr 2022 12:58:07 +0000 (14:58 +0200)
[EDF25207] : Non regression test

src/INTERP_KERNEL/MeshElement.hxx
src/INTERP_KERNEL/MeshElement.txx
src/MEDCoupling_Swig/MEDCouplingBasicsTest7.py

index 6324f594e3f3b8bd283f0561afac1bee29013c9c..2953cf96010f73351eb9c962b1b2a4f0830c7eaf 100644 (file)
@@ -22,6 +22,8 @@
 
 #include "BoundingBox.hxx"
 
+#include <cstdint>
+
 namespace INTERP_KERNEL
 {
 
@@ -42,7 +44,7 @@ namespace INTERP_KERNEL
     
     ConnType getIndex() const { return _index; }
     
-    unsigned char getNumberOfNodes() const { return _number; }
+    std::uint16_t getNumberOfNodes() const { return _number; }
     
     const BoundingBox* getBoundingBox() const { return _box; }
 
@@ -56,7 +58,7 @@ namespace INTERP_KERNEL
     /// global number of the element
     const ConnType _index;
 
-    const unsigned char _number;
+    const std::uint16_t _number;
     
     /// bounding box of the element - does not change after having been initialised
     BoundingBox* _box;
index 5fa0d6a02657cf6610964dc3ac3f31a24aec682f..e73d8074cf7eb3d2a370758ecb315b7c63269f59 100755 (executable)
@@ -39,11 +39,11 @@ namespace INTERP_KERNEL
   template<class ConnType>
   template<class MyMeshType>
   MeshElement<ConnType>::MeshElement(const ConnType index, const MyMeshType& mesh)
-    : _index(index), _number((unsigned char)mesh.getNumberOfNodesOfElement(OTT<typename MyMeshType::MyConnType,MyMeshType::My_numPol>::indFC(index))), _box(0)
+    : _index(index), _number( static_cast<std::uint16_t>(mesh.getNumberOfNodesOfElement(OTT<typename MyMeshType::MyConnType,MyMeshType::My_numPol>::indFC(index))) ), _box(nullptr)
   {
     const double**vertices = new const double*[_number];
 
-    for(unsigned char i = 0 ; i < _number ; ++i)
+    for(std::uint16_t i = 0 ; i < _number ; ++i)
       vertices[i] = getCoordsOfNode(i , OTT<typename MyMeshType::MyConnType,MyMeshType::My_numPol>::indFC(index), mesh);
 
     // create bounding box
index 98fa9ed4fc1d52e65cbe624107b29a9b1e4befc1..9df9f869595f4403c388f6f5e7a3a91a2ec72ae0 100644 (file)
@@ -998,6 +998,37 @@ class MEDCouplingBasicsTest7(unittest.TestCase):
         ]
         self.assertTrue( bm.getNodalConnectivity().isEqual(DataArrayInt(sum(conn_expected,[]))) )
 
+    def testBugWithPolyhedInterpWithMoreThan255Nodes(self):
+        """
+        [EDF25207] : Check interpolation containing polyhedron with more than 255 nodes is OK at bbox computation stage
+        """
+        n = 8
+        arr = DataArrayDouble(n) ; arr.iota()
+        m = MEDCouplingCMesh()
+        m.setCoords(arr,arr,arr)
+        m = m.buildUnstructured()
+        skin = m.computeSkin()
+        skin.zipCoords()
+        # check that skin contains more than 2**8-1 node to reveal bug
+        self.assertTrue(skin.getNumberOfNodes()>255)
+        # Build a single polyhedron cell from skin
+        skin1 = MEDCoupling1SGTUMesh(skin)
+        conn = skin1.getNodalConnectivity()
+        conn.rearrange( MEDCouplingUMesh.GetNumberOfNodesOfGeometricType(skin1.getCellModelEnum()) )
+        connPolyhed = conn.changeNbOfComponents(MEDCouplingUMesh.GetNumberOfNodesOfGeometricType(skin1.getCellModelEnum())+1,-1)
+        connPolyhed.rearrange(1)
+        connPolyhed.popBackSilent()
+        meshSinglePolyhed = MEDCouplingUMesh("",3)
+        meshSinglePolyhed.allocateCells()
+        meshSinglePolyhed.insertNextCell(NORM_POLYHED,connPolyhed.getValues())
+        meshSinglePolyhed.setCoords( skin1.getCoords() )
+
+        rem = MEDCouplingRemapper()
+        rem.prepare(meshSinglePolyhed,m,"P0P0")
+        res = rem.getCrudeMatrix()
+        self.assertTrue( all([len(elt)==1 for elt in res]) )
+        self.assertTrue( all([elt[0]>0.99 and elt[0]<1.01 for elt in res]) )
+
 
     pass