/[escript]/trunk/dudley/src/Mesh_optimizeDOFDistribution.c
ViewVC logotype

Diff of /trunk/dudley/src/Mesh_optimizeDOFDistribution.c

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

temp_trunk_copy/finley/src/Mesh_optimizeDOFDistribution.c revision 1384 by phornby, Fri Jan 11 02:29:38 2008 UTC trunk/finley/src/Mesh_optimizeDOFDistribution.c revision 2368 by gross, Mon Apr 6 05:05:35 2009 UTC
# Line 1  Line 1 
1    
 /* $Id$ */  
   
2  /*******************************************************  /*******************************************************
3   *  *
4   *           Copyright 2003-2007 by ACceSS MNRF  * Copyright (c) 2003-2008 by University of Queensland
5   *       Copyright 2007 by University of Queensland  * Earth Systems Science Computational Center (ESSCC)
6   *  * http://www.uq.edu.au/esscc
7   *                http://esscc.uq.edu.au  *
8   *        Primary Business: Queensland, Australia  * Primary Business: Queensland, Australia
9   *  Licensed under the Open Software License version 3.0  * Licensed under the Open Software License version 3.0
10   *     http://www.opensource.org/licenses/osl-3.0.php  * http://www.opensource.org/licenses/osl-3.0.php
11   *  *
12   *******************************************************/  *******************************************************/
13    
14    
15  /**************************************************************/  /**************************************************************/
16    
# Line 26  Line 25 
25  #ifdef _OPENMP  #ifdef _OPENMP
26  #include <omp.h>  #include <omp.h>
27  #endif  #endif
28    #ifdef USE_PARMETIS
29    #include "parmetis.h"
30    #endif
31    
32  /**************************************************************/  /**************************************************************/
33    
# Line 40  void Finley_Mesh_optimizeDOFDistribution Line 42  void Finley_Mesh_optimizeDOFDistribution
42       Paso_MPI_rank myRank,dest,source,current_rank, rank;       Paso_MPI_rank myRank,dest,source,current_rank, rank;
43       Finley_IndexList* index_list=NULL;       Finley_IndexList* index_list=NULL;
44       float *xyz=NULL;       float *xyz=NULL;
45         int c;
46            
47       #ifdef PASO_MPI       #ifdef PASO_MPI
48       MPI_Status status;       MPI_Status status;
# Line 67  void Finley_Mesh_optimizeDOFDistribution Line 70  void Finley_Mesh_optimizeDOFDistribution
70       newGlobalDOFID=TMPMEMALLOC(len,index_t);       newGlobalDOFID=TMPMEMALLOC(len,index_t);
71       setNewDOFId=TMPMEMALLOC(in->Nodes->numNodes,bool_t);       setNewDOFId=TMPMEMALLOC(in->Nodes->numNodes,bool_t);
72       if (!(Finley_checkPtr(partition) || Finley_checkPtr(xyz) || Finley_checkPtr(partition_count) || Finley_checkPtr(partition_count) || Finley_checkPtr(newGlobalDOFID) || Finley_checkPtr(setNewDOFId))) {       if (!(Finley_checkPtr(partition) || Finley_checkPtr(xyz) || Finley_checkPtr(partition_count) || Finley_checkPtr(partition_count) || Finley_checkPtr(newGlobalDOFID) || Finley_checkPtr(setNewDOFId))) {
73             dim_t *recvbuf=TMPMEMALLOC(mpiSize*mpiSize,dim_t);
74    
75           /* set the coordinates: *?           /* set the coordinates: */
76           /* it is assumed that at least one node on this processor provides a coordinate */           /* it is assumed that at least one node on this processor provides a coordinate */
77           #pragma omp parallel for private(i,j,k)           #pragma omp parallel for private(i,j,k)
78           for (i=0;i<in->Nodes->numNodes;++i) {           for (i=0;i<in->Nodes->numNodes;++i) {
# Line 91  void Finley_Mesh_optimizeDOFDistribution Line 95  void Finley_Mesh_optimizeDOFDistribution
95                }                }
96            /* ksteube build CSR format */            /* ksteube build CSR format */
97                /*  insert contributions from element matrices into colums index index_list: */                /*  insert contributions from element matrices into colums index index_list: */
98                Finley_IndexList_insertElementsWithRowRange(index_list, myFirstVertex, myLastVertex,                Finley_IndexList_insertElementsWithRowRangeNoMainDiagonal(index_list, myFirstVertex, myLastVertex,
99                                                            in->Elements,in->Nodes->globalDegreesOfFreedom,                                                                          in->Elements,in->Nodes->globalDegreesOfFreedom,
100                                                            in->Nodes->globalDegreesOfFreedom);                                                                          in->Nodes->globalDegreesOfFreedom);
101                Finley_IndexList_insertElementsWithRowRange(index_list, myFirstVertex, myLastVertex,                Finley_IndexList_insertElementsWithRowRangeNoMainDiagonal(index_list, myFirstVertex, myLastVertex,
102                                                            in->FaceElements,in->Nodes->globalDegreesOfFreedom,                                                                          in->FaceElements,in->Nodes->globalDegreesOfFreedom,
103                                                            in->Nodes->globalDegreesOfFreedom);                                                                          in->Nodes->globalDegreesOfFreedom);
104                Finley_IndexList_insertElementsWithRowRange(index_list, myFirstVertex, myLastVertex,                Finley_IndexList_insertElementsWithRowRangeNoMainDiagonal(index_list, myFirstVertex, myLastVertex,
105                                                            in->ContactElements,in->Nodes->globalDegreesOfFreedom,                                                                          in->ContactElements,in->Nodes->globalDegreesOfFreedom,
106                                                            in->Nodes->globalDegreesOfFreedom);                                                                          in->Nodes->globalDegreesOfFreedom);
107                Finley_IndexList_insertElementsWithRowRange(index_list, myFirstVertex, myLastVertex,                Finley_IndexList_insertElementsWithRowRangeNoMainDiagonal(index_list, myFirstVertex, myLastVertex,
108                                                            in->Points,in->Nodes->globalDegreesOfFreedom,                                                                          in->Points,in->Nodes->globalDegreesOfFreedom,
109                                                            in->Nodes->globalDegreesOfFreedom);                                                                          in->Nodes->globalDegreesOfFreedom);
110             }             }
111                        
112             /* create the local matrix pattern */             /* create the local matrix pattern */
113             pattern=Finley_IndexList_createPattern(myNumVertices,index_list,0,globalNumVertices,0);             pattern=Finley_IndexList_createPattern(0,myNumVertices,index_list,0,globalNumVertices,0);
114    
115             /* clean up index list */             /* clean up index list */
116             if (index_list!=NULL) {             if (index_list!=NULL) {
# Line 116  void Finley_Mesh_optimizeDOFDistribution Line 120  void Finley_Mesh_optimizeDOFDistribution
120    
121             if (Finley_noError()) {             if (Finley_noError()) {
122    
123  /*  #ifdef USE_PARMETIS
124    
125              if (in->MPIInfo->size>1) {
126             int i;
127             int wgtflag = 0;
128             int numflag = 0;   /* pattern->ptr is C style: starting from 0 instead of 1 */
129             int ncon = 1;
130             int edgecut;
131             int options[2];
132             float *tpwgts = TMPMEMALLOC(ncon*mpiSize,float);
133             float *ubvec = TMPMEMALLOC(ncon,float);
134             for (i=0; i<ncon*mpiSize; i++) tpwgts[i] = 1.0/(float)mpiSize;
135             for (i=0; i<ncon; i++) ubvec[i] = 1.05;
136             options[0] = 3;
137             options[1] = 15;
138                 ParMETIS_V3_PartGeomKway(distribution,
139                                              pattern->ptr,
140                                              pattern->index,
141                                              NULL,
142                                              NULL,
143                                              &wgtflag,
144                                              &numflag,
145                                              &dim,
146                                              xyz,
147                                              &ncon,
148                                              &mpiSize,
149                                              tpwgts,
150                                              ubvec,
151                                              options,
152                                              &edgecut,
153                                              partition,                /* new CPU ownership of elements */
154                                              &(in->MPIInfo->comm));
155             /* printf("ParMETIS number of edges cut by partitioning per processor: %d\n", edgecut/MAX(in->MPIInfo->size,1)); */
156                     TMPMEMFREE(ubvec);
157                     TMPMEMFREE(tpwgts);
158              } else {
159                     for (i=0;i<myNumVertices;++i) partition[i]=0;      /* CPU 0 owns it */
160              }
161    #else
162                  for (i=0;i<myNumVertices;++i) partition[i]=myRank;    /* CPU 0 owns it */
163    #endif
164    
         ParMETIS_V3_PartGeomKway(distribution,  
                                  pattern->ptr,  
                                  pattern->index,  
                                  idxtype *vwgt, +  
                                  idxtype *adjwgt, +  
                                  int *wgtflag, +  
                                  int *numflag, +  
                                  dim,  
                                  xyz,  
                                  int *ncon, +  
                                  mpiSize,  
                                  float *tpwgts, +  
                                  float *ubvec, +  
                                  int *options, +  
                                  int *edgecut, +  
                                  partition,  
                                  in->MPIInfo->comm);  
 */  
                for (i=0;i<myNumVertices;++i) partition[i]=myRank; /* remove */  
165             }             }
166    
167             Paso_Pattern_free(pattern);             Paso_Pattern_free(pattern);
# Line 156  void Finley_Mesh_optimizeDOFDistribution Line 181  void Finley_Mesh_optimizeDOFDistribution
181                 THREAD_MEMFREE(loc_partition_count);                 THREAD_MEMFREE(loc_partition_count);
182             }             }
183             #ifdef PASO_MPI             #ifdef PASO_MPI
184                MPI_Allreduce( new_distribution, partition_count, mpiSize, MPI_INT, MPI_SUM, in->MPIInfo->comm );            /* recvbuf will be the concatenation of each CPU's contribution to new_distribution */
185              MPI_Allgather(new_distribution, mpiSize, MPI_INT, recvbuf, mpiSize, MPI_INT, in->MPIInfo->comm);
186             #else             #else
187                 for (i=0;i<mpiSize;++i) partition_count[i]=new_distribution[i];                 for (i=0;i<mpiSize;++i) recvbuf[i]=new_distribution[i];
188             #endif             #endif
189             new_distribution[0]=0;             new_distribution[0]=0;
190             for (i=0;i<mpiSize;++i) {         for (rank=0; rank<mpiSize;rank++) {
191                 new_distribution[i+1]=new_distribution[i]+partition_count[i];            c=0;
192                 partition_count[i]=0;                for (i=0;i<myRank;++i) c+=recvbuf[rank+mpiSize*i];
193             }                for (i=0;i<myNumVertices;++i) {
194             for (i=0;i<myNumVertices;++i) {                   if (rank==partition[i]) {
195                rank=partition[i];                      newGlobalDOFID[i]=new_distribution[rank]+c;
196                newGlobalDOFID[i]=new_distribution[rank]+partition_count[rank];                      c++;
197                partition_count[rank]++;               }
198                  }
199                  for (i=myRank+1;i<mpiSize;++i) c+=recvbuf[rank+mpiSize*i];
200                  new_distribution[rank+1]=new_distribution[rank]+c;
201             }             }
202               TMPMEMFREE(recvbuf);
203    
204             /* now the overlap needs to be created by sending the partition around*/             /* now the overlap needs to be created by sending the partition around*/
205    
206             dest=Paso_MPIInfo_mod(mpiSize, myRank + 1);             dest=Paso_MPIInfo_mod(mpiSize, myRank + 1);
# Line 203  void Finley_Mesh_optimizeDOFDistribution Line 234  void Finley_Mesh_optimizeDOFDistribution
234                }                }
235             }             }
236             for (i=0;i<mpiSize+1;++i) distribution[i]=new_distribution[i];             for (i=0;i<mpiSize+1;++i) distribution[i]=new_distribution[i];
   
             
237           }           }
238           TMPMEMFREE(index_list);           TMPMEMFREE(index_list);
239       }       }

Legend:
Removed from v.1384  
changed lines
  Added in v.2368

  ViewVC Help
Powered by ViewVC 1.1.26