int _nextFree;
int _maxAvail;
int _chunkSize;
+ int _maxOccupied;
+ int _nbHoles;
int getNextFree()
{
+ // Don't iterate on the _freeList if all the "holes"
+ // are filled. Go straight to the last occupied ID + 1
+ if ( _nbHoles == 0 )
+ return std::min(_maxOccupied + 1, _maxAvail);
+
for (int i = _nextFree; i < _maxAvail; i++)
if (_freeList[i] == true)
{
_chunkSize = nblk;
_nextFree = 0;
_maxAvail = 0;
+ _maxOccupied = 0;
+ _nbHoles = 0;
_chunkList.clear();
_freeList.clear();
}
_freeList[_nextFree] = false;
obj = _chunkList[chunkId] + rank; // &_chunkList[chunkId][rank];
}
+ if (_nextFree < _maxOccupied)
+ {
+ _nbHoles-=1;
+ }
+ else
+ {
+ _maxOccupied = _nextFree;
+ }
//obj->init();
return obj;
}
_freeList[toFree] = true;
if (toFree < _nextFree)
_nextFree = toFree;
+ if (toFree < _maxOccupied)
+ _nbHoles += 1;
//obj->clean();
//checkDelete(i); compactage non fait
break;
{
_nextFree = 0;
_maxAvail = 0;
+ _maxOccupied = 0;
+ _nbHoles = 0;
for (size_t i = 0; i < _chunkList.size(); i++)
delete[] _chunkList[i];
clearVector( _chunkList );
};
} // namespace
-class TElemToDelete
-{
-public:
- TElemToDelete(const SMDS_MeshElement* theElem, SMESHDS_SubMesh* theSubMesh)
- {
- elem = theElem;
- subMesh = theSubMesh;
- }
- const SMDS_MeshElement* Elem() const {return elem;}
- SMESHDS_SubMesh* Submesh() {return subMesh;}
- const SMDS_MeshElement* elem;
- SMESHDS_SubMesh* subMesh;
-};
-
//=======================================================================
//function : SplitVolumesIntoTetra
//purpose : Split volume elements into tetrahedra.
double bc[3];
TIDSortedElemSet::const_iterator elem = theElems.begin();
- std::vector<TElemToDelete> elem_to_delete;
for ( ; elem != theElems.end(); ++elem )
{
if ( (*elem)->GetType() != SMDSAbs_Volume )
}
ReplaceElemInGroups( face, triangles, GetMeshDS() );
GetMeshDS()->RemoveFreeElement( face, fSubMesh, /*fromGroups=*/false );
-// TElemToDelete faceToDelete(face, fSubMesh);
-// elem_to_delete.push_back(faceToDelete);
}
} // loop on volume faces to split them into triangles
-// GetMeshDS()->RemoveFreeElement( *elem, subMesh, /*fromGroups=*/false );
-
- // rnc : don't delete the elem here because it results in a mesh with a free
- // ID at the beginning of the ID list. The first tetra is then inserted in O(1)
- // but the second one is inserted in O(n), then the whole procedure has almost a O(n^2)
- // complexity. If all elements to remove are stored and removed after tetra creation
- // we get a O(n) complexity for the whole procedure.
- // The memory cost is at worst a 6*n*constant memory occupation (where n is the number of elements)
- // before deletion of the hexas and then 5*n*constant instead of a maximum of 5*n*constant.
- // So there is a transient 1/5*(memory occupation) additional cost.
-
- // Store the elements to delete
- TElemToDelete elemToDelete(*elem, subMesh);
- elem_to_delete.push_back(elemToDelete);
+ GetMeshDS()->RemoveFreeElement( *elem, subMesh, /*fromGroups=*/false );
if ( geomType == SMDSEntity_TriQuad_Hexa )
{
GetMeshDS()->RemoveNode( volNodes[i] );
}
} // loop on volumes to split
-
- // Delete stored elements
- std::vector<TElemToDelete>::iterator it;
- for( it = elem_to_delete.begin(); it!= elem_to_delete.end(); it++)
- {
- GetMeshDS()->RemoveFreeElement( it->Elem(), it->Submesh(), /*fromGroups=*/false );
- }
myLastCreatedNodes = newNodes;
myLastCreatedElems = newElems;