[MOAB-dev] r2527 - MOAB/trunk/tools/iMesh
kraftche at mcs.anl.gov
kraftche at mcs.anl.gov
Fri Jan 9 16:44:13 CST 2009
Author: kraftche
Date: 2009-01-09 16:44:12 -0600 (Fri, 09 Jan 2009)
New Revision: 2527
Modified:
MOAB/trunk/tools/iMesh/iMesh_MOAB.cpp
Log:
fix bug where iMesh_getEntArrAdj breaks for structured mesh
Modified: MOAB/trunk/tools/iMesh/iMesh_MOAB.cpp
===================================================================
--- MOAB/trunk/tools/iMesh/iMesh_MOAB.cpp 2009-01-09 21:10:42 UTC (rev 2526)
+++ MOAB/trunk/tools/iMesh/iMesh_MOAB.cpp 2009-01-09 22:44:12 UTC (rev 2527)
@@ -986,11 +986,22 @@
int* off_iter = *offset;
int prev_off = 0;
- std::vector<MBEntityHandle> all_adj_ents;
+ std::vector<MBEntityHandle> conn_storage;
std::vector<MBEntityHandle> adj_ents;
const MBEntityHandle *connect;
int num_connect;
+ MBEntityHandle* array = reinterpret_cast<MBEntityHandle*>(*adjacentEntityHandles);
+ int array_alloc = *adjacentEntityHandles_allocated;
+ const bool allocated_array = !array || !array_alloc;
+ if (allocated_array) {
+ array_alloc = 2 * entity_handles_size;
+ array = (MBEntityHandle*)malloc(array_alloc*sizeof(MBEntityHandle));
+ if (!array) {
+ RETURN(iBase_MEMORY_ALLOCATION_FAILED);
+ }
+ }
+
for ( ; entity_iter != entity_end; ++entity_iter)
{
*off_iter = prev_off;
@@ -998,27 +1009,25 @@
if (iBase_VERTEX == entity_type_requested &&
TYPE_FROM_HANDLE(*entity_iter) != MBPOLYHEDRON) {
- result = MBI->get_connectivity(*entity_iter, connect, num_connect);
+ result = MBI->get_connectivity(*entity_iter, connect, num_connect, true, &conn_storage);
if (MB_SUCCESS != result) {
iMesh_processError(iBase_ERROR_MAP[result], "iMesh_getEntArrAdj: trouble getting adjacency list.");
RETURN(iBase_ERROR_MAP[result]);
}
- std::copy(connect, connect+num_connect, std::back_inserter(all_adj_ents));
- prev_off += num_connect;
}
else if (iBase_ALL_TYPES == entity_type_requested) {
+ adj_ents.clear();
for (int dim = 0; dim < 4; ++dim) {
if (MBCN::Dimension(TYPE_FROM_HANDLE(*entity_iter)) == dim)
continue;
- adj_ents.clear();
result = MBI->get_adjacencies( entity_iter, 1, dim, false, adj_ents );
if (MB_SUCCESS != result) {
iMesh_processError(iBase_ERROR_MAP[result], "iMesh_getEntArrAdj: trouble getting adjacency list.");
RETURN(iBase_ERROR_MAP[result]);
}
- std::copy(adj_ents.begin(), adj_ents.end(), std::back_inserter(all_adj_ents));
- prev_off += adj_ents.size();
}
+ connect = &adj_ents[0];
+ num_connect = adj_ents.size();
}
else {
adj_ents.clear();
@@ -1028,19 +1037,39 @@
iMesh_processError(iBase_ERROR_MAP[result], "iMesh_getEntArrAdj: trouble getting adjacency list.");
RETURN(iBase_ERROR_MAP[result]);
}
- std::copy(adj_ents.begin(), adj_ents.end(), std::back_inserter(all_adj_ents));
- prev_off += adj_ents.size();
+ connect = &adj_ents[0];
+ num_connect = adj_ents.size();
}
+
+ if (prev_off + num_connect <= array_alloc) {
+ std::copy(connect, connect+num_connect, array+prev_off);
+ }
+ else if (allocated_array) {
+ array_alloc *= 2;
+ array = (MBEntityHandle*)realloc( array, array_alloc*sizeof(MBEntityHandle) );
+ if (!array) {
+ RETURN(iBase_MEMORY_ALLOCATION_FAILED);
+ }
+ std::copy(connect, connect+num_connect, array+prev_off);
+ }
+ // else do nothing. Will catch error later when comparing
+ // occupied to allocated sizes. Continue here because
+ // must pass back required size.
+
+ prev_off += num_connect;
}
*off_iter = prev_off;
+ *offset_size = entity_handles_size+1;
+ *adjacentEntityHandles_size = prev_off;
- CHECK_SIZE(*adjacentEntityHandles, *adjacentEntityHandles_allocated,
- (int)all_adj_ents.size(),
- iBase_EntityHandle, iBase_MEMORY_ALLOCATION_FAILED);
- memcpy(*adjacentEntityHandles, &all_adj_ents[0], sizeof(MBEntityHandle) * all_adj_ents.size() );
+ if (*adjacentEntityHandles_size > array_alloc) {
+ RETURN(iBase_BAD_ARRAY_SIZE);
+ }
+ else if (allocated_array) {
+ *adjacentEntityHandles = reinterpret_cast<iBase_EntityHandle*>(array);
+ *adjacentEntityHandles_allocated = array_alloc;
+ }
- *adjacentEntityHandles_size = all_adj_ents.size();
- *offset_size = entity_handles_size+1;
RETURN(iBase_SUCCESS);
}
More information about the moab-dev
mailing list