charm examples: clean up and add features to jacobi3d (from pmodels book)
[charm.git] / examples / charm++ / jacobi3d-sdag / jacobi3d.ci
1 mainmodule jacobi3d {
2   readonly CProxy_Main mainProxy;
3   readonly int arrayDimX;
4   readonly int arrayDimY;
5   readonly int arrayDimZ;
6   readonly int blockDimX;
7   readonly int blockDimY;
8   readonly int blockDimZ;
9   readonly int num_chare_x;
10   readonly int num_chare_y;
11   readonly int num_chare_z;
12
13   mainchare Main {
14     entry Main(CkArgMsg *m);
15     entry void done(int iterations);
16   };
17
18   array [3D] Jacobi {
19     entry Jacobi(void);
20     entry void updateGhosts(int ref, int dir, int w, int h, double gh[w*h]);
21     entry [reductiontarget] void checkConverged(bool result);
22     entry void checkpointFinished();
23     entry void run() {
24       while (!converged) {
25         atomic { begin_iteration(); }
26         for (remoteCount = 0; remoteCount < 6; remoteCount++) {
27           when updateGhosts[iterations](int ref, int dir, int w, int h, double buf[w*h]) atomic {
28             updateBoundary(dir, w, h, buf);
29           }
30         }
31         atomic {
32           double error = computeKernel();
33           int conv = error < DELTA;
34           if (iterations % 5 == 1) {
35             contribute(sizeof(int), &conv, CkReduction::logical_and, CkCallback(CkReductionTarget(Jacobi, checkConverged), thisProxy));
36           }
37         }
38         if (++iterations % 5 == 0)
39           when checkConverged(bool result)
40             if (result) atomic { mainProxy.done(iterations); converged = true; }
41         if (iterations % LBPERIOD == 0) atomic { AtSync(); }
42         if (iterations % CHECKPOINTPERIOD == 0) {
43           atomic {
44             CkCallback cb(CkIndex_Jacobi::checkpointFinished(), thisProxy);
45             CkStartMemCheckpoint(cb);
46           }
47           when checkpointFinished() { }
48         }
49       }
50     };
51   };
52 };