コード例 #1
0
    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;
        }
    }
コード例 #2
0
ファイル: grid_intersect.cpp プロジェクト: ChunHungLiu/FreeFT
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();
}
コード例 #3
0
    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;
            }
        }
    }
コード例 #4
0
ファイル: grid_intersect.cpp プロジェクト: ChunHungLiu/FreeFT
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;
}