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     rfftwnd_plan forward_plan, backward_plan;
00126 #endif
00127     int nx, ny;
00128     PatchGridElem  * m2m_recv_grid;
00129     float          * many_to_many_gr_data;
00130     CkCallbackWrapper  cbw_recvgrid;
00131     CkCallbackWrapper  cbw_recvuntrans;
00132 
00133     void initialize_manytomany ();
00134 };
00135 
00136 class OptPmeYPencil : public OptPmePencil<CBase_OptPmeYPencil> {
00137 public:
00138     OptPmeYPencil_SDAG_CODE
00139     OptPmeYPencil() { __sdag_init(); setMigratable(false); }
00140     OptPmeYPencil(CkMigrateMessage *) { __sdag_init(); }
00141     void fft_init();
00142     void recv_trans(const OptPmeFFTMsg *);
00143     void forward_fft();
00144     void send_trans();
00145     void many_to_many_send(int phase);
00146     void recv_untrans(const OptPmeFFTMsg *);
00147     void many_to_many_recv_trans();
00148     void backward_fft();
00149     void send_untrans();
00150     void many_to_many_recv_untrans();   
00151 private:
00152 #ifdef NAMD_FFTW
00153     fftw_plan forward_plan, backward_plan;
00154 #endif
00155     int nx, nz;
00156     CkCallbackWrapper  cbw_recvtrans;
00157     CkCallbackWrapper  cbw_recvuntrans;
00158 
00159     void initialize_manytomany ();
00160 };
00161 
00162 class OptPmeXPencil : public OptPmePencil<CBase_OptPmeXPencil> {
00163 public:
00164     OptPmeXPencil_SDAG_CODE
00165     OptPmeXPencil() { __sdag_init();  myKSpace = 0; setMigratable(false); }
00166     OptPmeXPencil(CkMigrateMessage *) { __sdag_init(); }
00167     void fft_init();
00168     void recv_trans(const OptPmeFFTMsg *);
00169     void many_to_many_recv_trans();     
00170     void forward_fft();
00171     void pme_kspace();
00172     void backward_fft();
00173     void send_untrans();
00174     void many_to_many_send_untrans();
00175 #ifdef NAMD_FFTW
00176     fftw_plan forward_plan, backward_plan;
00177 #endif
00178     int ny, nz;
00179     PmeKSpace *myKSpace;
00180     CkCallbackWrapper  cbw_recvtrans;
00181     bool               constant_pressure;
00182 
00183     void initialize_manytomany ();
00184 };
00185 
00186 #endif

Generated on Mon Nov 23 04:59:20 2009 for NAMD by  doxygen 1.3.9.1