KOKKOS_INLINE_FUNCTION void operator()( TYPE_OPERATOR(bucket, solo, unroll) , const int elementBucketIndex) const { const unsigned numElements = elemsPerBucket(elementBucketIndex); const unsigned nodesPerElem = nodesPerElement(elementBucketIndex); double tempx = 0, tempy = 0, tempz = 0; for(unsigned elementIndex=0; elementIndex<numElements; ++elementIndex) { int elementOffset = elemBucketOffsets(elementBucketIndex) + elementIndex; int connOffset = connBucketOffsets(elementBucketIndex) + elementIndex*nodesPerElem; stk::mesh::Entity element = elemEntities(elementOffset); const unsigned elemFieldIndex = get_index(element); tempx = 0; tempy = 0; tempz = 0; for(unsigned nodeIndex=0; nodeIndex<nodesPerElem; ++nodeIndex) // loop over every node of this element { const unsigned idx = get_index(elementNodeConnectivity(connOffset + nodeIndex)); tempx += nodeCoords(idx, 0); tempy += nodeCoords(idx, 1); tempz += nodeCoords(idx, 2); } elementCentroids(elemFieldIndex, 0) = tempx * 0.125; elementCentroids(elemFieldIndex, 1) = tempy * 0.125; elementCentroids(elemFieldIndex, 2) = tempz * 0.125; } }
void Grid::findAll(vector<int> &out, const FBox &box, int ignored_id, int flags) const { IRect grid_box = nodeCoords(box); for(int y = grid_box.min.y; y <= grid_box.max.y; y++) for(int x = grid_box.min.x; x <= grid_box.max.x; x++) { int node_id = nodeAt(int2(x, y)); const Node &node = m_nodes[node_id]; if(!flagTest(node.obj_flags, flags) || !areOverlapping(box, node.bbox)) continue; bool anything_found = false; const Object *objects[node.size]; int count = extractObjects(node_id, objects, ignored_id, flags); for(int n = 0; n < count; n++) if(areOverlapping(box, objects[n]->bbox)) { if(objects[n]->node_id == -1) disableOverlap(objects[n]); out.push_back(objects[n] - &m_objects[0]); anything_found = true; } if(!anything_found && node.is_dirty) updateNode(node_id); } clearDisables(); }
KOKKOS_INLINE_FUNCTION void operator()( TYPE_OPERATOR(bucket, solo, compact) , const int elementBucketIndex) const { const unsigned numElements = elemsPerBucket(elementBucketIndex); const unsigned nodesPerElem = nodesPerElement(elementBucketIndex); const unsigned dim = elementCentroids.extent(1); double temp[3] = {0.0, 0.0, 0.0}; for(unsigned elementIndex=0; elementIndex<numElements; ++elementIndex) { int elementOffset = elemBucketOffsets(elementBucketIndex) + elementIndex; int connOffset = connBucketOffsets(elementBucketIndex) + elementIndex*nodesPerElem; stk::mesh::Entity element = elemEntities(elementOffset); const unsigned elemFieldIndex = get_index(element); for(unsigned k=0;k<dim;++k) { temp[k] = 0.0; } for(unsigned nodeIndex=0; nodeIndex<nodesPerElem; ++nodeIndex) // loop over every node of this element { const unsigned idx = get_index(elementNodeConnectivity(connOffset + nodeIndex)); for(unsigned k=0; k<dim; ++k) { temp[k] += nodeCoords(idx, k); } } for(unsigned k=0; k<dim; ++k) { elementCentroids(elemFieldIndex, k) = temp[k] * 0.125; } } }
int Grid::findAny(const FBox &box, int ignored_id, int flags) const { IRect grid_box = nodeCoords(box); for(int y = grid_box.min.y; y <= grid_box.max.y; y++) for(int x = grid_box.min.x; x <= grid_box.max.x; x++) { int node_id = nodeAt(int2(x, y)); const Node &node = m_nodes[node_id]; if(!node.size || !flagTest(node.obj_flags, flags) || !areOverlapping(box, node.bbox)) continue; const Object *objects[node.size]; int count = extractObjects(node_id, objects, ignored_id, flags); for(int n = 0; n < count; n++) if(areOverlapping(box, objects[n]->bbox)) return objects[n] - &m_objects[0]; if(node.is_dirty) updateNode(node_id); } return -1; }