twoAwayXY support
authorAbhinav Bhatele <bhatele@illinois.edu>
Fri, 8 Aug 2008 22:24:37 +0000 (22:24 +0000)
committerAbhinav Bhatele <bhatele@illinois.edu>
Fri, 8 Aug 2008 22:24:37 +0000 (22:24 +0000)
examples/charm++/Molecular2D/Compute.C
examples/charm++/Molecular2D/Patch.C
examples/charm++/Molecular2D/Patch.ci
examples/charm++/Molecular2D/common.h

index 4eb990247881ebae4580e92f5d1ea85dc27b281e..ee5ae79d14cece4dada502494d5150a6caeb5b28 100644 (file)
@@ -28,6 +28,7 @@ extern /* readonly */ int patchArrayDimY;     // Number of Chare Columns
 extern /* readonly */ int patchSize;
 extern /* readonly */ double radius;
 extern /* readonly */ int finalStepCount; 
+extern /* readonly */ double stepTime; 
 
 extern double A;                       // Force Calculation parameter 1
 extern double B;                       // Force Calculation parameter 2
index c2df81e32d0c3d086fed7a532f552589fdbf0268..90d9e5c77b11baa6e2482c7485ec7f14629a5988 100644 (file)
@@ -30,6 +30,7 @@
 /* readonly */ int patchSize; 
 /* readonly */ double radius;
 /* readonly */ int finalStepCount; 
+/* readonly */ double stepTime; 
 
 double A = 2.0;                        // Force Calculation parameter 1
 double B = 1.0;                        // Force Calculation parameter 2
@@ -37,6 +38,7 @@ double B = 1.0;                       // Force Calculation parameter 2
 // Entry point of Charm++ application
 Main::Main(CkArgMsg* msg) {
 
+  stepTime = CmiWallTimer();
   CkPrintf("\nLENNARD JONES MOLECULAR DYNAMICS RUNNING ...\n");
 
   numParts = DEFAULT_PARTICLES;
@@ -228,13 +230,13 @@ void Patch::updateForces(CkVec<Particle> &updates) {
     for(i=0; i<particles.length(); i++) {
       migrateToPatch(particles[i], x1, y1);
       if(x1 !=0 || y1!=0) {
-       outgoing[(x1+1)*3+(y1+1)].push_back(wrapAround(particles[i]));
+       outgoing[(x1+1)*NBRS_Y + (y1+1)].push_back(wrapAround(particles[i]));
        particles.remove(i);
       }
     }
    
     for(i=0; i<NUM_NEIGHBORS; i++)
-      patchArray(WRAP_X(x + i/3 - 2), WRAP_Y(y + i%3 -2)).updateParticles(outgoing[i]);
+      patchArray(WRAP_X(x + i/NBRS_Y - NBRS_X/2), WRAP_Y(y + i%NBRS_Y - NBRS_Y/2)).updateParticles(outgoing[i]);
 
     updateFlag = true;
              
@@ -245,6 +247,8 @@ void Patch::updateForces(CkVec<Particle> &updates) {
 }
 
 void Patch::migrateToPatch(Particle p, int &px, int &py) {
+  // currently this is assuming that particles are
+  // migrating only to the immediate neighbors
   int x = thisIndex.x * patchSize;
   int y = thisIndex.y * patchSize;
 
@@ -260,23 +264,27 @@ void Patch::migrateToPatch(Particle p, int &px, int &py) {
 // Function that checks whether it must start the following step or wait until other messages are received
 void Patch::checkNextStep(){
   int i;
-  if(updateFlag && incomingFlag) {
-    if(thisIndex.x==0 && thisIndex.y==0 && stepCount%10==0)
-      CkPrintf("Step %d %f\n", stepCount, CmiWallTimer());
+  double timer;
 
+  if (updateFlag && incomingFlag) {
     // resetting flags
     updateFlag = false;
     incomingFlag = false;
     stepCount++;
 
     // adding new elements
-    for(i = 0; i < incomingParticles.length(); i++){
+    for (i = 0; i < incomingParticles.length(); i++)
       particles.push_back(incomingParticles[i]);
-    }
     incomingParticles.removeAll();
 
+    if (thisIndex.x==0 && thisIndex.y==0 && stepCount%10==0) {
+      timer = CmiWallTimer();
+      CkPrintf("Step %d Benchmark Time %f ms/step\n", stepCount, ((timer - stepTime)/10)*1000);
+      stepTime = timer;
+    }
+
     // checking for next step
-    if(stepCount >= finalStepCount) {
+    if (stepCount >= finalStepCount) {
       print();
       contribute(0, 0, CkReduction::concat, CkCallback(CkIndex_Main::allDone(), mainProxy)); 
     } else {
index 05dbca3b80d1bce16c4ef07490a20b4a76c151aa..d9c834ed6a36f83404212ce6cf5b3e92db34238f 100644 (file)
@@ -10,6 +10,7 @@ mainmodule Patch {
   readonly int patchSize;      // size of each Patch
   readonly double radius;      // maximum distance between two interacting particles
   readonly int finalStepCount; // number of steps at which the cells should stop computation
+  readonly double stepTime;
 
   mainchare Main {
     entry Main(CkArgMsg* msg);
index d170eb340fe0f5c9f07bfb814d110b3d3d02b190..dd46d3cb87a012ac455126a1d779460d365675f9 100644 (file)
 #define PATCH_SIZE             1
 
 #define DEFAULT_RADIUS         5
-#define DEFAULT_FINALSTEPCOUNT 21
+#define DEFAULT_FINALSTEPCOUNT 51
 #define MAX_VELOCITY           30.0
-#define NUM_NEIGHBORS          9
+
+#define KAWAY_X                        1
+#define KAWAY_Y                        1
+#define NBRS_X                 (2*KAWAY_X+1)
+#define NBRS_Y                 (2*KAWAY_Y+1)
+#define NUM_NEIGHBORS          (NBRS_X * NBRS_Y)
 
 #define WRAP_X(a)              (((a)+patchArrayDimX)%patchArrayDimX)
 #define WRAP_Y(a)              (((a)+patchArrayDimY)%patchArrayDimY)