Adding leanmd simplified as an example
[charm.git] / examples / charm++ / piArray / pgm.C
1 #include "pgm.h"
2
3 CkChareID mainhandle;
4
5 #define USE_REDUCTION 0
6
7 void reductionHandler(void *param, int dataSize, void *data)
8 {
9   CProxy_main m(mainhandle);
10   int d = *(int*)data;
11   m.results(d);
12 }
13
14 main::main(CkArgMsg * m)
15
16   if(m->argc != 3)
17   {
18     CkPrintf("Usage: pgm <nsamples> <nchares>\n");
19     CkAbort("");
20   }
21
22   ns = atoi(m->argv[1]);
23   nc = atoi(m->argv[2]);
24   delete m;
25
26   starttime = CkWallTimer();
27
28   //FIXME
29   //CkGroupID gid = CkCreatePropMap();
30   //CProxy_piPart  arr = CProxy_piPart::ckNew(nc, gid);
31   CProxy_piPart  arr = CProxy_piPart::ckNew(nc);
32
33   CkPrintf("At time %lf, array created.\n", (CkWallTimer()-starttime));
34
35 #if USE_REDUCTION
36   arr.setReductionClient(reductionHandler,(void *)NULL);
37 #endif
38   arr.compute(ns);
39   responders = nc;
40   count = 0;
41   mainhandle = thishandle; // readonly initialization
42   CkPrintf("At time %lf, main exits.\n", (CkWallTimer()-starttime));
43 }
44
45 void main::results(int cnt) 
46
47   count += cnt;
48 #if ! USE_REDUCTION
49   if (0 == --responders) 
50 #endif
51   {
52     endtime = CkWallTimer();
53     CkPrintf("At time %lf, pi=: %f \n", (endtime-starttime), 4.0*count/(ns*nc));
54     CkExit();
55   }
56 }
57
58 piPart::piPart()
59
60   CrnSrand((int)(long) this);
61 }
62
63 void
64 piPart::compute(int ns)
65 {
66   int i;
67   int count=0;
68   for (i= 0; i<ns; i++) {
69     double x = CrnDrand();
70     double y = CrnDrand();
71     if ((x*x + y*y) <= 1.0) count++;
72   }
73 #if ! USE_REDUCTION
74   CProxy_main mainproxy(mainhandle);
75   mainproxy.results(count);
76 #else
77   contribute(sizeof(int), (void *)&count, CkReduction::sum_int);
78 #endif
79 }
80
81 #include "pgm.def.h"