fix bug and clean up jacobi examples
[charm.git] / examples / charm++ / jacobi2d-2d-decomposition / jacobi2d.ci
1 mainmodule jacobi2d {
2
3   readonly CProxy_Main mainProxy;
4   readonly int arrayDimX;
5   readonly int arrayDimY;
6   readonly int blockDimX;
7   readonly int blockDimY;
8   readonly int num_chare_x;
9   readonly int num_chare_y;
10   readonly int maxiterations;
11
12   mainchare Main {
13     entry Main(CkArgMsg *m);
14     entry void done(int totalIter);
15   };
16
17   array [2D] Jacobi {
18     entry Jacobi(void);
19     entry void begin_iteration(void);
20     entry void receiveGhosts(int iter, int dir, int size, double ghosts[size]);
21     entry [reductiontarget] void recvConvergeResult(int result);
22
23     entry void run() {
24       while (!converged && iterations < maxiterations) {
25         serial "begin_iteration" {
26           begin_iteration();
27         }
28         for(imsg = 0; imsg < neighbors; imsg++) {
29           // "iterations" keeps track of messages across steps
30           when receiveGhosts[iterations] (int iter, int dir, int size, double ghosts[size])
31             serial "process ghosts" {
32               processGhosts(dir, size, ghosts);
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 };