/[escript]/branches/domexper/finley/src/NodeFile_gather.c
ViewVC logotype

Diff of /branches/domexper/finley/src/NodeFile_gather.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/finley/src/NodeFile_gather.c revision 3232 by jfenwick, Thu Jan 28 02:03:15 2010 UTC branches/domexper/finley/src/NodeFile_gather.c revision 3234 by jfenwick, Mon Oct 4 01:46:30 2010 UTC
# Line 61  void Finley_NodeFile_gather(index_t* ind Line 61  void Finley_NodeFile_gather(index_t* ind
61  void Finley_NodeFile_gather_global(index_t* index, Finley_NodeFile* in, Finley_NodeFile* out)  void Finley_NodeFile_gather_global(index_t* index, Finley_NodeFile* in, Finley_NodeFile* out)
62  {  {
63    index_t min_id, max_id, undefined_node;    index_t min_id, max_id, undefined_node;
64    Paso_MPI_rank buffer_rank, dest, source, *distribution=NULL;    Esys_MPI_rank buffer_rank, dest, source, *distribution=NULL;
65    index_t  *Id_buffer=NULL, *Tag_buffer=NULL, *globalDegreesOfFreedom_buffer=NULL;    index_t  *Id_buffer=NULL, *Tag_buffer=NULL, *globalDegreesOfFreedom_buffer=NULL;
66    double* Coordinates_buffer=NULL;    double* Coordinates_buffer=NULL;
67    dim_t p, buffer_len,n;    dim_t p, buffer_len,n;
68    char error_msg[100];    char error_msg[100];
69    #ifdef PASO_MPI    #ifdef ESYS_MPI
70    MPI_Status status;    MPI_Status status;
71    #endif    #endif
72    
# Line 78  void Finley_NodeFile_gather_global(index Line 78  void Finley_NodeFile_gather_global(index
78    
79    if ( !Finley_checkPtr(distribution) ) {    if ( !Finley_checkPtr(distribution) ) {
80        /* distribute the range of node ids */        /* distribute the range of node ids */
81        buffer_len=Paso_MPIInfo_setDistribution(in->MPIInfo,min_id,max_id,distribution);        buffer_len=Esys_MPIInfo_setDistribution(in->MPIInfo,min_id,max_id,distribution);
82        /* allocate buffers */        /* allocate buffers */
83        Id_buffer=TMPMEMALLOC(buffer_len,index_t);        Id_buffer=TMPMEMALLOC(buffer_len,index_t);
84        Tag_buffer=TMPMEMALLOC(buffer_len,index_t);        Tag_buffer=TMPMEMALLOC(buffer_len,index_t);
# Line 91  void Finley_NodeFile_gather_global(index Line 91  void Finley_NodeFile_gather_global(index
91              for (n=0;n<buffer_len;n++) Id_buffer[n]=undefined_node;              for (n=0;n<buffer_len;n++) Id_buffer[n]=undefined_node;
92                            
93              /* fill the buffer by sending portions around in a circle */              /* fill the buffer by sending portions around in a circle */
94              dest=Paso_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank + 1);              dest=Esys_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank + 1);
95              source=Paso_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank - 1);              source=Esys_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank - 1);
96              buffer_rank=in->MPIInfo->rank;              buffer_rank=in->MPIInfo->rank;
97              for (p=0; p< in->MPIInfo->size; ++p) {              for (p=0; p< in->MPIInfo->size; ++p) {
98                   if (p>0) {  /* the initial send can be skipped */                   if (p>0) {  /* the initial send can be skipped */
99                       #ifdef PASO_MPI                       #ifdef ESYS_MPI
100                       MPI_Sendrecv_replace(Id_buffer, buffer_len, MPI_INT,                       MPI_Sendrecv_replace(Id_buffer, buffer_len, MPI_INT,
101                                            dest, in->MPIInfo->msg_tag_counter, source, in->MPIInfo->msg_tag_counter,                                            dest, in->MPIInfo->msg_tag_counter, source, in->MPIInfo->msg_tag_counter,
102                                            in->MPIInfo->comm,&status);                                            in->MPIInfo->comm,&status);
# Line 112  void Finley_NodeFile_gather_global(index Line 112  void Finley_NodeFile_gather_global(index
112                       #endif                       #endif
113                       in->MPIInfo->msg_tag_counter+=4;                       in->MPIInfo->msg_tag_counter+=4;
114                   }                   }
115                   buffer_rank=Paso_MPIInfo_mod(in->MPIInfo->size, buffer_rank-1);                   buffer_rank=Esys_MPIInfo_mod(in->MPIInfo->size, buffer_rank-1);
116                   Finley_NodeFile_scatterEntries(in->numNodes, in->Id,                   Finley_NodeFile_scatterEntries(in->numNodes, in->Id,
117                                                  distribution[buffer_rank], distribution[buffer_rank+1],                                                  distribution[buffer_rank], distribution[buffer_rank+1],
118                                                  Id_buffer, in->Id,                                                  Id_buffer, in->Id,
# Line 121  void Finley_NodeFile_gather_global(index Line 121  void Finley_NodeFile_gather_global(index
121                                                  out->numDim, Coordinates_buffer, in->Coordinates);                                                  out->numDim, Coordinates_buffer, in->Coordinates);
122              }              }
123              /* now entries are collected from the buffer again by sending the entries around in a circle */              /* now entries are collected from the buffer again by sending the entries around in a circle */
124              dest=Paso_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank + 1);              dest=Esys_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank + 1);
125              source=Paso_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank - 1);              source=Esys_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank - 1);
126              buffer_rank=in->MPIInfo->rank;              buffer_rank=in->MPIInfo->rank;
127              for (p=0; p< in->MPIInfo->size; ++p) {              for (p=0; p< in->MPIInfo->size; ++p) {
128                   Finley_NodeFile_gatherEntries(out->numNodes, index,                   Finley_NodeFile_gatherEntries(out->numNodes, index,
# Line 132  void Finley_NodeFile_gather_global(index Line 132  void Finley_NodeFile_gather_global(index
132                                                 out->globalDegreesOfFreedom, globalDegreesOfFreedom_buffer,                                                 out->globalDegreesOfFreedom, globalDegreesOfFreedom_buffer,
133                                                 out->numDim, out->Coordinates, Coordinates_buffer);                                                 out->numDim, out->Coordinates, Coordinates_buffer);
134                   if (p<in->MPIInfo->size-1) {  /* the last send can be skipped */                   if (p<in->MPIInfo->size-1) {  /* the last send can be skipped */
135                       #ifdef PASO_MPI                       #ifdef ESYS_MPI
136                       MPI_Sendrecv_replace(Id_buffer, buffer_len, MPI_INT,                       MPI_Sendrecv_replace(Id_buffer, buffer_len, MPI_INT,
137                                            dest, in->MPIInfo->msg_tag_counter, source, in->MPIInfo->msg_tag_counter,                                            dest, in->MPIInfo->msg_tag_counter, source, in->MPIInfo->msg_tag_counter,
138                                            in->MPIInfo->comm,&status);                                            in->MPIInfo->comm,&status);
# Line 148  void Finley_NodeFile_gather_global(index Line 148  void Finley_NodeFile_gather_global(index
148                       #endif                       #endif
149                       in->MPIInfo->msg_tag_counter+=4;                       in->MPIInfo->msg_tag_counter+=4;
150                   }                   }
151                   buffer_rank=Paso_MPIInfo_mod(in->MPIInfo->size, buffer_rank-1);                   buffer_rank=Esys_MPIInfo_mod(in->MPIInfo->size, buffer_rank-1);
152              }              }
153              /* check if all nodes are set: */              /* check if all nodes are set: */
154              #pragma omp parallel for private(n) schedule(static)              #pragma omp parallel for private(n) schedule(static)
# Line 167  void Finley_NodeFile_gather_global(index Line 167  void Finley_NodeFile_gather_global(index
167    }    }
168    TMPMEMFREE(distribution);    TMPMEMFREE(distribution);
169    /* make sure that the error is global */    /* make sure that the error is global */
170    Paso_MPIInfo_noError(in->MPIInfo);    Esys_MPIInfo_noError(in->MPIInfo);
171  }  }

Legend:
Removed from v.3232  
changed lines
  Added in v.3234

  ViewVC Help
Powered by ViewVC 1.1.26