libs/ck-libs/idxl/idxl_comm.h

Go to the documentation of this file.
00001 
00007 #ifndef __CHARM_IDXL_COMM_H
00008 #define __CHARM_IDXL_COMM_H
00009 
00010 #include "pup.h"
00011 #include "cklists.h"
00012 #include "ckhashtable.h"
00013 #include "charm.h"
00014 
00015 
00023 class IDXL_Share {
00024  public:
00025   int chk; //Chunk we're shared with
00026   int idx; //Our index in the local comm. list for that chunk
00027   IDXL_Share(int x=0) {chk=idx=-1;}
00028   IDXL_Share(int c,int i) :chk(c), idx(i) {}
00029   void pup(PUP::er &p) {p(chk); p(idx);}
00030 };
00031 PUPmarshall(IDXL_Share);
00032 
00036 class IDXL_Rec {
00037         int entity; //Index of entity (node or element) we describe
00038         CkVec<IDXL_Share> shares;
00039         int oldlength;
00040 public:
00041         IDXL_Rec(int entity_=-1);
00042         ~IDXL_Rec();
00043 
00044         void pup(PUP::er &p);
00045         
00046         inline int getEntity(void) const {return entity;}
00047         inline int getShared(void) const {return shares.size();}
00048         inline int getChk(int shareNo) const {return shares[shareNo].chk;}
00049         inline int getIdx(int shareNo) const {return shares[shareNo].idx;}
00050         bool hasChk(int chk) const {
00051                 for (int i=0;i<getShared();i++)
00052                         if (getChk(i)==chk) return true;
00053                 return false;
00054         }
00055         void add(int chk,int idx);
00056 };
00057 
00063 class IDXL_Map {
00064         CkHashtableT<CkHashtableAdaptorT<int>,IDXL_Rec *> map;
00065 public:
00066         IDXL_Map();
00067         ~IDXL_Map();
00068 
00069         //Add a IDXL_Rec entry for this entity
00070         void add(int entity,int chk,int idx);
00071         
00072         //Look up this entity's IDXL_Rec.  Returns NULL if entity is not shared.
00073         const IDXL_Rec *get(int entity) const;
00074 };
00075 
00082 class IDXL_List {
00083         int chunk; //Global number of other chunk       
00084         CkVec<int> shared; //Local indices of shared entities
00085         bool lock;
00086 public:
00087         IDXL_List();
00088         IDXL_List(int otherchunk);
00089         ~IDXL_List();
00090         int getDest(void) const {return chunk;}
00091         int size(void) const {return shared.size();}
00092         int &operator[](int idx) {return shared[idx]; }
00093         int operator[](int idx) const {return shared[idx]; }
00094         const int *getVec(void) const {return &shared[0];}
00095         bool lockIdxl();
00096         void unlockIdxl();
00097         bool isLocked();
00099         int push_back(int localIdx);
00100         bool set(int localIdx, int sharedIdx);
00101         bool unset(int sharedIdx);
00102         int exists(int localIdx);
00103         int get(int sharedIdx);
00104         void pup(PUP::er &p);
00105         void sort2d(double *coord);
00106         void sort3d(double *coord);
00107 };
00108 PUPmarshall(IDXL_List)
00109 
00110 
00111 
00112 
00113 class IDXL_Print_Map {
00114 public:
00115         virtual void map(int srcIdx) const =0;
00116 };
00117 
00124 class IDXL_Side : public CkNoncopyable {
00126         CkPupPtrVec<IDXL_List, CkPupAlwaysAllocatePtr<IDXL_List> > comm; 
00127 
00131         IDXL_Map *cached_map;
00132         IDXL_Map &getMap(void);
00133         
00134         //Return the Comm_List associated with this chunk, or NULL
00135         IDXL_List *getListN(int chunk) { 
00136                 for (int i=0;i<comm.size();i++)
00137                         if (comm[i]->getDest()==chunk)
00138                                 return comm[i];
00139                 return NULL; 
00140         }
00141 public:
00142         IDXL_Side(void);
00143         void pup(PUP::er &p);
00144         ~IDXL_Side();
00146         int total() const;
00147         
00149         int size(void) const {return comm.size();}
00151         const IDXL_List &getLocalList(int idx) const { return *comm[idx]; }
00152         IDXL_List &setLocalList(int idx) { return *comm[idx]; }
00153         
00155         int findLocalList(int chunk) const {
00156                 for (int i=0;i<comm.size();i++) 
00157                         if (comm[i]->getDest()==chunk)
00158                                 return i;
00159                 return -1;
00160         }
00161         
00163         const IDXL_List &getList(int chunk) const { 
00164                 const IDXL_List *ret=((IDXL_Side *)this)->getListN(chunk);
00165                 if (ret==NULL) CkAbort("FEM> Communication lists corrupted (unexpected message)");
00166                 return *ret; 
00167         }
00169         IDXL_List &addList(int chunk) {
00170                 IDXL_List *ret=getListN(chunk);
00171                 if (ret==NULL) { //Have to add a new list:
00172                         ret=new IDXL_List(chunk);
00173                         comm.push_back(ret);
00174                 }
00175                 return *ret;
00176         }
00177 
00178         IDXL_List *getIdxlListN(int chunk) {
00179           return getListN(chunk);
00180         }
00181         
00183         const IDXL_Rec *getRec(int entity) const;
00184         
00185 
00187         void flushMap(void);
00188         
00194         void add(int myChunk,int myLocalNo,
00195                  int hisChunk,int hisLocalNo,IDXL_Side &hisList);
00196         
00197         
00202         void clear();
00203         
00204         /***
00205          * added by Nilesh, needs comments.
00206          * */
00207         bool lockIdxl(int sharedWithChk);
00208         void unlockIdxl(int sharedWithChk);
00209         bool isLocked(int sharedWithChk);
00210         int addNode(int localNo, int sharedWithChk);
00211         int removeNode(int localNo, int sharedWithChk);
00212         bool setNode(int localNo, int sharedWithChk, int sharedIdx);
00213         bool unsetNode(int sharedWithChk, int sharedIdx);
00214         int existsNode(int localNo, int sharedWithChk);
00215         int getNode(int sharedWithChk, int sharedIdx);
00216 
00217         void print(const IDXL_Print_Map *idxmap=NULL) const;
00218 
00219         void sort2d(double *coord);
00220 
00221         void sort3d(double *coord);
00222 };
00223 
00227 class IDXL : public CkNoncopyable {
00228         IDXL_Side *send,*recv;
00229         IDXL_Side *alloc_send, *alloc_recv;
00230 public:
00232         IDXL(IDXL_Side *sendrecv) {
00233                 send=sendrecv; recv=sendrecv;
00234                 alloc_send=alloc_recv=NULL;
00235         }
00236         
00238         IDXL(IDXL_Side *send_, IDXL_Side *recv_) {
00239                 send=send_; recv=recv_;
00240                 alloc_send=alloc_recv=NULL;
00241         }
00242         
00244         IDXL(void) {
00245                 send=alloc_send=NULL;
00246                 recv=alloc_recv=NULL;
00247         }
00248         
00250         void allocateSingle(void) {
00251                 send=alloc_send=new IDXL_Side;
00252                 recv=send; alloc_recv=NULL;
00253         }
00255         void allocateDual(void) {
00256                 send=alloc_send=new IDXL_Side;
00257                 recv=alloc_recv=new IDXL_Side;
00258         }
00259         
00260         void pup(PUP::er &p) {
00261                 int isSendRecv= (send==recv);
00262                 p|isSendRecv;
00263                 if (!send) send=alloc_send=new IDXL_Side;
00264                 send->pup(p);
00265                 if (isSendRecv) {
00266                         recv=send;
00267                 }
00268                 else {
00269                         if (!recv) recv=alloc_recv=new IDXL_Side;
00270                         recv->pup(p);
00271                 }
00272         }
00273         ~IDXL(void) {
00274                 delete alloc_send; delete alloc_recv;
00275         }
00276         
00278         bool isSingle(void) const {return send==recv;}
00279         
00280         IDXL_Side &getSend(void) {return *send;}
00281         const IDXL_Side &getSend(void) const {return *send;}
00282         IDXL_Side &getRecv(void) {return *recv;}
00283         const IDXL_Side &getRecv(void) const {return *recv;}
00284 
00285         void sort2d(double *coord);
00286 
00287         void sort3d(double *coord);
00288 };
00289 
00290 #endif

Generated on Sun Jun 29 13:29:21 2008 for Charm++ by  doxygen 1.5.1