fix bug and clean up jacobi examples
[charm.git] / examples / charm++ / jacobi3d-2d-decomposition / 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 numChareX;
10   readonly int numChareY;
11   readonly int numChareZ;
12   readonly int maxiterations;
13
14   mainchare Main {
15     entry Main(CkArgMsg *m);
16     entry [reductiontarget] void done(int);
17   };
18
19   array [3D] Jacobi {
20     entry Jacobi(void);
21     entry void receiveGhosts(int ref, int dir, int w, int h, double gh[w*h]);
22     entry [reductiontarget] void recvConvergeResult(int result);
23
24     entry void run() {
25       while (!converged && iterations<maxiterations) {
26         serial "begin_iteration" {
27           begin_iteration();
28         }
29         for (remoteCount = 0; remoteCount < neighbors; remoteCount++) {
30           when receiveGhosts[iterations](int ref, int dir, int w, int h, double buf[w*h]) serial {
31             processGhosts(dir, w, h, buf);
32           }
33         }
34
35         serial "compute" { 
36           check_and_compute();
37         }
38         serial "compute_converge" {
39           int conv = (max_error <= THRESHOLD);
40           CkCallback cb(CkReductionTarget(Jacobi, recvConvergeResult), thisProxy);
41           contribute(sizeof(int), &conv, CkReduction::logical_and, cb);
42         }
43         when recvConvergeResult(int result) serial "check_converge"{
44           converged = result;
45         if ((result || iterations>=maxiterations) && thisIndex.x +thisIndex.y == 0) mainProxy.done(iterations);
46       }
47       }
48     };
49   };
50 };