/[escript]/trunk/finley/src/NodeFile_createDenseLabelings.c
ViewVC logotype

Diff of /trunk/finley/src/NodeFile_createDenseLabelings.c

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

revision 3258 by jfenwick, Thu Jan 28 02:03:15 2010 UTC revision 3259 by jfenwick, Mon Oct 11 01:48:14 2010 UTC
# Line 28  Line 28 
28  dim_t Finley_NodeFile_createDenseDOFLabeling(Finley_NodeFile* in)  dim_t Finley_NodeFile_createDenseDOFLabeling(Finley_NodeFile* in)
29  {  {
30    index_t min_dof, max_dof, unset_dof=-1,set_dof=1, dof_0, dof_1, *DOF_buffer=NULL, k;    index_t min_dof, max_dof, unset_dof=-1,set_dof=1, dof_0, dof_1, *DOF_buffer=NULL, k;
31    Paso_MPI_rank buffer_rank, dest, source, *distribution=NULL;    Esys_MPI_rank buffer_rank, dest, source, *distribution=NULL;
32    dim_t p, buffer_len,n, myDOFs, *offsets=NULL, *loc_offsets=NULL, new_numGlobalDOFs=0, myNewDOFs;    dim_t p, buffer_len,n, myDOFs, *offsets=NULL, *loc_offsets=NULL, new_numGlobalDOFs=0, myNewDOFs;
33    bool_t *set_new_DOF=NULL;    bool_t *set_new_DOF=NULL;
34    #ifdef PASO_MPI    #ifdef ESYS_MPI
35    MPI_Status status;    MPI_Status status;
36    #endif    #endif
37    
# Line 45  dim_t Finley_NodeFile_createDenseDOFLabe Line 45  dim_t Finley_NodeFile_createDenseDOFLabe
45    
46    if ( ! (Finley_checkPtr(distribution) || Finley_checkPtr(offsets) || Finley_checkPtr(loc_offsets) || Finley_checkPtr(set_new_DOF)) ) {    if ( ! (Finley_checkPtr(distribution) || Finley_checkPtr(offsets) || Finley_checkPtr(loc_offsets) || Finley_checkPtr(set_new_DOF)) ) {
47        /* distribute the range of node ids */        /* distribute the range of node ids */
48        buffer_len=Paso_MPIInfo_setDistribution(in->MPIInfo,min_dof,max_dof,distribution);        buffer_len=Esys_MPIInfo_setDistribution(in->MPIInfo,min_dof,max_dof,distribution);
49        myDOFs=distribution[in->MPIInfo->rank+1]-distribution[in->MPIInfo->rank];        myDOFs=distribution[in->MPIInfo->rank+1]-distribution[in->MPIInfo->rank];
50        /* allocate buffers */        /* allocate buffers */
51        DOF_buffer=TMPMEMALLOC(buffer_len,index_t);        DOF_buffer=TMPMEMALLOC(buffer_len,index_t);
# Line 55  dim_t Finley_NodeFile_createDenseDOFLabe Line 55  dim_t Finley_NodeFile_createDenseDOFLabe
55              for (n=0;n<buffer_len;n++) DOF_buffer[n]=unset_dof;              for (n=0;n<buffer_len;n++) DOF_buffer[n]=unset_dof;
56                            
57              /* fill the buffer by sending portions around in a circle */              /* fill the buffer by sending portions around in a circle */
58              dest=Paso_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank + 1);              dest=Esys_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank + 1);
59              source=Paso_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank - 1);              source=Esys_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank - 1);
60              buffer_rank=in->MPIInfo->rank;              buffer_rank=in->MPIInfo->rank;
61              for (p=0; p< in->MPIInfo->size; ++p) {              for (p=0; p< in->MPIInfo->size; ++p) {
62                   if (p>0) {  /* the initial send can be skipped */                   if (p>0) {  /* the initial send can be skipped */
63                       #ifdef PASO_MPI                       #ifdef ESYS_MPI
64                       MPI_Sendrecv_replace(DOF_buffer, buffer_len, MPI_INT,                       MPI_Sendrecv_replace(DOF_buffer, buffer_len, MPI_INT,
65                                            dest, in->MPIInfo->msg_tag_counter, source, in->MPIInfo->msg_tag_counter,                                            dest, in->MPIInfo->msg_tag_counter, source, in->MPIInfo->msg_tag_counter,
66                                            in->MPIInfo->comm,&status);                                            in->MPIInfo->comm,&status);
67                       #endif                       #endif
68                       in->MPIInfo->msg_tag_counter++;                       in->MPIInfo->msg_tag_counter++;
69                   }                   }
70                   buffer_rank=Paso_MPIInfo_mod(in->MPIInfo->size, buffer_rank-1);                   buffer_rank=Esys_MPIInfo_mod(in->MPIInfo->size, buffer_rank-1);
71                   dof_0=distribution[buffer_rank];                   dof_0=distribution[buffer_rank];
72                   dof_1=distribution[buffer_rank+1];                   dof_1=distribution[buffer_rank+1];
73                   #pragma omp parallel for private(n,k) schedule(static)                   #pragma omp parallel for private(n,k) schedule(static)
# Line 89  dim_t Finley_NodeFile_createDenseDOFLabe Line 89  dim_t Finley_NodeFile_createDenseDOFLabe
89              }              }
90              memset(loc_offsets,0,in->MPIInfo->size*sizeof(dim_t));              memset(loc_offsets,0,in->MPIInfo->size*sizeof(dim_t));
91              loc_offsets[in->MPIInfo->rank]=myNewDOFs;              loc_offsets[in->MPIInfo->rank]=myNewDOFs;
92              #ifdef PASO_MPI              #ifdef ESYS_MPI
93                 MPI_Allreduce(loc_offsets,offsets,in->MPIInfo->size, MPI_INT, MPI_SUM, in->MPIInfo->comm );                 MPI_Allreduce(loc_offsets,offsets,in->MPIInfo->size, MPI_INT, MPI_SUM, in->MPIInfo->comm );
94                 new_numGlobalDOFs=0;                 new_numGlobalDOFs=0;
95                 for (n=0; n< in->MPIInfo->size; ++n) {                 for (n=0; n< in->MPIInfo->size; ++n) {
# Line 108  dim_t Finley_NodeFile_createDenseDOFLabe Line 108  dim_t Finley_NodeFile_createDenseDOFLabe
108                  #pragma omp for private(n) schedule(static)                  #pragma omp for private(n) schedule(static)
109                  for (n=0; n<in->numNodes; ++n) set_new_DOF[n]=TRUE;                  for (n=0; n<in->numNodes; ++n) set_new_DOF[n]=TRUE;
110              }              }
111              dest=Paso_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank + 1);              dest=Esys_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank + 1);
112              source=Paso_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank - 1);              source=Esys_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank - 1);
113              buffer_rank=in->MPIInfo->rank;              buffer_rank=in->MPIInfo->rank;
114              for (p=0; p< in->MPIInfo->size; ++p) {              for (p=0; p< in->MPIInfo->size; ++p) {
115                   dof_0=distribution[buffer_rank];                   dof_0=distribution[buffer_rank];
# Line 123  dim_t Finley_NodeFile_createDenseDOFLabe Line 123  dim_t Finley_NodeFile_createDenseDOFLabe
123                        }                        }
124                   }                   }
125                   if (p<in->MPIInfo->size-1) {  /* the last send can be skipped */                   if (p<in->MPIInfo->size-1) {  /* the last send can be skipped */
126                       #ifdef PASO_MPI                       #ifdef ESYS_MPI
127                       MPI_Sendrecv_replace(DOF_buffer, buffer_len, MPI_INT,                       MPI_Sendrecv_replace(DOF_buffer, buffer_len, MPI_INT,
128                                            dest, in->MPIInfo->msg_tag_counter, source, in->MPIInfo->msg_tag_counter,                                            dest, in->MPIInfo->msg_tag_counter, source, in->MPIInfo->msg_tag_counter,
129                                            in->MPIInfo->comm,&status);                                            in->MPIInfo->comm,&status);
130                       #endif                       #endif
131                       in->MPIInfo->msg_tag_counter+=1;                       in->MPIInfo->msg_tag_counter+=1;
132                   }                   }
133                   buffer_rank=Paso_MPIInfo_mod(in->MPIInfo->size, buffer_rank-1);                   buffer_rank=Esys_MPIInfo_mod(in->MPIInfo->size, buffer_rank-1);
134              }              }
135        }        }
136        TMPMEMFREE(DOF_buffer);        TMPMEMFREE(DOF_buffer);
# Line 142  dim_t Finley_NodeFile_createDenseDOFLabe Line 142  dim_t Finley_NodeFile_createDenseDOFLabe
142    return new_numGlobalDOFs;    return new_numGlobalDOFs;
143  }  }
144    
145  void Finley_NodeFile_assignMPIRankToDOFs(Finley_NodeFile* in,Paso_MPI_rank* mpiRankOfDOF, index_t *distribution){  void Finley_NodeFile_assignMPIRankToDOFs(Finley_NodeFile* in,Esys_MPI_rank* mpiRankOfDOF, index_t *distribution){
146    index_t min_DOF,max_DOF, k;    index_t min_DOF,max_DOF, k;
147    dim_t n;    dim_t n;
148    Paso_MPI_rank p, p_min=in->MPIInfo->size, p_max=-1;    Esys_MPI_rank p, p_min=in->MPIInfo->size, p_max=-1;
149    /* first we calculate the min and max dof on this processor to reduce costs for seraching */    /* first we calculate the min and max dof on this processor to reduce costs for seraching */
150    Finley_NodeFile_setDOFRange(&min_DOF,&max_DOF,in);    Finley_NodeFile_setDOFRange(&min_DOF,&max_DOF,in);
151    
# Line 167  void Finley_NodeFile_assignMPIRankToDOFs Line 167  void Finley_NodeFile_assignMPIRankToDOFs
167  dim_t Finley_NodeFile_createDenseReducedDOFLabeling(Finley_NodeFile* in,index_t* reducedNodeMask)  dim_t Finley_NodeFile_createDenseReducedDOFLabeling(Finley_NodeFile* in,index_t* reducedNodeMask)
168  {  {
169    index_t min_dof, max_dof, unset_dof=-1,set_dof=1, dof_0, dof_1, *DOF_buffer=NULL, k;    index_t min_dof, max_dof, unset_dof=-1,set_dof=1, dof_0, dof_1, *DOF_buffer=NULL, k;
170    Paso_MPI_rank buffer_rank, dest, source, *distribution=NULL;    Esys_MPI_rank buffer_rank, dest, source, *distribution=NULL;
171    dim_t p, buffer_len,n, myDOFs, *offsets=NULL, *loc_offsets=NULL, globalNumReducedDOFs=0, myNewDOFs;    dim_t p, buffer_len,n, myDOFs, *offsets=NULL, *loc_offsets=NULL, globalNumReducedDOFs=0, myNewDOFs;
172    #ifdef PASO_MPI    #ifdef ESYS_MPI
173    MPI_Status status;    MPI_Status status;
174    #endif    #endif
175    
# Line 182  dim_t Finley_NodeFile_createDenseReduced Line 182  dim_t Finley_NodeFile_createDenseReduced
182    
183    if ( ! (Finley_checkPtr(distribution) || Finley_checkPtr(offsets) || Finley_checkPtr(loc_offsets) ) ) {    if ( ! (Finley_checkPtr(distribution) || Finley_checkPtr(offsets) || Finley_checkPtr(loc_offsets) ) ) {
184        /* distribute the range of node ids */        /* distribute the range of node ids */
185        buffer_len=Paso_MPIInfo_setDistribution(in->MPIInfo,min_dof,max_dof,distribution);        buffer_len=Esys_MPIInfo_setDistribution(in->MPIInfo,min_dof,max_dof,distribution);
186        myDOFs=distribution[in->MPIInfo->rank+1]-distribution[in->MPIInfo->rank];        myDOFs=distribution[in->MPIInfo->rank+1]-distribution[in->MPIInfo->rank];
187        /* allocate buffers */        /* allocate buffers */
188        DOF_buffer=TMPMEMALLOC(buffer_len,index_t);        DOF_buffer=TMPMEMALLOC(buffer_len,index_t);
# Line 192  dim_t Finley_NodeFile_createDenseReduced Line 192  dim_t Finley_NodeFile_createDenseReduced
192              for (n=0;n<buffer_len;n++) DOF_buffer[n]=unset_dof;              for (n=0;n<buffer_len;n++) DOF_buffer[n]=unset_dof;
193                            
194              /* fill the buffer by sending portions around in a circle */              /* fill the buffer by sending portions around in a circle */
195              dest=Paso_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank + 1);              dest=Esys_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank + 1);
196              source=Paso_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank - 1);              source=Esys_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank - 1);
197              buffer_rank=in->MPIInfo->rank;              buffer_rank=in->MPIInfo->rank;
198              for (p=0; p< in->MPIInfo->size; ++p) {              for (p=0; p< in->MPIInfo->size; ++p) {
199                   if (p>0) {  /* the initial send can be skipped */                   if (p>0) {  /* the initial send can be skipped */
200                       #ifdef PASO_MPI                       #ifdef ESYS_MPI
201                       MPI_Sendrecv_replace(DOF_buffer, buffer_len, MPI_INT,                       MPI_Sendrecv_replace(DOF_buffer, buffer_len, MPI_INT,
202                                            dest, in->MPIInfo->msg_tag_counter, source, in->MPIInfo->msg_tag_counter,                                            dest, in->MPIInfo->msg_tag_counter, source, in->MPIInfo->msg_tag_counter,
203                                            in->MPIInfo->comm,&status);                                            in->MPIInfo->comm,&status);
204                       #endif                       #endif
205                       in->MPIInfo->msg_tag_counter++;                       in->MPIInfo->msg_tag_counter++;
206                   }                   }
207                   buffer_rank=Paso_MPIInfo_mod(in->MPIInfo->size, buffer_rank-1);                   buffer_rank=Esys_MPIInfo_mod(in->MPIInfo->size, buffer_rank-1);
208                   dof_0=distribution[buffer_rank];                   dof_0=distribution[buffer_rank];
209                   dof_1=distribution[buffer_rank+1];                   dof_1=distribution[buffer_rank+1];
210                   #pragma omp parallel for private(n,k) schedule(static)                   #pragma omp parallel for private(n,k) schedule(static)
# Line 228  dim_t Finley_NodeFile_createDenseReduced Line 228  dim_t Finley_NodeFile_createDenseReduced
228              }              }
229              memset(loc_offsets,0,in->MPIInfo->size*sizeof(dim_t));              memset(loc_offsets,0,in->MPIInfo->size*sizeof(dim_t));
230              loc_offsets[in->MPIInfo->rank]=myNewDOFs;              loc_offsets[in->MPIInfo->rank]=myNewDOFs;
231              #ifdef PASO_MPI              #ifdef ESYS_MPI
232                 MPI_Allreduce(loc_offsets,offsets,in->MPIInfo->size, MPI_INT, MPI_SUM, in->MPIInfo->comm );                 MPI_Allreduce(loc_offsets,offsets,in->MPIInfo->size, MPI_INT, MPI_SUM, in->MPIInfo->comm );
233                 globalNumReducedDOFs=0;                 globalNumReducedDOFs=0;
234                 for (n=0; n< in->MPIInfo->size; ++n) {                 for (n=0; n< in->MPIInfo->size; ++n) {
# Line 244  dim_t Finley_NodeFile_createDenseReduced Line 244  dim_t Finley_NodeFile_createDenseReduced
244              /* 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 */
245              #pragma omp parallel for private(n) schedule(static)              #pragma omp parallel for private(n) schedule(static)
246              for (n=0; n<in->numNodes; ++n) in->globalReducedDOFIndex[n]=loc_offsets[0]-1;              for (n=0; n<in->numNodes; ++n) in->globalReducedDOFIndex[n]=loc_offsets[0]-1;
247              dest=Paso_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank + 1);              dest=Esys_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank + 1);
248              source=Paso_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank - 1);              source=Esys_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank - 1);
249              buffer_rank=in->MPIInfo->rank;              buffer_rank=in->MPIInfo->rank;
250              for (p=0; p< in->MPIInfo->size; ++p) {              for (p=0; p< in->MPIInfo->size; ++p) {
251                   dof_0=distribution[buffer_rank];                   dof_0=distribution[buffer_rank];
# Line 258  dim_t Finley_NodeFile_createDenseReduced Line 258  dim_t Finley_NodeFile_createDenseReduced
258                        }                        }
259                   }                   }
260                   if (p<in->MPIInfo->size-1) {  /* the last send can be skipped */                   if (p<in->MPIInfo->size-1) {  /* the last send can be skipped */
261                       #ifdef PASO_MPI                       #ifdef ESYS_MPI
262                       MPI_Sendrecv_replace(DOF_buffer, buffer_len, MPI_INT,                       MPI_Sendrecv_replace(DOF_buffer, buffer_len, MPI_INT,
263                                            dest, in->MPIInfo->msg_tag_counter, source, in->MPIInfo->msg_tag_counter,                                            dest, in->MPIInfo->msg_tag_counter, source, in->MPIInfo->msg_tag_counter,
264                                            in->MPIInfo->comm,&status);                                            in->MPIInfo->comm,&status);
265                       #endif                       #endif
266                       in->MPIInfo->msg_tag_counter+=1;                       in->MPIInfo->msg_tag_counter+=1;
267                   }                   }
268                   buffer_rank=Paso_MPIInfo_mod(in->MPIInfo->size, buffer_rank-1);                   buffer_rank=Esys_MPIInfo_mod(in->MPIInfo->size, buffer_rank-1);
269              }              }
270        }        }
271        TMPMEMFREE(DOF_buffer);        TMPMEMFREE(DOF_buffer);
# Line 279  dim_t Finley_NodeFile_createDenseNodeLab Line 279  dim_t Finley_NodeFile_createDenseNodeLab
279  {  {
280    index_t myFirstDOF, myLastDOF, max_id, min_id, loc_max_id, loc_min_id, dof, id, itmp, nodeID_0, nodeID_1, dof_0, dof_1, *Node_buffer=NULL;    index_t myFirstDOF, myLastDOF, max_id, min_id, loc_max_id, loc_min_id, dof, id, itmp, nodeID_0, nodeID_1, dof_0, dof_1, *Node_buffer=NULL;
281    dim_t n, my_buffer_len, buffer_len, globalNumNodes=0, myNewNumNodes;    dim_t n, my_buffer_len, buffer_len, globalNumNodes=0, myNewNumNodes;
282    Paso_MPI_rank p, dest, source, buffer_rank;    Esys_MPI_rank p, dest, source, buffer_rank;
283    const index_t unset_nodeID=-1, set_nodeID=1;    const index_t unset_nodeID=-1, set_nodeID=1;
284    const dim_t header_len=2;    const dim_t header_len=2;
285    #ifdef PASO_MPI    #ifdef ESYS_MPI
286    MPI_Status status;    MPI_Status status;
287    #endif    #endif
288    Paso_MPI_rank myRank=in->MPIInfo->rank;    Esys_MPI_rank myRank=in->MPIInfo->rank;
289    
290    /* find the range of node ids controled by me */    /* find the range of node ids controled by me */
291    
# Line 315  dim_t Finley_NodeFile_createDenseNodeLab Line 315  dim_t Finley_NodeFile_createDenseNodeLab
315     /* allocate a buffer */     /* allocate a buffer */
316     my_buffer_len=max_id>=min_id ? max_id-min_id+1 :0;     my_buffer_len=max_id>=min_id ? max_id-min_id+1 :0;
317    
318     #ifdef PASO_MPI     #ifdef ESYS_MPI
319     MPI_Allreduce( &my_buffer_len, &buffer_len, 1, MPI_INT, MPI_MAX, in->MPIInfo->comm );     MPI_Allreduce( &my_buffer_len, &buffer_len, 1, MPI_INT, MPI_MAX, in->MPIInfo->comm );
320     #else     #else
321     buffer_len=my_buffer_len;     buffer_len=my_buffer_len;
# Line 345  dim_t Finley_NodeFile_createDenseNodeLab Line 345  dim_t Finley_NodeFile_createDenseNodeLab
345              }              }
346         }         }
347         /* make the local number of nodes globally available */         /* make the local number of nodes globally available */
348         #ifdef PASO_MPI         #ifdef ESYS_MPI
349           MPI_Allgather(&myNewNumNodes,1,MPI_INT,node_distribution,1,MPI_INT,in->MPIInfo->comm);           MPI_Allgather(&myNewNumNodes,1,MPI_INT,node_distribution,1,MPI_INT,in->MPIInfo->comm);
350         #else         #else
351           node_distribution[0]=myNewNumNodes;           node_distribution[0]=myNewNumNodes;
# Line 367  dim_t Finley_NodeFile_createDenseNodeLab Line 367  dim_t Finley_NodeFile_createDenseNodeLab
367    
368    
369         /* now we send this buffer around to assign global node index: */         /* now we send this buffer around to assign global node index: */
370         dest=Paso_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank + 1);         dest=Esys_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank + 1);
371         source=Paso_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank - 1);         source=Esys_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank - 1);
372         Node_buffer[0]=min_id;         Node_buffer[0]=min_id;
373         Node_buffer[1]=max_id;         Node_buffer[1]=max_id;
374         buffer_rank=in->MPIInfo->rank;         buffer_rank=in->MPIInfo->rank;
# Line 386  dim_t Finley_NodeFile_createDenseNodeLab Line 386  dim_t Finley_NodeFile_createDenseNodeLab
386                  }                  }
387               }               }
388               if (p<in->MPIInfo->size-1) {  /* the last send can be skipped */               if (p<in->MPIInfo->size-1) {  /* the last send can be skipped */
389                   #ifdef PASO_MPI                   #ifdef ESYS_MPI
390                   MPI_Sendrecv_replace(Node_buffer, buffer_len+header_len, MPI_INT,                   MPI_Sendrecv_replace(Node_buffer, buffer_len+header_len, MPI_INT,
391                                        dest, in->MPIInfo->msg_tag_counter, source, in->MPIInfo->msg_tag_counter,                                        dest, in->MPIInfo->msg_tag_counter, source, in->MPIInfo->msg_tag_counter,
392                                        in->MPIInfo->comm,&status);                                        in->MPIInfo->comm,&status);
393                   #endif                   #endif
394                   in->MPIInfo->msg_tag_counter+=1;                   in->MPIInfo->msg_tag_counter+=1;
395               }               }
396               buffer_rank=Paso_MPIInfo_mod(in->MPIInfo->size, buffer_rank-1);               buffer_rank=Esys_MPIInfo_mod(in->MPIInfo->size, buffer_rank-1);
397         }         }
398     }     }
399     TMPMEMFREE(Node_buffer);     TMPMEMFREE(Node_buffer);
# Line 403  dim_t Finley_NodeFile_createDenseNodeLab Line 403  dim_t Finley_NodeFile_createDenseNodeLab
403  dim_t Finley_NodeFile_createDenseReducedNodeLabeling(Finley_NodeFile* in,index_t* reducedNodeMask)  dim_t Finley_NodeFile_createDenseReducedNodeLabeling(Finley_NodeFile* in,index_t* reducedNodeMask)
404  {  {
405    index_t min_node, max_node, unset_node=-1,set_node=1, node_0, node_1, *Nodes_buffer=NULL, k;    index_t min_node, max_node, unset_node=-1,set_node=1, node_0, node_1, *Nodes_buffer=NULL, k;
406    Paso_MPI_rank buffer_rank, dest, source, *distribution=NULL;    Esys_MPI_rank buffer_rank, dest, source, *distribution=NULL;
407    dim_t p, buffer_len,n, myNodes, *offsets=NULL, *loc_offsets=NULL, globalNumReducedNodes=0, myNewNodes;    dim_t p, buffer_len,n, myNodes, *offsets=NULL, *loc_offsets=NULL, globalNumReducedNodes=0, myNewNodes;
408    #ifdef PASO_MPI    #ifdef ESYS_MPI
409    MPI_Status status;    MPI_Status status;
410    #endif    #endif
411    
# Line 418  dim_t Finley_NodeFile_createDenseReduced Line 418  dim_t Finley_NodeFile_createDenseReduced
418    
419    if ( ! (Finley_checkPtr(distribution) || Finley_checkPtr(offsets) || Finley_checkPtr(loc_offsets) ) ) {    if ( ! (Finley_checkPtr(distribution) || Finley_checkPtr(offsets) || Finley_checkPtr(loc_offsets) ) ) {
420        /* distribute the range of node ids */        /* distribute the range of node ids */
421        buffer_len=Paso_MPIInfo_setDistribution(in->MPIInfo,min_node,max_node,distribution);        buffer_len=Esys_MPIInfo_setDistribution(in->MPIInfo,min_node,max_node,distribution);
422        myNodes=distribution[in->MPIInfo->rank+1]-distribution[in->MPIInfo->rank];        myNodes=distribution[in->MPIInfo->rank+1]-distribution[in->MPIInfo->rank];
423        /* allocate buffers */        /* allocate buffers */
424        Nodes_buffer=TMPMEMALLOC(buffer_len,index_t);        Nodes_buffer=TMPMEMALLOC(buffer_len,index_t);
# Line 428  dim_t Finley_NodeFile_createDenseReduced Line 428  dim_t Finley_NodeFile_createDenseReduced
428              for (n=0;n<buffer_len;n++) Nodes_buffer[n]=unset_node;              for (n=0;n<buffer_len;n++) Nodes_buffer[n]=unset_node;
429                            
430              /* fill the buffer by sending portions around in a circle */              /* fill the buffer by sending portions around in a circle */
431              dest=Paso_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank + 1);              dest=Esys_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank + 1);
432              source=Paso_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank - 1);              source=Esys_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank - 1);
433              buffer_rank=in->MPIInfo->rank;              buffer_rank=in->MPIInfo->rank;
434              for (p=0; p< in->MPIInfo->size; ++p) {              for (p=0; p< in->MPIInfo->size; ++p) {
435                   if (p>0) {  /* the initial send can be skipped */                   if (p>0) {  /* the initial send can be skipped */
436                       #ifdef PASO_MPI                       #ifdef ESYS_MPI
437                       MPI_Sendrecv_replace(Nodes_buffer, buffer_len, MPI_INT,                       MPI_Sendrecv_replace(Nodes_buffer, buffer_len, MPI_INT,
438                                            dest, in->MPIInfo->msg_tag_counter, source, in->MPIInfo->msg_tag_counter,                                            dest, in->MPIInfo->msg_tag_counter, source, in->MPIInfo->msg_tag_counter,
439                                            in->MPIInfo->comm,&status);                                            in->MPIInfo->comm,&status);
440                       #endif                       #endif
441                       in->MPIInfo->msg_tag_counter++;                       in->MPIInfo->msg_tag_counter++;
442                   }                   }
443                   buffer_rank=Paso_MPIInfo_mod(in->MPIInfo->size, buffer_rank-1);                   buffer_rank=Esys_MPIInfo_mod(in->MPIInfo->size, buffer_rank-1);
444                   node_0=distribution[buffer_rank];                   node_0=distribution[buffer_rank];
445                   node_1=distribution[buffer_rank+1];                   node_1=distribution[buffer_rank+1];
446                   #pragma omp parallel for private(n,k) schedule(static)                   #pragma omp parallel for private(n,k) schedule(static)
# Line 464  dim_t Finley_NodeFile_createDenseReduced Line 464  dim_t Finley_NodeFile_createDenseReduced
464              }              }
465              memset(loc_offsets,0,in->MPIInfo->size*sizeof(dim_t));              memset(loc_offsets,0,in->MPIInfo->size*sizeof(dim_t));
466              loc_offsets[in->MPIInfo->rank]=myNewNodes;              loc_offsets[in->MPIInfo->rank]=myNewNodes;
467              #ifdef PASO_MPI              #ifdef ESYS_MPI
468                 MPI_Allreduce(loc_offsets,offsets,in->MPIInfo->size, MPI_INT, MPI_SUM, in->MPIInfo->comm );                 MPI_Allreduce(loc_offsets,offsets,in->MPIInfo->size, MPI_INT, MPI_SUM, in->MPIInfo->comm );
469                 globalNumReducedNodes=0;                 globalNumReducedNodes=0;
470                 for (n=0; n< in->MPIInfo->size; ++n) {                 for (n=0; n< in->MPIInfo->size; ++n) {
# Line 480  dim_t Finley_NodeFile_createDenseReduced Line 480  dim_t Finley_NodeFile_createDenseReduced
480              /* 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 */
481              #pragma omp parallel for private(n) schedule(static)              #pragma omp parallel for private(n) schedule(static)
482              for (n=0; n<in->numNodes; ++n) in->globalReducedNodesIndex[n]=loc_offsets[0]-1;              for (n=0; n<in->numNodes; ++n) in->globalReducedNodesIndex[n]=loc_offsets[0]-1;
483              dest=Paso_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank + 1);              dest=Esys_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank + 1);
484              source=Paso_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank - 1);              source=Esys_MPIInfo_mod(in->MPIInfo->size, in->MPIInfo->rank - 1);
485              buffer_rank=in->MPIInfo->rank;              buffer_rank=in->MPIInfo->rank;
486              for (p=0; p< in->MPIInfo->size; ++p) {              for (p=0; p< in->MPIInfo->size; ++p) {
487                   node_0=distribution[buffer_rank];                   node_0=distribution[buffer_rank];
# Line 494  dim_t Finley_NodeFile_createDenseReduced Line 494  dim_t Finley_NodeFile_createDenseReduced
494                        }                        }
495                   }                   }
496                   if (p<in->MPIInfo->size-1) {  /* the last send can be skipped */                   if (p<in->MPIInfo->size-1) {  /* the last send can be skipped */
497                       #ifdef PASO_MPI                       #ifdef ESYS_MPI
498                       MPI_Sendrecv_replace(Nodes_buffer, buffer_len, MPI_INT,                       MPI_Sendrecv_replace(Nodes_buffer, buffer_len, MPI_INT,
499                                            dest, in->MPIInfo->msg_tag_counter, source, in->MPIInfo->msg_tag_counter,                                            dest, in->MPIInfo->msg_tag_counter, source, in->MPIInfo->msg_tag_counter,
500                                            in->MPIInfo->comm,&status);                                            in->MPIInfo->comm,&status);
501                       #endif                       #endif
502                       in->MPIInfo->msg_tag_counter+=1;                       in->MPIInfo->msg_tag_counter+=1;
503                   }                   }
504                   buffer_rank=Paso_MPIInfo_mod(in->MPIInfo->size, buffer_rank-1);                   buffer_rank=Esys_MPIInfo_mod(in->MPIInfo->size, buffer_rank-1);
505              }              }
506        }        }
507        TMPMEMFREE(Nodes_buffer);        TMPMEMFREE(Nodes_buffer);

Legend:
Removed from v.3258  
changed lines
  Added in v.3259

  ViewVC Help
Powered by ViewVC 1.1.26