From: eap Date: Fri, 28 Dec 2012 09:49:56 +0000 (+0000) Subject: 0021756: [CEA 602] MEDPartitioner improvements X-Git-Tag: V6_main_FINAL~441 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=a744c7034e0e8815deae63589eb28a184b2db5aa;p=tools%2Fmedcoupling.git 0021756: [CEA 602] MEDPartitioner improvements + /*! + * \brief Class encapsulating BBTree of dimension given at construction and + * providing all features of BBTree + */ + class BBTreeOfDim --- diff --git a/src/MEDPartitioner/MEDPARTITIONER_Utils.cxx b/src/MEDPartitioner/MEDPARTITIONER_Utils.cxx index 6bbe1a86c..64488d052 100644 --- a/src/MEDPartitioner/MEDPARTITIONER_Utils.cxx +++ b/src/MEDPartitioner/MEDPARTITIONER_Utils.cxx @@ -826,3 +826,54 @@ ParaMEDMEM::MEDCouplingUMesh* MEDPARTITIONER::CreateEmptyMEDCouplingUMesh() umesh->checkCoherency(); return umesh; } + +namespace MEDPARTITIONER +{ + BBTreeOfDim::BBTreeOfDim( int dim, + const double* bbs, + int* elems, + int level, + int nbelems, + double epsilon) + { + switch ( dim ) + { + case 3: + _tree=new BBTree<3> (bbs,elems,level,nbelems,epsilon); + _PgetElementsAroundPoint = & BBTreeOfDim::_getElementsAroundPoint< 3 >; + _PgetIntersectingElems = & BBTreeOfDim::_getIntersectingElems< 3 >; + break; + case 2: + _tree=new BBTree<2> (bbs,elems,level,nbelems,epsilon); + _PgetElementsAroundPoint = & BBTreeOfDim::_getElementsAroundPoint< 2 >; + _PgetIntersectingElems = & BBTreeOfDim::_getIntersectingElems< 2 >; + break; + case 1: + _tree=new BBTree<1> (bbs,elems,level,nbelems,epsilon); + _PgetElementsAroundPoint = & BBTreeOfDim::_getElementsAroundPoint< 1 >; + _PgetIntersectingElems = & BBTreeOfDim::_getIntersectingElems< 1 >; + break; + default: + _tree=0; + throw INTERP_KERNEL::Exception("BBTreeOfDim(): wrong space dimension"); + } + } + + BBTreeOfDim::~BBTreeOfDim() + { + delete (BBTree<3>*)_tree; + } + + void BBTreeOfDim::getElementsAroundPoint( const double* coordsPtr, + std::vector& elems ) const + { + BBTreeOfDim* me = (BBTreeOfDim*) this; + (me->*_PgetElementsAroundPoint) ( coordsPtr, elems ); + } + void BBTreeOfDim::getIntersectingElems(const double* bb, + std::vector& elems) const + { + BBTreeOfDim* me = (BBTreeOfDim*) this; + (me->*_PgetIntersectingElems) ( bb, elems ); + } +} diff --git a/src/MEDPartitioner/MEDPARTITIONER_Utils.hxx b/src/MEDPartitioner/MEDPARTITIONER_Utils.hxx index 02b74cf28..1fcdc33a2 100644 --- a/src/MEDPartitioner/MEDPARTITIONER_Utils.hxx +++ b/src/MEDPartitioner/MEDPARTITIONER_Utils.hxx @@ -23,6 +23,7 @@ #include "MEDPARTITIONER.hxx" #include "MEDCouplingUMesh.hxx" +#include "BBTree.txx" #include #include @@ -133,5 +134,44 @@ namespace MEDPARTITIONER /*! used for descriptions of components of fields for example...*/ static std::vector _General_Informations; }; + + + + /*! + * \brief Class encapsulating BBTree of dimension given at construction and + * providing all features of BBTree + */ + class BBTreeOfDim + { + void * _tree; + void (BBTreeOfDim::*_PgetElementsAroundPoint)( const double* coordsPtr, + std::vector& elems ) const; + void (BBTreeOfDim::*_PgetIntersectingElems)( const double* bb, + std::vector& elems ) const; + + template< int dim> + void _getElementsAroundPoint( const double* coordsPtr, + std::vector& elems ) const + { + ((BBTree*)_tree)->getElementsAroundPoint( coordsPtr, elems ); + } + template< int dim> + void _getIntersectingElems(const double* bb, + std::vector& elems) const + { + ((BBTree*)_tree)->getIntersectingElems( bb, elems ); + } + public: + + BBTreeOfDim( int dim, + const double* bbs, + int* elems, + int level, + int nbelems, + double epsilon=1e-12); + ~BBTreeOfDim(); + void getElementsAroundPoint(const double* coordsPtr, std::vector& elems ) const; + void getIntersectingElems (const double* bb, std::vector& elems) const; + }; } #endif