void MemoryPool_Extend( MemoryPool *memPool )
{
	int i = 0;
	char **newPool;

	assert( memPool );

	memPool->numMemChunks++;

	memPool->chunks = (MemChunk*)Memory_Realloc( memPool->chunks, sizeof(MemChunk)*memPool->numMemChunks );
	assert( memPool->chunks );

	memPool->chunks[memPool->numMemChunks-1].memory = (char*)Memory_Alloc_Bytes_Unnamed( memPool->elementSize * memPool->delta, "int" );
	memset( memPool->chunks[memPool->numMemChunks-1].memory, 0, memPool->elementSize * memPool->delta );
	memPool->chunks[memPool->numMemChunks-1].numFree = memPool->delta;
	memPool->chunks[memPool->numMemChunks-1].maxFree = memPool->delta;

	newPool = (char**)Memory_Alloc_Bytes_Unnamed( sizeof(char*) * (memPool->numElements+memPool->delta), "char*" );
	assert( newPool );

	memcpy( newPool+memPool->delta, memPool->pool, sizeof(char*)*memPool->numElements );

	for( i=0; i<memPool->delta; i++ ){
		newPool[i] = &(memPool->chunks[memPool->numMemChunks-1].memory[i*memPool->elementSize]);
	}

	Memory_Free( memPool->pool );
	memPool->pool = newPool;
	memPool->numElements+=memPool->delta;
	memPool->numElementsFree=memPool->delta;

	if( memPool->callbackFunc ){
		memPool->callbackFunc( memPool->callbackFuncArg );
	}
}
void _RefinedRegionsGeometry_AddRefinedRegion( void* refinedRegionsGeometry, Index dim,
        double regionStart, double regionEnd, unsigned int refinementFactor )
{
    RefinedRegionsGeometry*	self = (RefinedRegionsGeometry*)refinedRegionsGeometry;

    if ( self->refinedRegionCounts[dim] == self->refinedRegionSizes[dim] )
    {
        self->refinedRegionSizes[dim] += self->refinedRegionDeltas[dim];
        self->refinedRegions[dim] = Memory_Realloc(
                                        self->refinedRegions[dim],
                                        self->refinedRegionSizes[dim] * sizeof(RefinedRegion) );
    }
    self->refinedRegions[dim][self->refinedRegionCounts[dim]].regionStart = regionStart;
    self->refinedRegions[dim][self->refinedRegionCounts[dim]].regionEnd = regionEnd;
    self->refinedRegions[dim][self->refinedRegionCounts[dim]].refinementFactor = refinementFactor;
    /* Following 2 values are set to zero until real vals calculated later */
    self->refinedRegions[dim][self->refinedRegionCounts[dim]].numElements = 0;
    self->refinedRegions[dim][self->refinedRegionCounts[dim]].elementLength = 0.0;
    self->refinedRegionCounts[dim]++;
}
void _ParticleShadowSync_BeginReceiveOfIncomingParticles( ParticleCommHandler* pCommHandler ) {
	ParticleShadowSync		*self = (ParticleShadowSync*)pCommHandler;
	ShadowInfo*		        cellShadowInfo = CellLayout_GetShadowInfo( self->swarm->cellLayout );
	ProcNbrInfo*		        procNbrInfo = cellShadowInfo->procNbrInfo;
	long                           incomingViaShadowArrayBytes = 0;
	Neighbour_Index		        nbr_I;
	Processor_Index			proc_I;
	int i = 0;
	char* recvLocation  = NULL;

	self->particlesArrivingFromNbrShadowCellsHandles = Memory_Alloc_Array_Unnamed( MPI_Request*, procNbrInfo->procNbrCnt );
	for( i=0; i<procNbrInfo->procNbrCnt; i++ ){
		self->particlesArrivingFromNbrShadowCellsHandles[i] = Memory_Alloc_Array_Unnamed( MPI_Request, 1 );
	}

	self->swarm->shadowParticles = Memory_Realloc( self->swarm->shadowParticles,
			self->swarm->particleExtensionMgr->finalSize*(self->swarm->shadowParticleCount) );
	
	recvLocation = (char*)self->swarm->shadowParticles;
	for ( nbr_I=0; nbr_I < procNbrInfo->procNbrCnt; nbr_I++ ) {
		
		if ( self->particlesArrivingFromNbrShadowCellsTotalCounts[nbr_I] != 0 ) {
			proc_I = procNbrInfo->procNbrTbl[nbr_I];

			/* start non-blocking recv of particles */
			incomingViaShadowArrayBytes = self->swarm->particleExtensionMgr->finalSize * 
				self->particlesArrivingFromNbrShadowCellsTotalCounts[nbr_I];
			
			/*printf( "receiving %ld bytes\n", incomingViaShadowArrayBytes );*/
			(void)MPI_Irecv( recvLocation, incomingViaShadowArrayBytes, MPI_BYTE,
				proc_I, SHADOW_PARTICLES, self->swarm->comm,
				self->particlesArrivingFromNbrShadowCellsHandles[nbr_I] );
			
			recvLocation += incomingViaShadowArrayBytes;
		}
	}
}
void MemoryPool_Shrink( MemoryPool *memPool )
{
	int i = 0;
	Bool deleteFlag = (Bool)0;
	int chunkIdx = 0;
	char **newPool = (char**)0;
	int eCounter = 0;

	assert( memPool );

	if( memPool->numElementsFree < memPool->delta ){
		return;
	}

	for( i=0; i<memPool->numMemChunks; i++ )
	{
		if( memPool->chunks[i].numFree == memPool->chunks[i].maxFree ){
			deleteFlag = True;
			chunkIdx = i;
			break;
		}
	}

	if( deleteFlag ){
		int numObjs = 0;
		numObjs = memPool->chunks[chunkIdx].maxFree*memPool->elementSize;

		newPool = (char**)Memory_Alloc_Bytes_Unnamed( sizeof(char*) * (memPool->numElements-memPool->chunks[chunkIdx].maxFree), "char*" );

		eCounter = 0;
		for( i=0; i<memPool->numElements; i++ ){
			if( (memPool->pool[i] >= memPool->chunks[chunkIdx].memory) && 
					(memPool->pool[i] < (memPool->chunks[chunkIdx].memory+numObjs)) ){
			}
			else{
				newPool[eCounter++] = memPool->pool[i];
			}
		}

		Memory_Free( memPool->pool );
		memPool->pool = newPool;
		
		memPool->numElements-=memPool->chunks[chunkIdx].maxFree;
		memPool->numElementsFree-=memPool->chunks[chunkIdx].maxFree;

		Memory_Free( memPool->chunks[chunkIdx].memory );
		memPool->chunks[chunkIdx].memory = (char*)NULL;

		if( chunkIdx == (memPool->numMemChunks-1) ){
			memPool->numMemChunks--;

			if( memPool->numMemChunks>0 ){
				memPool->chunks = (MemChunk*)Memory_Realloc( memPool->chunks, sizeof(MemChunk)*memPool->numMemChunks );
				assert( memPool->chunks );
			}
		}
		else{
			memcpy( &(memPool->chunks[chunkIdx]), &(memPool->chunks[chunkIdx+1]), sizeof(MemChunk)*(memPool->numMemChunks - (chunkIdx+1)) );
			memPool->numMemChunks--;
			memPool->chunks = (MemChunk*)Memory_Realloc( memPool->chunks, sizeof(MemChunk)*memPool->numMemChunks );
			assert( memPool->chunks );
		}
	}
	
	if( memPool->callbackFunc ){
		memPool->callbackFunc( memPool->callbackFuncArg );
	}
}