Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

fftlib.h

Go to the documentation of this file.
00001 
00002 #ifndef   __FFT_LIB_H__
00003 #define   __FFT_LIB_H__
00004 
00005 #if CHARM_VERSION > 60000
00006 #include <cmidirectmanytomany.h>
00007 #endif
00008 
00009 #define  MANY_TO_MANY_START  10
00010 #define  MANY_TO_MANY_SETUP  2
00011 
00012 #define  PHASE_YF  0   // Recv Y-Forward
00013 #define  PHASE_XF  1   // Recv X-Forward
00014 #define  PHASE_YB  2   // Recv Y-Backward
00015 #define  PHASE_ZB  3   // Recv Z-Backward
00016 #define  PHASE_GR  4   // Send Grid
00017 #define  PHASE_UG  5   // Recv Ungrid
00018 
00019 extern int many_to_many_start;
00020 
00021 class OptPmeGridMsg : public CMessage_OptPmeGridMsg {
00022 public:
00023   int sourceNode;
00024   int xstart;
00025   int xlen;
00026   int ystart;
00027   int ylen;
00028   int zstart;
00029   int zlen;
00030   int patchID;
00031   float *qgrid;
00032 };  //32 byte header on 32 bit architectures
00033 
00034 
00035 class OptPmeFFTMsg : public CMessage_OptPmeFFTMsg {
00036 public:
00037   int sourceNode;
00038   int nx;
00039   float *qgrid;
00040 };  //12 byte header on 32 bit architectures
00041 
00042 
00043 class OptPmeDummyMsg : public CMessage_OptPmeDummyMsg {
00044 };
00045 
00046 // use this idiom since messages don't have copy constructors
00047 struct OptPmePencilInitMsgData {
00048   PmeGrid grid;
00049   int xBlocks, yBlocks, zBlocks;
00050   CProxy_OptPmeXPencil xPencil;
00051   CProxy_OptPmeYPencil yPencil;
00052   CProxy_OptPmeZPencil zPencil;
00053   CProxy_OptPmeMgr     pmeProxy;
00054   CkCallback           cb_energy;
00055   bool                 constant_pressure;
00056 };
00057 
00058 
00059 class OptPmePencilInitMsg : public CMessage_OptPmePencilInitMsg {
00060 public:
00061   OptPmePencilInitMsg(OptPmePencilInitMsgData &d) { data = d; }
00062   OptPmePencilInitMsgData data;
00063 };
00064 
00065 struct CkCallbackWrapper {
00066   CkCallback    cb;
00067   void        * msg;
00068 };
00069 
00070 
00071 template <class T> class OptPmePencil : public T {
00072 public:
00073   OptPmePencil() {
00074     data = 0;
00075     work = 0;
00076     send_order = 0;
00077   }
00078   ~OptPmePencil() {
00079     delete [] data;
00080     delete [] work;
00081     delete [] send_order;
00082   }
00083   void base_init(OptPmePencilInitMsg *msg) {
00084     initdata = msg->data;
00085   }
00086   void order_init(int nBlocks) {
00087     send_order = new int[nBlocks];
00088     for ( int i=0; i<nBlocks; ++i ) send_order[i] = i;
00089     Random rand(CkMyPe());
00090     rand.reorder(send_order,nBlocks);
00091   }
00092   OptPmePencilInitMsgData initdata;
00093   Lattice lattice;
00094   PmeReduction evir;
00095   int imsg;  // used in sdag code
00096   int _iter; // used in sdag code
00097   float *data;
00098   float *many_to_many_data; //data in a differnt format
00099   int   *many_to_many_nb;
00100   float *work;
00101   int *send_order;
00102   void *handle;
00103 };
00104 
00105 
00106 class OptPmeZPencil : public OptPmePencil<CBase_OptPmeZPencil> {
00107 public:
00108     OptPmeZPencil_SDAG_CODE
00109     OptPmeZPencil() { __sdag_init(); setMigratable(false); }
00110     OptPmeZPencil(CkMigrateMessage *) { __sdag_init();  setMigratable (false); }
00111     void fft_init();
00112     void recv_grid(const OptPmeGridMsg *);
00113     void many_to_many_recv_grid();
00114     void forward_fft();
00115     void send_trans();
00116     void many_to_many_send_trans();
00117     void recv_untrans(const OptPmeFFTMsg *);
00118     void many_to_many_recv_untrans();
00119     void backward_fft();
00120     void send_ungrid(OptPmeGridMsg *);
00121     void many_to_many_send_ungrid ();
00122 private:
00123     ResizeArray<OptPmeGridMsg *> grid_msgs;
00124 #ifdef NAMD_FFTW
00125 #ifdef NAMD_FFTW_3
00126     fftwf_plan  forward_plan, backward_plan;
00127 #else
00128     rfftwnd_plan forward_plan, backward_plan;
00129 #endif
00130 #endif
00131     int nx, ny;
00132     PatchGridElem  * m2m_recv_grid;
00133     float          * many_to_many_gr_data;
00134     CkCallbackWrapper  cbw_recvgrid;
00135     CkCallbackWrapper  cbw_recvuntrans;
00136 
00137     void initialize_manytomany ();
00138 };
00139 
00140 class OptPmeYPencil : public OptPmePencil<CBase_OptPmeYPencil> {
00141 public:
00142     OptPmeYPencil_SDAG_CODE
00143     OptPmeYPencil() { __sdag_init(); setMigratable(false); }
00144     OptPmeYPencil(CkMigrateMessage *) { __sdag_init(); }
00145     void fft_init();
00146     void recv_trans(const OptPmeFFTMsg *);
00147     void forward_fft();
00148     void send_trans();
00149     void many_to_many_send(int phase);
00150     void recv_untrans(const OptPmeFFTMsg *);
00151     void many_to_many_recv_trans();
00152     void backward_fft();
00153     void send_untrans();
00154     void many_to_many_recv_untrans();   
00155 private:
00156 #ifdef NAMD_FFTW
00157 #ifdef NAMD_FFTW_3
00158     fftwf_plan  forward_plan, backward_plan;
00159 #else
00160     fftw_plan forward_plan, backward_plan;
00161 #endif
00162 #endif
00163     int nx, nz;
00164     CkCallbackWrapper  cbw_recvtrans;
00165     CkCallbackWrapper  cbw_recvuntrans;
00166 
00167     void initialize_manytomany ();
00168 };
00169 
00170 class OptPmeXPencil : public OptPmePencil<CBase_OptPmeXPencil> {
00171 public:
00172     OptPmeXPencil_SDAG_CODE
00173     OptPmeXPencil() { __sdag_init();  myKSpace = 0; setMigratable(false); }
00174     OptPmeXPencil(CkMigrateMessage *) { __sdag_init(); }
00175     void fft_init();
00176     void recv_trans(const OptPmeFFTMsg *);
00177     void many_to_many_recv_trans();     
00178     void forward_fft();
00179     void pme_kspace();
00180     void backward_fft();
00181     void send_untrans();
00182     void many_to_many_send_untrans();
00183 #ifdef NAMD_FFTW
00184 #ifdef NAMD_FFTW_3
00185     fftwf_plan  forward_plan, backward_plan;
00186 #else
00187     fftw_plan forward_plan, backward_plan;
00188 #endif
00189 #endif
00190     int ny, nz;
00191     PmeKSpace *myKSpace;
00192     CkCallbackWrapper  cbw_recvtrans;
00193     bool               constant_pressure;
00194 
00195     void initialize_manytomany ();
00196 };
00197 
00198 #endif

Generated on Fri May 25 04:07:15 2012 for NAMD by  doxygen 1.3.9.1