Removing memory leak in kNeighbor benchmark
[charm.git] / examples / charm++ / integrate2 / pgm.C
1 #include "pgm.h"
2
3 CProxy_main mainProxy;
4
5 /* 
6   This is the 1D function we want to integrate.
7   Because this class is sent over the network as
8   a pointer to its abstract superclass, we need the 
9   "PUPable" declarations.
10 */
11 class myFunction : public function1d {
12         double height;
13 public:
14         myFunction(double height_=1.0) :height(height_) {}
15
16         virtual double evaluate(double x) {
17                 return height/(1+x);
18         }
19         
20         //PUP::able support:
21         PUPable_decl(myFunction);
22         myFunction(CkMigrateMessage *m=0) {}    
23         virtual void pup(PUP::er &p) {
24                 p|height;
25         }
26 };
27
28 main::main(CkArgMsg * m)
29
30   if(m->argc < 3) CmiAbort("./pgm slices numChares.");
31   int slices = atoi(m->argv[1]); 
32   int numChares = atoi(m->argv[2]);
33   mainProxy = thishandle; // readonly initialization
34
35   int slicesPerChare=slices/numChares;
36   slices=slicesPerChare*numChares; //Make slices an even multiple of numChares
37
38   myFunction *f=new myFunction(2.0);
39   double xLeft=0.0; //Left end of integration domain
40   double xRight=1.0; //Right end of integration domain
41   double dx=(xRight-xLeft)/slices;
42   for (int i=0; i<numChares; i++) {
43     int nSlices=slicesPerChare; // must be a divisor
44     double x=xLeft+i*slicesPerChare*dx; //Chare i takes slices starting at [i*slicesPerChare]
45     CProxy_integrate::ckNew(x,dx,nSlices,*f); 
46   }
47   count = numChares;
48   integral = 0.0;
49 }
50
51 void main::results(double partialIntegral) 
52
53   integral += partialIntegral;
54   if (0 == --count) {
55     CkPrintf("With all results, integral is: %.15f \n", integral);
56     CkExit();
57   }
58 }
59
60 integrate::integrate(double xStart,double dx, int nSlices,function1d &f)
61
62   double partialIntegral = 0.0;
63   for (int i=0; i<nSlices; i++) {
64     double x = xStart+(i+0.5)*dx;
65     partialIntegral += f.evaluate(x)*dx;
66   }
67
68   mainProxy.results(partialIntegral);
69
70   delete this; /*this chare has no more work to do.*/
71 }
72
73 #include "pgm.def.h"