Revise ParFUM and MSA to match new interface. Everything builds again.
authorPhil Miller <mille121@illinois.edu>
Mon, 13 Oct 2008 22:20:27 +0000 (22:20 +0000)
committerPhil Miller <mille121@illinois.edu>
Mon, 13 Oct 2008 22:20:27 +0000 (22:20 +0000)
src/libs/ck-libs/ParFUM/Makefile
src/libs/ck-libs/ParFUM/ParFUM_internals.h
src/libs/ck-libs/ParFUM/parallel_part.C

index bfbcf5f241ec4ae2958b27361013ae674c05717b..5e0e8c08b88b48f507d460150fbcabde9233104a 100644 (file)
@@ -13,7 +13,7 @@ GENHEADERS= ParFUM.def.h ParFUM.decl.h ParFUM_Adapt.decl.h ParFUM_Adapt.def.h Pa
 
 HEADDEP= $(GENHEADERS) $(HEADERS) $(INTERNALHEADERS)
 
-OBJS=ParFUM.o mesh.o symmetries.o partition.o map.o compat.o call_init.o parallel_part.o mesh_modify.o mesh_adjacency.o adapt.o adapt_algs.o adapt_if.o interpolate.o lock.o util.o lock_node.o adapt_lock.o ParFUM_SA.o global_numbering.o import.o adapt_adj.o bulk_adapt_ops.o bulk_adapt.o mesh_feature_detect.o
+OBJS=ParFUM.o mesh.o symmetries.o partition.o map.o compat.o call_init.o parallel_part.o mesh_modify.o mesh_adjacency.o adapt.o adapt_algs.o adapt_if.o interpolate.o lock.o util.o lock_node.o adapt_lock.o ParFUM_SA.o global_numbering.o import.o adapt_adj.o bulk_adapt_ops.o bulk_adapt.o mesh_feature_detect.o MsaHashtable.o
 
 COMPAT=compat_init.o compat_finit.o compat_driver.o compat_fdriver.o 
 LIB=libmoduleParFUM
@@ -66,6 +66,9 @@ headers: $(HEADDEP)
 #      $(CHARMC) -c $<
 
 
+MsaHashtable.o: MsaHashtable.C ParFUM.h ParFUM_internals.h MsaHashtable.h
+       $(CHARMC) -c MsaHashtable.C $(INCS)
+
 mesh_modify.o: mesh_modify.C $(HEADDEP)
        $(CHARMC) -c mesh_modify.C $(INCS)
 
@@ -93,7 +96,7 @@ compat.o: compat.C $(HEADDEP)
 call_init.o: call_init.c $(HEADDEP)
        $(CHARMC) -c call_init.c $(INCS)
 
-parallel_part.o: parallel_part.C $(HEADDEP)
+parallel_part.o: parallel_part.C $(HEADDEP) MsaHashtable.h
        $(CHARMC) -c parallel_part.C $(INCS)
 
 mesh_adjacency.o: mesh_adjacency.C $(HEADDEP)
@@ -156,7 +159,7 @@ bulk_adapt_ops.o: bulk_adapt_ops.C $(HEADDEP)
 bulk_adapt.o: bulk_adapt.C $(HEADDEP)
        $(CHARMC) -c bulk_adapt.C $(INCS)
 
-docs: ParFUM.doxy ParFUM_Adapt_Algs.h ParFUM_Adapt.h ParFUMf.h ParFUM.h ParFUM_internals.h ParFUM_Interpolate.h ParFUM_locking.h ParFUM_Mesh_Modify.h adapt_algs.C adapt.C adapt_if.C adapt_lock.C collide.C compat.C interpolate.C lock.C lock_node.C main.C map.C mesh_adjacency.C mesh.C mesh_modify.C parallel_part.C ParFUM.C partition.C symmetries.C util.C call_init.c compat_driver.c compat_fdriver.c compat_finit.c compat_init.c ParFUM_SA.C global_numbering.C import.C import.h
+docs: ParFUM.doxy ParFUM_Adapt_Algs.h ParFUM_Adapt.h ParFUMf.h ParFUM.h ParFUM_internals.h ParFUM_Interpolate.h ParFUM_locking.h ParFUM_Mesh_Modify.h adapt_algs.C adapt.C adapt_if.C adapt_lock.C collide.C compat.C interpolate.C lock.C lock_node.C main.C map.C mesh_adjacency.C mesh.C mesh_modify.C MsaHashtable.C parallel_part.C ParFUM.C partition.C symmetries.C util.C call_init.c compat_driver.c compat_fdriver.c compat_finit.c compat_init.c ParFUM_SA.C global_numbering.C import.C import.h
        doxygen ParFUM.doxy
 
 # clean up
index 0c65e2e20c93fddff68e006a205b51c30bba3bf7..c85b9dd0ea8f36882ca823f6497e0f1ca669f984 100644 (file)
@@ -2456,9 +2456,6 @@ typedef MSA1D<NodeList, DefaultListEntry<NodeList,true>,MSA_DEFAULT_ENTRIES_PER_
 
 typedef MSA1D<MeshElem,DefaultEntry<MeshElem,true>,1> MSA1DFEMMESH;
 
-typedef UniqElemList<Hashnode> Hashtuple;
-typedef MSA1D<Hashtuple,DefaultListEntry<Hashtuple,true>,MSA_DEFAULT_ENTRIES_PER_PAGE> MSA1DHASH;
-
 
 
 struct conndata{
@@ -2520,127 +2517,11 @@ struct ghostdata{
 };
 
 
-class MsaHashtable : private MSA1DHASH
-{
-public:
-       class Read; class Add;
-       Read& syncToRead(Add&);
-       Add&  syncToAdd(Read&);
-       Add& getInitialAdd();
-       using MSA1DHASH::pup;
-       using MSA1DHASH::enroll;
-
-       class Read : private MSA1DHASH::Read
-       {
-       public:
-               using MSA1DHASH::Read::get;
-               friend Read &MsaHashtable::syncToRead(Add&);
-               friend Add& MsaHashtable::syncToAdd(Read&);
-               void print();
-
-       private:
-       Read(MsaHashtable &m) : MSA1DHASH::Read(m) { }
-       };
-
-       class Add : private MSA1DHASH::Accum
-       {
-               using MSA1DHASH::Accum::accumulate;
-               friend Add& MsaHashtable::syncToAdd(Read&);
-               friend Read &MsaHashtable::syncToRead(Add&);
-               friend Add& MsaHashtable::getInitialAdd();
-       Add(MsaHashtable &m) : MSA1DHASH::Accum(m) { }
-       public:
-               int addTuple(int *tuple, int nodesPerTuple, int chunk, int elementNo);
-
-       };
-
-
-MsaHashtable(int _numSlots,int numWorkers)
-       : MSA1DHASH(_numSlots, numWorkers) { }
-       MsaHashtable(){};
-};
-
-MsaHashtable::Add& MsaHashtable::getInitialAdd()
-{
-       if(initHandleGiven)
-               throw MSA_InvalidHandle();
-       
-       Add *a = new Add(*this);
-       sync();
-       initHandleGiven = true;
-       return *a;
-}
-
-MsaHashtable::Add& MsaHashtable::syncToAdd(Read &r)
-{
-       r.checkInvalidate(this);
-       delete &r;
-       sync();
-       Add *a = new Add(*this);
-       return *a;
-}
-
-MsaHashtable::Read& MsaHashtable::syncToRead(Add &a)
-{
-       a.checkInvalidate(this);
-       delete &a;
-       sync();
-       Read *r = new Read(*this);
-       return *r;
-}
-
-void MsaHashtable::Read::print()
-{
-       unsigned nEntries = MSA1DHASH::Read::msa.length();
-       char str[100];
-       for(int i=0;i<nEntries;i++){
-               const Hashtuple &t = get(i);
-               for(int j=0;j<t.vec->size();j++){
-                       Hashnode &tuple = (*t.vec)[j];
-                       printf("ghost element chunk %d element %d index %d tuple < %s>\n", 
-                              tuple.chunk, tuple.elementNo, i, 
-                              tuple.nodes.toString(tuple.numnodes,str));
-               }
-       }
-}
-
-int MsaHashtable::Add::addTuple(int *tuple,int nodesPerTuple,int chunk,int elementNo)
-{
-       int slots = msa.length();
-
-       // sort the tuples to get a canonical form
-       // bubble sort should do just as well since the number
-       // of nodes is less than 10.
-       for(int i=0;i<nodesPerTuple-1;i++){
-               for(int j=i+1;j<nodesPerTuple;j++){
-                       if(tuple[j] < tuple[i]){
-                               int t = tuple[j];
-                               tuple[j] = tuple[i];
-                               tuple[i] = t;
-                       }
-               }
-       }
-
-       //find out the index
-       long long sum = 0;
-       for(int i=0;i<nodesPerTuple;i++){
-               sum = sum*slots + tuple[i];
-       }
-       int index = (int )(sum %(long )slots);
-       Hashnode entry(nodesPerTuple,chunk,elementNo,tuple);
-
-       Hashtuple &list=accumulate(index);
-       list.vec->push_back(entry);
-       char str[100];
-       DEBUG(printf("[%d] adding tuple %s element %d to index %d \n",chunk,entry.nodes.toString(nodesPerTuple,str),elementNo,index));
-       return index;
-}
-
 
 
 int FEM_master_parallel_part(int ,int ,FEM_Comm_t);
 int FEM_slave_parallel_part(int ,int ,FEM_Comm_t);
-struct partconndata* FEM_call_parmetis(struct conndata &data,FEM_Comm_t comm_context);
+struct partconndata* FEM_call_parmetis(int nelem, MSA1DINT::Read &rPtr, MSA1DINT::Read &rInd, FEM_Comm_t comm_context);
 void FEM_write_nodepart(MSA1DINTLIST::Accum &nodepart, struct partconndata *data, MPI_Comm comm_context);
 void FEM_write_part2node(MSA1DINTLIST::Read &nodepart, MSA1DNODELIST::Accum &part2node, struct partconndata *data, MPI_Comm comm_context);
 void FEM_write_part2elem(MSA1DINTLIST::Accum &part2elem, struct partconndata *data, MPI_Comm comm_context);
index 43615eadd4589c3de2ac66d2582dfb2cbea93366..21c7bb875def6ef9dcfd023cd0c7539e87560288 100644 (file)
@@ -14,6 +14,7 @@
 
 #include "ParFUM.h"
 #include "ParFUM_internals.h"
+#include "MsaHashtable.h"
 
 #include "../parmetis/parmetis.h"
 
@@ -111,9 +112,11 @@ int FEM_master_parallel_part(int fem_mesh,int masterRank,FEM_Comm_t comm_context
   /*
     call parmetis
   */
-       double  parStartTime = CkWallTimer();
-       printf("starting FEM_call_parmetis \n");
-  struct partconndata *partdata = FEM_call_parmetis(data,comm_context);
+  double  parStartTime = CkWallTimer();
+  MSA1DINT::Read &rPtr = eptrMSA.syncToRead(wPtr);
+  MSA1DINT::Read &rInd = eindMSA.syncToRead(wInd);
+  printf("starting FEM_call_parmetis \n");
+  struct partconndata *partdata = FEM_call_parmetis(data.nelem, rPtr, rInd, comm_context);
 
   printf("done with parmetis %d FEM_Mesh %d in %.6lf \n",CmiMemoryUsage(),sizeof(FEM_Mesh),CkWallTimer()-parStartTime);
        
@@ -175,9 +178,11 @@ int FEM_master_parallel_part(int fem_mesh,int masterRank,FEM_Comm_t comm_context
        
   DEBUG(printf("[%d] Memory usage on vp 0 close to max %d \n",CkMyPe(),CmiMemoryUsage()));
        //Free up the eptr and eind MSA arrays stored in data
-       data.arr1.FreeMem();
-       data.arr2.FreeMem();
-       nodepart.FreeMem();
+  delete &rPtr;
+  delete &rInd;
+  data.arr1.FreeMem();
+  data.arr2.FreeMem();
+  nodepart.FreeMem();
   DEBUG(printf("[%d] Memory usage on vp 0 after FreeMem %d \n",CkMyPe(),CmiMemoryUsage()));
        
   addIDXLists(me.m,lnodes,masterRank);
@@ -246,14 +251,15 @@ int FEM_slave_parallel_part(int fem_mesh,int masterRank,FEM_Comm_t comm_context)
     These will be used later to give each partitioned mesh
     its elements and data.
   */
-       
   FEM_Mesh mypiece;
   MPI_Recv_pup(mypiece,masterRank,MESH_CHUNK_TAG,(MPI_Comm)comm_context);
        
   /*
     call parmetis and get the resuts back from it
   */
-  struct partconndata *partdata = FEM_call_parmetis(data,comm_context);
+  MSA1DINT::Read &rPtr = data.arr1.syncToRead(data.arr1.getInitialWrite());
+  MSA1DINT::Read &rInd = data.arr2.syncToRead(data.arr1.getInitialWrite());
+  struct partconndata *partdata = FEM_call_parmetis(data.nelem, rPtr, rInd, comm_context);
        
   /*
     write to the msa that contains the partitions to which a node belongs
@@ -303,6 +309,8 @@ int FEM_slave_parallel_part(int fem_mesh,int masterRank,FEM_Comm_t comm_context)
   //printf("[%d] Number of elements in my partitioned mesh %d number of nodes %d \n",myRank,me.m->nElems(),me.m->node.size());
        
        //Free up the eptr and eind MSA arrays stored in data
+  delete &rPtr;
+  delete &rInd;
        data.arr1.FreeMem();
        data.arr2.FreeMem();
        nodepart.FreeMem();
@@ -342,12 +350,12 @@ int FEM_slave_parallel_part(int fem_mesh,int masterRank,FEM_Comm_t comm_context)
   parmetis. It returns the partition and the connectivity of
   the elements for which this processor is responsible.
 */
-struct partconndata * FEM_call_parmetis(struct conndata &data,FEM_Comm_t comm_context){
+struct partconndata * FEM_call_parmetis(int nelem, MSA1DINT::Read &rPtr, MSA1DINT::Read &rInd, FEM_Comm_t comm_context)
+{
   int myRank,numChunks;
   MPI_Comm_size((MPI_Comm)comm_context,&numChunks);
   MPI_Comm_rank((MPI_Comm)comm_context,&myRank);
        
-  int nelem = data.nelem;
   /*
     Setup the elmdist array. All processors
     get equal number of elements. This is not
@@ -363,26 +371,24 @@ struct partconndata * FEM_call_parmetis(struct conndata &data,FEM_Comm_t comm_co
   }
   DEBUG(printf("\n"));
   int startindex = elmdist[myRank];
-  int endindex = elmdist[myRank+1];    
-  data.arr1.sync();
-  data.arr2.sync();
+  int endindex = elmdist[myRank+1];
   int numindices = endindex - startindex;
   int *eptr = new int[numindices+1];
   /*
     Read the msa arrays to extract the data
     Store it in the eptr and eind arrays
   */
-  int startConn = data.arr1.get(startindex);
-  int endConn = data.arr1.get(endindex);
+  int startConn = rPtr.get(startindex);
+  int endConn = rPtr.get(endindex);
   int numConn = endConn - startConn;
   int *eind = new int[numConn];
   DEBUG(printf("%d startindex %d endindex %d startConn %d endConn %d \n",myRank,startindex,endindex,startConn,endConn));
   for(int i=startindex;i<endindex;i++){
-    int conn1 = data.arr1.get(i);
-    int conn2 = data.arr1.get(i+1);
+    int conn1 = rPtr.get(i);
+    int conn2 = rPtr.get(i+1);
     eptr[i-startindex] = conn1 - startConn;
     for(int j=conn1;j<conn2;j++){
-      eind[j-startConn] = data.arr2.get(j);
+      eind[j-startConn] = rInd.get(j);
     }
   }
   eptr[numindices] = endConn - startConn;
@@ -399,8 +405,6 @@ struct partconndata * FEM_call_parmetis(struct conndata &data,FEM_Comm_t comm_co
     }
     printf("\n");
   */
-  data.arr1.sync();
-  data.arr2.sync();
   int wgtflag=0,numflag=0,ncon=1,ncommonnodes=2,options[5],edgecut=0;
   double ubvec = 1.05;
   double *tpwgts = new double[numChunks];
@@ -586,21 +590,9 @@ void FEM_write_part2mesh(MSA1DFEMMESH::Accum &part2mesh,
   }
 }
 
-/*
-  horrible bubble sort, replace by quicksort : done
-*/
 void sortNodeList(NodeList &lnodes){
   CkVec<NodeElem> *vec = lnodes.vec;
-/*  for(int i=0;i<vec->size();i++){
-    for(int j=i+1;j<vec->size();j++){
-      if((*vec)[i].global > (*vec)[j].global){
-       NodeElem t = (*vec)[i];
-       (*vec)[i] = (*vec)[j];
-       (*vec)[j] = t;
-      }
-    }
-  }*/
-       vec->quickSort();
+  vec->quickSort();
 }