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

Diff of /trunk/finley/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 1811 by ksteube, Thu Sep 25 23:11:13 2008 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          ParMETIS_V3_PartGeomKway(distribution,            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    
139    /*
140    {
141    int k=distribution[in->MPIInfo->rank+1]-distribution[in->MPIInfo->rank];
142    int min_i,max_i;
143    printf("INPUT PARMETIS: %d\n",k);
144    for(i=0;i<in->MPIInfo->size+1;++i) printf("%d ",distribution[i]);
145    printf("\n");
146    min_i=pattern->index[0];
147    max_i=pattern->index[0];
148    for(i=0;i<pattern->ptr[k];++i) {
149    min_i=MIN(min_i,pattern->index[i]);
150    max_i=MAX(max_i,pattern->index[i]);
151    }
152    printf("index range = %d : %d\n",min_i,max_i);
153    
154    for(i=0;i<k+1;++i) printf("%d ",pattern->ptr[i]);
155    printf("\n");
156    for(i=0;i<pattern->ptr[k];++i) printf("%d ",pattern->index[i]);
157    printf("\n");
158    }
159    */
160             ParMETIS_V3_PartGeomKway(distribution,
161                                   pattern->ptr,                                   pattern->ptr,
162                                   pattern->index,                                   pattern->index,
163                                   idxtype *vwgt, +                                   NULL,
164                                   idxtype *adjwgt, +                                   NULL,
165                                   int *wgtflag, +                                   &wgtflag,
166                                   int *numflag, +                                   &numflag,
167                                   dim,                                   &dim,
168                                   xyz,                                   xyz,
169                                   int *ncon, +                                   &ncon,
170                                   mpiSize,                                   &mpiSize,
171                                   float *tpwgts, +                                   tpwgts,
172                                   float *ubvec, +                                   ubvec,
173                                   int *options, +                                   options,
174                                   int *edgecut, +                                   &edgecut,
175                                   partition,                                   partition,             /* new CPU ownership of elements */
176                                   in->MPIInfo->comm);                                   &(in->MPIInfo->comm));
177  */           printf("ParMETIS number of edges cut by partitioning per processor: %d\n", edgecut/MAX(in->MPIInfo->size,1));
178                 for (i=0;i<myNumVertices;++i) partition[i]=myRank; /* remove */                   TMPMEMFREE(ubvec);
179                     TMPMEMFREE(tpwgts);
180              } else {
181                     for (i=0;i<myNumVertices;++i) partition[i]=0;      /* CPU 0 owns it */
182              }
183    #else
184                  for (i=0;i<myNumVertices;++i) partition[i]=myRank;    /* CPU 0 owns it */
185    #endif
186    
187             }             }
188    
189             Paso_Pattern_free(pattern);             Paso_Pattern_free(pattern);
# Line 156  void Finley_Mesh_optimizeDOFDistribution Line 203  void Finley_Mesh_optimizeDOFDistribution
203                 THREAD_MEMFREE(loc_partition_count);                 THREAD_MEMFREE(loc_partition_count);
204             }             }
205             #ifdef PASO_MPI             #ifdef PASO_MPI
206                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 */
207              MPI_Allgather(new_distribution, mpiSize, MPI_INT, recvbuf, mpiSize, MPI_INT, in->MPIInfo->comm);
208             #else             #else
209                 for (i=0;i<mpiSize;++i) partition_count[i]=new_distribution[i];                 for (i=0;i<mpiSize;++i) recvbuf[i]=new_distribution[i];
210             #endif             #endif
211             new_distribution[0]=0;             new_distribution[0]=0;
212             for (i=0;i<mpiSize;++i) {         for (rank=0; rank<mpiSize;rank++) {
213                 new_distribution[i+1]=new_distribution[i]+partition_count[i];            c=0;
214                 partition_count[i]=0;                for (i=0;i<myRank;++i) c+=recvbuf[rank+mpiSize*i];
215             }                for (i=0;i<myNumVertices;++i) {
216             for (i=0;i<myNumVertices;++i) {                   if (rank==partition[i]) {
217                rank=partition[i];                      newGlobalDOFID[i]=new_distribution[rank]+c;
218                newGlobalDOFID[i]=new_distribution[rank]+partition_count[rank];                      c++;
219                partition_count[rank]++;               }
220                  }
221                  for (i=myRank+1;i<mpiSize;++i) c+=recvbuf[rank+mpiSize*i];
222                  new_distribution[rank+1]=new_distribution[rank]+c;
223             }             }
224               TMPMEMFREE(recvbuf);
225    
226             /* now the overlap needs to be created by sending the partition around*/             /* now the overlap needs to be created by sending the partition around*/
227    
228             dest=Paso_MPIInfo_mod(mpiSize, myRank + 1);             dest=Paso_MPIInfo_mod(mpiSize, myRank + 1);
# Line 203  void Finley_Mesh_optimizeDOFDistribution Line 256  void Finley_Mesh_optimizeDOFDistribution
256                }                }
257             }             }
258             for (i=0;i<mpiSize+1;++i) distribution[i]=new_distribution[i];             for (i=0;i<mpiSize+1;++i) distribution[i]=new_distribution[i];
   
             
259           }           }
260           TMPMEMFREE(index_list);           TMPMEMFREE(index_list);
261       }       }

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

  ViewVC Help
Powered by ViewVC 1.1.26