From 19d1ad343de9dc9fa5bc2db9a1a2eeec7163e36a Mon Sep 17 00:00:00 2001 From: Hamidreza Norouzi Date: Fri, 29 Mar 2024 13:45:29 -0700 Subject: [PATCH] changes to cellsWallLevel0 to narrow down the contact list for particle-wall --- .../ContactSearch/ContactSearch.hpp | 10 ++-- .../contactSearch/contactSearch.cpp | 8 +-- .../contactSearch/contactSearch.hpp | 10 ++-- .../methods/cellBased/NBS/NBS.cpp | 6 +- .../methods/cellBased/NBS/NBS.hpp | 8 ++- .../methods/cellBased/NBS/NBSLevel0.cpp | 1 - .../methods/cellBased/NBS/cellsWallLevel0.cpp | 60 ++++++++++++------- .../methods/cellBased/NBS/cellsWallLevel0.hpp | 26 ++++++-- .../sphereInteraction/sphereInteraction.cpp | 2 +- 9 files changed, 83 insertions(+), 48 deletions(-) diff --git a/src/Interaction/contactSearch/ContactSearch/ContactSearch.hpp b/src/Interaction/contactSearch/ContactSearch/ContactSearch.hpp index 84fe8c95..c7afcbf0 100644 --- a/src/Interaction/contactSearch/ContactSearch/ContactSearch.hpp +++ b/src/Interaction/contactSearch/ContactSearch/ContactSearch.hpp @@ -56,12 +56,12 @@ public: ContactSearch( const dictionary& csDict, - const box& domain, + const box& extDomain, const particles& prtcl, const geometry& geom, Timers& timers) : - contactSearch(csDict, domain, prtcl, geom, timers) + contactSearch(csDict, extDomain, prtcl, geom, timers) { auto method = dict().getVal("method"); @@ -79,12 +79,13 @@ public: uint32 wnTri = this->Geometry().size(); const auto& wPoints = this->Geometry().points().deviceViewAll(); const auto& wVertices = this->Geometry().vertices().deviceViewAll(); + const auto& wNormals = this->Geometry().normals().deviceViewAll(); ppwContactSearch_ = makeUnique ( nbDict, - this->domainBox(), + this->extendedDomainBox(), minD, maxD, position, @@ -93,7 +94,8 @@ public: wnPoints, wnTri, wPoints, - wVertices + wVertices, + wNormals ); REPORT(2)<<"Contact search algorithm for particle-particle is "<< Green_Text(ppwContactSearch_().typeName())< pFlow::contactSearch::create( const dictionary &dict, - const box &domain, + const box &extDomain, const particles &prtcl, const geometry &geom, Timers &timers) @@ -60,7 +60,7 @@ pFlow::uniquePtr pFlow::contactSearch::create( if( dictionaryvCtorSelector_.search(model)) { - auto objPtr = dictionaryvCtorSelector_[model] (dict, domain, prtcl, geom, timers); + auto objPtr = dictionaryvCtorSelector_[model] (dict, extDomain, prtcl, geom, timers); REPORT(2)<<"Model "<< Green_Text(model)<<" is created."<< END_REPORT; return objPtr; } diff --git a/src/Interaction/contactSearch/contactSearch/contactSearch.hpp b/src/Interaction/contactSearch/contactSearch/contactSearch.hpp index 347ae028..eaf9c100 100644 --- a/src/Interaction/contactSearch/contactSearch/contactSearch.hpp +++ b/src/Interaction/contactSearch/contactSearch/contactSearch.hpp @@ -42,7 +42,7 @@ class contactSearch { private: - const box& domainBox_; + const box& extendedDomainBox_; const particles& particles_; @@ -60,7 +60,7 @@ public: contactSearch( const dictionary& dict, - const box& domain, + const box& extDomain, const particles& prtcl, const geometry& geom, Timers& timers); @@ -88,9 +88,9 @@ public: return dict_; } - const auto& domainBox()const + const auto& extendedDomainBox()const { - return domainBox_; + return extendedDomainBox_; } const auto& Particles()const @@ -133,7 +133,7 @@ public: static uniquePtr create( const dictionary& dict, - const box& domain, + const box& extDomain, const particles& prtcl, const geometry& geom, Timers& timers); diff --git a/src/Interaction/contactSearch/methods/cellBased/NBS/NBS.cpp b/src/Interaction/contactSearch/methods/cellBased/NBS/NBS.cpp index 9c8b3a29..733313b4 100644 --- a/src/Interaction/contactSearch/methods/cellBased/NBS/NBS.cpp +++ b/src/Interaction/contactSearch/methods/cellBased/NBS/NBS.cpp @@ -32,7 +32,8 @@ pFlow::NBS::NBS uint32 nWallPoints, uint32 nWallElements, const ViewType1D& wallPoints, - const ViewType1D& wallVertices + const ViewType1D& wallVertices, + const ViewType1D& wallNormals ) : particleWallContactSearchs( @@ -61,7 +62,8 @@ pFlow::NBS::NBS nWallPoints, nWallElements, wallPoints, - wallVertices + wallVertices, + wallNormals ) { } diff --git a/src/Interaction/contactSearch/methods/cellBased/NBS/NBS.hpp b/src/Interaction/contactSearch/methods/cellBased/NBS/NBS.hpp index f0f83436..11d2e108 100644 --- a/src/Interaction/contactSearch/methods/cellBased/NBS/NBS.hpp +++ b/src/Interaction/contactSearch/methods/cellBased/NBS/NBS.hpp @@ -80,7 +80,10 @@ protected: if(!cellsWallLevel0_.broadSearch( pwPairs, NBSLevel0_.getSearchCells(), - NBSLevel0_.getCellIterator())) + NBSLevel0_.getCellIterator(), + pointPos, + diameter, + sizeRatio_)) { fatalErrorInFunction<< "Error in broadSearch for NBS (particle-wall)"<& wallPoints, - const ViewType1D& wallVertices); + const ViewType1D& wallVertices, + const ViewType1D& wallNormals ); INLINE_FUNCTION_HD diff --git a/src/Interaction/contactSearch/methods/cellBased/NBS/NBSLevel0.cpp b/src/Interaction/contactSearch/methods/cellBased/NBS/NBSLevel0.cpp index 96e47917..8e43c35f 100644 --- a/src/Interaction/contactSearch/methods/cellBased/NBS/NBSLevel0.cpp +++ b/src/Interaction/contactSearch/methods/cellBased/NBS/NBSLevel0.cpp @@ -60,7 +60,6 @@ bool pFlow::NBSLevel0::findPairs } - Kokkos::fence(); } return true; diff --git a/src/Interaction/contactSearch/methods/cellBased/NBS/cellsWallLevel0.cpp b/src/Interaction/contactSearch/methods/cellBased/NBS/cellsWallLevel0.cpp index 5d85a118..00932281 100644 --- a/src/Interaction/contactSearch/methods/cellBased/NBS/cellsWallLevel0.cpp +++ b/src/Interaction/contactSearch/methods/cellBased/NBS/cellsWallLevel0.cpp @@ -26,18 +26,18 @@ pFlow::cellsWallLevel0::cellsWallLevel0 real cellExtent, uint32 numPoints, uint32 numElements, - const ViewType1D &points, - const ViewType1D &vertices + const ViewType1D &points, + const ViewType1D &vertices, + const ViewType1D& normals ) : cellExtent_( max(cellExtent, 0.5 ) ), numElements_(numElements), numPoints_(numPoints), vertices_(vertices), - points_(points) + points_(points), + normals_(normals) { - allocateArrays(); } @@ -45,8 +45,9 @@ bool pFlow::cellsWallLevel0::resetElements ( uint32 numElements, uint32 numPoints, - ViewType1D &points, - ViewType1D &vertices + const ViewType1D& points, + const ViewType1D& vertices, + const ViewType1D& normals ) { @@ -54,6 +55,7 @@ bool pFlow::cellsWallLevel0::resetElements numPoints_ = numPoints; points_ = points; vertices_ = vertices; + normals_ = normals; allocateArrays(); @@ -64,7 +66,10 @@ bool pFlow::cellsWallLevel0::broadSearch ( csPairContainerType &pairs, const cells& searchBox, - const mapperNBS::CellIterator &particleMap + const mapperNBS::CellIterator &particleMap, + const deviceViewType1D& pPoints, + const deviceViewType1D& pDiams, + real sizeRatio ) { @@ -72,7 +77,7 @@ bool pFlow::cellsWallLevel0::broadSearch this->build(searchBox); - this->particleWallFindPairs(pairs, particleMap); + this->particleWallFindPairs(pairs, particleMap, pPoints, pDiams, sizeRatio); return true; } @@ -104,7 +109,10 @@ bool pFlow::cellsWallLevel0::build(const cells & searchBox) bool pFlow::cellsWallLevel0::particleWallFindPairs ( csPairContainerType &pairs, - const mapperNBS::CellIterator &particleMap + const mapperNBS::CellIterator &particleMap, + const deviceViewType1D& pPoints, + const deviceViewType1D& pDiams, + real sizeRatio ) { @@ -113,7 +121,7 @@ bool pFlow::cellsWallLevel0::particleWallFindPairs while (getFull) { - getFull = findPairsElementRangeCount(pairs, particleMap); + getFull = findPairsElementRangeCount(pairs, particleMap, pPoints, pDiams, sizeRatio); if(getFull) { @@ -137,14 +145,14 @@ bool pFlow::cellsWallLevel0::particleWallFindPairs pFlow::int32 pFlow::cellsWallLevel0::findPairsElementRangeCount ( csPairContainerType &pairs, - const mapperNBS::CellIterator &particleMap + const mapperNBS::CellIterator &particleMap, + const deviceViewType1D& pPoints, + const deviceViewType1D& pDiams, + real sizeRatio ) { uint32 getFull =0; - - //const auto pwPairs = pairs; - const auto elementBox = elementBox_; - + Kokkos::parallel_reduce( "pFlow::cellsWallLevel0::findPairsElementRangeCount", @@ -155,13 +163,16 @@ pFlow::int32 pFlow::cellsWallLevel0::findPairsElementRangeCount const uint32 iTri = teamMember.league_rank(); - const auto triBox = elementBox[iTri]; - + const auto triBox = elementBox_[iTri]; + const auto triPlane = infinitePlane( + normals_[iTri], + points_[vertices_[iTri].x()]); + uint32 getFull2 = 0; auto bExtent = boxExtent(triBox); uint32 numCellBox = bExtent.x()*bExtent.y()*bExtent.z(); - + Kokkos::parallel_reduce( Kokkos::TeamThreadRange( teamMember, numCellBox ), [&] ( const uint32 linIndex, uint32 &innerUpdate ) @@ -175,10 +186,13 @@ pFlow::int32 pFlow::cellsWallLevel0::findPairsElementRangeCount while( n != particleMap.NoPos) { // id is wall id the pair is (particle id, wall id) - if( pairs.insert( - static_cast(n), - static_cast(iTri) ) == -1 ) - innerUpdate++; + if( abs(triPlane.pointFromPlane(pPoints[n]))< pDiams[n]*sizeRatio*cellExtent_) + { + if( pairs.insert( + static_cast(n), + static_cast(iTri) ) == -1 ) + innerUpdate++; + } n = particleMap.next(n); } diff --git a/src/Interaction/contactSearch/methods/cellBased/NBS/cellsWallLevel0.hpp b/src/Interaction/contactSearch/methods/cellBased/NBS/cellsWallLevel0.hpp index 2ffb4414..da7d77d1 100644 --- a/src/Interaction/contactSearch/methods/cellBased/NBS/cellsWallLevel0.hpp +++ b/src/Interaction/contactSearch/methods/cellBased/NBS/cellsWallLevel0.hpp @@ -60,6 +60,9 @@ private: // - ref to points in the trisurface (borrowed) ViewType1D points_; + // - ref to normal vectors of triangles (borrowed) + ViewType1D normals_; + // cell range of element/triangle bounding box ViewType1D elementBox_; @@ -88,7 +91,8 @@ public: uint32 numPoints, uint32 numElements, const ViewType1D& points, - const ViewType1D& vertices); + const ViewType1D& vertices, + const ViewType1D& normals); @@ -97,8 +101,9 @@ public: bool resetElements( uint32 numElements, uint32 numPoints, - ViewType1D& points, - ViewType1D& vertices); + const ViewType1D& points, + const ViewType1D& vertices, + const ViewType1D& normals); INLINE_FUNCTION_HD @@ -116,18 +121,27 @@ public: bool broadSearch( csPairContainerType& pairs, const cells& searchBox, - const mapperNBS::CellIterator& particleMap); + const mapperNBS::CellIterator& particleMap, + const deviceViewType1D& pPoints, + const deviceViewType1D& pDiams, + real sizeRatio); bool build(const cells& searchBox); bool particleWallFindPairs( csPairContainerType& pairs, - const mapperNBS::CellIterator& particleMap); + const mapperNBS::CellIterator& particleMap, + const deviceViewType1D& pPoints, + const deviceViewType1D& pDiams, + real sizeRatio); int32 findPairsElementRangeCount( csPairContainerType& pairs, - const mapperNBS::CellIterator& particleMap); + const mapperNBS::CellIterator& particleMap, + const deviceViewType1D& pPoints, + const deviceViewType1D& pDiams, + real sizeRatio); diff --git a/src/Interaction/sphereInteraction/sphereInteraction.cpp b/src/Interaction/sphereInteraction/sphereInteraction.cpp index 1cb1472e..983d3757 100644 --- a/src/Interaction/sphereInteraction/sphereInteraction.cpp +++ b/src/Interaction/sphereInteraction/sphereInteraction.cpp @@ -134,7 +134,7 @@ pFlow::sphereInteraction::sphereInteraction { contactSearch_ = contactSearch::create( subDict("contactSearch"), - prtcl.thisDomain().domainBox(), + prtcl.extendedDomain().domainBox(), prtcl, geom, timers());