From: Anthony Geay Date: Wed, 9 Aug 2023 08:18:49 +0000 (+0200) Subject: [EDF27859] : Improve management of GENERAL_24 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=f2fc436a0cbd616411b7b04533151f8e2dbbdd7b;p=tools%2Fmedcoupling.git [EDF27859] : Improve management of GENERAL_24 --- diff --git a/src/INTERP_KERNEL/PolyhedronIntersectorP1P0.txx b/src/INTERP_KERNEL/PolyhedronIntersectorP1P0.txx index 7c4776d36..858b253da 100644 --- a/src/INTERP_KERNEL/PolyhedronIntersectorP1P0.txx +++ b/src/INTERP_KERNEL/PolyhedronIntersectorP1P0.txx @@ -98,46 +98,50 @@ namespace INTERP_KERNEL void PolyhedronIntersectorP1P0::intersectCells(ConnType targetCell, const std::vector& srcCells, MyMatrix& res) { typename MyMatrix::value_type& resRow=res[targetCell]; - if( _split.getSplittingPolicy() != GENERAL_24) + INTERP_KERNEL::SplittingPolicy sp( _split.getSplittingPolicy() ); + if( sp == GENERAL_48 ) + THROW_IK_EXCEPTION("GENERAL_28 spliting is not supported for P1P0 interpolation"); + SplitterTetra* subTetras[24]; + for(typename std::vector::const_iterator iterCellS=srcCells.begin();iterCellS!=srcCells.end();iterCellS++) { - SplitterTetra* subTetras[24]; - for(typename std::vector::const_iterator iterCellS=srcCells.begin();iterCellS!=srcCells.end();iterCellS++) - { - releaseArrays(); - ConnType nbOfNodesS=Intersector3D::_src_mesh.getNumberOfNodesOfElement(OTT::indFC(*iterCellS)); - _split.splitTargetCell(*iterCellS,nbOfNodesS,_tetra); - for(typename std::vector*>::const_iterator iter = _tetra.cbegin(); iter != _tetra.cend(); ++iter) - { - (*iter)->splitIntoDualCells(subTetras); - double vol2 = 0.; - for(int i=0;i<24;i++) - { - SplitterTetra *tmp=subTetras[i]; - double volume = tmp->intersectSourceCell(targetCell); - vol2 += volume; - ConnType sourceNode=tmp->getId(0); - AddContributionInRow(resRow,OTT::indFC(sourceNode),volume); - delete tmp; - } - } - } - } - else - { - for(typename std::vector::const_iterator iterCellS=srcCells.begin();iterCellS!=srcCells.end();iterCellS++) - { - releaseArrays(); - ConnType nbOfNodesS=Intersector3D::_src_mesh.getNumberOfNodesOfElement(OTT::indFC(*iterCellS)); - _split.splitTargetCell(*iterCellS,nbOfNodesS,_tetra); - for(typename std::vector*>::const_iterator iter = _tetra.cbegin(); iter != _tetra.cend(); ++iter) - { - double volume = std::abs( (*iter)->intersectSourceCell(targetCell) ); - // node #0 is for internal node node #1 is for the node at the middle of the face - ConnType sourceNode0( (*iter)->getId(2) ), sourceNode1( (*iter)->getId(3) ); - AddContributionInRow(resRow,OTT::indFC(sourceNode0),volume/2.); - AddContributionInRow(resRow,OTT::indFC(sourceNode1),volume/2.); - } - } + releaseArrays(); + ConnType nbOfNodesS=this->_src_mesh.getNumberOfNodesOfElement(OTT::indFC(*iterCellS)); + _split.splitTargetCell(*iterCellS,nbOfNodesS,_tetra); + INTERP_KERNEL::NormalizedCellType srcType = this->_src_mesh.getTypeOfElement( OTT::indFC(*iterCellS) ); + if( srcType == NORM_TETRA4 || (srcType == NORM_HEXA8 && sp != GENERAL_24 )) + { + for(typename std::vector*>::const_iterator iter = _tetra.cbegin(); iter != _tetra.cend(); ++iter) + { + (*iter)->splitIntoDualCells(subTetras); + double vol2 = 0.; + for(int i=0;i<24;i++) + { + SplitterTetra *tmp=subTetras[i]; + double volume = tmp->intersectSourceCell(targetCell); + vol2 += volume; + ConnType sourceNode=tmp->getId(0); + AddContributionInRow(resRow,OTT::indFC(sourceNode),volume); + delete tmp; + } + } + } + else + { + for(typename std::vector::const_iterator iterCellS=srcCells.begin();iterCellS!=srcCells.end();iterCellS++) + { + releaseArrays(); + ConnType nbOfNodesS=Intersector3D::_src_mesh.getNumberOfNodesOfElement(OTT::indFC(*iterCellS)); + _split.splitTargetCell(*iterCellS,nbOfNodesS,_tetra); + for(typename std::vector*>::const_iterator iter = _tetra.cbegin(); iter != _tetra.cend(); ++iter) + { + double volume = std::abs( (*iter)->intersectSourceCell(targetCell) ); + // node #0 is for internal node node #1 is for the node at the middle of the face + ConnType sourceNode0( (*iter)->getId(2) ), sourceNode1( (*iter)->getId(3) ); + AddContributionInRow(resRow,OTT::indFC(sourceNode0),volume/2.); + AddContributionInRow(resRow,OTT::indFC(sourceNode1),volume/2.); + } + } + } } } } diff --git a/src/MEDCoupling/Test/MEDCouplingBasicsTestInterp.cxx b/src/MEDCoupling/Test/MEDCouplingBasicsTestInterp.cxx index 1977fabd8..a188997b6 100644 --- a/src/MEDCoupling/Test/MEDCouplingBasicsTestInterp.cxx +++ b/src/MEDCoupling/Test/MEDCouplingBasicsTestInterp.cxx @@ -1287,8 +1287,8 @@ void MEDCouplingBasicsTestInterp::test3DInterpP1P0_1() INTERP_KERNEL::Interpolation3D myInterpolator; std::vector > res; myInterpolator.setPrecision(1e-12); - INTERP_KERNEL::SplittingPolicy sp[] = { INTERP_KERNEL::PLANAR_FACE_5, INTERP_KERNEL::PLANAR_FACE_6, INTERP_KERNEL::GENERAL_24, INTERP_KERNEL::GENERAL_48 }; - for ( int i = 0; i < 4; ++i ) + INTERP_KERNEL::SplittingPolicy sp[] = { INTERP_KERNEL::PLANAR_FACE_5, INTERP_KERNEL::PLANAR_FACE_6, INTERP_KERNEL::GENERAL_24}; + for ( int i = 0; i < 3; ++i ) { myInterpolator.setSplittingPolicy( sp[i] ); res.clear();