Updating the latest main.C and main.ci files - One Step computation working
authorKumaresh P <kpattab2@uiuc.edu>
Mon, 21 Apr 2008 04:58:06 +0000 (04:58 +0000)
committerKumaresh P <kpattab2@uiuc.edu>
Mon, 21 Apr 2008 04:58:06 +0000 (04:58 +0000)
examples/charm++/Molecular/main.C
examples/charm++/Molecular/main.ci

index 4ef2b5c59aebdc28c42f1a7e056d808f523b86d6..80ecb8e8440fe5e6d1c81a2732d0b8f5e924e083 100644 (file)
@@ -1 +1,296 @@
-#include "
+#include "main.decl.h"
+
+#define DEBUG 1
+
+#define DEFAULT_PARTICLES 1000
+#define DEFAULT_N 3
+#define DEFAULT_M 3
+#define DEFAULT_RADIUS 10
+#define DEFAULT_FINALSTEPCOUNT 1
+
+/* readonly */ CProxy_Main mainProxy;
+/* readonly */ CProxy_Cell cellArray; /* CHECKME */
+/* readonly */ CProxy_Interaction interactionArray; /* CHECKME */
+
+/* readonly */ int particles;
+/* readonly */ int m;
+/* readonly */ int n;
+/* readonly */ double radius;
+/* readonly */ int finalStepCount; 
+
+/* FIXME */
+/*
+struct Particle {
+  double x,y,z; // coordinates
+};*/
+
+class Cell : public CBase_Cell {
+  private:
+    //VECTOR OF PARTICLES /* FIXME */
+    int forceCount; // to count the returns from interactions
+    int stepCount;  // to count the number of steps, and decide when to stop
+
+  public:
+    Cell();
+    Cell(CkMigrateMessage *msg);
+    ~Cell();
+
+    void start();
+    void force();
+    void stepDone();
+};
+
+class Interaction : public CBase_Interaction {
+  private:
+    // VARIABLES FOR FOCES COMPUTATION /* FIXME */
+    int cellCount;  // to count the number of interact() calls
+    
+    /* FIXME */
+    int bufferedX;
+    int bufferedY;
+
+  public:
+    Interaction();
+    Interaction(CkMigrateMessage *msg);
+
+    void interact(/*CkVec<CkArrayIndex1D> particles,*/ int i, int j);
+
+};
+    
+
+class Main : public CBase_Main {
+
+  private:
+    int checkinCount;
+    
+    int doneCount; // Count to terminate
+
+    #ifdef DEBUG
+      int interactionCount;
+    #endif
+
+  public:
+
+    /// Constructors ///
+    Main(CkArgMsg* msg);
+    Main(CkMigrateMessage* msg);
+
+    void done();
+};
+
+// Entry point of Charm++ application
+Main::Main(CkArgMsg* msg) {
+  
+  particles = DEFAULT_PARTICLES;
+  m = DEFAULT_M;
+  n = DEFAULT_N;
+  radius = DEFAULT_RADIUS;
+  finalStepCount = DEFAULT_FINALSTEPCOUNT;
+
+  delete msg;
+  doneCount = 0;
+
+  #ifdef DEBUG
+    interactionCount=0;
+  #endif
+
+  mainProxy = thisProxy;
+
+  cellArray = CProxy_Cell::ckNew(m,n);
+
+  interactionArray = CProxy_Interaction::ckNew();
+
+  int i, j, k, l;
+  for (int x = 0; x < m ; x++ ) {
+    for (int y = 0; y < n; y++ ) {
+
+      //Processor Round Robin needed
+      #ifdef DEBUG
+        CkPrintf("INITIAL:( %d, %d) ( %d , %d )\n", x,y,x,y);
+        interactionCount++;
+      #endif
+
+      // self interaction
+      interactionArray( x, y, x, y ).insert( /* processor number */0 );
+
+      // (x,y) and (x+1,y) pair
+      (x == m-1) ? (i=(x+1)%m, k=x) : (i=x, k=x+1);
+      #ifdef DEBUG
+        CkPrintf("INITIAL:( %d, %d) ( %d , %d )\n", i,y,k,y);
+        interactionCount++;
+      #endif
+      interactionArray( i, y, k, y ).insert( /* processor number */0 );
+
+      // (x,y) and (x,y+1) pair
+      (y == n-1) ? (j=(y+1)%n, l=y) : (j=y, l=y+1);
+      #ifdef DEBUG
+        CkPrintf("INITIAL:( %d, %d) ( %d , %d )\n", x,j,x,l);
+        interactionCount++;
+      #endif
+      interactionArray( x, j, x, l ).insert( /* processor number */0 );
+
+      // (x,y) and (x+1,y+1) pair, Irrespective of y /* UNDERSTAND */
+      (x == m-1) ? ( i=(x+1)%m, k=x, j=(y+1)%n, l=y ) : (i=x, k=x+1, j=y, l=(y+1)%n );
+      #ifdef DEBUG
+        CkPrintf("INITIAL:( %d, %d) ( %d , %d )\n", i,j,k,l);
+        interactionCount++;
+      #endif
+      interactionArray( i, j, k, l ).insert( /* processor number */0 );
+
+      // (x,y) and (x-1,y+1) pair /* UNDERSTAND */
+      (x == 0) ? ( i=x, k=(x-1+m)%m, j=y, l=(y+1)%n ) : (i=x-1, k=x, j=(y+1)%n, l=y );
+      #ifdef DEBUG
+        CkPrintf("INITIAL:( %d, %d) ( %d , %d )\n", i,j,k,l);
+        interactionCount++;
+      #endif
+      interactionArray( i, j, k, l ).insert( /* processor number */0 );
+
+    }
+  }
+
+  interactionArray.doneInserting();
+  #ifdef DEBUG
+    CkPrintf("Interaction Count: %d\n", interactionCount);
+  #endif
+
+  cellArray.start();
+}
+
+// Constructor needed for chare object migration (ignore for now)
+// NOTE: This constructor does not need to appear in the ".ci" file
+Main::Main(CkMigrateMessage* msg) { }
+
+void Main::done() {
+  doneCount ++;
+  if( doneCount >= m*n) {
+    CkExit();
+  }
+}
+
+
+Cell::Cell() {
+  forceCount = 0;
+  stepCount = 0;
+}
+
+// Constructor needed for chare object migration (ignore for now)
+// NOTE: This constructor does not need to appear in the ".ci" file
+Cell::Cell(CkMigrateMessage *msg) { }                                         
+Cell::~Cell() {
+  /* FIXME */
+  // Deallocate Atom lists
+}
+
+
+void Cell::start() {
+
+  int x = thisIndex.x;
+  int y = thisIndex.y;
+
+  int i, j, k, l;
+
+  #ifdef DEBUG
+    CkPrintf("START:( %d, %d) ( %d , %d )\n", x,y,x,y);
+  #endif
+  
+  // self interaction
+  interactionArray( x, y, x, y).interact( x, y);
+
+  // interaction with (x-1, y-1)
+  (x == 0) ? ( i=x, k=(x-1+m)%m, j=y, l=(y-1+n)%n ) : (i=x-1, k=x, j=(y-1+n)%n, l=y);
+  interactionArray( i, j, k, l ).interact( x, y);
+
+  // interaction with (x-1, y)
+  (x == 0) ? (i=x, k=(x-1+m)%m) : (i=x-1, k=x);
+  interactionArray( i, y, k, y).interact( x, y);
+
+  // interaction with (x-1, y+1)
+  (x == 0) ? ( i=x, k=(x-1+m)%m, j=y, l=(y+1)%n ) : (i=x-1, k=x, j=(y+1)%n, l=y);
+  interactionArray( i, j, k, l ).interact( x, y);
+
+
+  // interaction with (x, y-1)
+  (y == 0) ? (j=y, l=(y-1+n)%n) : (j=(y-1+n)%n, l=y);
+  interactionArray( x, j, x, l ).interact( x, y);
+
+  // interaction with (x, y+1)
+  (y == n-1) ? (j=(y+1)%n, l=y) : (j=y, l=y+1);
+  interactionArray( x, j, x, l ).interact( x, y);
+
+
+  // interaction with (x+1, y-1)
+  (x == m-1) ? ( i=(x+1)%m, k=x, j=(y-1+n)%n, l=y ) : (i=x, k=x+1, j=y, l=(y-1+n)%n );
+  interactionArray( i, j, k, l ).interact( x, y);
+
+  // interaction with (x+1, y)
+  (x == m-1) ? (i=(x+1)%m, k=x) : (i=x, k=x+1);
+  interactionArray( i, y, k, y).interact( x, y);
+
+  // interaction with (x+1, y+1)
+  (x == m-1) ? ( i=(x+1)%m, k=x, j=(y+1)%n, l=y ) : (i=x, k=x+1, j=y, l=(y+1)%n );
+  interactionArray( i, j, k, l ).interact( x, y);
+
+}
+
+void Cell::force() {
+  forceCount++;
+  if( forceCount >= 9) {
+    // Received all it's forces from the interactions.
+    stepCount++;
+    
+    /* FIX ME*/
+    // Methods to migrate atoms.
+
+    #ifdef DEBUG
+    if( forceCount > 9 )
+      CkPrintf("ERROR\n");
+    #endif
+
+    if(stepCount >= finalStepCount) {
+      #ifdef DEBUG
+        CkPrintf("STEP: %d DONE:( %d , %d )\n", stepCount, thisIndex.x, thisIndex.y);
+      #endif
+      mainProxy.done();
+    } else {
+      thisProxy( thisIndex.x, thisIndex.y ).start();
+    }
+  }
+    
+}
+
+Interaction::Interaction() {
+  cellCount = 0;
+
+  /* FIXME */
+    bufferedX = 0;
+    bufferedY = 0;
+}
+
+Interaction::Interaction(CkMigrateMessage *msg) { }
+  
+
+void Interaction::interact( int x, int y ) {
+
+  if(cellCount == 0) {
+    bufferedX = x;
+    bufferedY = y;
+
+    // self interaction check
+    if( thisIndex.x == thisIndex.z && thisIndex.y == thisIndex.w ) {
+      CkPrintf("SELF: ( %d , %d )\n", thisIndex.x, thisIndex.y );
+      cellArray( x, y).force();
+    }
+  }
+
+  cellCount++;
+
+  if( cellCount >= 2) {
+    CkPrintf("PAIR:( %d , %d )  ( %d , %d ) \n", bufferedX, bufferedY, x, y );
+    cellArray( bufferedX, bufferedY).force();
+    cellArray( x, y).force();
+  }
+
+}
+
+#include "main.def.h"
index 656e698707fd391d77a306e1529703c20cfd04bc..543e6007c1f8da86c8e13cc3f034b81e1200eba6 100644 (file)
@@ -1,33 +1,14 @@
-module cell {
-
-  array [2D] Cell {
-    entry Cell();
-    entry start();
-    entry forces(CkVec<CkArrayIndex1D> particles);
-  };
-
-};
-
-module interaction {
-
-  array [4D] Interaction {
-    entry Interaction(int i, int j, int k, int l);
-    entry interact(CkVec<CkArrayIndex1D> particles, int i, int j);
-  };
-
-};
-
-
 mainmodule main {
 
-       readonly CProxy_Main mainProxy;
+       readonly CProxy_Main mainProxy;  
+  readonly CProxy_Cell cellArray;
+  readonly CProxy_Interaction interactionArray;
+
        readonly int particles;                                 // total number of particles
-       readonly int n;                                         // total number of rows in the grid
-       readonly int m;                                         // total number of columns in the grid
+       readonly int m;                                         // total number of rows in the grid
+       readonly int n;                                         // total number of columns in the grid
        readonly double radius;                                 // maximum distance between two interacting particles
-
-       module cell;
-       module interaction;
+  readonly int finalStepCount; // number of steps at which the cells should stop computation
 
        mainchare Main {
                entry Main(CkArgMsg* msg);
@@ -35,4 +16,16 @@ mainmodule main {
                entry void done();
        };
 
+  array [2D] Cell {
+    entry Cell();
+    entry void start();
+    entry void force( /*CkVec<CkArrayIndex1D> particles*/ );
+  };
+
+  array [4D] Interaction {
+    entry Interaction();
+    //entry Interaction(int i, int j, int k, int l);
+    entry void interact( /*CkVec<CkArrayIndex1D> particles,*/ int i, int j);
+  };
+
 };