Bool FeMesh_Algorithms_SearchWithTree( void* _self, double* pnt, unsigned* dim, unsigned* el ) { FeMesh_Algorithms* self = (FeMesh_Algorithms*)_self; int nEls, *els; int curRank, ii; unsigned curDim, curEl; int nLocals, owner; Mesh_ElementType* elType; *dim = Mesh_GetDimSize( self->mesh ); MPI_Comm_size( MPI_COMM_WORLD, &curRank ); nLocals = Mesh_GetLocalSize( self->mesh, *dim ); if( !SpatialTree_Search( self->tree, pnt, &nEls, &els ) ) return False; *el = nLocals; elType = Mesh_GetElementType( self->mesh, 0 ); for( ii = 0; ii < nEls; ii++ ) { if( FeMesh_ElementType_ElementHasPoint( elType, els[ii], pnt, &curDim, &curEl ) ) { if( curEl >= nLocals ) { owner = Mesh_GetOwner( self->mesh, curDim, curEl - nLocals ); owner = Comm_RankLocalToGlobal( self->mesh->topo->comm, owner ); if( owner <= curRank ) { curRank = owner; *el = curEl; } } else if( self->rank <= curRank && curEl < *el ) { curRank = self->rank; *el = curEl; } } } return True; }
void ElementCellLayout_BuildShadowInfo( ElementCellLayout* self ) { unsigned nDims; Comm* comm; int nIncProcs; int* incProcs; unsigned n_i; nDims = Mesh_GetDimSize( self->mesh ); comm = Mesh_GetCommTopology( self->mesh, nDims ); Comm_GetNeighbours( comm, &nIncProcs, &incProcs ); /* Extract neighbouring proc information. */ self->cellShadowInfo.procNbrInfo = Memory_Alloc_Unnamed( ProcNbrInfo ); self->cellShadowInfo.procNbrInfo->procNbrCnt = nIncProcs; self->cellShadowInfo.procNbrInfo->procNbrTbl = AllocArray( unsigned, nIncProcs ); memcpy( self->cellShadowInfo.procNbrInfo->procNbrTbl, incProcs, nIncProcs * sizeof(unsigned) ); /* Count shadow info. */ if( nIncProcs ) { self->cellShadowInfo.procShadowedCnt = AllocArray( unsigned, nIncProcs ); memset( self->cellShadowInfo.procShadowedCnt, 0, nIncProcs * sizeof(unsigned) ); self->cellShadowInfo.procShadowCnt = AllocArray( unsigned, nIncProcs ); memset( self->cellShadowInfo.procShadowCnt, 0, nIncProcs * sizeof(unsigned) ); } for( n_i = 0; n_i < Mesh_GetSharedSize( self->mesh, nDims ); n_i++ ) { unsigned nSharers; unsigned* sharers; unsigned s_i; Mesh_GetSharers( self->mesh, nDims, n_i, &nSharers, &sharers ); for( s_i = 0; s_i < nSharers; s_i++ ) self->cellShadowInfo.procShadowedCnt[sharers[s_i]]++; } for( n_i = 0; n_i < Mesh_GetRemoteSize( self->mesh, nDims ); n_i++ ) { unsigned owner; owner = Mesh_GetOwner( self->mesh, nDims, n_i ); self->cellShadowInfo.procShadowCnt[owner]++; } /* Build shadow info indices. */ if( nIncProcs ) { self->cellShadowInfo.procShadowedTbl = Memory_Alloc_2DComplex_Unnamed( unsigned, nIncProcs, self->cellShadowInfo.procShadowedCnt ); self->cellShadowInfo.procShadowTbl = Memory_Alloc_2DComplex_Unnamed( unsigned, nIncProcs, self->cellShadowInfo.procShadowCnt ); memset( self->cellShadowInfo.procShadowedCnt, 0, nIncProcs * sizeof(unsigned) ); memset( self->cellShadowInfo.procShadowCnt, 0, nIncProcs * sizeof(unsigned) ); } for( n_i = 0; n_i < Mesh_GetSharedSize( self->mesh, nDims ); n_i++ ) { unsigned local; unsigned curInd; unsigned nSharers; unsigned* sharers; unsigned s_i; local = Mesh_SharedToLocal( self->mesh, nDims, n_i ); Mesh_GetSharers( self->mesh, nDims, n_i, &nSharers, &sharers ); for( s_i = 0; s_i < nSharers; s_i++ ) { curInd = self->cellShadowInfo.procShadowedCnt[sharers[s_i]]++; self->cellShadowInfo.procShadowedTbl[sharers[s_i]][curInd] = local; } } for( n_i = 0; n_i < Mesh_GetRemoteSize( self->mesh, nDims ); n_i++ ) { unsigned domain; unsigned curInd; unsigned owner; domain = Mesh_GetLocalSize( self->mesh, nDims ) + n_i; owner = Mesh_GetOwner( self->mesh, nDims, n_i ); curInd = self->cellShadowInfo.procShadowCnt[owner]++; self->cellShadowInfo.procShadowTbl[owner][curInd] = domain; } }