Adding example program for interoperability
[charm.git] / examples / charm++ / mpi-coexist / libs / hi / hi.C
1 #include <stdio.h>
2 #include "hi.decl.h"
3 //header from Charm to enable Interoperation
4 #include "mpi-interoperate.h"
5
6 CProxy_MainHi mainHi;
7 /*mainchare*/
8 class MainHi : public CBase_MainHi
9 {
10 public:
11   MainHi(CkArgMsg *m) {
12     mainHi = thisProxy;
13     delete m;
14   }
15
16   void StartHi(int elems)
17   {
18     //Process command-line arguments
19     int nElements=elems;
20     //Start the computation
21
22     CkPrintf("Running Hi on %d processors for %d elements\n",
23              CkNumPes(),nElements);
24     CProxy_Hi arr = CProxy_Hi::ckNew(mainHi, nElements, nElements);
25
26     arr[0].SayHi(1);
27   };
28
29   MainHi(CkMigrateMessage *m) {}
30
31   void done(void)
32   {
33     CkExit();
34   };
35 };
36
37 /*array [1D]*/
38 class Hi : public CBase_Hi 
39 {
40 private:
41   CProxy_MainHi mainProxy;
42   int nElements;
43 public:
44   Hi(CProxy_MainHi mp, int nElems)
45   {
46     mainProxy = mp;
47     nElements = nElems;
48   }
49
50   Hi(CkMigrateMessage *m) {}
51   
52   void SayHi(int hiNo)
53   {
54     CkPrintf("Hi[%d] from element %d\n",hiNo,thisIndex);
55     if (thisIndex < nElements-1)
56       //Pass the hello on:
57       thisProxy[thisIndex+1].SayHi(hiNo+1);
58     else 
59       //We've been around once-- we're done.
60       mainProxy.done();
61   }
62 };
63
64 //C++ function invoked from MPI, marks the begining of Charm++
65 void HiStart(int elems)
66 {
67   if(CkMyPe() == 0) {
68     mainHi.StartHi(elems);
69   }
70   CsdScheduler(-1);
71 }
72
73 #include "hi.def.h"