32215f6ec583328adf2b1ac8ab9fab7058581277
[charm.git] / tests / charm++ / megatest / migration.C
1 #include "migration.h"
2
3 void migration_init(void)
4 {
5   const int numElements = 10;
6   if(CkNumPes() < 2) {
7     CkError("migration: requires at least 2 processors.\n");
8     megatest_finish();
9   } else
10     CProxy_mig_Element::ckNew(numElements);
11 }
12
13 void migration_moduleinit(void){}
14
15 mig_Element::mig_Element()
16 {
17   origPE = -1;
18   sum = 0;
19   index = thisIndex;
20   numDone = 0;
21   CProxy_mig_Element self(thisArrayID);
22   self[thisIndex].arrive();
23 }
24
25 void mig_Element::pup(PUP::er &p)
26 {
27   p(origPE);
28   p(sum);
29   p(numDone);
30   p(index);
31 }
32
33 void 
34 mig_Element::arrive(void)
35 {
36   if (thisIndex != index) 
37     CkAbort("migration: chare-data corrupted!\n");
38   CProxy_mig_Element self(thisArrayID);
39   if(CkMyPe() == origPE) {
40     if(sum != ((CkNumPes()+1)*CkNumPes())/2)
41       CkAbort("migrate: Element did not migrate to all the processors!\n");
42     self[0].done();
43   } else {
44     if(origPE==(-1)) origPE = CkMyPe();
45     sum += CkMyPe() + 1;
46     self[thisIndex].arrive();
47     int nextPE = (CkMyPe()+1)%CkNumPes();
48     migrateMe(nextPE);
49   }  
50 }
51
52 void
53 mig_Element::done(void)
54 {
55   numDone++;
56   if(numDone==ckGetArraySize())
57     megatest_finish();
58 }
59
60 MEGATEST_REGISTER_TEST(migration,"jackie",1)
61 #include "migration.def.h"