fix bug and clean up jacobi examples
[charm.git] / examples / charm++ / jacobi2d-1d-decomposition / jacobi1d.ci
1 mainmodule jacobi1d {
2   readonly CProxy_Main mainProxy;
3   readonly int arrayDimX;
4   readonly int arrayDimY;
5   readonly int blockDimX;
6   readonly int numChares;
7   readonly int maxiterations;
8
9   mainchare Main {
10     entry Main(CkArgMsg *m);
11     entry void done(int totalIter);
12   };
13
14   array [1D] Jacobi {
15     entry Jacobi(void);
16     entry void receiveGhosts(int iter, int dir, int size, double gh[size]);
17     entry [reductiontarget] void recvConvergeResult(int result);
18
19     entry void run() {
20       while (!converged && iterations<maxiterations) {
21         serial "send_to_neighbors" {
22           iterations++;
23           if(!topBound)
24             thisProxy((thisIndex-1+numChares)%numChares).receiveGhosts(iterations, BOTTOM, arrayDimY, &temperature[1][0]);
25           if(!bottomBound)
26             thisProxy((thisIndex+1)%numChares).receiveGhosts(iterations, TOP, arrayDimY, &temperature[blockDimX][0]);
27         }
28         for(imsg = 0; imsg < neighbors; imsg++)
29           when receiveGhosts[iterations] (int iter, int dir, int size, double gh[size])
30             serial "update_boundary" {
31               int row = (dir == TOP) ? 0 : blockDimX+1;
32               for(int j=0; j<size; j++)
33                 temperature[row][j] = gh[j];
34             }
35         serial "compute" { check_and_compute(); }
36         serial "compute_converge" {
37           int conv = (max_error <= THRESHOLD);
38           CkCallback cb(CkReductionTarget(Jacobi, recvConvergeResult), thisProxy);
39           contribute(sizeof(int), &conv, CkReduction::logical_and, cb);
40         }
41         when recvConvergeResult(int result) serial "check_converge"{
42           converged = result;
43         if ((result || iterations>=maxiterations) && thisIndex == 0) mainProxy.done(iterations);
44       }
45       }
46     };
47   };
48 };