From: Anthony Geay Date: Mon, 11 Apr 2022 12:13:25 +0000 (+0200) Subject: [EDF25207] : Fix bbox computation in the polhedron with more than 255 nodes context X-Git-Tag: V9_9_0b1~1 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=ee33c67ce54b04aab5b4c7e87b092bfc6722c5df;p=tools%2Fmedcoupling.git [EDF25207] : Fix bbox computation in the polhedron with more than 255 nodes context [EDF25207] : Non regression test --- diff --git a/src/INTERP_KERNEL/MeshElement.hxx b/src/INTERP_KERNEL/MeshElement.hxx index 6324f594e..2953cf960 100644 --- a/src/INTERP_KERNEL/MeshElement.hxx +++ b/src/INTERP_KERNEL/MeshElement.hxx @@ -22,6 +22,8 @@ #include "BoundingBox.hxx" +#include + 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; diff --git a/src/INTERP_KERNEL/MeshElement.txx b/src/INTERP_KERNEL/MeshElement.txx index 5fa0d6a02..e73d8074c 100755 --- a/src/INTERP_KERNEL/MeshElement.txx +++ b/src/INTERP_KERNEL/MeshElement.txx @@ -39,11 +39,11 @@ namespace INTERP_KERNEL template template MeshElement::MeshElement(const ConnType index, const MyMeshType& mesh) - : _index(index), _number((unsigned char)mesh.getNumberOfNodesOfElement(OTT::indFC(index))), _box(0) + : _index(index), _number( static_cast(mesh.getNumberOfNodesOfElement(OTT::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::indFC(index), mesh); // create bounding box diff --git a/src/MEDCoupling_Swig/MEDCouplingBasicsTest7.py b/src/MEDCoupling_Swig/MEDCouplingBasicsTest7.py index 98fa9ed4f..9df9f8695 100644 --- a/src/MEDCoupling_Swig/MEDCouplingBasicsTest7.py +++ b/src/MEDCoupling_Swig/MEDCouplingBasicsTest7.py @@ -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