[cig-commits] r5807 - in long/3D/Gale/trunk/src/StGermain: .
Discretisation/Swarm/src
walter at geodynamics.org
walter at geodynamics.org
Wed Jan 17 16:09:25 PST 2007
Author: walter
Date: 2007-01-17 16:09:25 -0800 (Wed, 17 Jan 2007)
New Revision: 5807
Modified:
long/3D/Gale/trunk/src/StGermain/
long/3D/Gale/trunk/src/StGermain/Discretisation/Swarm/src/ParticleCommHandler.c
long/3D/Gale/trunk/src/StGermain/Discretisation/Swarm/src/ParticleCommHandler.h
long/3D/Gale/trunk/src/StGermain/Discretisation/Swarm/src/SwarmClass.c
Log:
r3298 at earth (orig r3966): LukeHodkinson | 2007-01-15 15:47:08 -0800
I've found that the particle communication has some
problems with the new mesh decomposition code. This
commit includes code that disables the majority of
particle communication for debugging purposes.
Property changes on: long/3D/Gale/trunk/src/StGermain
___________________________________________________________________
Name: svk:merge
- 1ef209d2-b310-0410-a72d-e20c9eb0015c:/cig:3196
afb6c753-b9d0-0310-b4e7-dbd8d91cdd35:/branches/decomp3d/StGermain:3965
afb6c753-b9d0-0310-b4e7-dbd8d91cdd35:/trunk/StGermain:3899
+ 1ef209d2-b310-0410-a72d-e20c9eb0015c:/cig:3196
afb6c753-b9d0-0310-b4e7-dbd8d91cdd35:/branches/decomp3d/StGermain:3966
afb6c753-b9d0-0310-b4e7-dbd8d91cdd35:/trunk/StGermain:3899
Modified: long/3D/Gale/trunk/src/StGermain/Discretisation/Swarm/src/ParticleCommHandler.c
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Discretisation/Swarm/src/ParticleCommHandler.c 2007-01-18 00:09:23 UTC (rev 5806)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Swarm/src/ParticleCommHandler.c 2007-01-18 00:09:25 UTC (rev 5807)
@@ -28,1465 +28,218 @@
**
**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
#include <mpi.h>
-#include "Base/Base.h"
+#include "Base/Base.h"
#include "Discretisation/Geometry/Geometry.h"
#include "Discretisation/Shape/Shape.h"
#include "Discretisation/Mesh/Mesh.h"
#include "Discretisation/Utils/Utils.h"
+#include "Swarm.h"
-#include "types.h"
-#include "shortcuts.h"
-#include "ParticleCommHandler.h"
-#include "SwarmClass.h"
-#include "ShadowInfo.h"
-#include "CellLayout.h"
-#include "ElementCellLayout.h"
-#include "StandardParticle.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <string.h>
-
+/* Textual name of this class */
const Type ParticleCommHandler_Type = "ParticleCommHandler";
-/* MPI tags */
-static const int SHADOW_PARTICLE_COUNTS_PER_CELL = 10;
-static const int SHADOW_PARTICLES = 20;
-ParticleCommHandler* ParticleCommHandler_DefaultNew( Name name )
-{
- return _ParticleCommHandler_New( sizeof(ParticleCommHandler), ParticleCommHandler_Type,
- _ParticleCommHandler_Delete, _ParticleCommHandler_Print, _ParticleCommHandler_Copy,
- (Stg_Component_DefaultConstructorFunction*)ParticleCommHandler_DefaultNew,
- _ParticleCommHandler_Construct, _ParticleCommHandler_Build, _ParticleCommHandler_Initialise,
- _ParticleCommHandler_Execute, _ParticleCommHandler_Destroy, name, False,
- _ParticleCommHandler_HandleParticleMovementBetweenProcs, NULL );
-}
+/*----------------------------------------------------------------------------------------------------------------------------------
+** Constructors
+*/
-ParticleCommHandler* ParticleCommHandler_New(
- Name name,
- void* swarm )
-{
- return _ParticleCommHandler_New( sizeof(ParticleCommHandler), ParticleCommHandler_Type,
- _ParticleCommHandler_Delete, _ParticleCommHandler_Print, _ParticleCommHandler_Copy,
- (Stg_Component_DefaultConstructorFunction*)ParticleCommHandler_DefaultNew,
- _ParticleCommHandler_Construct, _ParticleCommHandler_Build, _ParticleCommHandler_Initialise,
- _ParticleCommHandler_Execute, _ParticleCommHandler_Destroy, name, True,
- _ParticleCommHandler_HandleParticleMovementBetweenProcs, swarm );
+ParticleCommHandler* ParticleCommHandler_New( Name name ) {
+ return _ParticleCommHandler_New( sizeof(ParticleCommHandler),
+ ParticleCommHandler_Type,
+ _ParticleCommHandler_Delete,
+ _ParticleCommHandler_Print,
+ NULL,
+ (void* (*)(Name))_ParticleCommHandler_New,
+ _ParticleCommHandler_Construct,
+ _ParticleCommHandler_Build,
+ _ParticleCommHandler_Initialise,
+ _ParticleCommHandler_Execute,
+ _ParticleCommHandler_Destroy,
+ name,
+ NON_GLOBAL,
+ _ParticleCommHandler_Update );
}
-ParticleCommHandler* _ParticleCommHandler_New(
- SizeT _sizeOfSelf,
- Type type,
- Stg_Class_DeleteFunction* _delete,
- Stg_Class_PrintFunction* _print,
- Stg_Class_CopyFunction* _copy,
- Stg_Component_DefaultConstructorFunction* _defaultConstructor,
- Stg_Component_ConstructFunction* _construct,
- Stg_Component_BuildFunction* _build,
- Stg_Component_InitialiseFunction* _initialise,
- Stg_Component_ExecuteFunction* _execute,
- Stg_Component_DestroyFunction* _destroy,
- Name name,
- Bool initFlag,
- ParticleCommHandler_HandleParticleMovementBetweenProcsFunction handleParticleMovementBetweenProcs,
- void* swarm )
-{
- ParticleCommHandler* self;
-
+ParticleCommHandler* _ParticleCommHandler_New( PARTICLECOMMHANDLER_DEFARGS ) {
+ ParticleCommHandler* self;
+
/* Allocate memory */
- self = (ParticleCommHandler*)_Stg_Component_New( _sizeOfSelf, type, _delete, _print, _copy, _defaultConstructor,
- _construct, _build, _initialise, _execute, _destroy, name, NON_GLOBAL );
-
- /* General info */
+ assert( sizeOfSelf >= sizeof(ParticleCommHandler) );
+ self = (ParticleCommHandler*)_Stg_Component_New( STG_COMPONENT_PASSARGS );
+
/* Virtual info */
- self->_handleParticleMovementBetweenProcs = handleParticleMovementBetweenProcs;
-
+ self->updateFunc = updateFunc;
+
/* ParticleCommHandler info */
- if( initFlag ){
- _ParticleCommHandler_Init( self, swarm );
- }
-
+ _ParticleCommHandler_Init( self );
+
return self;
}
+void _ParticleCommHandler_Init( ParticleCommHandler* self ) {
+ assert( self && Stg_CheckType( self, ParticleCommHandler ) );
-void _ParticleCommHandler_Init( ParticleCommHandler* self, void* swarm ) {
- self->isConstructed = True;
- self->swarm = (Swarm*) swarm;
- self->debug = Stream_RegisterChild( Swarm_Debug, self->type );
- self->shadowParticlesLeavingMeIndices = NULL;
- self->shadowParticlesLeavingMeTotalCount = 0;
- self->shadowParticlesLeavingMeUnfilledCount = 0;
- self->currShadowParticleLeavingMeIndex = 0;
- self->particlesOutsideDomainIndices = NULL;
- self->particlesOutsideDomainTotalCount = 0;
- self->particlesOutsideDomainUnfilledCount = 0;
- self->currParticleLeavingMyDomainIndex = 0;
- self->defensive = True;
+ self->swarm = NULL;
+ self->defensive = False;
}
-void _ParticleCommHandler_Delete(void* pCommsHandler ) {
- /* Nothing to do, as the temporary arrays are deleted each step as soon as they are finished with. */
- _Stg_Class_Delete( pCommsHandler );
-}
+/*----------------------------------------------------------------------------------------------------------------------------------
+** Virtual functions
+*/
+void _ParticleCommHandler_Delete( void* particleCommHandler ) {
+ ParticleCommHandler* self = (ParticleCommHandler*)particleCommHandler;
-void _ParticleCommHandler_Print( void* pCommsHandler, Stream* stream ) {
- ParticleCommHandler* self = (ParticleCommHandler*)pCommsHandler;
-
- /* General info */
- Journal_Printf( stream, "ParticleCommHandler (ptr): %p\n", self );
-
- /* Parent class info */
- _Stg_Class_Print( self, stream );
-
- /* Virtual info */
- Journal_Printf( stream, "self->_handleParticleMovementBetweenProcs (ptr): %p\n",
- self->_handleParticleMovementBetweenProcs );
-
- /* class info */
- Journal_Printf( stream, "self->swarm (ptr): %p\n", self->swarm );
- Journal_Printf( stream, "self->shadowParticlesLeavingMeTotalCount: %d\n", self->shadowParticlesLeavingMeTotalCount );
- Journal_Printf( stream, "self->shadowParticlesLeavingMeUnfilledCount: %d\n", self->shadowParticlesLeavingMeUnfilledCount );
- Journal_Printf( stream, "self->currShadowParticleLeavingMeIndex: %d\n", self->currShadowParticleLeavingMeIndex );
- Journal_Printf( stream, "self->shadowParticlesLeavingMeIndices (ptr): %p\n", self->shadowParticlesLeavingMeIndices );
- Journal_Printf( stream, "self->particlesOutsideDomainTotalCount: %d\n", self->particlesOutsideDomainTotalCount );
- Journal_Printf( stream, "self->particlesOutsideDomainUnfiledCount: %d\n", self->particlesOutsideDomainUnfilledCount );
- Journal_Printf( stream, "self->currParticleLeavingMyDomainIndex: %d\n", self->currParticleLeavingMyDomainIndex );
- Journal_Printf( stream, "self->particlesOutsideDomainIndices(ptr): %p\n", self->particlesOutsideDomainIndices );
+ /* Delete the parent. */
+ _Stg_Component_Delete( self );
}
-
-void* _ParticleCommHandler_Copy( void* particleCommHandler, void* dest, Bool deep, Name nameExt, PtrMap* ptrMap ) {
+void _ParticleCommHandler_Print( void* particleCommHandler, Stream* stream ) {
ParticleCommHandler* self = (ParticleCommHandler*)particleCommHandler;
- ParticleCommHandler* newParticleCommHandler;
- PtrMap* map = ptrMap;
- Bool ownMap = False;
- if( !map ) {
- map = PtrMap_New( 10 );
- ownMap = True;
- }
-
- newParticleCommHandler = _Stg_Class_Copy( self, dest, deep, nameExt, map );
-
- /* Virtual methods */
- newParticleCommHandler->_handleParticleMovementBetweenProcs = self->_handleParticleMovementBetweenProcs;
-
- newParticleCommHandler->shadowParticlesLeavingMeTotalCount = self->shadowParticlesLeavingMeTotalCount;
- newParticleCommHandler->shadowParticlesLeavingMeUnfilledCount = self->shadowParticlesLeavingMeUnfilledCount;
- newParticleCommHandler->currShadowParticleLeavingMeIndex = self->currShadowParticleLeavingMeIndex;
- newParticleCommHandler->particlesOutsideDomainTotalCount = self->particlesOutsideDomainTotalCount;
- newParticleCommHandler->particlesOutsideDomainUnfilledCount = self->particlesOutsideDomainUnfilledCount;
- newParticleCommHandler->currParticleLeavingMyDomainIndex = self->currParticleLeavingMyDomainIndex;
-
- if( deep ) {
- newParticleCommHandler->debug = (Stream*)Stg_Class_Copy( self->debug, NULL, deep, nameExt, map );
- newParticleCommHandler->swarm = (Swarm*)Stg_Class_Copy( self->swarm, NULL, deep, nameExt, map );
-
- if( (newParticleCommHandler->shadowParticlesLeavingMeIndices = PtrMap_Find( map, self->shadowParticlesLeavingMeIndices )) == NULL && self->shadowParticlesLeavingMeIndices ) {
- newParticleCommHandler->shadowParticlesLeavingMeIndices = Memory_Alloc_Array( Index, newParticleCommHandler->shadowParticlesLeavingMeTotalCount, "ParticleCommHandler->shadowParticlesLeavingMeIndices" );
- memcpy( newParticleCommHandler->shadowParticlesLeavingMeIndices, self->shadowParticlesLeavingMeIndices, sizeof(Index) * newParticleCommHandler->shadowParticlesLeavingMeTotalCount );
- PtrMap_Append( map, self->shadowParticlesLeavingMeIndices, newParticleCommHandler->shadowParticlesLeavingMeIndices );
- }
-
- if( (newParticleCommHandler->particlesOutsideDomainIndices = PtrMap_Find( map, self->particlesOutsideDomainIndices )) == NULL && self->particlesOutsideDomainIndices ) {
- newParticleCommHandler->particlesOutsideDomainIndices = Memory_Alloc_Array( Index, newParticleCommHandler->particlesOutsideDomainTotalCount, "ParticleCommHandler->particlesOutsideDomainIndices" );
- memcpy( newParticleCommHandler->particlesOutsideDomainIndices, self->particlesOutsideDomainIndices, sizeof(Index) * newParticleCommHandler->particlesOutsideDomainTotalCount );
- PtrMap_Append( map, self->particlesOutsideDomainIndices, newParticleCommHandler->particlesOutsideDomainIndices );
- }
-
- if( (newParticleCommHandler->shadowParticlesLeavingMeTotalCounts = PtrMap_Find( map, self->shadowParticlesLeavingMeTotalCounts )) == NULL && self->shadowParticlesLeavingMeTotalCounts ) {
- ShadowInfo* cellShadowInfo = CellLayout_GetShadowInfo( self->swarm->cellLayout );
- ProcNbrInfo* procNbrInfo = cellShadowInfo->procNbrInfo;
- Neighbour_Index nbrCount = procNbrInfo->procNbrCnt;
-
- newParticleCommHandler->shadowParticlesLeavingMeTotalCounts = Memory_Alloc_Array( Particle_Index, nbrCount, "ParticleCommHandler->shadowParticlesLeavingMeTotalCounts" );
- memcpy( newParticleCommHandler->shadowParticlesLeavingMeTotalCounts, self->shadowParticlesLeavingMeTotalCounts, sizeof(Particle_Index) * nbrCount );
- PtrMap_Append( map, self->shadowParticlesLeavingMeTotalCounts, newParticleCommHandler->shadowParticlesLeavingMeTotalCounts );
- }
-
- if( (newParticleCommHandler->shadowParticlesLeavingMeCountsPerCell = PtrMap_Find( map, self->shadowParticlesLeavingMeCountsPerCell )) == NULL && self->shadowParticlesLeavingMeCountsPerCell ) {
- ShadowInfo* cellShadowInfo = CellLayout_GetShadowInfo( self->swarm->cellLayout );
- ProcNbrInfo* procNbrInfo = cellShadowInfo->procNbrInfo;
- Neighbour_Index nbrCount = procNbrInfo->procNbrCnt;
- Neighbour_Index nbr_I;
-
- newParticleCommHandler->shadowParticlesLeavingMeCountsPerCell = Memory_Alloc_2DComplex( Particle_Index, nbrCount, newParticleCommHandler->shadowParticlesLeavingMeTotalCounts, "ParticleCommHandler->shadowParticlesLeavingMeCountsPerCell" );
- for( nbr_I = 0; nbr_I < nbrCount; nbr_I++ ) {
- memcpy( newParticleCommHandler->shadowParticlesLeavingMeCountsPerCell[nbr_I], self->shadowParticlesLeavingMeCountsPerCell[nbr_I], sizeof(Particle_Index) * newParticleCommHandler->shadowParticlesLeavingMeTotalCounts[nbr_I] );
- }
- PtrMap_Append( map, self->shadowParticlesLeavingMeCountsPerCell, newParticleCommHandler->shadowParticlesLeavingMeCountsPerCell );
- }
-
- if( (newParticleCommHandler->shadowParticlesLeavingMe = PtrMap_Find( map, self->shadowParticlesLeavingMe )) == NULL && self->shadowParticlesLeavingMe ) {
- ShadowInfo* cellShadowInfo = CellLayout_GetShadowInfo( self->swarm->cellLayout );
- ProcNbrInfo* procNbrInfo = cellShadowInfo->procNbrInfo;
- Neighbour_Index nbrCount = procNbrInfo->procNbrCnt;
- Neighbour_Index nbr_I;
-
- newParticleCommHandler->shadowParticlesLeavingMe = Memory_Alloc_Array( Particle*, nbrCount, "ParticleCommHandler->shadowParticlesLeavingMe" );
- for( nbr_I = 0; nbr_I < nbrCount; nbr_I++ ) {
- SizeT particlesArraySize = self->swarm->particleExtensionMgr->finalSize * newParticleCommHandler->shadowParticlesLeavingMeTotalCounts[nbr_I];
-
- newParticleCommHandler->shadowParticlesLeavingMe[nbr_I] = Memory_Alloc_Bytes( particlesArraySize, "Particle", "particleCommHandler->shadowParticlesLeavingMe[]" );
- memcpy( newParticleCommHandler->shadowParticlesLeavingMe[nbr_I], self->shadowParticlesLeavingMe[nbr_I], particlesArraySize );
- }
- PtrMap_Append( map, self->shadowParticlesLeavingMe, newParticleCommHandler->shadowParticlesLeavingMe );
- }
-
- if( (newParticleCommHandler->shadowParticlesLeavingMeHandles = PtrMap_Find( map, self->shadowParticlesLeavingMeHandles )) == NULL && self->shadowParticlesLeavingMeHandles ) {
- ShadowInfo* cellShadowInfo = CellLayout_GetShadowInfo( self->swarm->cellLayout );
- ProcNbrInfo* procNbrInfo = cellShadowInfo->procNbrInfo;
- Neighbour_Index nbrCount = procNbrInfo->procNbrCnt;
- Neighbour_Index nbr_I;
-
- newParticleCommHandler->shadowParticlesLeavingMeHandles = Memory_Alloc_Array( MPI_Request*, nbrCount, "ParticleCommHandler->shadowParticlesLeavingMeHandles" );
- for( nbr_I = 0; nbr_I < nbrCount; nbr_I++ ) {
- if( self->shadowParticlesLeavingMeHandles[nbr_I] ) {
- newParticleCommHandler->shadowParticlesLeavingMeHandles[nbr_I] = Memory_Alloc( MPI_Request, "particleCommHandler->shadowParticlesLeavingMeHandles[]" );
- memcpy( newParticleCommHandler->shadowParticlesLeavingMeHandles[nbr_I], self->shadowParticlesLeavingMeHandles[nbr_I], sizeof(MPI_Request) );
- }
- else {
- newParticleCommHandler->shadowParticlesLeavingMeHandles[nbr_I] = NULL;
- }
- }
- PtrMap_Append( map, self->shadowParticlesLeavingMeHandles, newParticleCommHandler->shadowParticlesLeavingMeHandles );
- }
-
- /*
- ** Temporary
- */
-
- if( (newParticleCommHandler->particlesArrivingFromNbrShadowCellsTotalCounts = PtrMap_Find( map, self->particlesArrivingFromNbrShadowCellsTotalCounts )) == NULL && self->particlesArrivingFromNbrShadowCellsTotalCounts ) {
- ShadowInfo* cellShadowInfo = CellLayout_GetShadowInfo( self->swarm->cellLayout );
- ProcNbrInfo* procNbrInfo = cellShadowInfo->procNbrInfo;
- Neighbour_Index nbrCount = procNbrInfo->procNbrCnt;
-
- newParticleCommHandler->particlesArrivingFromNbrShadowCellsTotalCounts = Memory_Alloc_Array( Particle_Index, nbrCount, "ParticleCommHandler->particlesArrivingFromNbrShadowCellsTotalCounts" );
- memcpy( newParticleCommHandler->particlesArrivingFromNbrShadowCellsTotalCounts, self->particlesArrivingFromNbrShadowCellsTotalCounts, sizeof(Particle_Index) * nbrCount );
- PtrMap_Append( map, self->particlesArrivingFromNbrShadowCellsTotalCounts, newParticleCommHandler->particlesArrivingFromNbrShadowCellsTotalCounts );
- }
-
- if( (newParticleCommHandler->particlesArrivingFromNbrShadowCellCounts = PtrMap_Find( map, self->particlesArrivingFromNbrShadowCellCounts )) == NULL && self->particlesArrivingFromNbrShadowCellCounts ) {
- ShadowInfo* cellShadowInfo = CellLayout_GetShadowInfo( self->swarm->cellLayout );
- ProcNbrInfo* procNbrInfo = cellShadowInfo->procNbrInfo;
- Neighbour_Index nbrCount = procNbrInfo->procNbrCnt;
- Neighbour_Index nbr_I;
-
- newParticleCommHandler->particlesArrivingFromNbrShadowCellCounts = Memory_Alloc_2DComplex( Particle_Index, nbrCount, newParticleCommHandler->particlesArrivingFromNbrShadowCellsTotalCounts, "ParticleCommHandler->particlesArrivingFromNbrShadowCellCounts" );
- for( nbr_I = 0; nbr_I < nbrCount; nbr_I++ ) {
- memcpy( newParticleCommHandler->particlesArrivingFromNbrShadowCellCounts[nbr_I], self->particlesArrivingFromNbrShadowCellCounts[nbr_I], sizeof(Particle_Index) * newParticleCommHandler->particlesArrivingFromNbrShadowCellsTotalCounts[nbr_I] );
- }
- PtrMap_Append( map, self->particlesArrivingFromNbrShadowCellCounts, newParticleCommHandler->particlesArrivingFromNbrShadowCellCounts );
- }
-
- if( (newParticleCommHandler->particlesArrivingFromNbrShadowCells = PtrMap_Find( map, self->particlesArrivingFromNbrShadowCells )) == NULL && self->particlesArrivingFromNbrShadowCells ) {
- ShadowInfo* cellShadowInfo = CellLayout_GetShadowInfo( self->swarm->cellLayout );
- ProcNbrInfo* procNbrInfo = cellShadowInfo->procNbrInfo;
- Neighbour_Index nbrCount = procNbrInfo->procNbrCnt;
- Neighbour_Index nbr_I;
-
- newParticleCommHandler->particlesArrivingFromNbrShadowCells = Memory_Alloc_Array( Particle*, nbrCount, "ParticleCommHandler->particlesArrivingFromNbrShadowCells" );
- for( nbr_I = 0; nbr_I < nbrCount; nbr_I++ ) {
- SizeT particlesArraySize = self->swarm->particleExtensionMgr->finalSize * newParticleCommHandler->particlesArrivingFromNbrShadowCellsTotalCounts[nbr_I];
-
- newParticleCommHandler->particlesArrivingFromNbrShadowCells[nbr_I] = Memory_Alloc_Bytes( particlesArraySize, "Particle", "particleCommHandler->particlesArrivingFromNbrShadowCells[]" );
- memcpy( newParticleCommHandler->particlesArrivingFromNbrShadowCells[nbr_I], self->particlesArrivingFromNbrShadowCells[nbr_I], particlesArraySize );
- }
- PtrMap_Append( map, self->particlesArrivingFromNbrShadowCells, newParticleCommHandler->particlesArrivingFromNbrShadowCells );
- }
-
- if( (newParticleCommHandler->particlesArrivingFromNbrShadowCellsHandles = PtrMap_Find( map, self->particlesArrivingFromNbrShadowCellsHandles )) == NULL && self->particlesArrivingFromNbrShadowCellsHandles ) {
- ShadowInfo* cellShadowInfo = CellLayout_GetShadowInfo( self->swarm->cellLayout );
- ProcNbrInfo* procNbrInfo = cellShadowInfo->procNbrInfo;
- Neighbour_Index nbrCount = procNbrInfo->procNbrCnt;
- Neighbour_Index nbr_I;
-
- newParticleCommHandler->particlesArrivingFromNbrShadowCellsHandles = Memory_Alloc_Array( MPI_Request*, nbrCount, "ParticleCommHandler->particlesArrivingFromNbrShadowCellsHandles" );
- for( nbr_I = 0; nbr_I < nbrCount; nbr_I++ ) {
- if( self->particlesArrivingFromNbrShadowCellsHandles[nbr_I] ) {
- newParticleCommHandler->particlesArrivingFromNbrShadowCellsHandles[nbr_I] = Memory_Alloc( MPI_Request, "particleCommHandler->particlesArrivingFromNbrShadowCellsHandles[]" );
- memcpy( newParticleCommHandler->particlesArrivingFromNbrShadowCellsHandles[nbr_I], self->particlesArrivingFromNbrShadowCellsHandles[nbr_I], sizeof(MPI_Request) );
- }
- else {
- newParticleCommHandler->particlesArrivingFromNbrShadowCellsHandles[nbr_I] = NULL;
- }
- }
- PtrMap_Append( map, self->particlesArrivingFromNbrShadowCellsHandles, newParticleCommHandler->particlesArrivingFromNbrShadowCellsHandles );
- }
-
- if( (newParticleCommHandler->particlesArrivingFromNbrShadowCellCountsHandles = PtrMap_Find( map, self->particlesArrivingFromNbrShadowCellCountsHandles )) == NULL && self->particlesArrivingFromNbrShadowCellCountsHandles ) {
- ShadowInfo* cellShadowInfo = CellLayout_GetShadowInfo( self->swarm->cellLayout );
- ProcNbrInfo* procNbrInfo = cellShadowInfo->procNbrInfo;
- Neighbour_Index nbrCount = procNbrInfo->procNbrCnt;
- Neighbour_Index nbr_I;
-
- newParticleCommHandler->particlesArrivingFromNbrShadowCellCountsHandles = Memory_Alloc_Array( MPI_Request*, nbrCount, "ParticleCommHandler->particlesArrivingFromNbrShadowCellCountsHandles" );
- for( nbr_I = 0; nbr_I < nbrCount; nbr_I++ ) {
- if( self->particlesArrivingFromNbrShadowCellCountsHandles[nbr_I] ) {
- newParticleCommHandler->particlesArrivingFromNbrShadowCellCountsHandles[nbr_I] = Memory_Alloc( MPI_Request, "particleCommHandler->particlesArrivingFromNbrShadowCellCountsHandles[]" );
- memcpy( newParticleCommHandler->particlesArrivingFromNbrShadowCellCountsHandles[nbr_I], self->particlesArrivingFromNbrShadowCellCountsHandles[nbr_I], sizeof(MPI_Request) );
- }
- else {
- newParticleCommHandler->particlesArrivingFromNbrShadowCellCountsHandles[nbr_I] = NULL;
- }
- }
- PtrMap_Append( map, self->particlesArrivingFromNbrShadowCellCountsHandles, newParticleCommHandler->particlesArrivingFromNbrShadowCellCountsHandles );
- }
- }
- else {
- newParticleCommHandler->debug = self->debug;
- newParticleCommHandler->swarm = self->swarm;
- newParticleCommHandler->shadowParticlesLeavingMeIndices = self->shadowParticlesLeavingMeIndices;
- newParticleCommHandler->particlesOutsideDomainIndices = self->particlesOutsideDomainIndices;
- newParticleCommHandler->shadowParticlesLeavingMeTotalCounts = self->shadowParticlesLeavingMeTotalCounts;
- newParticleCommHandler->shadowParticlesLeavingMeCountsPerCell = self->shadowParticlesLeavingMeCountsPerCell;
- newParticleCommHandler->shadowParticlesLeavingMe = self->shadowParticlesLeavingMe;
- newParticleCommHandler->shadowParticlesLeavingMeHandles = self->shadowParticlesLeavingMeHandles;
- newParticleCommHandler->particlesArrivingFromNbrShadowCellsTotalCounts = self->particlesArrivingFromNbrShadowCellsTotalCounts;
- newParticleCommHandler->particlesArrivingFromNbrShadowCellCounts = self->particlesArrivingFromNbrShadowCellCounts;
- newParticleCommHandler->particlesArrivingFromNbrShadowCells = self->particlesArrivingFromNbrShadowCells;
- newParticleCommHandler->particlesArrivingFromNbrShadowCellsHandles = self->particlesArrivingFromNbrShadowCellsHandles;
- newParticleCommHandler->particlesArrivingFromNbrShadowCellCountsHandles = self->particlesArrivingFromNbrShadowCellCountsHandles;
- }
-
- if( ownMap ) {
- Stg_Class_Delete( map );
- }
-
- return (void*)newParticleCommHandler;
-}
+ /* Set the Journal for printing informations */
+ Stream* particleCommHandlerStream;
+ particleCommHandlerStream = Journal_Register( InfoStream_Type, "ParticleCommHandlerStream" );
-void _ParticleCommHandler_Construct( void* pCommsHandler, Stg_ComponentFactory* cf, void* data ){
-
+ /* Print parent */
+ Journal_Printf( stream, "ParticleCommHandler (ptr): (%p)\n", self );
+ _Stg_Component_Print( self, stream );
}
-
-void _ParticleCommHandler_Build( void* pCommsHandler, void *data ){
-
-}
-
-void _ParticleCommHandler_Initialise( void* pCommsHandler, void *data ){
-
-}
-
-void _ParticleCommHandler_Execute( void* pCommsHandler, void *data ){
-
-}
-void _ParticleCommHandler_Destroy( void* pCommsHandler, void *data ){
-
+void _ParticleCommHandler_Construct( void* particleCommHandler, Stg_ComponentFactory* cf, void* data ) {
}
-void ParticleCommHandler_HandleParticleMovementBetweenProcs( void* pCommsHandler ) {
- ParticleCommHandler* self = (ParticleCommHandler*)pCommsHandler;
-
- self->_handleParticleMovementBetweenProcs( self );
+void _ParticleCommHandler_Build( void* particleCommHandler, void* data ) {
}
-void _ParticleCommHandler_HandleParticleMovementBetweenProcs( void* pCommsHandler ) {
- ParticleCommHandler* self = (ParticleCommHandler*)pCommsHandler;
- double startTime = 0;
- double myProcTime = 0;
- double* procTimes = NULL;
- double maxProcTime = 0;
- Processor_Index proc_I = 0;
- Neighbour_Index nbrCount = 0;
- Particle_Index totalParticlesRecvdViaShadowFromNbrs = 0;
- Stream* info = Journal_Register( Info_Type, self->type );
- Particle_Index globalParticlesArrivingMyDomainCount = 0;
- Particle_Index globalParticlesOutsideDomainTotal = 0;
-
- Journal_DPrintfL( self->debug, 1, "In %s(), for swarm \"%s\":\n", __func__, self->swarm->name );
- if ( 1 == self->swarm->nProc ) {
- Journal_DPrintfL( self->debug, 1, "Serial run -> nothing to communicate, returning.\n" );
- Stream_UnIndentBranch( Swarm_Debug );
- return;
- }
-
- Journal_Printf( info, "Proc %d in %s() for swarm \"%s\": beginning comms...\n",
- self->swarm->myRank, __func__, self->swarm->name );
- startTime = MPI_Wtime();
- Stream_IndentBranch( Swarm_Debug );
-
- if ( self->swarm->cellShadowCount > 0 ) {
- ShadowInfo* cellShadowInfo = CellLayout_GetShadowInfo( self->swarm->cellLayout );
- ProcNbrInfo* procNbrInfo = cellShadowInfo->procNbrInfo;
- Neighbour_Index nbr_I;
- Processor_Index proc_I;
- Neighbour_Index nbrCount = procNbrInfo->procNbrCnt;
-
- /* Allocate the recv count arrays and handles */
- self->particlesArrivingFromNbrShadowCellCounts = Memory_Alloc_2DComplex(
- Particle_Index, nbrCount, cellShadowInfo->procShadowedCnt,
- "ParticleCommHandler->particlesArrivingFromNbrShadowCellCounts" );
- self->particlesArrivingFromNbrShadowCellCountsHandles = Memory_Alloc_Array( MPI_Request*, nbrCount,
- "ParticleCommHandler->particlesArrivingFromNbrShadowCellCountsHandles" );
- for ( nbr_I=0; nbr_I < procNbrInfo->procNbrCnt; nbr_I++ ) {
- self->particlesArrivingFromNbrShadowCellCountsHandles[nbr_I] = Memory_Alloc( MPI_Request,
- "ParticleCommHandler->particlesArrivingFromNbrShadowCellCountsHandles[]" );
- }
- self->particlesArrivingFromNbrShadowCellsTotalCounts = Memory_Alloc_Array( Particle_Index, nbrCount,
- "ParticleCommHandler->particlesArrivingFromNbrShadowCellsTotalCounts" );
-
- for ( nbr_I=0; nbr_I < procNbrInfo->procNbrCnt; nbr_I++ ) {
- proc_I = procNbrInfo->procNbrTbl[nbr_I];
- MPI_Irecv( self->particlesArrivingFromNbrShadowCellCounts[nbr_I], cellShadowInfo->procShadowedCnt[nbr_I],
- MPI_UNSIGNED, proc_I, SHADOW_PARTICLE_COUNTS_PER_CELL, self->swarm->comm,
- self->particlesArrivingFromNbrShadowCellCountsHandles[nbr_I] );
- }
-
- self->shadowParticlesLeavingMeCountsPerCell = Memory_Alloc_2DComplex(
- Particle_Index, nbrCount, cellShadowInfo->procShadowCnt,
- "ParticleCommHandler->shadowParticlesLeavingMeCountsPerCell" );
- self->shadowParticlesLeavingMeTotalCounts = Memory_Alloc_Array( Particle_Index, nbrCount,
- "ParticleCommHandler->shadowParticlesLeavingMeTotalCounts" );
-
- _ParticleCommHandler_SendParticleTotalsInShadowCellsToNbrs( self );
-
- /* wait until recv of totals from nbrs complete, then start non-blocking recv of particles */
- {
- Particle_Index incomingCellParticleCount = 0;
- SizeT particlesArraySize;
- MPI_Status status;
- Cell_ShadowTransferIndex stCell_I;
- Processor_Index proc_I;
-
- self->particlesArrivingFromNbrShadowCellsHandles = Memory_Alloc_Array(
- MPI_Request*, procNbrInfo->procNbrCnt,
- "ParticleCommHandler->particlesArrivingFromNbrShadowCellsHandles");
- self->particlesArrivingFromNbrShadowCells = Memory_Alloc_Array(
- Particle*, procNbrInfo->procNbrCnt,
- "ParticleCommHandler->particlesArrivingFromNbrShadowCells" );
-
- /* TODO: may be worth converting the below into an MPI_Test loop */
- for ( nbr_I=0; nbr_I < procNbrInfo->procNbrCnt; nbr_I++ ) {
-
- proc_I = procNbrInfo->procNbrTbl[nbr_I];
- MPI_Wait( self->particlesArrivingFromNbrShadowCellCountsHandles[nbr_I], &status );
- Memory_Free( self->particlesArrivingFromNbrShadowCellCountsHandles[nbr_I] );
-
- Journal_DPrintfL( self->debug, 1, "proc %d: recv shadow counts from nbr %d (rank %d):\n",
- self->swarm->myRank, nbr_I, proc_I );
- Journal_DPrintfL( self->debug, 2, "\tare [" );
- self->particlesArrivingFromNbrShadowCellsTotalCounts[nbr_I] = 0;
- for ( stCell_I=0; stCell_I < cellShadowInfo->procShadowedCnt[nbr_I]; stCell_I++ ) {
- incomingCellParticleCount = self->particlesArrivingFromNbrShadowCellCounts[nbr_I][stCell_I];
- Journal_DPrintfL( self->debug, 2, "%d, ", incomingCellParticleCount );
- self->particlesArrivingFromNbrShadowCellsTotalCounts[nbr_I] += incomingCellParticleCount;
- }
- Journal_DPrintfL( self->debug, 2, "]\n" );
- Journal_DPrintfL( self->debug, 1, "(Proc %d):....totalled to %d\n", self->swarm->myRank,
- self->particlesArrivingFromNbrShadowCellsTotalCounts[nbr_I] );
-
- if ( self->particlesArrivingFromNbrShadowCellsTotalCounts[nbr_I] == 0 ) {
- /* No particles to receive from this proc -> just clear recv ptr */
- self->particlesArrivingFromNbrShadowCellsHandles[nbr_I] = NULL;
- self->particlesArrivingFromNbrShadowCells[nbr_I] = NULL;
- }
- else {
- self->particlesArrivingFromNbrShadowCellsHandles[nbr_I] = Memory_Alloc(
- MPI_Request,
- "ParticleCommHandler->particlesArrivingFromNbrShadowCellsHandles[]" );
-
- /* allocate particles recv array to right size */
- particlesArraySize = self->swarm->particleExtensionMgr->finalSize *
- self->particlesArrivingFromNbrShadowCellsTotalCounts[nbr_I];
- self->particlesArrivingFromNbrShadowCells[nbr_I] = Memory_Alloc_Bytes( particlesArraySize,
- "Particle", "particleCommHandler->particlesArrivingFromNbrShadowCells[]" );
- /* start non-blocking recv of particles */
- MPI_Irecv( self->particlesArrivingFromNbrShadowCells[nbr_I], particlesArraySize, MPI_BYTE,
- proc_I, SHADOW_PARTICLES, self->swarm->comm,
- self->particlesArrivingFromNbrShadowCellsHandles[nbr_I] );
- }
- }
-
- Memory_Free( self->particlesArrivingFromNbrShadowCellCountsHandles );
- }
-
- _ParticleCommHandler_NonBlockingSendParticlesInShadowCellsToNbrs( self );
-
- Memory_Free( self->shadowParticlesLeavingMeCountsPerCell );
- }
-
- /* Now check for particles that have moved further than the shadow cells */
- _ParticleCommHandler_FindParticlesThatHaveMovedOutsideMyDomain( self );
-
- _ParticleCommHandler_ShareAndUpdateParticlesThatHaveMovedOutsideDomains( self,
- &globalParticlesArrivingMyDomainCount,
- &globalParticlesOutsideDomainTotal );
-
- if ( self->swarm->cellShadowCount > 0 ) {
- _ParticleCommHandler_ReceiveAndUpdateShadowParticlesEnteringMyDomain( self );
- }
-
- /* final update of the 'holes' in my particles list, if any left, of particles that left */
- _ParticleCommHandler_FillRemainingHolesInLocalParticlesArray( self );
-
- if ( self->swarm->cellShadowCount > 0 ) {
- ShadowInfo* cellShadowInfo = CellLayout_GetShadowInfo( self->swarm->cellLayout );
- ProcNbrInfo* procNbrInfo = cellShadowInfo->procNbrInfo;
- Neighbour_Index nbr_I;
- MPI_Status status;
-
- /* MPI_Wait for all shadow sends to complete */
- for ( nbr_I=0; nbr_I < procNbrInfo->procNbrCnt; nbr_I++ ) {
- if ( self->shadowParticlesLeavingMeTotalCounts[nbr_I] > 0 ) {
- MPI_Wait( self->shadowParticlesLeavingMeHandles[nbr_I], &status );
- Memory_Free( self->shadowParticlesLeavingMe[nbr_I] );
- Memory_Free( self->shadowParticlesLeavingMeHandles[nbr_I] );
- }
- }
- Memory_Free( self->shadowParticlesLeavingMe );
- Memory_Free( self->shadowParticlesLeavingMeHandles );
- Memory_Free( self->shadowParticlesLeavingMeTotalCounts );
- Memory_Free( self->shadowParticlesLeavingMeIndices );
- }
-
-
- /* Useful info for profiling... */
- myProcTime = MPI_Wtime() - startTime;
-
- totalParticlesRecvdViaShadowFromNbrs = 0;
- nbrCount = 0;
- if ( self->swarm->cellShadowCount > 0 ) {
- ShadowInfo* cellShadowInfo = CellLayout_GetShadowInfo( self->swarm->cellLayout );
- ProcNbrInfo* procNbrInfo = cellShadowInfo->procNbrInfo;
- Neighbour_Index nbr_I;
-
- nbrCount = procNbrInfo->procNbrCnt;
- for ( nbr_I=0; nbr_I < procNbrInfo->procNbrCnt; nbr_I++ ) {
- totalParticlesRecvdViaShadowFromNbrs +=
- self->particlesArrivingFromNbrShadowCellsTotalCounts[nbr_I];
- }
- }
-
-
- for ( proc_I = 0; proc_I < self->swarm->nProc; proc_I++ ) {
- MPI_Barrier( self->swarm->comm );
- if ( self->swarm->myRank == proc_I ) {
- Journal_Printf( info, "...proc %d finished particle communication:\n", self->swarm->myRank );
- Stream_Indent( info );
- Journal_Printf( info, "- Particle comm totals via shadow cells (%d nbr procs): sent %d, recvd %d\n",
- nbrCount, self->shadowParticlesLeavingMeTotalCount,
- totalParticlesRecvdViaShadowFromNbrs );
- Journal_Printf( info, "- Particle comm totals via global synch (%d total procs): sent %d, recvd %d (of %d synched)\n",
- self->swarm->nProc,
- self->particlesOutsideDomainTotalCount,
- globalParticlesArrivingMyDomainCount,
- globalParticlesOutsideDomainTotal );
- Journal_Printf( info, "- time taken = %.2f (secs)\n", myProcTime );
- Stream_UnIndent( info );
- }
- }
-
- procTimes = Memory_Alloc_Array( double, self->swarm->nProc, "procTimes" );
- MPI_Gather( &myProcTime, 1, MPI_DOUBLE, procTimes, 1, MPI_DOUBLE, 0, self->swarm->comm );
- if (self->swarm->myRank == 0 ) {
- for ( proc_I = 0; proc_I < self->swarm->nProc; proc_I++ ) {
- if ( procTimes[proc_I] > maxProcTime ) {
- maxProcTime = procTimes[proc_I];
- }
- }
- /* TODO: print some stats on max particles sent/recvd and total sent/recvd */
- Journal_Printf( info, "...Max Communication time by any proc was %.2f (secs)\n", maxProcTime );
- }
- Memory_Free( procTimes );
- MPI_Barrier( self->swarm->comm );
-
- /* clean up allocated memory, and zero counters, ready for next timestep */
- Memory_Free( self->particlesArrivingFromNbrShadowCellsTotalCounts );
- self->shadowParticlesLeavingMeIndices = NULL;
- self->currShadowParticleLeavingMeIndex = 0;
- self->shadowParticlesLeavingMeTotalCount = 0;
- self->shadowParticlesLeavingMeUnfilledCount = 0;
- Memory_Free( self->particlesOutsideDomainIndices );
- self->particlesOutsideDomainIndices = NULL;
- self->particlesOutsideDomainTotalCount = 0;
- self->particlesOutsideDomainUnfilledCount = 0;
- self->currParticleLeavingMyDomainIndex = 0;
-
- Stream_UnIndentBranch( Swarm_Debug );
+void _ParticleCommHandler_Initialise( void* particleCommHandler, void* data ) {
}
-
-void _ParticleCommHandler_SendParticleTotalsInShadowCellsToNbrs( ParticleCommHandler* self )
-{
- Cell_ShadowTransferIndex stCell_I;
- Cell_DomainIndex dCell_I;
- Index nbr_I;
- Processor_Index proc_I;
- Cell_ShadowTransferIndex shadowCellsToProcCount;
- ShadowInfo* cellShadowInfo = CellLayout_GetShadowInfo( self->swarm->cellLayout );
- ProcNbrInfo* procNbrInfo = cellShadowInfo->procNbrInfo;
- Cell_PointIndex currCellParticleCount;
-
- Journal_DPrintfL( self->debug, 1, "In %s():\n", __func__ );
- Stream_IndentBranch( Swarm_Debug );
-
- self->shadowParticlesLeavingMeTotalCount = 0;
-
- for ( nbr_I = 0; nbr_I < procNbrInfo->procNbrCnt; nbr_I++ ) {
- proc_I = procNbrInfo->procNbrTbl[nbr_I];
-
- shadowCellsToProcCount = cellShadowInfo->procShadowCnt[nbr_I];
- Journal_DPrintfL( self->debug, 3, "Saving particle count in %d shadow cells going to nbr %d (proc %d):\n\t",
- shadowCellsToProcCount, nbr_I, proc_I );
-
- self->shadowParticlesLeavingMeTotalCounts[nbr_I] = 0;
-
- for ( stCell_I=0; stCell_I < shadowCellsToProcCount; stCell_I++ ) {
- dCell_I = cellShadowInfo->procShadowTbl[nbr_I][stCell_I];
-
- currCellParticleCount = self->swarm->cellParticleCountTbl[dCell_I];
- Journal_DPrintfL( self->debug, 3, "(stCell_I=%d, dCell_I=%d, cnt=%d), ",
- stCell_I, dCell_I, currCellParticleCount );
- self->shadowParticlesLeavingMeCountsPerCell[nbr_I][stCell_I] = currCellParticleCount;
- self->shadowParticlesLeavingMeTotalCounts[nbr_I] += currCellParticleCount;
- self->shadowParticlesLeavingMeTotalCount += currCellParticleCount;
- }
- Journal_DPrintfL( self->debug, 3, "\n" );
-
- MPI_Ssend( self->shadowParticlesLeavingMeCountsPerCell[nbr_I], shadowCellsToProcCount, MPI_UNSIGNED,
- proc_I, SHADOW_PARTICLE_COUNTS_PER_CELL, self->swarm->comm );
- }
-
- self->shadowParticlesLeavingMeUnfilledCount = self->shadowParticlesLeavingMeTotalCount;
- Stream_UnIndentBranch( Swarm_Debug );
+void _ParticleCommHandler_Execute( void* particleCommHandler, void* data ) {
}
-
-void _ParticleCommHandler_NonBlockingSendParticlesInShadowCellsToNbrs( ParticleCommHandler* self ) {
- Cell_ShadowTransferIndex stCell_I;
- Cell_DomainIndex dCell_I;
- Neighbour_Index nbr_I;
- Processor_Index proc_I;
- Cell_ShadowTransferIndex shadowCellsToProcCount;
- ShadowInfo* cellShadowInfo = CellLayout_GetShadowInfo( self->swarm->cellLayout );
- ProcNbrInfo* procNbrInfo = cellShadowInfo->procNbrInfo;
- Neighbour_Index nbrCount = procNbrInfo->procNbrCnt;
- Particle_InCellIndex currCellParticleCount;
- Particle_InCellIndex cParticle_I;
- Particle_Index lParticle_I;
- Particle_Index tParticle_I=0; /*Index into the particle transfer array */
- Index leavingParticle_I=0; /*Index into the array of all leaving particle indices */
- SizeT particlesArrayBytes;
- #if DEBUG
- GlobalParticle* currParticle;
- #endif
- #if CAUTIOUS
- Bool* cellsClearedForTransfer = NULL;
- Neighbour_Index* cellsClearedForTransferDests = NULL;
- Stream* errorStream = Journal_Register( Error_Type, self->type );
- #endif
-
- Journal_DPrintfL( self->debug, 1, "In %s():\n", __func__ );
- Stream_Indent( self->debug );
-
- #if CAUTIOUS
- /* These guys are used to check that we never try and send the same cell of particles twice */
- cellsClearedForTransfer = Memory_Alloc_Array( Bool, self->swarm->cellDomainCount,
- "cellsClearedForTransfer" );
- cellsClearedForTransferDests = Memory_Alloc_Array( Neighbour_Index, self->swarm->cellDomainCount,
- "cellsClearedForTransferDests" );
- for ( dCell_I = 0; dCell_I < self->swarm->cellDomainCount; dCell_I++ ) {
- cellsClearedForTransfer[dCell_I] = False;
- cellsClearedForTransferDests[dCell_I] = 0;
- }
- #endif
-
- /* Allocate the list of shadow particle indices to all nbrs */
- self->shadowParticlesLeavingMeIndices = Memory_Alloc_Array( Particle_Index, self->shadowParticlesLeavingMeTotalCount,
- "self->shadowParticlesLeavingMeIndices" );
- self->shadowParticlesLeavingMeHandles = Memory_Alloc_Array(
- MPI_Request*, procNbrInfo->procNbrCnt,
- "ParticleCommHandler->shadowParticlesLeavingMeHandles");
- self->shadowParticlesLeavingMe = Memory_Alloc_Array(
- Particle*, procNbrInfo->procNbrCnt,
- "ParticleCommHandler->shadowParticlesLeavingMe" );
-
- Journal_DPrintfL( self->debug, 1, "Sending the shadow particles going to my %d neighbours:\n", nbrCount );
-
- for ( nbr_I=0; nbr_I < nbrCount; nbr_I++ ) {
- tParticle_I=0; /* Reset index for new neighbour processor */
-
- if ( self->shadowParticlesLeavingMeTotalCounts[nbr_I] == 0 ) {
- /* If we're not sending any particles to this proc, skip to next */
- self->shadowParticlesLeavingMeHandles[nbr_I] = NULL;
- self->shadowParticlesLeavingMe[nbr_I] = NULL;
- }
- else {
- #ifdef CAUTIOUS
- Neighbour_Index prevNbr_I;
- #endif
-
- shadowCellsToProcCount = cellShadowInfo->procShadowCnt[nbr_I];
- proc_I = procNbrInfo->procNbrTbl[nbr_I];
- Journal_DPrintfL( self->debug, 3, "nbr %d (proc %d) - %d shadow cells going to it:\n",
- nbr_I, proc_I, shadowCellsToProcCount );
- #ifdef CAUTIOUS
- for ( prevNbr_I=0; prevNbr_I < nbr_I; prevNbr_I++ ) {
- Journal_Firewall( proc_I != procNbrInfo->procNbrTbl[prevNbr_I], errorStream,
- "Error - in %s(), on proc %u: found in our Swarm's ProcNbrInfo "
- "that our nbr %u is proc %u, but we already sent particles to "
- "that processor as nbr %u! Can't send same particles to same "
- "proc twice.\n", __func__, self->swarm->myRank, nbr_I, proc_I,
- prevNbr_I );
- }
- #endif
-
- Stream_Indent( self->debug );
-
- self->shadowParticlesLeavingMeHandles[nbr_I] = Memory_Alloc( MPI_Request,
- "ParticleCommHandler->shadowParticlesLeavingMeHandles[]" );
- particlesArrayBytes = self->swarm->particleExtensionMgr->finalSize *
- self->shadowParticlesLeavingMeTotalCounts[nbr_I];
- self->shadowParticlesLeavingMe[nbr_I] = Memory_Alloc_Bytes( particlesArrayBytes,
- "Particle", "ParticleCommHandler->shadowParticlesLeavingMe[]" );
-
- for ( stCell_I=0; stCell_I < shadowCellsToProcCount; stCell_I++ ) {
- currCellParticleCount = self->shadowParticlesLeavingMeCountsPerCell[nbr_I][stCell_I];
- dCell_I = cellShadowInfo->procShadowTbl[nbr_I][stCell_I];
- #ifdef CAUTIOUS
- Journal_Firewall( cellsClearedForTransfer[dCell_I] == False, errorStream,
- "Error - in %s(), on proc %u: while trying to send shadow particles to "
- "nbr %u (proc %u), tried to copy particles from domain cell %u, but "
- "this cell has already had all its particles cleared for send to "
- "nbr %u (proc %u).\n", __func__, self->swarm->myRank, nbr_I, proc_I,
- dCell_I, cellsClearedForTransferDests[dCell_I],
- procNbrInfo->procNbrTbl[cellsClearedForTransferDests[dCell_I]] );
- #endif
-
- Journal_DPrintfL( self->debug, 3, "Processing Cell %d (%d particles):\n", dCell_I,
- currCellParticleCount );
-
- Stream_Indent( self->debug );
-
- for ( cParticle_I=0; cParticle_I < currCellParticleCount; cParticle_I++ ) {
-
- lParticle_I = self->swarm->cellParticleTbl[dCell_I][cParticle_I];
- #if DEBUG
- currParticle = (GlobalParticle*)Swarm_ParticleAt( self->swarm, lParticle_I );
- Journal_DPrintfL( self->debug, 3, "Copying PIC %d, particle %d at "
- "(%.2f,%.2f,%.2g) to shadowParticlesLeavingMe[%d][%d]\n",
- cParticle_I, lParticle_I,
- currParticle->coord[0], currParticle->coord[1], currParticle->coord[2],
- nbr_I, tParticle_I );
- #endif
- Swarm_CopyParticleOffSwarm( self->swarm,
- self->shadowParticlesLeavingMe[nbr_I], tParticle_I++,
- lParticle_I );
- /* Note: we have no guarantee that the local particle index of where these
- shadow cells are leaving from is monotonically increasing: thus do an insertion
- at the right place. */
- {
- Index insertionIndex = 0;
- Particle_Index* currInsertionPtr;
- for ( ;insertionIndex < leavingParticle_I; insertionIndex++ ) {
- currInsertionPtr = &self->shadowParticlesLeavingMeIndices[insertionIndex];
- if (lParticle_I < (*currInsertionPtr) )
- {
- memmove(
- (Pointer)(((ArithPointer)currInsertionPtr) + sizeof(Particle_Index)),
- currInsertionPtr,
- (leavingParticle_I - insertionIndex) * sizeof(Particle_Index) );
-
- (*currInsertionPtr) = lParticle_I;
- break;
- }
- }
- if ( insertionIndex == leavingParticle_I) {
- self->shadowParticlesLeavingMeIndices[leavingParticle_I] = lParticle_I;
- }
- leavingParticle_I++;
- }
-
- }
- Stream_UnIndent( self->debug );
-
- #ifdef CAUTIOUS
- cellsClearedForTransfer[dCell_I] = True;
- cellsClearedForTransferDests[dCell_I] = nbr_I;
- #endif
- /* Remember to clear the entries for that cell now. */
- self->swarm->cellParticleCountTbl[dCell_I] = 0;
- self->swarm->cellParticleSizeTbl[dCell_I] = 0;
- if ( self->swarm->cellParticleTbl[dCell_I] ) {
- Memory_Free( self->swarm->cellParticleTbl[dCell_I] );
- }
- self->swarm->cellParticleTbl[dCell_I] = NULL;
-
- }
- Stream_UnIndent( self->debug );
-
- /* non blocking send out particles */
- MPI_Issend( self->shadowParticlesLeavingMe[nbr_I],
- self->shadowParticlesLeavingMeTotalCounts[nbr_I] * self->swarm->particleExtensionMgr->finalSize,
- MPI_BYTE, proc_I, SHADOW_PARTICLES, self->swarm->comm,
- self->shadowParticlesLeavingMeHandles[nbr_I] );
- }
- }
- #if CAUTIOUS
- Memory_Free( cellsClearedForTransfer );
- Memory_Free( cellsClearedForTransferDests );
- #endif
- Stream_UnIndent( self->debug );
+void _ParticleCommHandler_Destroy( void* particleCommHandler, void* data ) {
}
+void _ParticleCommHandler_Update( void* particleCommHandler ) {
+ ParticleCommHandler* self = (ParticleCommHandler*)particleCommHandler;
+ unsigned nExternals, *externals;
-/* TODO: look at using MPI_Indexed instead */
-void _ParticleCommHandler_ReceiveAndUpdateShadowParticlesEnteringMyDomain( ParticleCommHandler* self ) {
- MPI_Status status;
- Cell_ShadowTransferIndex stCell_I;
- Cell_LocalIndex lCell_I;
- Neighbour_Index nbr_I;
- Cell_ShadowTransferIndex shadowCellsFromProcCount;
- ShadowInfo* cellShadowInfo = CellLayout_GetShadowInfo( self->swarm->cellLayout );
- ProcNbrInfo* procNbrInfo = cellShadowInfo->procNbrInfo;
- Neighbour_Index nbrCount = procNbrInfo->procNbrCnt;
- Particle_InCellIndex incomingCellParticleCount;
- Particle_InCellIndex cParticle_I;
- Particle_Index lParticle_I;
- Index incomingParticle_I=0; /*Index into the array of all leaving particle indices */
- Index incomingParticleSetsNotYetReceivedCount;
- Bool* incomingParticlesReceived;
- #if DEBUG
- GlobalParticle* currParticle;
- #endif
+ assert( self && Stg_CheckType( self, ParticleCommHandler ) );
- Journal_DPrintf( self->debug, "In %s():\n", __func__ );
- Stream_IndentBranch( Swarm_Debug );
-
- incomingParticlesReceived = Memory_Alloc_Array_Unnamed( Bool, nbrCount );
+ ParticleCommHandler_BuildExternalParticles( self, &nExternals, &externals );
+ ParticleCommHandler_RemoveParticles( self, nExternals, externals );
- /* Calculate how many particle sets we have to receive */
- incomingParticleSetsNotYetReceivedCount = 0;
- for ( nbr_I=0; nbr_I < nbrCount; nbr_I++ ) {
- incomingParticlesReceived[nbr_I] = False;
- if (self->particlesArrivingFromNbrShadowCellsTotalCounts[nbr_I] > 0) {
- incomingParticleSetsNotYetReceivedCount++;
- }
- }
-
- while ( incomingParticleSetsNotYetReceivedCount > 0 ) {
- int flag = 0;
- Journal_DPrintfL( self->debug, 3, "%d particle sets still to go...\n", incomingParticleSetsNotYetReceivedCount );
- for ( nbr_I=0; nbr_I < nbrCount; nbr_I++ ) {
- if ( (self->particlesArrivingFromNbrShadowCellsTotalCounts[nbr_I] > 0) &&
- (False == incomingParticlesReceived[nbr_I]) )
- {
- MPI_Test( self->particlesArrivingFromNbrShadowCellsHandles[nbr_I], &flag, &status );
- if ( False == flag ) {
- /* No results yet from this proc -> continue to next. */
- continue;
- }
- else {
- Journal_DPrintfL( self->debug, 3, "Received particles from nbr %d (proc %d):\n",
- nbr_I, procNbrInfo->procNbrTbl[nbr_I] );
- Stream_Indent( self->debug );
-
- incomingParticle_I = 0;
- shadowCellsFromProcCount = cellShadowInfo->procShadowedCnt[nbr_I];
-
-
- for ( stCell_I=0; stCell_I < shadowCellsFromProcCount; stCell_I++ ) {
-
- lCell_I = cellShadowInfo->procShadowedTbl[nbr_I][stCell_I];
- Journal_DPrintfL( self->debug, 3, "Incoming cell %d (local index %d):\n",
- stCell_I, lCell_I );
- Stream_Indent( self->debug );
-
- incomingCellParticleCount =
- self->particlesArrivingFromNbrShadowCellCounts[nbr_I][stCell_I];
-
- for ( cParticle_I=0; cParticle_I < incomingCellParticleCount; cParticle_I++ ) {
-
- #if DEBUG
- currParticle = (GlobalParticle*)ParticleAt(
- self->particlesArrivingFromNbrShadowCells[nbr_I],
- incomingParticle_I,
- self->swarm->particleExtensionMgr->finalSize );
- Journal_DPrintfL( self->debug, 3, "Handling its PIC %d: - at "
- "(%.2f,%.2f,%.2f)\n", cParticle_I,
- currParticle->coord[0], currParticle->coord[1],
- currParticle->coord[2] );
- #endif
-
- Stream_Indent( self->debug );
-
- lParticle_I = _ParticleCommHandler_FindFreeSlotAndPrepareForInsertion( self );
-
- Swarm_CopyParticleOntoSwarm(
- self->swarm,
- lParticle_I,
- self->particlesArrivingFromNbrShadowCells[nbr_I], incomingParticle_I++ );
-
- Swarm_AddParticleToCell( self->swarm, lCell_I, lParticle_I );
-
- Stream_UnIndent( self->debug );
- }
- Stream_UnIndent( self->debug );
- }
- incomingParticlesReceived[nbr_I] = True;
- incomingParticleSetsNotYetReceivedCount--;
- Memory_Free( self->particlesArrivingFromNbrShadowCells[nbr_I] );
- Memory_Free( self->particlesArrivingFromNbrShadowCellsHandles[nbr_I] );
- Stream_UnIndent( self->debug );
- }
- }
- }
- }
- Memory_Free( incomingParticlesReceived );
- Memory_Free( self->particlesArrivingFromNbrShadowCells );
- Memory_Free( self->particlesArrivingFromNbrShadowCellsHandles );
- Memory_Free( self->particlesArrivingFromNbrShadowCellCounts );
- Stream_UnIndentBranch( Swarm_Debug );
-}
-
-
-void _ParticleCommHandler_FindParticlesThatHaveMovedOutsideMyDomain( ParticleCommHandler* self )
-{
- Particle_Index particlesOutsideDomainSize = 0;
- GlobalParticle* currParticle = NULL;
- Particle_Index lParticle_I = 0;
-
- Journal_DPrintfL( self->debug, 1, "In %s():\n", __func__ );
- Stream_IndentBranch( Swarm_Debug );
-
- self->particlesOutsideDomainTotalCount = 0;
- particlesOutsideDomainSize = self->swarm->particlesArrayDelta;
- self->particlesOutsideDomainIndices = Memory_Alloc_Array( Particle_Index, particlesOutsideDomainSize,
- "self->particlesOutsideDomainIndices" );
-
-
- Journal_DPrintfL( self->debug, 1, "Checking the owning cell of each of my swarm's %d particles:\n",
- self->swarm->particleLocalCount );
- Stream_IndentBranch( Swarm_Debug );
-
- for ( lParticle_I=0; lParticle_I < self->swarm->particleLocalCount; lParticle_I++ ) {
-
- currParticle = (GlobalParticle*)Swarm_ParticleAt( self->swarm, lParticle_I );
- if ( currParticle->owningCell == self->swarm->cellDomainCount ) {
- Journal_DPrintfL( self->debug, 3, "particle %d has moved outside domain to (%.2f,%.2f,%.2f): "
- "saving index\n", lParticle_I, currParticle->coord[0], currParticle->coord[1],
- currParticle->coord[2] );
- if ( self->particlesOutsideDomainTotalCount == particlesOutsideDomainSize ) {
- particlesOutsideDomainSize += self->swarm->particlesArrayDelta;
- Journal_DPrintfL( self->debug, 3, "(Need more memory to save indexes: increasing from %d to %d.)\n",
- self->particlesOutsideDomainTotalCount, particlesOutsideDomainSize );
- self->particlesOutsideDomainIndices = Memory_Realloc_Array( self->particlesOutsideDomainIndices,
- Particle_Index, particlesOutsideDomainSize );
- }
- self->particlesOutsideDomainIndices[self->particlesOutsideDomainTotalCount++] = lParticle_I;
- }
-
- }
- Stream_UnIndentBranch( Swarm_Debug );
-
- self->particlesOutsideDomainUnfilledCount = self->particlesOutsideDomainTotalCount;
-
- #if DEBUG
- {
- Particle_Index particle_I = 0;
- if ( Stream_IsPrintableLevel( self->debug, 2 ) ) {
- Journal_DPrintf( self->debug, "%d Particles have moved outside my domain:\n\t[",
- self->particlesOutsideDomainTotalCount );
- for ( ; particle_I < self->particlesOutsideDomainTotalCount; particle_I++ ) {
- Journal_DPrintf( self->debug, "%d, ", self->particlesOutsideDomainIndices[particle_I] );
- }
- Journal_DPrintf( self->debug, "]\n" );
- }
- }
- #endif
- Stream_UnIndentBranch( Swarm_Debug );
+ FreeArray( externals );
}
-void _ParticleCommHandler_ShareAndUpdateParticlesThatHaveMovedOutsideDomains(
- ParticleCommHandler* self,
- Particle_Index* globalParticlesArrivingMyDomainCountPtr,
- Particle_Index* globalParticlesOutsideDomainTotalPtr )
-{
- Particle_Index* globalParticlesOutsideDomainCounts = NULL;
- Particle_Index maxGlobalParticlesOutsideDomainCount = 0;
- Processor_Index proc_I = 0;
- Particle_Index lParticle_I = 0;
- Particle_Index particle_I = 0;
+/*--------------------------------------------------------------------------------------------------------------------------
+** Public Functions
+*/
- Journal_DPrintfL( self->debug, 2, "In %s():\n", __func__ );
- Stream_IndentBranch( Swarm_Debug );
+void ParticleCommHandler_SetSwarm( void* particleCommHandler, void* swarm ) {
+ ParticleCommHandler* self = (ParticleCommHandler*)particleCommHandler;
- (*globalParticlesArrivingMyDomainCountPtr) = 0;
- (*globalParticlesOutsideDomainTotalPtr) = 0;
+ assert( self && Stg_CheckType( self, ParticleCommHandler ) );
+ assert( !swarm || Stg_CheckType( swarm, Swarm ) );
- /* Find the counts of particles outside domain... */
- _ParticleCommHandler_GetCountOfParticlesOutsideDomainPerProcessor(
- self,
- &globalParticlesOutsideDomainCounts,
- &maxGlobalParticlesOutsideDomainCount,
- globalParticlesOutsideDomainTotalPtr );
-
- if ( (*globalParticlesOutsideDomainTotalPtr) > 0 ) {
- Particle* particlesLeavingMyDomain = NULL;
- Particle* globalParticlesLeavingDomains = NULL;
- SizeT particlesLeavingDomainSizeBytes = 0;
- Cell_DomainIndex lCell_I = 0;
- GlobalParticle* currParticle = NULL;
- Particle_Index currProcParticlesOutsideDomainCount = 0;
- Particle_Index currProcOffset = 0;
- Particle_Index totalParticlesFoundEnteringDomains = 0;
-
- particlesLeavingDomainSizeBytes = self->swarm->particleExtensionMgr->finalSize
- * maxGlobalParticlesOutsideDomainCount;
- particlesLeavingMyDomain = Memory_Alloc_Bytes( particlesLeavingDomainSizeBytes, "Particle",
- "particlesLeavingMyDomain" );
-
- /* TODO: investigate doing this with an MPI_Indexed datatype instead... */
- Journal_DPrintfL( self->debug, 2, "Copying particles leaving my domain to temp. transfer array\n" );
- Stream_IndentBranch( Swarm_Debug );
-
- #if 0
- MPI_Type_indexed(
- self->particlesOutsideDomainTotalCount,
- blocklens,
- self->particlesOutsideDomainIndices,/*change to contiguous indices?*/
- MPI_BYTE,
- ParticlesLeavingDomainTransferIndexed
- );
- #endif
-
- for ( particle_I=0; particle_I < self->particlesOutsideDomainTotalCount; particle_I++ ) {
- Journal_DPrintfL( self->debug, 3, "Copying particle %d to particlesLeavingMyDomain[%d]\n",
- self->particlesOutsideDomainIndices[particle_I], particle_I );
- Swarm_CopyParticleOffSwarm( self->swarm,
- particlesLeavingMyDomain, particle_I,
- self->particlesOutsideDomainIndices[particle_I] );
- }
- Stream_UnIndentBranch( Swarm_Debug );
-
- /* allocate the big global receive buffer */
- globalParticlesLeavingDomains = Memory_Alloc_Bytes( particlesLeavingDomainSizeBytes * self->swarm->nProc,
- "Particle", "globalParticlesLeavingDomains" );
-
- Journal_DPrintfL( self->debug, 2, "Getting the global array of particles leaving domains\n" );
- MPI_Allgather( particlesLeavingMyDomain, particlesLeavingDomainSizeBytes, MPI_BYTE,
- globalParticlesLeavingDomains, particlesLeavingDomainSizeBytes, MPI_BYTE,
- self->swarm->comm );
-
- Journal_DPrintfL( self->debug, 2, "Checking through the global array of particles leaving domains, "
- "and snaffling those moving into my domain:\n" );
- Stream_IndentBranch( Swarm_Debug );
- for ( proc_I=0; proc_I < self->swarm->nProc; proc_I++ ) {
-
- if ( proc_I == self->swarm->myRank ) continue;
-
- currProcOffset = proc_I * maxGlobalParticlesOutsideDomainCount;
- currProcParticlesOutsideDomainCount = globalParticlesOutsideDomainCounts[proc_I];
-
- Journal_DPrintfL( self->debug, 3, "Checking particles that left proc. %d:\n", proc_I );
- for ( particle_I=0; particle_I < currProcParticlesOutsideDomainCount; particle_I++ ) {
- currParticle = (GlobalParticle*)ParticleAt( globalParticlesLeavingDomains,
- (currProcOffset + particle_I),
- self->swarm->particleExtensionMgr->finalSize );
- lCell_I = CellLayout_CellOf( self->swarm->cellLayout, currParticle );
- if ( lCell_I < self->swarm->cellLocalCount ) {
- #if DEBUG
- Journal_DPrintfL( self->debug, 3, "Found particle at (%.2f,%.2f,%.2f) that's moved "
- "into my local cell %d...\n", currParticle->coord[0],
- currParticle->coord[1], currParticle->coord[2], lCell_I );
- #endif
-
- /* copy particle to the lowest available slot in my particles array */
- lParticle_I = _ParticleCommHandler_FindFreeSlotAndPrepareForInsertion( self );
-
- Swarm_CopyParticleOntoSwarm( self->swarm, lParticle_I,
- globalParticlesLeavingDomains, (currProcOffset + particle_I) );
- Swarm_AddParticleToCell( self->swarm, lCell_I, lParticle_I );
- (*globalParticlesArrivingMyDomainCountPtr)++;
- }
- #if DEBUG
- else {
- currParticle = (GlobalParticle*)ParticleAt( globalParticlesLeavingDomains,
- (currProcOffset + particle_I),
- self->swarm->particleExtensionMgr->finalSize );
- Journal_DPrintfL( self->debug, 3, "Ignoring particle at (%.2f,%.2f,%.2f) since "
- "not in my local cells...\n", currParticle->coord[0],
- currParticle->coord[1], currParticle->coord[2] );
- }
- #endif
- }
- }
- Stream_UnIndentBranch( Swarm_Debug );
-
- Memory_Free( particlesLeavingMyDomain );
- Memory_Free( globalParticlesLeavingDomains );
-
- /* Defensive check to make sure particles not lost/created accidentally somehow */
- if( self->defensive == True ) {
- MPI_Reduce( globalParticlesArrivingMyDomainCountPtr, &totalParticlesFoundEnteringDomains,
- 1, MPI_UNSIGNED, MPI_SUM, 0, self->swarm->comm );
- if ( 0 == self->swarm->myRank ) {
- Stream* errorStream = Journal_Register( Error_Type, self->type );
-
- Journal_Firewall( totalParticlesFoundEnteringDomains == (*globalParticlesOutsideDomainTotalPtr),
- errorStream, "Error - in %s(): %d particles were found across all processors to be "
- "leaving the individual domains directly, but after sharing and searching %d were "
- "found entering them directly! These must match as no particles should be "
- "lost/created through advection.\n",
- __func__, (*globalParticlesOutsideDomainTotalPtr),
- totalParticlesFoundEnteringDomains );
- }
- }
- }
- Memory_Free( globalParticlesOutsideDomainCounts );
- Stream_UnIndentBranch( Swarm_Debug );
+ self->swarm = swarm;
}
-void _ParticleCommHandler_GetCountOfParticlesOutsideDomainPerProcessor(
- ParticleCommHandler* self,
- Particle_Index** globalParticlesOutsideDomainCountsPtr,
- Particle_Index* maxGlobalParticlesOutsideDomainCountPtr,
- Particle_Index* globalParticlesOutsideDomainTotalPtr )
-{
- Processor_Index proc_I;
+/*----------------------------------------------------------------------------------------------------------------------------------
+** Private Functions
+*/
- (*globalParticlesOutsideDomainCountsPtr) = Memory_Alloc_Array( Particle_Index, self->swarm->nProc,
- "(*globalParticlesOutsideDomainCountsPtr)" );
-
- MPI_Allgather( (&self->particlesOutsideDomainTotalCount), 1, MPI_UNSIGNED,
- (*globalParticlesOutsideDomainCountsPtr), 1, MPI_UNSIGNED, self->swarm->comm );
-
- (*globalParticlesOutsideDomainTotalPtr) = 0;
- for ( proc_I=0; proc_I < self->swarm->nProc; proc_I++ ) {
- (*globalParticlesOutsideDomainTotalPtr) += (*globalParticlesOutsideDomainCountsPtr)[proc_I];
- if ( (*globalParticlesOutsideDomainCountsPtr)[proc_I] > (*maxGlobalParticlesOutsideDomainCountPtr) ) {
- (*maxGlobalParticlesOutsideDomainCountPtr) = (*globalParticlesOutsideDomainCountsPtr)[proc_I];
- }
- }
+void ParticleCommHandler_BuildExternalParticles( ParticleCommHandler* self, unsigned* nExternals, unsigned** externals ) {
+ Swarm* swarm;
+ unsigned nParticles;
+ GlobalParticle* particle;
+ List* particleList;
+ unsigned p_i;
- #if DEBUG
- if ( Stream_IsPrintableLevel( self->debug, 2 ) ) {
- Journal_DPrintf( self->debug, "Global counts of particles moving outside domains:\n" );
- Journal_DPrintf( self->debug, "\tTotal: %d, Counts: [", (*globalParticlesOutsideDomainTotalPtr) );
- for ( proc_I=0; proc_I < self->swarm->nProc; proc_I++ ) {
- Journal_DPrintf( self->debug, "%d, ", (*globalParticlesOutsideDomainCountsPtr)[proc_I] );
- }
- Journal_DPrintf( self->debug, "]\n" );
- }
- #endif
-}
+ assert( self && Stg_CheckType( self, ParticleCommHandler ) );
+ assert( nExternals && externals );
+ swarm = self->swarm;
+ nParticles = swarm->particleLocalCount;
-Particle_Index _ParticleCommHandler_FindFreeSlotAndPrepareForInsertion( ParticleCommHandler* self )
-{
- Particle_Index lParticle_I = 0;
+ particleList = List_New();
+ List_SetItemSize( particleList, sizeof(unsigned) );
- if ( self->shadowParticlesLeavingMeUnfilledCount > 0 ) {
- Journal_DPrintfL( self->debug, 3, "Still %d holes available from "
- "particles leaving via shadow cells\n-> free slot to add into is %d\n",
- self->shadowParticlesLeavingMeUnfilledCount,
- self->shadowParticlesLeavingMeIndices[self->currShadowParticleLeavingMeIndex]);
-
- lParticle_I = self->shadowParticlesLeavingMeIndices[self->currShadowParticleLeavingMeIndex];
-
- self->currShadowParticleLeavingMeIndex++;
- self->shadowParticlesLeavingMeUnfilledCount--;
+ for( p_i = 0; p_i < nParticles; p_i++ ) {
+ particle = (GlobalParticle*)Swarm_ParticleAt( swarm, p_i );
+ if( particle->owningCell >= swarm->cellDomainCount )
+ List_Append( particleList, &p_i );
}
- else if ( self->particlesOutsideDomainUnfilledCount ) {
- Journal_DPrintfL( self->debug, 3, "Still %d holes available from "
- "particles leaving domain direct\n-> free slot to add into is %d\n",
- self->particlesOutsideDomainUnfilledCount,
- self->particlesOutsideDomainIndices[self->currParticleLeavingMyDomainIndex]);
- lParticle_I = self->particlesOutsideDomainIndices[self->currParticleLeavingMyDomainIndex];
+ *nExternals = List_GetSize( particleList );
+ *externals = AllocArray( unsigned, *nExternals );
+ for( p_i = 0; p_i < *nExternals; p_i++ )
+ (*externals)[p_i] = *List_Get( particleList, p_i, unsigned );
- self->currParticleLeavingMyDomainIndex++;
- self->particlesOutsideDomainUnfilledCount--;
- }
- else {
- Journal_DPrintfL( self->debug, 3, "No holes left from leaving "
- "particles\n-> slot to insert into is end of array %d\n",
- self->swarm->particleLocalCount );
- lParticle_I = self->swarm->particleLocalCount;
- if ( self->swarm->particleLocalCount == self->swarm->particlesArraySize ) {
- Journal_DPrintfL( self->debug, 3, "Particles array memory used up "
- "-> increasing from %d entries by %d\n",
- self->swarm->particlesArraySize, self->swarm->particlesArrayDelta );
- self->swarm->particlesArraySize += self->swarm->particlesArrayDelta;
- self->swarm->particles = Memory_Realloc_Array_Bytes(
- self->swarm->particles,
- self->swarm->particleExtensionMgr->finalSize,
- self->swarm->particlesArraySize );
- }
- self->swarm->particleLocalCount++;
- }
-
- return lParticle_I;
+ FreeObject( particleList );
}
+void ParticleCommHandler_RemoveParticles( ParticleCommHandler* self, unsigned nRemovals, unsigned* removals ) {
+ Swarm* swarm;
+ unsigned oldArraySize;
+ RangeSet *rSet, *pSet;
+ unsigned nRemaining, *remaining;
-void _ParticleCommHandler_FillRemainingHolesInLocalParticlesArray( ParticleCommHandler* self )
-{
- Particle_Index prevParticlesArraySize = self->swarm->particlesArraySize;
- Particle_Index numHolesToFill;
- Particle_InCellIndex cParticle_I;
- StandardParticle* oldPtrToMovedParticle;
- Cell_LocalIndex owningCell;
- Particle_Index indexToInsertAt;
- Particle_Index* leavingParticlesArray = NULL;
- Index currLeavingParticleArrayEntry = 0;
- Index highestLeavingParticleArrayEntry;
- Index leavingParticlesUnfilledCount = 0;
- Particle_Index highestLeavingParticleIndex;
- Particle_Index candidateParticleToMove;
- Bool finishedFlag = False;
- Bool mergedArrayCreated = False;
- Particle_Index prevParticleCount = self->swarm->particleLocalCount;
-
- Journal_DPrintf( self->debug, "In %s():\n", __func__ );
- Stream_IndentBranch( Swarm_Debug );
+ assert( self && Stg_CheckType( self, ParticleCommHandler ) );
+ assert( !nRemovals || removals );
- numHolesToFill = self->particlesOutsideDomainUnfilledCount + self->shadowParticlesLeavingMeUnfilledCount;
- if ( numHolesToFill == 0 ) {
- Journal_DPrintfL( self->debug, 2, "No holes to fill -> nothing to do, returning.\n" );
- Stream_UnIndentBranch( Swarm_Debug );
- return;
- }
- #if DEBUG
- if ( Stream_IsPrintableLevel( self->debug, 2 ) ) {
- _ParticleCommHandler_PrintParticleSlotsYetToFill( self );
- }
- #endif
+ swarm = self->swarm;
- /* work out the list we have to iterate over: */
- if ( self->shadowParticlesLeavingMeUnfilledCount && !self->particlesOutsideDomainUnfilledCount ) {
- Journal_DPrintfL( self->debug, 2, "Particles have only left via shadow cells -> no need to merge lists\n" );
- leavingParticlesArray = &self->shadowParticlesLeavingMeIndices[self->currShadowParticleLeavingMeIndex];
- }
- else if ( self->particlesOutsideDomainUnfilledCount && !self->shadowParticlesLeavingMeUnfilledCount ) {
- Journal_DPrintfL( self->debug, 2, "Particles have only left domain directly -> no need to merge lists\n" );
- leavingParticlesArray = &self->particlesOutsideDomainIndices[self->currParticleLeavingMyDomainIndex];
- }
- else {
- Journal_DPrintfL( self->debug, 2, "Particles have left both via shadow cells and domain directly -> merge lists\n" );
- leavingParticlesArray = _ParticleCommHandler_MergeListsOfUnfilledParticleSlots( self );
- mergedArrayCreated = True;
- }
+ rSet = RangeSet_New();
+ RangeSet_SetIndices( rSet, nRemovals, removals );
+ pSet = RangeSet_New();
+ RangeSet_SetRange( pSet, 0, swarm->particleLocalCount, 1 );
+ RangeSet_Subtraction( pSet, rSet );
+ FreeObject( rSet );
+ RangeSet_GetIndices( pSet, &nRemaining, &remaining );
+ FreeObject( pSet );
- /* Ok: while there are holes left to fill, find the highest candidate, move it, and reduce the count. */
- Journal_DPrintfL( self->debug, 2, "Starting run through the %d particles to fill:\n", numHolesToFill );
- Stream_IndentBranch( Swarm_Debug );
+ if( nRemaining ) {
+ unsigned remainInd;
+ unsigned owningCell;
+ unsigned particleInd;
+ unsigned r_i;
- currLeavingParticleArrayEntry = 0;
- highestLeavingParticleArrayEntry = numHolesToFill-1;
- leavingParticlesUnfilledCount = numHolesToFill;
-
- while ( leavingParticlesUnfilledCount > 0 ) {
-
- indexToInsertAt = leavingParticlesArray[currLeavingParticleArrayEntry];
- Journal_DPrintfL( self->debug, 3, "Attempting to fill leaving slot %d (at particle index %d):\n",
- currLeavingParticleArrayEntry, indexToInsertAt );
-
- Stream_Indent( self->debug );
-
- /* This is where we work out the index of which particle to move into the free slot.
- * We Start from the end of the particles array, then decrement by 1 until we find a candidate that
- * hasn't itself already left.
- * We also need to consider the possibility that every candidate higher than the current index
- * has also left, in which case we are done, and finish the while process.
- * See the ParticleCommHandler Twiki page for diagrams illustrating this algorithm.
- */
-
- candidateParticleToMove = self->swarm->particleLocalCount-1;
- highestLeavingParticleIndex = leavingParticlesArray[highestLeavingParticleArrayEntry];
- Journal_DPrintfL( self->debug, 3, "Searching for highest particle that hasn't also moved:\n" );
- Stream_Indent( self->debug );
-
- while ( candidateParticleToMove == leavingParticlesArray[highestLeavingParticleArrayEntry] ) {
- /* Check if that was the last candidate particle above the current one: */
- /* This test needs to be at the top of this loop to handle the case where we have one
- particle that's leaving */
-
- if ( candidateParticleToMove <= indexToInsertAt ) {
- Journal_DPrintfL( self->debug, 3, "** No more particles above current "
- "hole %d to fill: we're done. **\n", indexToInsertAt );
- /* Need the line below to mark the fact we failed to fill the current indexToInsertAt hole */
- self->swarm->particleLocalCount--;
- finishedFlag = True;
+ for( r_i = 0; r_i < nRemovals; r_i++ ) {
+ remainInd = nRemaining - r_i - 1;
+ if( remaining[remainInd] < removals[r_i] )
break;
- }
- Journal_DPrintfL( self->debug, 3, "Candidate particle %d has also left...\n",
- candidateParticleToMove );
-
- highestLeavingParticleArrayEntry--;
- highestLeavingParticleIndex = leavingParticlesArray[highestLeavingParticleArrayEntry];
- leavingParticlesUnfilledCount--;
- self->swarm->particleLocalCount--;
- candidateParticleToMove--;
- }
- Stream_UnIndent( self->debug );
-
- if ( True == finishedFlag ) {
- /* We must have hit the "no more candidate particles" criterion in the search loop, so
- * quit trying to fill empty holes entirely. */
- Stream_UnIndent( self->debug );
- break;
+ Swarm_CopyParticleWithinSwarm( swarm, removals[r_i], remaining[remainInd] );
+ owningCell = Swarm_ParticleAt( self->swarm, removals[r_i] )->owningCell;
+ particleInd = Swarm_GetParticleIndexWithinCell( self->swarm, owningCell, remaining[remainInd] );
+ swarm->cellParticleTbl[owningCell][particleInd] = removals[r_i];
}
- Journal_DPrintfL( self->debug, 3, "Highest valid particle found at index %d:\n",
- candidateParticleToMove );
- Journal_DFirewall( (candidateParticleToMove > indexToInsertAt), Swarm_Error,
- "Error in %s: Empty hole filling\nalgorithm has stuffed up somehow,"
- " since particle to be moved %d is <= slot to insert into %d.\n",
- __func__, candidateParticleToMove, indexToInsertAt );
- Stream_Indent( self->debug );
-
- Journal_DPrintfL( self->debug, 3, "Copying particle data from %d to %d\n",
- candidateParticleToMove, indexToInsertAt );
- Swarm_CopyParticleWithinSwarm( self->swarm, indexToInsertAt, candidateParticleToMove );
-
- /* update the cell that the moved particle lives in to have the correct index into the
- * particle array for it. */
- oldPtrToMovedParticle = Swarm_ParticleAt( self->swarm, candidateParticleToMove );
- owningCell = oldPtrToMovedParticle->owningCell;
- cParticle_I = Swarm_GetParticleIndexWithinCell( self->swarm, owningCell, candidateParticleToMove );
- Journal_DPrintfL( self->debug, 3, "Updating owning cell: (Cell %d, PIC index %d) now -> p.i. %d\n",
- owningCell, cParticle_I, indexToInsertAt );
- self->swarm->cellParticleTbl[owningCell][cParticle_I] = indexToInsertAt;
-
-
- Stream_UnIndent( self->debug );
-
- /* update the counters/indices */
- currLeavingParticleArrayEntry++;
- leavingParticlesUnfilledCount--;
- self->swarm->particleLocalCount--;
-
- Stream_UnIndent( self->debug );
+ FreeArray( remaining );
}
- Stream_UnIndentBranch( Swarm_Debug );
- /* we only need to free the array of leaving particle slots if its a new merged list */
- if ( mergedArrayCreated == True ) {
- Memory_Free( leavingParticlesArray );
+ /* Update the memory allocated to the particles array if particle count has reduced significantly. */
+ oldArraySize = swarm->particlesArraySize;
+ while( swarm->particlesArraySize > swarm->particleLocalCount + swarm->particlesArrayDelta )
+ swarm->particlesArraySize -= swarm->particlesArrayDelta;
+ if( swarm->particlesArraySize < oldArraySize ) {
+ self->swarm->particles = Memory_Realloc_Array_Bytes( swarm->particles,
+ swarm->particleExtensionMgr->finalSize,
+ swarm->particlesArraySize );
}
- /* ------------------------- */
- Journal_DPrintfL( self->debug, 2, "Local particle count reduced from %d to %d\n", prevParticleCount,
- self->swarm->particleLocalCount );
-
- /* Update the memory allocated to the particles array if particle count has reduced significantly */
- while ( self->swarm->particlesArraySize > self->swarm->particleLocalCount + self->swarm->particlesArrayDelta ) {
- self->swarm->particlesArraySize -= self->swarm->particlesArrayDelta;
- }
- if ( self->swarm->particlesArraySize < prevParticlesArraySize ) {
- Journal_DPrintfL( self->debug, 2, "Reducing particles array entries from %d to %d\n",
- prevParticlesArraySize, self->swarm->particlesArraySize );
- self->swarm->particles = Memory_Realloc_Array_Bytes(
- self->swarm->particles,
- self->swarm->particleExtensionMgr->finalSize,
- self->swarm->particlesArraySize );
- }
-
- Stream_UnIndentBranch( Swarm_Debug );
+ /* Update local particle count. */
+ swarm->particleLocalCount -= nRemovals;
}
-
-
-Particle_Index* _ParticleCommHandler_MergeListsOfUnfilledParticleSlots( ParticleCommHandler* self )
-{
- Particle_Index* mergedLeavingParticleArray = NULL;
- Particle_Index slotsToFillTotalCount = 0;
- Index currMergedLeavingParticleEntry = 0;
- Index lowestUnmergedLeavingViaShadow = self->currShadowParticleLeavingMeIndex;
- Index lowestUnmergedLeavingDomain = self->currParticleLeavingMyDomainIndex;
- Particle_Index indexOfLowestUnmergedLeavingDomain = 0;
- Index* lowestUnmergedLeavingEntryToUpdatePtr = NULL;
- Particle_Index candidateMergeParticle = 0;
-
- Journal_DPrintfL( self->debug, 1, "In %s():\n", __func__ );
- Stream_Indent( self->debug );
-
- slotsToFillTotalCount = self->particlesOutsideDomainUnfilledCount + self->shadowParticlesLeavingMeUnfilledCount;
- mergedLeavingParticleArray = Memory_Alloc_Array( Particle_Index, slotsToFillTotalCount, "mergedLeavingParticlesArray" );
-
- while ( currMergedLeavingParticleEntry < slotsToFillTotalCount ) {
- /* Need to initialise this to the max particle count every loop, in case the first condition is false,
- so the 2nd will always hit it. */
- candidateMergeParticle = self->swarm->particleLocalCount;
-
- if ( lowestUnmergedLeavingViaShadow < self->shadowParticlesLeavingMeTotalCount ) {
- candidateMergeParticle = self->shadowParticlesLeavingMeIndices[lowestUnmergedLeavingViaShadow];
- lowestUnmergedLeavingEntryToUpdatePtr = &lowestUnmergedLeavingViaShadow;
- }
- if ( lowestUnmergedLeavingDomain < self->particlesOutsideDomainTotalCount ) {
- indexOfLowestUnmergedLeavingDomain = self->particlesOutsideDomainIndices[lowestUnmergedLeavingDomain];
-
- if ( indexOfLowestUnmergedLeavingDomain < candidateMergeParticle ) {
- candidateMergeParticle = indexOfLowestUnmergedLeavingDomain;
- lowestUnmergedLeavingEntryToUpdatePtr = &lowestUnmergedLeavingDomain;
- }
- }
-
- mergedLeavingParticleArray[currMergedLeavingParticleEntry++] = candidateMergeParticle;
- (*lowestUnmergedLeavingEntryToUpdatePtr)++;
-
- #if DEBUG
- Journal_Firewall( lowestUnmergedLeavingViaShadow <= self->shadowParticlesLeavingMeTotalCount,
- Swarm_Error, "Error: merging of unfilled particle lists stuffed up.\n" );
- Journal_Firewall( lowestUnmergedLeavingDomain <= self->particlesOutsideDomainTotalCount,
- Swarm_Error, "Error: merging of unfilled particle lists stuffed up.\n" );
- #endif
- }
-
- #if DEBUG
- if ( Stream_IsPrintableLevel( self->debug, 2 ) ) {
- Journal_DPrintf( self->debug, "Merged list of particles leaving proc:\n\t{" );
- for ( currMergedLeavingParticleEntry=0; currMergedLeavingParticleEntry < slotsToFillTotalCount;
- currMergedLeavingParticleEntry++ )
- {
- Journal_DPrintf( self->debug, "%d, ",
- mergedLeavingParticleArray[currMergedLeavingParticleEntry] );
- }
- Journal_DPrintf( self->debug, "}\n" );
- }
- #endif
-
- Stream_UnIndent( self->debug );
-
- return mergedLeavingParticleArray;
-}
-
-
-void _ParticleCommHandler_PrintParticleSlotsYetToFill( ParticleCommHandler* self ) {
- Index leavingParticleEntry;
-
- Journal_DPrintf( self->debug, "%d slots yet to fill from particles leaving via shadow cells:\n",
- self->shadowParticlesLeavingMeUnfilledCount );
- leavingParticleEntry = self->currShadowParticleLeavingMeIndex;
- Journal_DPrintf( self->debug, "\t{ " );
- for ( ; leavingParticleEntry < self->shadowParticlesLeavingMeTotalCount; leavingParticleEntry++ ) {
- Journal_DPrintf( self->debug, "%d, ",
- self->shadowParticlesLeavingMeIndices[leavingParticleEntry] );
- }
- Journal_DPrintf( self->debug, "}\n" );
-
- Journal_DPrintf( self->debug, "%d slots yet to fill from particles leaving domain directly:\n",
- self->particlesOutsideDomainUnfilledCount );
- leavingParticleEntry = self->currParticleLeavingMyDomainIndex;
- Journal_DPrintf( self->debug, "\t{ " );
- for ( ; leavingParticleEntry < self->particlesOutsideDomainTotalCount; leavingParticleEntry++ ) {
- Journal_DPrintf( self->debug, "%d, ",
- self->particlesOutsideDomainIndices[leavingParticleEntry] );
- }
- Journal_DPrintf( self->debug, "}\n" );
-}
-
-
Modified: long/3D/Gale/trunk/src/StGermain/Discretisation/Swarm/src/ParticleCommHandler.h
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Discretisation/Swarm/src/ParticleCommHandler.h 2007-01-18 00:09:23 UTC (rev 5806)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Swarm/src/ParticleCommHandler.h 2007-01-18 00:09:25 UTC (rev 5807)
@@ -27,152 +27,84 @@
*/
/** \file
** Role:
-** Handles the communication of particles between processors when their coordinates are updated.
**
** Assumptions:
**
+** Invariants:
+**
** Comments:
-** If we ever decide we need more than one strategy for doing this, this will probably become an
-** interface and we'll have separate instantiation classes. Can't see that need in the short
-** term though so we'll just use the one class for now.
**
** $Id$
**
**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
-
-#ifndef __Discretisation_Swarm_ParticleCommHandler_h__
-#define __Discretisation_Swarm_ParticleCommHandler_h__
- typedef void (ParticleCommHandler_HandleParticleMovementBetweenProcsFunction) ( void* pCommHandler );
-
+#ifndef __Discretisaton_Swarm_ParticleCommHandler_h__
+#define __Discretisaton_Swarm_ParticleCommHandler_h__
+
/** Textual name of this class */
extern const Type ParticleCommHandler_Type;
- #define __ParticleCommHandler \
- __Stg_Component \
- /* Virtual info */ \
- ParticleCommHandler_HandleParticleMovementBetweenProcsFunction* \
- _handleParticleMovementBetweenProcs;\
- /* General info */ \
- Stream* debug; \
- Swarm* swarm; \
- Particle_Index* shadowParticlesLeavingMeIndices; \
- Index shadowParticlesLeavingMeTotalCount; \
- Index shadowParticlesLeavingMeUnfilledCount; \
- Index currShadowParticleLeavingMeIndex; \
- Particle_Index* particlesOutsideDomainIndices; \
- Index particlesOutsideDomainTotalCount; \
- Index particlesOutsideDomainUnfilledCount; \
- Index currParticleLeavingMyDomainIndex; \
- /** cnts of [nbr][st_cell] outgoing particles */ \
- Particle_Index** shadowParticlesLeavingMeCountsPerCell; \
- /** cnts of [nbr] total outgoing particles via my shadow cells to nbr procs */ \
- Particle_Index* shadowParticlesLeavingMeTotalCounts; \
- /** transfer array [nbr] of particles to send */ \
- Particle** shadowParticlesLeavingMe; \
- MPI_Request** shadowParticlesLeavingMeHandles; \
- /** cnts of [nbr][st_cell] incoming particles */ \
- Particle_Index** particlesArrivingFromNbrShadowCellCounts; \
- MPI_Request** particlesArrivingFromNbrShadowCellCountsHandles; \
- /** cnts of [nbr] total incoming particles via shadow cells of nbr procs */\
- Particle_Index* particlesArrivingFromNbrShadowCellsTotalCounts; \
- /** transfer array [nbr] of particles to recv */ \
- Particle** particlesArrivingFromNbrShadowCells; \
- MPI_Request** particlesArrivingFromNbrShadowCellsHandles; \
- Bool defensive;
+ /** Virtual function types */
+ typedef void (ParticleCommHandler_UpdateFunc) ( void* particleCommHandler );
+ /** Class contents */
+ #define __ParticleCommHandler \
+ /* General info */ \
+ __Stg_Component \
+ \
+ /* Virtual info */ \
+ ParticleCommHandler_UpdateFunc* updateFunc; \
+ \
+ /* ParticleCommHandler info */ \
+ Swarm* swarm; \
+ Bool defensive;
- struct ParticleCommHandler { __ParticleCommHandler };
+ struct ParticleCommHandler { __ParticleCommHandler };
- /* --- virtual functions --- */
+ /*--------------------------------------------------------------------------------------------------------------------------
+ ** Constructors
+ */
- /** Constructor interface */
- ParticleCommHandler* ParticleCommHandler_DefaultNew( Name name );
-
- ParticleCommHandler* ParticleCommHandler_New(
- Name name,
- void* swarm );
-
- /** Private Constructor */
- ParticleCommHandler* _ParticleCommHandler_New(
- SizeT _sizeOfSelf,
- Type type,
- Stg_Class_DeleteFunction* _delete,
- Stg_Class_PrintFunction* _print,
- Stg_Class_CopyFunction* _copy,
- Stg_Component_DefaultConstructorFunction* _defaultConstructor,
- Stg_Component_ConstructFunction* _construct,
- Stg_Component_BuildFunction* _build,
- Stg_Component_InitialiseFunction* _initialise,
- Stg_Component_ExecuteFunction* _execute,
- Stg_Component_DestroyFunction* _destroy,
- Name name,
- Bool initFlag,
- ParticleCommHandler_HandleParticleMovementBetweenProcsFunction handleParticleMovementBetweenProcs,
- void* swarm );
-
- /** Variable initialiser */
- void _ParticleCommHandler_Init( ParticleCommHandler* self, void* swarm );
+ #define PARTICLECOMMHANDLER_DEFARGS \
+ STG_COMPONENT_DEFARGS, \
+ ParticleCommHandler_UpdateFunc* updateFunc
- /** Stg_Class_Print() implementation */
- void _ParticleCommHandler_Print( void* pCommsHandler, Stream* stream );
-
- void _ParticleCommHandler_Construct( void* pCommsHandler, Stg_ComponentFactory* cf, void* data );
-
- void _ParticleCommHandler_Build( void* pCommsHandler, void *data );
-
- void _ParticleCommHandler_Initialise( void* pCommsHandler, void *data );
-
- void _ParticleCommHandler_Execute( void* pCommsHandler, void *data );
+ #define PARTICLECOMMHANDLER_PASSARGS \
+ STG_COMPONENT_PASSARGS, \
+ updateFunc
- void _ParticleCommHandler_Destroy( void* pCommsHandler, void *data );
-
- /** Copy */
- #define ParticleCommHandler_Copy( self ) \
- (ParticleCommHandler*)Stg_Class_Copy( self, NULL, False, NULL, NULL )
- #define ParticleCommHandler_DeepCopy( self ) \
- (ParticleCommHandler*)Stg_Class_Copy( self, NULL, True, NULL, NULL )
-
- void* _ParticleCommHandler_Copy( void* particleCommHandler, void* dest, Bool deep, Name nameExt, PtrMap* ptrMap );
-
- /** Stg_Class_Delete() implementation */
- void _ParticleCommHandler_Delete(void* pCommsHandler );
-
- /* --- Public functions --- */
-
- /** Handle particle movement between processors */
- void ParticleCommHandler_HandleParticleMovementBetweenProcs( void* pCommsHandler );
- /** ParticleCommHandler_HandleParticleMovementBetweenProcs() implementation */
- void _ParticleCommHandler_HandleParticleMovementBetweenProcs( void* pCommsHandler );
+ ParticleCommHandler* ParticleCommHandler_New( Name name );
+ ParticleCommHandler* _ParticleCommHandler_New( PARTICLECOMMHANDLER_DEFARGS );
+ void _ParticleCommHandler_Init( ParticleCommHandler* self );
- /* --- private functions --- */
+ /*--------------------------------------------------------------------------------------------------------------------------
+ ** Virtual functions
+ */
- void _ParticleCommHandler_SendParticleTotalsInShadowCellsToNbrs( ParticleCommHandler* self );
+ void _ParticleCommHandler_Delete( void* particleCommHandler );
+ void _ParticleCommHandler_Print( void* particleCommHandler, Stream* stream );
+ void _ParticleCommHandler_Construct( void* particleCommHandler, Stg_ComponentFactory* cf, void* data );
+ void _ParticleCommHandler_Build( void* particleCommHandler, void* data );
+ void _ParticleCommHandler_Initialise( void* particleCommHandler, void* data );
+ void _ParticleCommHandler_Execute( void* particleCommHandler, void* data );
+ void _ParticleCommHandler_Destroy( void* particleCommHandler, void* data );
- void _ParticleCommHandler_NonBlockingSendParticlesInShadowCellsToNbrs( ParticleCommHandler* self );
+ void _ParticleCommHandler_Update( void* particleCommHandler );
- void _ParticleCommHandler_ReceiveAndUpdateShadowParticlesEnteringMyDomain( ParticleCommHandler* self );
+ /*--------------------------------------------------------------------------------------------------------------------------
+ ** Public functions
+ */
- void _ParticleCommHandler_FindParticlesThatHaveMovedOutsideMyDomain( ParticleCommHandler* self );
+ void ParticleCommHandler_SetSwarm( void* particleCommHandler, void* swarm );
- void
- _ParticleCommHandler_ShareAndUpdateParticlesThatHaveMovedOutsideDomains(
- ParticleCommHandler* self,
- Particle_Index* globalParticlesArrivingMyDomainCountPtr,
- Particle_Index* globalParticlesOutsideDomainTotalPtr );
+ #define ParticleCommHandler_Update( self ) \
+ VirtualCall( self, updateFunc, self )
- void _ParticleCommHandler_GetCountOfParticlesOutsideDomainPerProcessor(
- ParticleCommHandler* self,
- Particle_Index** globalParticlesOutsideDomainCountsPtr,
- Particle_Index* maxGlobalParticlesOutsideDomainCountPtr,
- Particle_Index* globalParticlesOutsideDomainTotalPtr );
-
- Particle_Index _ParticleCommHandler_FindFreeSlotAndPrepareForInsertion( ParticleCommHandler* self );
+ /*--------------------------------------------------------------------------------------------------------------------------
+ ** Private Member functions
+ */
- void _ParticleCommHandler_FillRemainingHolesInLocalParticlesArray( ParticleCommHandler* self );
+ void ParticleCommHandler_BuildExternalParticles( ParticleCommHandler* self, unsigned* nExternals, unsigned** externals );
+ void ParticleCommHandler_RemoveParticles( ParticleCommHandler* self, unsigned nRemovals, unsigned* removals );
- Particle_Index* _ParticleCommHandler_MergeListsOfUnfilledParticleSlots( ParticleCommHandler* self );
-
- void _ParticleCommHandler_PrintParticleSlotsYetToFill( ParticleCommHandler* self );
-
-#endif
+#endif /* __Discretisaton_Mesh_ParticleCommHandler_h__ */
Modified: long/3D/Gale/trunk/src/StGermain/Discretisation/Swarm/src/SwarmClass.c
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Discretisation/Swarm/src/SwarmClass.c 2007-01-18 00:09:23 UTC (rev 5806)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Swarm/src/SwarmClass.c 2007-01-18 00:09:25 UTC (rev 5807)
@@ -233,7 +233,8 @@
self->particleExtensionMgr = ExtensionManager_New_OfStruct( "particle", self->particleSize );
ExtensionManager_Register_Add( extensionMgr_Register, self->particleExtensionMgr );
- self->particleCommunicationHandler = ParticleCommHandler_New( defaultSwarmParticleCommHandlerName, self );
+ self->particleCommunicationHandler = ParticleCommHandler_New( defaultSwarmParticleCommHandlerName );
+ ParticleCommHandler_SetSwarm( self->particleCommunicationHandler, self );
self->owningCellVariable = Swarm_NewScalarVariable(
self,
@@ -760,7 +761,7 @@
* the ParticleCommHandler since we know there's been no movement between
* processors yet. */
if ( False == self->stillDoingInitialisation ) {
- ParticleCommHandler_HandleParticleMovementBetweenProcs( self->particleCommunicationHandler );
+ ParticleCommHandler_Update( self->particleCommunicationHandler );
}
Stream_UnIndentBranch( Swarm_Debug );
More information about the cig-commits
mailing list