Merge branch 'charm' of charmgit:charm into charm
[charm.git] / examples / amr / jacobi2Dthesis / jacobi2DAMR.h
1
2 #include "amr.h"
3 //#include "GreedyLB.h"
4 #define LB_FREQUENCY 15
5
6 class Jacobi2DAMR:public AmrUserData {
7  private:
8   int cellSize;
9   double **dataGrid;
10   double **newDataGrid;
11   /*Utility Functions*/
12   void copyGrid(void);
13   void copyColumn(double *buf , int colNum) {
14     for(int i=1; i<=cellSize;i++)
15       buf[i-1] = dataGrid[i][colNum];   
16   }
17   
18   void copyRow(double *buf , int rowNum) {
19     for(int i=1; i<=cellSize;i++)
20       buf[i-1] = dataGrid[rowNum][i];   
21   }
22
23   void copyToColumn(double *buf , int colNum) {
24     for(int i=1; i<=cellSize;i++)
25       dataGrid[i][colNum]=  buf[i-1];   
26   }
27   
28   void copyToRow(double *buf , int rowNum) {
29     for(int i=1; i<=cellSize;i++)
30       dataGrid[rowNum][i]= buf[i-1];   
31   }
32   double sumofGrid(void) {
33     double sum = 0.0;
34     for(int i=1;i<cellSize+1;i++)
35       for(int j=1;j<cellSize+1;j++)
36         sum += dataGrid[i][j];
37     return sum;
38   }
39
40  public:
41   /*Default Constructor: Called in the initial setup of the tree*/
42   Jacobi2DAMR() {
43     cellSize = 32;
44     dataGrid = new double* [cellSize+2];
45     newDataGrid = new double* [cellSize+2];
46     for(int i=0;i< cellSize+2;i++) {
47       dataGrid[i] = new double [cellSize+2];
48       newDataGrid[i] = new double [cellSize +2];
49       for(int k = 0;  k < cellSize+2; k++) {
50         newDataGrid[i][k]=10.0;
51         dataGrid[i][k] = (i+k) *1.0;
52       }
53     }
54   }
55
56   Jacobi2DAMR(int size) {
57     cellSize = size;
58     dataGrid = new double* [cellSize+2];
59     newDataGrid = new double* [cellSize+2];
60     for(int i=0;i< cellSize+2;i++) {
61       dataGrid[i] = new double [cellSize+2];
62       newDataGrid[i] = new double [cellSize +2];
63       for(int k = 0; k < cellSize+2; k++) {
64         newDataGrid[i][k]= 10.0;
65         dataGrid[i][k] = (i+k) *1.0;
66
67
68
69       }
70     }
71   }
72
73   /*This constructor is called after refinement with data from te parent*/
74   Jacobi2DAMR(void *data,int dataSize)
75   {
76     double *indata = (double*) data;
77     cellSize = (int) sqrt((double) (dataSize/sizeof(double)));
78     //    cellSize = cellSize/sizeof(double);
79     dataGrid = new double* [cellSize+2];
80     newDataGrid = new double* [cellSize+2];
81     for(int i=0;i< cellSize+2;i++) {
82       dataGrid[i] = new double [cellSize+2];
83       newDataGrid[i] = new double [cellSize +2];
84       for(int k = 0;  k < cellSize+2; k++) {
85         newDataGrid[i][k]= 10.0;
86         if(i== 0 || i == cellSize+1 || k==0 || k== cellSize + 1)
87           dataGrid[i][k] = (i+k) *1.0;
88         else
89           dataGrid[i][k] = indata[(i-1) * cellSize + (k-1)];
90       }
91     }
92   
93   }
94
95   Jacobi2DAMR(CkMigrateMessage *m): AmrUserData(m){}
96
97   PUPable_decl(Jacobi2DAMR);
98   /*Mandatory Library Interface functions*/
99   virtual void doComputation(void);
100   virtual void **fragmentNborData(void* data, int* sizePtr);
101   virtual void **getNborMsgArray(int *sizeptr);
102   virtual void store(void* data, int dataSize, int neighborSide);
103   virtual void combineAndStore(void **dataArray, int dataSize,int neighborSide);
104   virtual bool refineCriterion(void);
105   virtual void **fragmentForRefine(int *sizePtr);
106
107   /*If load balancing is required*/
108   virtual void pup(PUP::er &p);
109   /*Destructor*/
110   ~Jacobi2DAMR() {
111     for (int i=0; i< cellSize+2;i++)
112       delete [] newDataGrid[i];
113     delete [] newDataGrid;
114     for (int i=0; i< cellSize+2;i++)
115       delete [] dataGrid[i];
116     delete[] dataGrid;
117   }
118 };
119
120 /*Main Chare*/
121 class main : public Chare {
122  public:
123   /*Constructor: Library is created from here*/
124   main(CkArgMsg* args) {
125
126     StartUpMsg *msg;
127     msg = new StartUpMsg;
128     msg->synchInterval = 200;
129     msg->depth = 2;
130     msg->dimension = 2;
131     msg-> totalIterations = 500;
132     //    CreateGreedyLB();
133     CProxy_AmrCoordinator::ckNew(msg,0);
134
135   }
136 };