void Collect(double *T, double *T_s) {
int MAX_MPI_SEND_COUNT = 15000;
int rc;
int source, dest,tag;
MPI_Status stat;
int loc_shape[2];
double loc_x,loc_z;
int i,j,shift_x,shift_z;
int loc_phys_bdy[4];
int left_s,right_s,top_s,bottom_s;
int k,kk,ll;
int indx,indx_s,ii,jj;
int cpi;
source = my_rank;
dest = 0;
tag = my_rank + 100;
rc = MPI_Send(&shape[0],2,MPI_INT,dest,tag,MPI_COMM_WORLD);
rc = MPI_Send(&x[0],1,MPI_DOUBLE,dest,tag,MPI_COMM_WORLD);
rc = MPI_Send(&z[0],1,MPI_DOUBLE,dest,tag,MPI_COMM_WORLD);
kk = shape[0]*shape[1]/MAX_MPI_SEND_COUNT;
for(k=0;k<kk;k++){
rc = MPI_Send(&T[k*MAX_MPI_SEND_COUNT],MAX_MPI_SEND_COUNT,MPI_DOUBLE,dest,tag,MPI_COMM_WORLD);
tag++;
}
ll = shape[0]*shape[1] % MAX_MPI_SEND_COUNT;
rc = MPI_Send(&T[kk*MAX_MPI_SEND_COUNT],ll,MPI_DOUBLE,dest,tag,MPI_COMM_WORLD);
rc = MPI_Send(&phys_bdy[0],4,MPI_INT,dest,tag,MPI_COMM_WORLD);
if (my_rank == 0) {
setzero(T_s,size_s);
for(cpi=0;cpi<numprocs;cpi++) {
source = cpi;
tag = cpi+100;
rc = MPI_Recv(&loc_shape[0], 2, MPI_INT,source, tag,
MPI_COMM_WORLD,&stat);
rc = MPI_Recv(&loc_x, 1, MPI_DOUBLE,source, tag,
MPI_COMM_WORLD,&stat);
rc = MPI_Recv(&loc_z, 1, MPI_DOUBLE,source, tag,
MPI_COMM_WORLD,&stat);
kk = loc_shape[0]*loc_shape[1]/MAX_MPI_SEND_COUNT;
for(k=0;k<kk;k++){
rc = MPI_Recv(&loc_T[k*MAX_MPI_SEND_COUNT],MAX_MPI_SEND_COUNT,
MPI_DOUBLE,source,tag, MPI_COMM_WORLD,&stat);
tag++;
}
ll = loc_shape[0]*loc_shape[1] % MAX_MPI_SEND_COUNT;
rc = MPI_Recv(&loc_T[kk*MAX_MPI_SEND_COUNT],MAX_MPI_SEND_COUNT,
MPI_DOUBLE,source,tag, MPI_COMM_WORLD,&stat);
rc = MPI_Recv(&loc_phys_bdy[0],4,MPI_INT,source,tag,
MPI_COMM_WORLD,&stat);
shift_x = (int)round( (loc_x - base_bbox[0] ) / hx );
shift_z = (int)round( (loc_z - base_bbox[2] ) / hz );
for(j=0;j<loc_shape[1];j++) {
jj = j+shift_z;
for(i=0;i<loc_shape[0];i++) {
ii = i+shift_x;
indx = i+j*loc_shape[0];
indx_s = ii+jj*Nx_s;
T_s[indx_s] = loc_T[indx];
}
}
}
}
}