/******************************************************** % % Written by: % -- % John L. Weatherwax 2006-09-03 % % email: wax@alum.mit.edu % % Please send comments and especially bug reports to the % above email address. % %----- */ #include #include #include "mpi.h" #include "global_grid.h" #include "sim_consts.h" #include "packageEvictedForMPISends.h" /* creates arrays for data that will be sent to each processor */ void packageEvictedForMPISends(void){ int pi; int pCount[]={0,0,0,0,0,0,0,0}; /* I don't think this is required ... pCount is an automatic variable and as such it should be initialized on EACH function call ... but it seemed to help to avoid seg faults with my compiler and therefore I'm using it ... */ for( pi=0; pi < 9; pi++ ){ pCount[pi]=0; } /* create NW array */ procInfo.partDataToEvict[NW] = (double*) malloc( 4*procInfo.numToEvict[NW]*sizeof(double) ); if( procInfo.partDataToEvict[NW]==NULL ){ printf("No memory!\n"); MPI_Abort(MPI_COMM_WORLD,1); } /* create N array */ procInfo.partDataToEvict[N] = (double*) malloc( 4*procInfo.numToEvict[N]*sizeof(double) ); if( procInfo.partDataToEvict[N]==NULL ){ printf("No memory!\n"); MPI_Abort(MPI_COMM_WORLD,1); } /* create NE array */ procInfo.partDataToEvict[NE] = (double*) malloc( 4*procInfo.numToEvict[NE]*sizeof(double) ); if( procInfo.partDataToEvict[NE]==NULL ){ printf("No memory!\n"); MPI_Abort(MPI_COMM_WORLD,1); } /* create W array */ procInfo.partDataToEvict[W] = (double*) malloc( 4*procInfo.numToEvict[W]*sizeof(double) ); if( procInfo.partDataToEvict[W]==NULL ){ printf("No memory!\n"); MPI_Abort(MPI_COMM_WORLD,1); } /* create I array ... not needed I don't send to myself ... */ procInfo.partDataToEvict[I] = NULL; /* create E array */ procInfo.partDataToEvict[E] = (double*) malloc( 4*procInfo.numToEvict[E]*sizeof(double) ); if( procInfo.partDataToEvict[E]==NULL ){ printf("No memory!\n"); MPI_Abort(MPI_COMM_WORLD,1); } /* create SW array */ procInfo.partDataToEvict[SW] = (double*) malloc( 4*procInfo.numToEvict[SW]*sizeof(double) ); if( procInfo.partDataToEvict[SW]==NULL ){ printf("No memory!\n"); MPI_Abort(MPI_COMM_WORLD,1); } /* create S array */ procInfo.partDataToEvict[S] = (double*) malloc( 4*procInfo.numToEvict[S]*sizeof(double) ); if( procInfo.partDataToEvict[S]==NULL ){ printf("No memory!\n"); MPI_Abort(MPI_COMM_WORLD,1); } /* create SE array */ procInfo.partDataToEvict[SE] = (double*) malloc( 4*procInfo.numToEvict[SE]*sizeof(double) ); if( procInfo.partDataToEvict[SE]==NULL ){ printf("No memory!\n"); MPI_Abort(MPI_COMM_WORLD,1); } /* fill each array with data ... each particle will be sent to only ONE neighbor ... (if at all) thus we can quickly exit this loop as soon as a test succeeds */ for( pi=0; pi < procInfo.NbPP; pi++ ){ if( procInfo.pEvictQ[pi][NW] == 1 ){ procInfo.partDataToEvict[NW][pCount[NW]++]=procInfo.px[pi]; procInfo.partDataToEvict[NW][pCount[NW]++]=procInfo.py[pi]; procInfo.partDataToEvict[NW][pCount[NW]++]=procInfo.vx[pi]; procInfo.partDataToEvict[NW][pCount[NW]++]=procInfo.vy[pi]; continue; } if( procInfo.pEvictQ[pi][N] == 1 ){ procInfo.partDataToEvict[N][pCount[N]++]=procInfo.px[pi]; procInfo.partDataToEvict[N][pCount[N]++]=procInfo.py[pi]; procInfo.partDataToEvict[N][pCount[N]++]=procInfo.vx[pi]; procInfo.partDataToEvict[N][pCount[N]++]=procInfo.vy[pi]; continue; } if( procInfo.pEvictQ[pi][NE] == 1 ){ procInfo.partDataToEvict[NE][pCount[NE]++]=procInfo.px[pi]; procInfo.partDataToEvict[NE][pCount[NE]++]=procInfo.py[pi]; procInfo.partDataToEvict[NE][pCount[NE]++]=procInfo.vx[pi]; procInfo.partDataToEvict[NE][pCount[NE]++]=procInfo.vy[pi]; continue; } if( procInfo.pEvictQ[pi][W] == 1 ){ procInfo.partDataToEvict[W][pCount[W]++]=procInfo.px[pi]; procInfo.partDataToEvict[W][pCount[W]++]=procInfo.py[pi]; procInfo.partDataToEvict[W][pCount[W]++]=procInfo.vx[pi]; procInfo.partDataToEvict[W][pCount[W]++]=procInfo.vy[pi]; continue; } /* fill I array ... not needed I don't send to myself ... */ if( procInfo.pEvictQ[pi][E] == 1 ){ procInfo.partDataToEvict[E][pCount[E]++]=procInfo.px[pi]; procInfo.partDataToEvict[E][pCount[E]++]=procInfo.py[pi]; procInfo.partDataToEvict[E][pCount[E]++]=procInfo.vx[pi]; procInfo.partDataToEvict[E][pCount[E]++]=procInfo.vy[pi]; continue; } if( procInfo.pEvictQ[pi][SW] == 1 ){ procInfo.partDataToEvict[SW][pCount[SW]++]=procInfo.px[pi]; procInfo.partDataToEvict[SW][pCount[SW]++]=procInfo.py[pi]; procInfo.partDataToEvict[SW][pCount[SW]++]=procInfo.vx[pi]; procInfo.partDataToEvict[SW][pCount[SW]++]=procInfo.vy[pi]; continue; } if( procInfo.pEvictQ[pi][S] == 1 ){ procInfo.partDataToEvict[S][pCount[S]++]=procInfo.px[pi]; procInfo.partDataToEvict[S][pCount[S]++]=procInfo.py[pi]; procInfo.partDataToEvict[S][pCount[S]++]=procInfo.vx[pi]; procInfo.partDataToEvict[S][pCount[S]++]=procInfo.vy[pi]; continue; } if( procInfo.pEvictQ[pi][SE] == 1 ){ procInfo.partDataToEvict[SE][pCount[SE]++]=procInfo.px[pi]; procInfo.partDataToEvict[SE][pCount[SE]++]=procInfo.py[pi]; procInfo.partDataToEvict[SE][pCount[SE]++]=procInfo.vx[pi]; procInfo.partDataToEvict[SE][pCount[SE]++]=procInfo.vy[pi]; continue; } } }