Cleanup #1980: Remove the old pencilfft library and a related example 02/4602/9
authorNitin Bhat <nbhat4@illinois.edu>
Fri, 21 Sep 2018 19:22:07 +0000 (19:22 +0000)
committerNitin Bhat <nbhat4@illinois.edu>
Mon, 17 Dec 2018 17:15:28 +0000 (11:15 -0600)
Pencilfft library used the CmiDirect Manytomany API. A newer charm fft
library can be used instead of the pencilfft library.

Change-Id: I767eb70673f7d201e4c88d7ebd8ad7e7f4efabba

examples/charm++/pencilFFT/Makefile [deleted file]
examples/charm++/pencilFFT/README [deleted file]
examples/charm++/pencilFFT/testpencil.C [deleted file]
examples/charm++/pencilFFT/testpencil.ci [deleted file]
src/libs/ck-libs/pencilfft/Makefile [deleted file]
src/libs/ck-libs/pencilfft/libmodulepencilfft.dep [deleted file]
src/libs/ck-libs/pencilfft/pencil_api.h [deleted file]
src/libs/ck-libs/pencilfft/pencilfft.C [deleted file]
src/libs/ck-libs/pencilfft/pencilfft.ci [deleted file]
src/libs/ck-libs/pencilfft/pencilfft.h [deleted file]

diff --git a/examples/charm++/pencilFFT/Makefile b/examples/charm++/pencilFFT/Makefile
deleted file mode 100644 (file)
index 4ab1aa4..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
--include ../../common.mk
-#Set FFTW_HOME home to the fftw-2.1.5 local installation
-
-#FFTW_HOME=/bgl/local/fftw-2.1.5/
-FFTW_HOME=/usr
-OPTS=-g -O3 
-
-CHARMC=../../../bin/charmc $(OPTS)
-INCLUDES=-I$(FFTW_HOME)/include -I$(CHARMBASE)/include/fftlib \
-        -DFFTW_ENABLE_FLOAT=1 -DUSE_FFTW_DECLS=1
-
-LIBS=-module PencilFFT -L$(FFTW_HOME)/lib -language charm++ -lsfftw -lsrfftw
-
-OBJS = testpencil.o 
-
-all:   cifiles testpencil
-
-testpencil: $(OBJS)
-       $(CHARMC) -language charm++ -o testpencil $(OBJS) ${LIBS}
-
-cifiles: testpencil.ci
-       $(CHARMC)  testpencil.ci
-
-clean:
-       rm -f *~ *.decl.h *.def.h conv-host *.o testpencil charmrun
-
-testpencil.o: testpencil.C
-       $(CHARMC) -c testpencil.C ${INCLUDES}
-
-test: all
-       @echo "Intra-processor Testpencil.."
-       $(call run, ./testpencil +p1)
-       @echo "Inter-processor Testpencil.."
-       $(call run, ./testpencil +p2)
-
-bgtest: all
-       @echo "Intra-processor Testpencil.."
-       $(call run, ./testpencil +p1 +x1 +y1 +z1)
-       @echo "Inter-processor Testpencil.."
-       $(call run, ./testpencil +p2 +x2 +y1 +z1)
-
diff --git a/examples/charm++/pencilFFT/README b/examples/charm++/pencilFFT/README
deleted file mode 100644 (file)
index 05e56af..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-Example to show the use of pencilFFT library.
-
-Steps:
-1. Build the pencilFFT library located at libs/ck-libs/pencilfft
-   Detailed instructions can be found here: http://charm.cs.illinois.edu/manuals/html/libraries/4.html
-2. Modify Makefile to set FFT library path.
-3. Compile and run.
diff --git a/examples/charm++/pencilFFT/testpencil.C b/examples/charm++/pencilFFT/testpencil.C
deleted file mode 100644 (file)
index 7379b84..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-
-#include "charm++.h"
-#include "pencilfft/pencil_api.h"
-#include "testpencil.decl.h"
-
-#define NUM_FFT_ITER   200
-#define START_TIMING   1
-#define MAX_ITERATIONS 5
-
-LineFFTInfo   info;
-int           iteration;
-double        startTime;
-
-void red_handler (void *param, int size, void *data) {
-
-  iteration ++;
-  //printf ("Iteration Complete\n", iteration);
-  
-  if (iteration == START_TIMING)
-    startTime = CkWallTimer ();
-  
-  if (iteration == MAX_ITERATIONS) {
-
-    double endTime = CkWallTimer();
-
-    CkAssert (MAX_ITERATIONS > START_TIMING);
-    CkPrintf ("Time to perform a pair of (%d, %d, %d) 3D FFT operations %g ms\n", 
-             info.sizeX, info.sizeY, info.sizeZ,
-             (endTime - startTime) * 1000.0/ 
-             (NUM_FFT_ITER * (MAX_ITERATIONS - START_TIMING)));
-    CkExit ();
-  }
-  
-  startLineFFTArray (&info);
-}
-
-class main : public CBase_main {
-public:
-  main (CkArgMsg *m);
-  main (CkMigrateMessage *m) {}
-};
-
-main::main (CkArgMsg *m) {
-  int sizeX=0, sizeY=0, sizeZ=0;
-  int grainX=0, grainY=0, grainZ=0;
-
-  if (m->argc <= 1) {
-    sizeX = sizeY = sizeZ = 16;
-    grainX = grainY = grainZ = 4;
-  }
-  else if (m->argc == 7) {
-    sizeX = atoi (m->argv[1]);
-    sizeY = atoi (m->argv[2]);
-    sizeZ = atoi (m->argv[3]);
-
-    grainX = atoi (m->argv[4]);
-    grainY = atoi (m->argv[5]);
-    grainZ = atoi (m->argv[6]);
-
-    CkAssert ((sizeX % grainX) == 0);
-    CkAssert ((sizeY % grainY) == 0);
-    CkAssert ((sizeZ % grainZ) == 0);
-  }
-  else {
-    sizeX = sizeY = sizeZ = atoi (m->argv[1]);
-    grainX = grainY = grainZ = atoi (m->argv[2]);    
-    CkAssert ((sizeX % grainX) == 0);
-  }
-
-  CkPrintf ("Calling Configure\n");
-  configureLineFFTInfo (&info, sizeX, sizeY, sizeZ, 
-                       grainX, grainY, grainZ,
-                       NULL, 
-                       ARRAY_REDUCTION, 
-                       true,
-                       NUM_FFT_ITER);
-
-  CkPrintf ("Calling Create\n");
-  createLineFFTArray (&info);
-
-  info.xProxy.setReductionClient (red_handler, NULL);
-
-  CkPrintf ("Calling Start\n");
-  startLineFFTArray (&info);
-
-  delete m;
-};
-
-
-#include "testpencil.def.h"
diff --git a/examples/charm++/pencilFFT/testpencil.ci b/examples/charm++/pencilFFT/testpencil.ci
deleted file mode 100644 (file)
index dcdaac9..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-
-mainmodule testpencil {
-    readonly LineFFTInfo    info;
-    
-    mainchare  main {
-       entry main (CkArgMsg *);
-    };
-};
diff --git a/src/libs/ck-libs/pencilfft/Makefile b/src/libs/ck-libs/pencilfft/Makefile
deleted file mode 100644 (file)
index 4878aeb..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-include ../common.mk
-
-FFTW_HOME=$(HOME)/fftw-bgq
-
-FFTW_LIBDIR=$(FFTW_HOME)/lib
-
-OPTS=-g -O3
-
-INCLUDE=-I$(FFTW_HOME)/include -DFFTW_ENABLE_FLOAT=1 -DUSE_FFTW_DECLS=1
-COMPILER=$(CHARMC) $(INCLUDE)
-
-LIB=libmodulePencilFFT.a
-LIBDEST=$(CDIR)/lib/$(LIB)
-LIBOBJ=pencilfft.o
-INCDIR=$(CDIR)/include/pencilfft
-HEADERS= $(INCDIR)/pencilfft.h\
-        $(INCDIR)/PencilFFT.decl.h\
-        $(INCDIR)/PencilFFT.def.h \
-        $(INCDIR)/pencil_api.h
-
-
-all: $(LIBDEST) $(HEADERS)
-
-
-$(LIBDEST): $(LIBOBJ)
-       $(CHARMC) -o $(LIBDEST) $(LIBOBJ)
-       /bin/cp libmodulepencilfft.dep $(LIBDIR)
-
-$(HEADERS): pencilfft.h PencilFFT.decl.h
-       test ! -d $(INCDIR) && mkdir $(INCDIR) || true
-       /bin/cp pencilfft.h $(INCDIR)
-       /bin/cp pencil_api.h $(INCDIR)
-       /bin/cp PencilFFT.decl.h $(INCDIR)
-       /bin/cp PencilFFT.def.h $(INCDIR)
-
-pencilfft.o: pencilfft.C PencilFFT.def.h
-       $(COMPILER) pencilfft.C
-
-PencilFFT.def.h: PencilFFT.decl.h
-
-PencilFFT.decl.h: pencilfft.ci
-       $(CHARMC) pencilfft.ci
-
-clean:
-       rm -f core* *~
-       rm -f $(LIB) $(LIBOBJ)
-       rm -f *.decl.h *.def.h 
diff --git a/src/libs/ck-libs/pencilfft/libmodulepencilfft.dep b/src/libs/ck-libs/pencilfft/libmodulepencilfft.dep
deleted file mode 100644 (file)
index 56981a5..0000000
+++ /dev/null
@@ -1 +0,0 @@
--module comlib -lfftw -lrfftw 
diff --git a/src/libs/ck-libs/pencilfft/pencil_api.h b/src/libs/ck-libs/pencilfft/pencil_api.h
deleted file mode 100644 (file)
index 2d334cc..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-
-#ifndef  __PENCIL_API_H__
-#define  __PENCIL_API_H__
-
-#include "pencilfft.h"
-
-inline void configureLineFFTInfo (LineFFTInfo *info,
-                                 int sizeX,  int sizeY,  int sizeZ,
-                                 int grainX, int grainY, int grainZ,
-                                 CkCallback  *kcallback,
-                                 LineFFTCompletion complid,
-                                 bool              normalize,
-                                 int               numiter) 
-{  
-  info->sizeX   =  sizeX;
-  info->sizeY   =  sizeY;
-  info->sizeZ   =  sizeZ;
-  
-  info->grainX  =  grainX;
-  info->grainY  =  grainY;
-  info->grainZ  =  grainZ;
-  
-  if (kcallback) 
-    info->kSpaceCallback = *kcallback;
-  
-  info->completionId = complid;
-  info->normalize    = normalize;
-  info->numIter      = numiter;
-}
-
-
-inline void  createLineFFTArray (LineFFTInfo *info) {
-
-  CkAssert (info->sizeX > 0);
-  CkAssert (info->sizeY > 0);
-  CkAssert (info->sizeZ > 0);
-  
-  CkAssert (info->grainX > 0);
-  CkAssert (info->grainY > 0);
-  CkAssert (info->grainZ > 0);
-  
-  int nx, ny, nz;
-
-  nx = info->sizeX / info->grainX;
-  ny = info->sizeY / info->grainY;
-  nz = info->sizeZ / info->grainZ;
-
-  printf ("Creating Line FFT Array (%dx%dx%d, %dx%dx%d) on %d nodes, %d PEs\n",
-         info->sizeX, 
-         info->sizeY, 
-         info->sizeZ, 
-         info->grainX, 
-         info->grainY, 
-         info->grainZ,
-         CmiNumNodes(),
-         CkNumPes());
-
-  info->mapx =  CProxy_PencilMapX::ckNew(*info);
-  info->mapy =  CProxy_PencilMapY::ckNew(*info);
-  info->mapz =  CProxy_PencilMapZ::ckNew(*info);
-  
-  CkArrayOptions optsx;
-  optsx.setMap (info->mapx);
-  info->xProxy = CProxy_LineFFTArray::ckNew(*info, 
-                                           (int) PHASE_X, optsx);
-
-  CkArrayOptions optsy;
-  optsy.setMap (info->mapy);
-  info->yProxy = CProxy_LineFFTArray::ckNew(*info, 
-                                           (int) PHASE_Y, optsy);
-
-  CkArrayOptions optsz;
-  optsz.setMap (info->mapz);
-  info->zProxy = CProxy_LineFFTArray::ckNew(*info, 
-                                           (int) PHASE_Z, optsz);
-  
-  int x,y,z;
-  for (z = 0; z < (info->sizeZ)/(info->grainZ); z ++) 
-    for (y = 0; y < (info->sizeY)/(info->grainY); y++)
-      info->xProxy(y, z).insert(*info, (int) PHASE_X);
-  
-  info->xProxy.doneInserting();
-  
-  for (x = 0; x < (info->sizeX)/(info->grainX); x ++)
-    for (z = 0; z < (info->sizeZ)/(info->grainZ); z ++) 
-      info->yProxy(z, x).insert(*info, (int) PHASE_Y);
-  
-  info->yProxy.doneInserting();
-  
-  for (y = 0; y < (info->sizeY)/(info->grainY); y ++) 
-    for (x = 0; x < (info->sizeX)/(info->grainX); x ++) 
-      info->zProxy(x, y).insert(*info, (int) PHASE_Z);
-  
-  info->zProxy.doneInserting();
-}
-
-
-inline void startLineFFTArray (LineFFTInfo *info) {
-  info->xProxy.startFFT ();
-}
-
-#endif
diff --git a/src/libs/ck-libs/pencilfft/pencilfft.C b/src/libs/ck-libs/pencilfft/pencilfft.C
deleted file mode 100644 (file)
index 33a7de7..0000000
+++ /dev/null
@@ -1,654 +0,0 @@
-
-#include "pencilfft.h"
-
-#define PRIORITY_SIZE ((int) sizeof(int)*8)
-
-#define CONST_A  1001
-#define CONST_B  17
-
-//#define VERIFY_FFT        1
-
-CmiNodeLock fftw_plan_lock;
-
-///
-/// \brief main constructor
-///
-LineFFTArray::LineFFTArray (LineFFTInfo &info, int phase): _info (info)
-{
-#if __LINEFFT_DEBUG__
-  CkPrintf ("[%d, %d, %d] Pencil FFT array constructor \n", thisIndex.x, thisIndex.y, phase);
-#endif
-
-  _nElements = 0;
-  _fftSize   = 0;
-  _phase     = (LineFFTPhase) phase;
-
-  switch (phase) {
-  case PHASE_X: 
-    _fftSize   = info.sizeX;
-    _nElements = info.sizeX * info.grainY * info.grainZ;
-    _nFFTMessages = info.sizeX / info.grainX;
-    break;
-
-  case PHASE_Y:
-    _fftSize   = info.sizeY; 
-    _nElements = info.sizeY * info.grainZ * info.grainX;
-    _nFFTMessages = info.sizeY / info.grainY;
-    break;
-
-  case PHASE_Z: 
-    _fftSize   = info.sizeZ; 
-    _nElements = info.sizeZ * info.grainX * info.grainY;
-    _nFFTMessages = info.sizeZ / info.grainZ;
-    break;
-  };    
-
-  _line = new complex[_nElements];
-  memset(_line, 0, sizeof(complex) * _nElements);
-  
-  LineFFTAssert ((_nFFTMessages % CONST_B) != 0);
-  
-#ifdef VERIFY_FFT 
-  for (int count = 0; count < _nElements; count++)
-    _line[count] = complex (1.0, 0.0);
-#endif  
-
-  CmiLock (fftw_plan_lock);
-  _fwdplan = fftw_create_plan(_fftSize, FFTW_FORWARD, FFTW_IN_PLACE | 
-                             FFTW_MEASURE | FFTW_USE_WISDOM);
-  _bwdplan = fftw_create_plan(_fftSize, FFTW_BACKWARD, FFTW_IN_PLACE | 
-                             FFTW_MEASURE | FFTW_USE_WISDOM);
-  CmiUnlock (fftw_plan_lock);
-
-  _curFFTMessages  = 0;
-  _curGridMessages = 0;
-  _nGridMessages   = 0;
-  _iter = 0;
-
-#if USE_MANY_TO_MANY
-  initialize_many_to_many();
-#endif
-}
-
-void LineFFTArray::receive_transpose (int           chunk_id, 
-                                     complex     * data,
-                                     int           gx,
-                                     int           gy,
-                                     int           gz) 
-{
-  int start = 0;
-  int localindex = 0;
-  int index = 0;
-  switch (_phase) {
-  case PHASE_X:
-    start = chunk_id * gx;
-    for (int z = 0; z < gz; z++) 
-      for (int y = 0; y < gy; y++) 
-       for (int x = start; x < start + gx; x++) {
-         localindex = _info.sizeX * gy * z + _info.sizeX * y + x;
-#if __LINEFFT_DEBUG__
-         LineFFTAssert (localindex < _nElements);
-#endif
-         _line [localindex] = data[index++];   
-       }    
-    break;
-    
-  case PHASE_Y:  
-    start = chunk_id * gy;
-    for (int z = 0; z < gz; z++) 
-      for (int y = start; y < start+gy; y++) 
-       for (int x = 0; x < gx; x++) {
-         localindex = _info.sizeY * gz * x + _info.sizeY * z + y;
-#if __LINEFFT_DEBUG__
-         LineFFTAssert (localindex < _nElements);
-#endif
-         _line [localindex] = data[index++];   
-       }
-    break;
-    
-  case PHASE_Z:
-    start = chunk_id * gz;
-    for (int z = start; z < start+gz; z++) 
-      for (int y = 0; y < gy; y++) 
-       for (int x = 0; x < gx; x++) {
-         localindex = _info.sizeZ * gx * y + _info.sizeZ * x + z;
-#if __LINEFFT_DEBUG__
-         LineFFTAssert (localindex < _nElements);
-#endif
-         _line [localindex] = data[index++];   
-       }
-    break;
-
-  default:
-    CkAbort ("Phase undefined");
-    break;
-  };    
-}
-
-
-///
-/// \brief Receive an intermediate FFT message
-///
-void LineFFTArray::receiveFFTMessage (LineFFTMsg *msg) {
-
-#if __LINEFFT_DEBUG__
-  CkPrintf ("[%d, %d] Pencil FFT receive fft message \n", 
-           thisIndex.x, thisIndex.y);
-#endif
-  int index = 0, localindex=0;
-  int start = 0;
-
-#if __LINEFFT_DEBUG__
-  LineFFTAssert (msg->phase == _phase);
-#endif
-
-  receive_transpose(msg->chunk_id, msg->data, 
-                   _info.grainX, _info.grainY, _info.grainZ);    
-  _curFFTMessages ++;
-  
-  if (_curFFTMessages == _nFFTMessages) {
-    _curFFTMessages = 0;
-    start_fft (msg->direction);
-  }
-  
-  CkFreeMsg (msg);
-}
-
-void LineFFTArray::send_transpose (int           chunk_id, 
-                                  complex   *   data,
-                                  int           gx,
-                                  int           gy,
-                                  int           gz) 
-{
-  int start = 0;
-  int localindex = 0;
-  int index = 0;
-  switch (_phase) {
-  case PHASE_X:
-    start = chunk_id * gx;
-    for (int z = 0; z < gz; z++) 
-      for (int y = 0; y < gy; y++) 
-       for (int x = start; x < start+gx; x++) {
-         localindex = _info.sizeX * gy * z + _info.sizeX * y + x;
-#if __LINEFFT_DEBUG__
-         LineFFTAssert (localindex < _nElements);
-#endif
-         data[index++] = _line [localindex];
-       }        
-    break;
-    
-  case PHASE_Y:
-    start = chunk_id * gy;
-    for (int z = 0; z < gz; z++) 
-      for (int y = start; y < start+gy; y++) 
-       for (int x = 0; x < gx; x++) {
-         localindex = _info.sizeY * gz * x + _info.sizeY * z + y;
-#if __LINEFFT_DEBUG__
-         LineFFTAssert (localindex < _nElements);
-#endif
-         data[index++] = _line [localindex];
-       }
-    
-    break;
-      
-  case PHASE_Z:
-    start = chunk_id * gz;
-    for (int z = start; z < start+gz; z++) 
-      for (int y = 0; y < gy; y++) 
-       for (int x = 0; x < gx; x++) {
-         localindex = _info.sizeZ * gx * y + _info.sizeZ * x + z;
-#if __LINEFFT_DEBUG__
-         LineFFTAssert (localindex < _nElements);
-#endif
-         data[index++] = _line [localindex];
-       }        
-    break;
-    
-  default:
-    CkAbort ("Phase undefined");
-    break;
-  };
-}
-
-///
-/// \brief Send the fft messages for the next few phases. Entry
-/// constructs a LineFFTMsg by splitting the thick pencil into chunks
-/// and then sends a chunk to a the neighbor intersecting on that
-/// chunk. The message is always formatted in the XYZ order
-/// 
-void LineFFTArray::sendFFTMessages (int dir) {
-  
-  int size = _info.grainX * _info.grainY * _info.grainZ;
-  CProxy_LineFFTArray proxy;
-  int arridx_x = 0, arridx_y =0;
-
-  for (int count = 0; count < _nFFTMessages; count ++) {
-    int index = 0, localindex =0;
-    int chunk_id = (CONST_A*CkMyPe() + CONST_B * count) % _nFFTMessages;
-
-    LineFFTMsg *msg = new (size, sizeof(int) * 8) LineFFTMsg;
-    send_transpose(chunk_id, msg->data,
-                  _info.grainX, _info.grainY, _info.grainZ);    
-
-    if (dir == FFTW_FORWARD) {
-      arridx_x = thisIndex.y;
-      arridx_y = chunk_id;
-      msg->chunk_id  =  thisIndex.x;
-    }
-    else {
-      arridx_x = chunk_id;
-      arridx_y = thisIndex.x;
-      msg->chunk_id  =  thisIndex.y;      
-    }
-
-    switch (_phase) {
-    case PHASE_X:
-      LineFFTAssert (dir == FFTW_FORWARD);
-      proxy = _info.yProxy;
-      msg->phase = PHASE_Y;      
-      break;
-      
-    case PHASE_Y:
-      if (dir == FFTW_FORWARD) {
-       proxy = _info.zProxy;
-       msg->phase = PHASE_Z;
-      }
-      else {     
-       proxy = _info.xProxy;
-       msg->phase = PHASE_X;
-      }
-      break;
-    
-    case PHASE_Z:
-      LineFFTAssert (dir == FFTW_BACKWARD);
-      proxy = _info.yProxy;
-      msg->phase = PHASE_Y;      
-      break;
-      //Default case already verified
-    };
-    
-    msg->direction =  dir;
-    //Send data to the intersecting neighbor
-    proxy(arridx_x, arridx_y).receiveFFTMessage (msg);
-  }  
-}
-
-///
-/// \brief Start the 3D fft operation. This can be called externally
-/// or intiated when all the grid/fft messages have been received.
-///
-void LineFFTArray::startFFT (int dir) {
-  _iter = 0;
-  start_fft(dir);
-}
-
-///
-/// \brief Start the 3D fft operation. This can be called externally
-/// or intiated when all the grid/fft messages have been received.
-///
-void LineFFTArray::start_fft (int dir) {
-
-#if __LINEFFT_DEBUG__
-  CkPrintf ("[%d, %d, %d, %d] Pencil FFT start fft %d,%d\n", 
-           thisIndex.x, thisIndex.y, _phase, dir, _nElements, _fftSize);
-#endif
-
-  fftw_plan plan = NULL;
-  
-  if (dir == FFTW_FORWARD)
-    plan = _fwdplan;
-  else
-    plan = _bwdplan;
-  
-  for (int count = 0; count < _nElements; count += _fftSize)
-    fftw_one (plan, (fftw_complex *) (_line + count), NULL);
-
-  if (dir == FFTW_FORWARD && _phase == PHASE_Z) { 
-    //call_kspace_callback ();    
-    start_fft (FFTW_BACKWARD);
-    return;
-  }
-
-  //Increment iter in backward phase
-  if (dir == FFTW_BACKWARD)
-    _iter ++;    
-  if (dir == FFTW_BACKWARD && _phase == PHASE_X) {
-#ifdef VERIFY_FFT
-    if ( _info.normalize ) {
-      fftw_real scale = 1.0 / (_info.sizeX * _info.sizeY * _info.sizeZ);
-      for (int count = 0; count < _nElements; count ++)
-       _line [count].re *= scale;
-    }
-    for (int count = 0; count < _nElements; count++) {
-      if (!((_line[count].re <= 1.001)
-           && (_line[count].re >= 0.999)))
-       CkPrintf ("[%d, %d] val[%d] = (%5.3f, %5.3f) \n", 
-                 thisIndex.x, thisIndex.y,
-                 count,
-                 _line[count].re, _line[count].im);
-    }
-
-    for (int count = 0; count < _nElements; count++)
-      _line[count] = complex (1.0, 0.0);
-#endif      
-    
-    if (_iter == _info.numIter) {
-      call_donecallback ();      
-      return;
-    }
-    
-    dir = FFTW_FORWARD;
-    start_fft(dir);
-    return; //We starting the next iteration
-  }
-  
-
-#if USE_MANY_TO_MANY  
-  if (_iter > 2) {
-    if (_info.grainX == 1 && _info.grainY == 1 && _info.grainZ ==1)
-      for (int idx = 0; idx < _nFFTMessages; ++idx) 
-       many_to_many_data[idx] = _line[idx];
-    else {
-      int size = _info.grainX * _info.grainY * _info.grainZ;
-      for (int idx = 0; idx < _nFFTMessages; ++idx) 
-       send_transpose(idx, many_to_many_data + idx * size,
-                      _info.grainX, _info.grainY, _info.grainZ);    
-    }
-    
-    int id = 0;
-    if (dir == FFTW_BACKWARD)
-      id = 1;
-    CmiAssert (tag_s[id] != -1);
-    CmiDirect_manytomany_start(handle, tag_s[id]);
-  }
-  else
-#endif
-    sendFFTMessages (dir);
-}
-
-
-///
-/// \brief Receive data points to be fft'ed. This will happen in the
-/// first and last phases
-///
-void LineFFTArray::receiveGridMessage (LineFFTGridMsg   *msg) {  
-  //copy grid data to the pencil lines
-  LineFFTAssert (_phase == PHASE_X);
-
-  int my_start_y = thisIndex.x * _info.grainY;
-  int my_start_z = thisIndex.y * _info.grainZ;
-
-  LineFFTGrid &grid = msg->grid;
-
-  int index = 0;
-  for (int z = grid.z0; z < grid.z0 + grid.zsize; z++){
-    LineFFTAssert ((z >= my_start_z) && (z < my_start_z + _info.grainZ));
-    for (int y = grid.y0; y < grid.y0 + grid.ysize; y++) {
-      LineFFTAssert ((y >= my_start_y) && (y < my_start_y + _info.grainY));      
-      for (int x = grid.x0; x < grid.x0 + grid.xsize; x++) {       
-       int rel_x = x;
-       if (rel_x < 0)
-         rel_x = x + _info.sizeX;      
-       if (rel_x >= _info.sizeX)
-         rel_x -= _info.sizeX;
-       
-       int local_index = (z - my_start_z) * _info.grainY * _info.sizeX +
-         (y - my_start_y) * _info.sizeX + rel_x;
-       
-       LineFFTAssert (msg->data [index] == 2.0);
-
-       LineFFTAssert (local_index < _nElements);
-       _line [local_index].re += msg->data [index++];
-      }
-    }
-  }
-
-  _gridList [_curGridMessages] = msg->grid;
-
-  CkFreeMsg (msg);
-  _curGridMessages ++;
-  
-  if (_curGridMessages == _nGridMessages) {
-    _curGridMessages = 0;
-    start_fft (FFTW_FORWARD);
-  }
-}
-
-
-///
-/// \brief Receive data points to be fft'ed. This will happen in the
-/// first and last phases
-///
-void LineFFTArray::sendGridMessages () {  
-  
-  int my_start_y = thisIndex.x * _info.grainY;
-  int my_start_z = thisIndex.y * _info.grainZ;
-
-  for (int count = 0; count < _nGridMessages; count ++) {
-    LineFFTGrid &grid = _gridList[count];
-
-    LineFFTGridMsg *msg = 
-      new (grid.xsize * grid.ysize * grid.zsize, sizeof(int) * 4) LineFFTGridMsg;
-    
-    int index = 0;
-    for (int z = grid.z0; z < grid.z0 + grid.zsize; z++){
-      LineFFTAssert ((z >= my_start_z) && (z < my_start_z + _info.grainZ));
-      for (int y = grid.y0; y < grid.y0 + grid.ysize; y++) {
-       LineFFTAssert ((y >= my_start_y) && (y < my_start_y + _info.grainY));      
-       for (int x = grid.x0; x < grid.x0 + grid.xsize; x++) {      
-         int rel_x = x;
-         if (rel_x < 0)
-           rel_x = x + _info.sizeX;    
-         if (rel_x >= _info.sizeX)
-           rel_x -= _info.sizeX;
-         
-         int local_index = (z - my_start_z) * _info.grainY * _info.sizeX +
-           (y - my_start_y) * _info.sizeX + rel_x;
-         
-         LineFFTAssert (local_index < _nElements);
-         msg->data [index++] = _line [local_index].re;
-       }
-      }
-    } 
-
-    grid.cb_done.send (msg);
-  }
-}
-
-#if USE_MANY_TO_MANY
-
-void call_ck_cb(void *m) {
-  LineFFTCbWrapper *cw = (LineFFTCbWrapper *) m;
-  //cw->cb.send(cw->msg);
-  cw->me->many_to_many_recvFFT(cw->msg);
-}
-
-void LineFFTArray::initialize_many_to_many () {
-  bool sfwd = false, sbwd=false;
-  bool rfwd = false, rbwd=false;
-  int fchunk_id = thisIndex.x;
-  int bchunk_id = thisIndex.y;
-  
-  CProxy_Group sf_proxy;
-  if (_phase == PHASE_X) {
-    sfwd = true;
-    sf_proxy = _info.mapy;
-  }
-  else if (_phase == PHASE_Y) {
-    sfwd = true;    
-    sf_proxy = _info.mapz;
-  }
-
-  CProxy_Group rf_proxy;
-  if (_phase == PHASE_Y) {
-    rfwd = true;
-    rf_proxy = _info.mapx;
-  }
-  else if (_phase == PHASE_Z) {
-    rfwd = true;
-    rf_proxy = _info.mapy;
-  }
-
-  CProxy_Group sb_proxy;
-  if (_phase == PHASE_Z) {
-    sbwd = true;
-    sb_proxy = _info.mapy;
-  }
-  else if (_phase == PHASE_Y) {
-    sbwd = true;    
-    sb_proxy = _info.mapx;
-  }
-
-  CProxy_Group rb_proxy;
-  if (_phase == PHASE_Y) {
-    rbwd = true;
-    rb_proxy = _info.mapz;
-  }
-  else if (_phase == PHASE_X) {
-    rbwd = true;
-    rb_proxy = _info.mapy;
-  }
-
-  handle = CmiDirect_manytomany_allocate_handle();
-  many_to_many_data = new complex[_nElements];
-  memset(many_to_many_data, 0, _nElements * sizeof(complex));
-
-  tag_s[0] = tag_s[1] = -1;
-
-  if (sfwd) { //we have forward send
-    CmiDirect_manytomany_initialize_sendbase (handle, _phase+1, NULL, NULL, 
-                                             (char *)many_to_many_data, 
-                                             _nFFTMessages, fchunk_id);
-    tag_s[0] = _phase+1;
-  }
-  
-  if (sbwd) {//we have forward send
-    CmiDirect_manytomany_initialize_sendbase (handle, _phase-1+NUM_PHASES, 
-                                             NULL, NULL, 
-                                             (char *)many_to_many_data, 
-                                             _nFFTMessages, bchunk_id);
-    tag_s[1] = _phase - 1 + NUM_PHASES;
-  }
-
-  //printf ("After send base\n");
-    
-  int arridx_x, arridx_y;
-  int bytes = _info.grainX * _info.grainY * _info.grainZ *sizeof(complex);
-  int index = 0;    
-  if (sfwd || sbwd) {
-    for (index = 0; index < _nFFTMessages; index++) {
-      if (sfwd) {
-       arridx_x = thisIndex.y;
-       arridx_y = index;
-       CkArrayMap *amap = (CkArrayMap *) CkLocalBranch(sf_proxy);
-       CkArrayIndex2D idx (arridx_x, arridx_y);    
-       int pe = amap->procNum (0, idx);    
-       LineFFTAssert (pe >= 0);
-       LineFFTAssert (pe < CkNumPes());
-       
-       CmiDirect_manytomany_initialize_send (handle, _phase+1, index, 
-                                             bytes*index, bytes, pe);        
-      }
-      if (sbwd) {
-       arridx_x = index;
-       arridx_y = thisIndex.x;
-       CkArrayMap *amap = (CkArrayMap *) CkLocalBranch(sb_proxy);
-       CkArrayIndex2D idx (arridx_x, arridx_y);    
-       int pe = amap->procNum (0, idx);    
-       LineFFTAssert (pe >= 0);
-       LineFFTAssert (pe < CkNumPes());
-       
-       CmiDirect_manytomany_initialize_send (handle, _phase-1+NUM_PHASES,
-                                             index, bytes*index, bytes, pe); 
-      }
-    }
-  }
-  
-  //printf("After initialize send\n");
-
-  if (rfwd) {
-    CkArrayIndex2D aidx(thisIndex.x, thisIndex.y);
-    cbf_recv.cb = CkCallback(CkIndex_LineFFTArray::many_to_many_recvFFT(NULL), 
-                            aidx, thisProxy.ckGetArrayID());
-    LineFFTCompleteMsg *lmsg = new (PRIORITY_SIZE) LineFFTCompleteMsg;
-    lmsg->dir = FFTW_FORWARD;
-    cbf_recv.msg = lmsg;
-    cbf_recv.me  = this;
-    CmiDirect_manytomany_initialize_recvbase (handle, 
-                                             _phase, 
-                                             call_ck_cb, 
-                                             &cbf_recv, 
-                                             (char *) many_to_many_data, 
-                                             _nFFTMessages,
-                                             -1); //no local messages
-  }
-  
-  if (rbwd) {
-    CkArrayIndex2D aidx(thisIndex.x, thisIndex.y);
-    cbb_recv.cb = CkCallback(CkIndex_LineFFTArray::many_to_many_recvFFT(NULL), 
-                            aidx, thisProxy.ckGetArrayID());
-    
-    LineFFTCompleteMsg *lmsg = new (PRIORITY_SIZE) LineFFTCompleteMsg;
-    lmsg->dir = FFTW_BACKWARD;
-    cbb_recv.msg = lmsg;
-    cbb_recv.me  = this;
-
-    CmiDirect_manytomany_initialize_recvbase (handle, 
-                                             _phase + NUM_PHASES, 
-                                             call_ck_cb, 
-                                             &cbb_recv, 
-                                             (char *) many_to_many_data, 
-                                             _nFFTMessages,
-                                             -1); //no local messages
-  }
-
-  if (rfwd || rbwd) {
-    for (index = 0; index < _nFFTMessages; index++) {
-      if (rfwd) {
-       arridx_x = index; 
-       arridx_y = thisIndex.x; 
-       CkArrayMap *amap = (CkArrayMap *) CkLocalBranch(rf_proxy);
-       CkArrayIndex2D idx (arridx_x, arridx_y);    
-       int pe = amap->procNum (0, idx);    
-       LineFFTAssert (pe >= 0);
-       LineFFTAssert (pe < CkNumPes());         
-       
-       CmiDirect_manytomany_initialize_recv (handle, _phase, index, 
-                                             bytes*index, bytes, pe);        
-      }
-      if (rbwd) {
-       arridx_x = thisIndex.y;
-       arridx_y = index; 
-       CkArrayMap *amap = (CkArrayMap *) CkLocalBranch(rb_proxy);
-       CkArrayIndex2D idx (arridx_x, arridx_y);    
-       int pe = amap->procNum (0, idx);    
-       LineFFTAssert (pe >= 0);
-       LineFFTAssert (pe < CkNumPes());         
-       
-       CmiDirect_manytomany_initialize_recv (handle, _phase+NUM_PHASES, 
-                                             index, bytes*index, bytes, pe);
-      }
-    }    
-  }  
-}
-
-void LineFFTArray::many_to_many_recvFFT (LineFFTCompleteMsg *msg) {
-  //printf("in many_to_many_recvFFT\n");
-  if (_info.grainX == 1 && _info.grainY == 1 && _info.grainZ == 1) {
-    for (int idx = 0; idx < _nFFTMessages; ++idx) 
-      _line[idx] = many_to_many_data[idx];
-  }
-  else {
-    int size = _info.grainX *_info.grainY *_info.grainZ;    
-    for (int idx = 0; idx < _nFFTMessages; ++idx )
-      receive_transpose(idx, many_to_many_data + idx * size,
-                       _info.grainX, _info.grainY, _info.grainZ);    
-  }
-
-  start_fft(msg->dir);
-}
-
-#endif
-
-#include "PencilFFT.def.h"
-
diff --git a/src/libs/ck-libs/pencilfft/pencilfft.ci b/src/libs/ck-libs/pencilfft/pencilfft.ci
deleted file mode 100644 (file)
index c1a25ff..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-
-module PencilFFT {
-
-       message LineFFTMsg     {complex   data[];};
-       message LineFFTGridMsg {fftw_real data[];};
-       message LineFFTCompleteMsg;
-
-       array [2D] LineFFTArray {
-               entry LineFFTArray (LineFFTInfo info, int phase);
-               entry void receiveGridMessage (LineFFTGridMsg *msg);
-               entry void setNumGridMessages (int n, CkCallback cb);
-               entry void receiveFFTMessage  (LineFFTMsg *msg);
-               entry void many_to_many_recvFFT  (LineFFTCompleteMsg *msg);
-               entry void startFFT (void);
-       };
-
-       group PencilMapX : CkArrayMap {
-               entry  PencilMapX(LineFFTInfo  info);
-       }
-
-       group PencilMapY : CkArrayMap {
-               entry  PencilMapY(LineFFTInfo  info);
-       }
-
-       group PencilMapZ : CkArrayMap {
-               entry  PencilMapZ(LineFFTInfo  info);
-       }       
-};
diff --git a/src/libs/ck-libs/pencilfft/pencilfft.h b/src/libs/ck-libs/pencilfft/pencilfft.h
deleted file mode 100644 (file)
index a979f5e..0000000
+++ /dev/null
@@ -1,504 +0,0 @@
-
-#ifndef  __PENCIL_FFT_H__
-#define  __PENCIL_FFT_H__
-
-#include "charm++.h"
-#include "ckcomplex.h"
-#include "sfftw.h"
-
-//#define USE_MANY_TO_MANY  1
-
-#if USE_MANY_TO_MANY
-#include "cmidirectmanytomany.h"
-#endif
-
-#define LineFFTAssert(x)  //CkAssert(x)
-#define __LINEFFT_DEBUG__  0
-
-///
-/// The specific phase of the 3D line fft operation
-///
-enum LineFFTPhase {
-  PHASE_X = 0,
-  PHASE_Y,
-  PHASE_Z,
-  NUM_PHASES
-};
-
-
-enum LineFFTCompletion {
-  ARRAY_REDUCTION = 0,
-  SEND_GRID,
-};
-
-
-///
-/// \brief The Grid structures which describes the points being sent 
-///
-struct LineFFTGrid {
-  short  x0;
-  short  xsize;
-  short  y0;
-  short  ysize;
-  short  z0;
-  short  zsize;  
-
-  short  idx_x;    //The x-coordinate of the pencil array element
-  short  idx_y;    //The y-coordinate of the pencil array element
-
-  CkCallback cb_done;   //Callback to call once the operation has been
-                       //finished
-};
-
-PUPbytes (LineFFTGrid)
-
-struct LineFFTInfo;
-
-#include "PencilFFT.decl.h"
-
-///
-/// Startup consturction info for the line fft array element
-///
-struct LineFFTInfo {
-  int sizeX, sizeY, sizeZ;    //FFT grid dimensions
-  int grainX, grainY, grainZ; //FFT pencil partition sizes
-  
-  ///
-  /// \brief Proxy for X, Y, Z chare arrays. This will allow each of
-  /// them to be a different chare array possibly mapped to different a
-  /// processor
-  ///
-  CProxy_LineFFTArray     xProxy;
-  CProxy_LineFFTArray     yProxy; 
-  CProxy_LineFFTArray     zProxy;
-
-  CProxy_PencilMapX       mapx;
-  CProxy_PencilMapY       mapy;
-  CProxy_PencilMapZ       mapz;
-
-  CkCallback              kSpaceCallback;
-  LineFFTCompletion       completionId;
-
-  bool                    normalize;
-  int                     numIter;
-};
-
-PUPbytes (LineFFTInfo)
-
-///////////////////////////////////////////////////////////////
-//             The Pencil FFT Array Class
-//
-//  Flow of Control :
-//   Client -> receiveGridMessage() > startFFT(X, Forward) -> 
-//   sendFFTMessages() -> startFFT(Y, Forward) -> 
-//   startFFT(Z, Forward) -> startFFT(Z, Backward) -> 
-//   startFFT(Y, Backward) -> startFFT(X, Backward) -> 
-//   sendGridMessages () -> Client
-//
-///////////////////////////////////////////////////////////////
-
-class LineFFTMsg : public CMessage_LineFFTMsg {
- public:
-  LineFFTPhase       phase;     //the phase of the operation
-  int                direction; //direction of the fft
-  int                chunk_id;  //the id of the chunk or a pencil
-  
-  ///
-  /// \brief data always stored in an XYZ order
-  ///
-  complex           * data;  
-};
-
-class LineFFTGridMsg : public CMessage_LineFFTGridMsg {
- public:
-  LineFFTGrid         grid;
-  fftw_real         * data;  
-};
-
-class LineFFTCompleteMsg :  public CMessage_LineFFTCompleteMsg {
- public:
-  int     dir;
-};
-
-class LineFFTArray;
-
-struct LineFFTCbWrapper {
-  CkCallback                    cb;
-  LineFFTCompleteMsg          * msg;
-  LineFFTArray                * me;
-};
-
-PUPbytes (LineFFTCbWrapper)
-
-///
-/// Main Pencil FFT Chare Array
-///
-class LineFFTArray : public CBase_LineFFTArray {
-  ///
-  /// \brief The fft points. The order of the points depends on the
-  /// phase. For example in Phase_X they will be stored in an XYZ order.
-  ///
-  complex *_line;
-  
-  ///Forward and backward fftw plans
-  fftw_plan _fwdplan, _bwdplan;
-  
-  ///
-  /// The FFT info structure
-  ///
-  LineFFTInfo   _info;
-  
-  LineFFTPhase  _phase;  //X, Y or Z chare
-
-  ///\brief Iteration count
-  int         _iter;
-
-  ///
-  /// \brief the current number of grid messages received so far
-  ///
-  int           _curGridMessages;
-
-  ///
-  /// \brief number of messssages received
-  ///
-  int           _curFFTMessages;
-
-  ///
-  /// \brief number of fft points in this thick pencil
-  ///
-  int           _nElements;
-
-  ///
-  /// \brief size of the fft
-  ///
-  int           _fftSize;
-
-  int           _nFFTMessages;
-
-  ///
-  /// \brief Number of grid messages to expect before starting the FFT
-  ///
-  int           _nGridMessages;
-
-  ///
-  /// \brief List of grids to send back to the the client
-  ///
-  LineFFTGrid  * _gridList;
-
- public:
-
-  /////////////////////////////////////////////////////
-  ///            Entry Methods
-  /////////////////////////////////////////////////////
-
-  ///
-  /// \brief Add loadbalancing and migration later
-  ///
-  LineFFTArray (CkMigrateMessage *m) {}
-
-  /// 
-  /// \brief The default constructor
-  ///
-  LineFFTArray () {
-    _fwdplan = _bwdplan =NULL;
-    //_id = -1;
-    _line = NULL;
-    _curFFTMessages = 0;
-    _curGridMessages = 0;
-    _nGridMessages = 0;
-  }
-
-  ///
-  /// \brief the real constructor
-  ///
-  LineFFTArray (LineFFTInfo &info, int phase);
-  
-  ~LineFFTArray () {
-    delete [] _line;
-  }
-
-  ///
-  /// \brief Receive data points to be fft'ed. This will happen in the
-  /// first and last phases
-  ///
-  void receiveGridMessage (LineFFTGridMsg   *msg);
-
-  ///
-  /// \brief transpose an intermediate FFT message
-  ///
-  void receive_transpose (int id, complex *data, int, int, int);
-
-  ///
-  /// \brief Receive an intermediate FFT message
-  ///
-  void receiveFFTMessage (LineFFTMsg *msg);
-
-  ///
-  /// \brief Start the 3D fft operation. This can be called externally
-  /// or intiated when all the grid/fft messages have been received.
-  ///
-  void start_fft (int direction = FFTW_FORWARD);
-
-  ///
-  /// \brief Start the 3D fft operation. This can be called externally
-  /// or intiated when all the grid/fft messages have been received.
-  ///
-  void startFFT (int direction = FFTW_FORWARD);
-
-  ///
-  /// \brief Set the number of grid messages to expect
-  ///
-  void setNumGridMessages (int n, CkCallback &cb) {
-    _nGridMessages = n;
-    
-#if __LINEFFT_DEBUG__
-    CkPrintf ("[%d, %d] Received ngridmsgs msg \n", thisIndex.x, thisIndex.y);
-#endif
-    _gridList = new LineFFTGrid [n];
-    
-    int x =0;
-    contribute (sizeof (int), &x, CkReduction::sum_int, cb);
-  }
-
-#if USE_MANY_TO_MANY 
-  void             * handle;   //many to many handle
-  int                tag_s[2]; //fwd and bwd send tags
-  complex          * many_to_many_data;
-  LineFFTCbWrapper   cbf_recv; //fwd recv completion
-  LineFFTCbWrapper   cbb_recv; //bwd recv completion
-
-  void initialize_many_to_many ();
-
-  ///
-  /// \brief many to many recv completion
-  ///
-  void many_to_many_recvFFT(LineFFTCompleteMsg *msg);
-#else
-  void many_to_many_recvFFT(LineFFTCompleteMsg *msg) {
-    //CmiAbort();
-  }
-#endif
-
-  /////////////////////////////////////////////////////////////
-  ///           End Entry Methods
-  /////////////////////////////////////////////////////////////
-  
- private:
-
-  ///
-  /// \brief Send the fft messages for the next few phases
-  /// 
-  void send_transpose (int id, complex *data, int, int, int);
-
-  ///
-  /// \brief Send the fft messages for the next few phases
-  /// 
-  void sendFFTMessages (int dir);
-
-  ///
-  /// \brief Send the grids back to the callers
-  ///
-  void sendGridMessages();
-  
-  ///
-  ///  \brief Call the application done callback
-  ///
-  void call_donecallback() {
-    LineFFTAssert (_phase == PHASE_X);
-
-#if __LINEFFT_DEBUG__    
-    CkPrintf ("[%d, %d] In Call Done Callback\n", thisIndex.x, thisIndex.y);
-#endif
-    if (_info.completionId == ARRAY_REDUCTION) {
-      int x =0;
-      contribute (sizeof (int), &x, CkReduction::sum_int);
-    }    
-    else 
-      sendGridMessages ();
-  }
-};   // -- End class LineFFTArray
-
-extern CmiNodeLock fftw_plan_lock;
-
-class PencilMapX : public CBase_PencilMapX
-{
-  LineFFTInfo   _info;
-  int         * _mapcache;
-  int           _sizeY;
-
- public:
-  PencilMapX(LineFFTInfo  &info) { 
-    _info = info;         
-    if (CmiMyRank() == 0)
-      if (fftw_plan_lock == NULL)
-       fftw_plan_lock = CmiCreateLock();
-    
-    initialize();
-  }
-  PencilMapX(CkMigrateMessage *m){}
-
-  void initialize () {    
-    double pe = 0.0;
-    int y = 0, z = 0;    
-    int nelem = (_info.sizeY * _info.sizeZ)/
-      (_info.grainY * _info.grainZ);    
-    if ((CkNumPes() % nelem) != 0)
-      nelem ++;
-    double stride = (int) ((1.0 *CkNumPes())/ nelem);
-#if USE_MANY_TO_MANY
-    CmiAssert (stride >= 1.0);
-#endif
-    _mapcache = new int[nelem];
-    memset (_mapcache, 0, sizeof(int)*nelem);
-    _sizeY = _info.sizeY/_info.grainY; 
-
-    int idx = 0;
-    for (pe = 0.0, z = 0; z < (_info.sizeZ)/(_info.grainZ); z ++) {
-      for (y = 0; y < (_info.sizeY)/(_info.grainY); y++) {
-       if(pe >= CkNumPes()) {
-         pe = pe - CkNumPes(); 
-         if ((int)pe == 0)
-           pe++;
-       }
-       idx = z * _sizeY + y;   
-       _mapcache[idx] = (int)pe;
-       pe +=  stride;
-      }
-    }
-    //if (CkMyPe() == 0)
-    //printf("X Last allocation to %d\n", (int)pe);    
-  }
-
-  int procNum(int, const CkArrayIndex &idx) {
-    CkArrayIndex2D idx2d = *(CkArrayIndex2D *) &idx;    
-    int y = idx2d.index[0];
-    int z = idx2d.index[1];
-    int id = z * _sizeY + y;
-
-    return _mapcache[id];
-  }
-};
-
-
-class PencilMapY : public CBase_PencilMapY
-{
-  LineFFTInfo   _info;
-  int         * _mapcache;
-  int           _sizeZ;
-
- public:
-  PencilMapY(LineFFTInfo  &info) { 
-    _info = info;         
-    if (CmiMyRank() == 0)
-      if (fftw_plan_lock == NULL)
-       fftw_plan_lock = CmiCreateLock();
-    
-    initialize();
-  }
-  PencilMapY(CkMigrateMessage *m){}
-
-  void initialize () {    
-    double pe = 0.0;
-    int z = 0, x = 0;    
-    int nelem = (_info.sizeZ * _info.sizeX)/
-      (_info.grainZ * _info.grainX);    
-    if ((CkNumPes() % nelem) != 0)
-      nelem ++;
-    double stride = (int)((1.0 *CkNumPes())/ nelem);
-#if USE_MANY_TO_MANY
-    CmiAssert (stride >= 1.0);
-#endif
-    _mapcache = new int[nelem];
-    memset (_mapcache, 0, sizeof(int)*nelem);
-    _sizeZ = _info.sizeZ/_info.grainZ; 
-
-    int idx = 0;
-    for (pe = 1.0, x = 0; x < (_info.sizeX)/(_info.grainX); x ++) {
-      for (z = 0; z < (_info.sizeZ)/(_info.grainZ); z++) {
-       if(pe >= CkNumPes()) {
-         pe = pe - CkNumPes(); 
-         if ((int)pe == 1)
-           pe++;
-       }
-       idx = x * _sizeZ + z;   
-       _mapcache[idx] = (int)pe;
-       pe +=  stride;
-      }
-    }
-
-    //if (CkMyPe() == 0)
-    //printf("Y Last allocation to %d\n", (int)pe);
-  }
-
-  int procNum(int, const CkArrayIndex &idx) {
-    CkArrayIndex2D idx2d = *(CkArrayIndex2D *) &idx;    
-    int z = idx2d.index[0];
-    int x = idx2d.index[1];
-    int id = x * _sizeZ + z;
-
-    return _mapcache[id];
-  }
-};
-
-////////////////////////////////////////////
-
-class PencilMapZ : public CBase_PencilMapZ
-{
-  LineFFTInfo   _info;
-  int         * _mapcache;
-  int           _sizeX;
-
- public:
-  PencilMapZ(LineFFTInfo  &info) { 
-    _info = info;         
-    if (CmiMyRank() == 0)
-      if (fftw_plan_lock == NULL)
-       fftw_plan_lock = CmiCreateLock();
-    
-    initialize();
-  }
-  PencilMapZ(CkMigrateMessage *m){}
-
-  void initialize () {    
-    double pe = 0.0;
-    int x = 0, y = 0;    
-    int nelem = (_info.sizeX * _info.sizeY)/
-      (_info.grainX * _info.grainY);    
-    if ((CkNumPes() % nelem) != 0)
-      nelem ++;
-    double stride = (int)((1.0 *CkNumPes())/ nelem);
-#if USE_MANY_TO_MANY
-    CmiAssert (stride >= 1.0);
-#endif
-    _mapcache = new int[nelem];    
-    memset (_mapcache, 0, sizeof(int)*nelem);
-    _sizeX = _info.sizeX/_info.grainX; 
-
-    int idx = 0;
-    for (pe = 0.0, x = 0; x < (_info.sizeX)/(_info.grainX); x ++) {
-      for (y = 0; y < (_info.sizeY)/(_info.grainY); y++) {
-       if(pe >= CkNumPes()) {
-         pe = pe - CkNumPes(); 
-         if((int) pe == 0)
-           pe++;
-       }
-       idx = y * _sizeX + x;   
-       _mapcache[idx] = (int)pe;
-       pe +=  stride;
-      }
-    }
-    //if (CkMyPe() == 0)
-    //printf("Z Last allocation to %d\n", (int)pe);
-  }
-
-  int procNum(int, const CkArrayIndex &idx) {
-    CkArrayIndex2D idx2d = *(CkArrayIndex2D *) &idx;    
-    int x = idx2d.index[0];
-    int y = idx2d.index[1];
-    int id = y * _sizeX + x;
-
-    return _mapcache[id];
-  }
-};
-
-#endif