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

OptPmeXPencil Class Reference

#include <fftlib.h>

Inheritance diagram for OptPmeXPencil:

OptPmePencil< CBase_OptPmeXPencil > CBase_OptPmeXPencil List of all members.

Public Member Functions

OptPmeXPencil_SDAG_CODE OptPmeXPencil ()
 OptPmeXPencil (CkMigrateMessage *)
void fft_init ()
void recv_trans (const OptPmeFFTMsg *)
void many_to_many_recv_trans ()
void forward_fft ()
void pme_kspace ()
void backward_fft ()
void send_untrans ()
void many_to_many_send_untrans ()
void initialize_manytomany ()

Public Attributes

fftw_plan forward_plan
fftw_plan backward_plan
int ny
int nz
PmeKSpacemyKSpace
CkCallbackWrapper cbw_recvtrans
bool constant_pressure

Constructor & Destructor Documentation

OptPmeXPencil_SDAG_CODE OptPmeXPencil::OptPmeXPencil  )  [inline]
 

Definition at line 165 of file fftlib.h.

References myKSpace.

00165 { __sdag_init();  myKSpace = 0; setMigratable(false); }

OptPmeXPencil::OptPmeXPencil CkMigrateMessage *   )  [inline]
 

Definition at line 166 of file fftlib.h.

00166 { __sdag_init(); }


Member Function Documentation

void OptPmeXPencil::backward_fft  ) 
 

Definition at line 393 of file fftlib.C.

References backward_plan, ny, and nz.

00393                                  {
00394 #ifdef NAMD_FFTW
00395   fftw(backward_plan, ny*nz,
00396        ((fftw_complex *) data), ny*nz, 1, (fftw_complex *) work, 1, 0);
00397 #endif
00398 }

void OptPmeXPencil::fft_init  ) 
 

Definition at line 115 of file fftlib.C.

References backward_plan, PmeGrid::block2, PmeGrid::block3, OptPmePencilInitMsgData::constant_pressure, constant_pressure, PmeGrid::dim3, SimParameters::FFTWEstimate, forward_plan, OptPmePencilInitMsgData::grid, initialize_manytomany(), PmeGrid::K1, PmeGrid::K2, SimParameters::lattice, myKSpace, NAMD_die(), ny, nz, OptPmePencil< CBase_OptPmeXPencil >::order_init(), Node::simParameters, simParams, and OptPmePencilInitMsgData::xBlocks.

00115                              {
00116   CProxy_Node nd(CkpvAccess(BOCclass_group).node);
00117   Node *node = nd.ckLocalBranch();
00118   SimParameters *simParams = node->simParameters;
00119 
00120   //  printf ("Initialize xpencil [%d,%d], on pd %d\n", thisIndex.x, thisIndex.y, CkMyPe());
00121 
00122   lattice = simParams->lattice;
00123 
00124   int K1 = initdata.grid.K1;
00125   int K2 = initdata.grid.K2;
00126   int dim3 = initdata.grid.dim3;
00127   int block2 = initdata.grid.block2;
00128   int block3 = initdata.grid.block3;
00129 
00130   ny = block2;
00131   if ( (thisIndex.y + 1) * block2 > K2 ) ny = K2 - thisIndex.y * block2;
00132   nz = block3;
00133   if ( (thisIndex.z+1)*block3 > dim3/2 ) nz = dim3/2 - thisIndex.z*block3;
00134 
00135   data = new float[K1*block2*block3*2];
00136   many_to_many_data = new float[K1*block2*block3*2];
00137   many_to_many_nb = new int [initdata.xBlocks];
00138   work = new float[2*K1];
00139 
00140   memset(many_to_many_data, 0, sizeof(float) * K1*block2*block3*2);
00141 
00142   order_init(initdata.xBlocks);
00143 
00144 #ifdef NAMD_FFTW
00145   CmiLock(fftw_plan_lock);
00146 
00147   forward_plan = fftw_create_plan_specific(K1, FFTW_FORWARD,
00148         ( simParams->FFTWEstimate ? FFTW_ESTIMATE : FFTW_MEASURE )
00149         | FFTW_IN_PLACE | FFTW_USE_WISDOM, (fftw_complex *) data,
00150         ny*nz, (fftw_complex *) work, 1);
00151   backward_plan = fftw_create_plan_specific(K1, FFTW_BACKWARD,
00152         ( simParams->FFTWEstimate ? FFTW_ESTIMATE : FFTW_MEASURE )
00153         | FFTW_IN_PLACE | FFTW_USE_WISDOM, (fftw_complex *) data,
00154         ny*nz, (fftw_complex *) work, 1);
00155 
00156   CmiUnlock(fftw_plan_lock);
00157 #else
00158   NAMD_die("Sorry, FFTW must be compiled in to use PME.");
00159 #endif
00160 
00161   myKSpace = new PmeKSpace(initdata.grid,
00162                 thisIndex.y*block2, thisIndex.y*block2 + ny,
00163                 thisIndex.z*block3, thisIndex.z*block3 + nz);
00164 
00165   handle = NULL; 
00166 #if CHARM_VERSION > 60000
00167   handle = CmiDirect_manytomany_allocate_handle();
00168 #endif
00169   initialize_manytomany();
00170 
00171   constant_pressure = initdata.constant_pressure;
00172 }

void OptPmeXPencil::forward_fft  ) 
 

Definition at line 370 of file fftlib.C.

References forward_plan, ny, and nz.

00370                                 {
00371 #ifdef NAMD_FFTW
00372   fftw(forward_plan, ny*nz,
00373        ((fftw_complex *) data), ny*nz, 1, (fftw_complex *) work, 1, 0);
00374 #endif
00375 }

void OptPmeXPencil::initialize_manytomany  ) 
 

Definition at line 944 of file fftlib.C.

References PmeGrid::block1, call_ck_cb(), CkCallbackWrapper::cb, cbw_recvtrans, global_map_y, OptPmePencilInitMsgData::grid, PmeGrid::K1, CkCallbackWrapper::msg, PHASE_XF, PHASE_YB, and OptPmePencilInitMsgData::xBlocks.

Referenced by fft_init().

00944                                             {  
00945 #if CHARM_VERSION > 60000
00946   int xBlocks = initdata.xBlocks;
00947   int block1 = initdata.grid.block1;
00948   int K1 = initdata.grid.K1;
00949   
00950   CmiDirect_manytomany_initialize_sendbase (handle, PHASE_YB, NULL, NULL, (char *)many_to_many_data, xBlocks, thisIndex.y);
00951   CkArrayIndex3D idx (thisIndex.x, thisIndex.y, thisIndex.z);
00952   cbw_recvtrans.cb = CkCallback(CkIndex_OptPmeXPencil::many_to_manyRecvTrans(NULL), idx, thisProxy.ckGetArrayID());
00953   cbw_recvtrans.msg = new (PRIORITY_SIZE) OptPmeDummyMsg;
00954   CmiDirect_manytomany_initialize_recvbase (handle, PHASE_XF, call_ck_cb, 
00955                                             &cbw_recvtrans,  (char *)many_to_many_data, 
00956                                             initdata.xBlocks, -1);
00957   
00958   for ( int ib=0; ib<xBlocks; ++ib ) {
00959     int nx = block1;
00960     if ( (ib+1)*block1 > K1 ) nx = K1 - ib*block1;
00961     
00962     CkArrayIndex3D index (ib,0,thisIndex.z);
00963     CProxy_OptPmePencilMapY yproxy (global_map_y);
00964     int pe = yproxy.ckLocalBranch()->procNum(0, index);
00965     CmiDirect_manytomany_initialize_send (handle, PHASE_YB, ib, 2*block1*ny*nz*ib*sizeof(float), 2*nx*ny*nz*sizeof(float), pe);
00966     
00967     CmiDirect_manytomany_initialize_recv (handle, PHASE_XF, ib, ib*block1*ny*nz*2*sizeof(float), nx*ny*nz*2*sizeof(float), pe);
00968     many_to_many_nb [ib] = nx;
00969   }
00970 #endif
00971 }

void OptPmeXPencil::many_to_many_recv_trans  ) 
 

Definition at line 709 of file fftlib.C.

References PmeGrid::block1, OptPmePencilInitMsgData::grid, j, PmeGrid::K1, ny, nz, and OptPmePencilInitMsgData::xBlocks.

00709                                              {
00710   
00711   int block1 = initdata.grid.block1;
00712   int K1 = initdata.grid.K1;
00713   
00714   const float *md = many_to_many_data;
00715   for (int ib =0; ib < initdata.xBlocks; ib++ ) {
00716     int nx = many_to_many_nb[ib];    
00717     for ( int i=ib*block1; i<(ib*block1+nx); ++i ) {
00718       float *d = data + i*ny*nz*2;
00719       for ( int j=0; j<ny; ++j, d += nz*2 ) {
00720         for ( int k=0; k<nz; ++k ) {
00721           d[2*k] = *(md++);
00722           d[2*k+1] = *(md++);
00723         }
00724       }
00725     }
00726   }
00727 }

void OptPmeXPencil::many_to_many_send_untrans  ) 
 

Definition at line 729 of file fftlib.C.

References PmeGrid::block1, OptPmePencilInitMsgData::grid, j, PmeGrid::K1, ny, nz, PHASE_YB, and OptPmePencilInitMsgData::xBlocks.

00729                                               {
00730   int xBlocks = initdata.xBlocks;
00731   int block1 = initdata.grid.block1;
00732   int K1 = initdata.grid.K1;
00733 
00734   int     nx = block1;
00735   float * md = many_to_many_data;
00736   for ( int ib=0; ib<xBlocks; ++ib ) {
00737     nx = block1;
00738     if ( (ib+1)*block1 > K1 ) nx = K1 - ib*block1;
00739     
00740     for ( int i=ib*block1; i<(ib*block1+nx); ++i ) {
00741       float *d = data + i*ny*nz*2;
00742       for ( int j=0; j<ny; ++j, d += nz*2 ) {
00743         for ( int k=0; k<nz; ++k ) {
00744           *(md++) = d[2*k];
00745           *(md++) = d[2*k+1];
00746         }
00747       }
00748     }
00749   }
00750 #if CHARM_VERSION > 60000
00751   CmiDirect_manytomany_start (handle, PHASE_YB);
00752 #endif
00753 }

void OptPmeXPencil::pme_kspace  ) 
 

Definition at line 377 of file fftlib.C.

References Array< Elem, Size >::begin(), BigReal, OptPmePencilInitMsgData::cb_energy, PmeKSpace::compute_energy(), and myKSpace.

00377                                {
00378 
00379   evir = 0.;
00380 
00381 #ifdef FFTCHECK
00382   return;
00383 #endif
00384 
00385   BigReal ewaldcof = ComputeNonbondedUtil::ewaldcof;
00386   evir[0] = myKSpace->compute_energy(data,
00387                                      lattice, ewaldcof, &(evir[1]));
00388 
00389   contribute (7*sizeof(double), evir.begin(), CkReduction::sum_double, initdata.cb_energy);
00390   
00391 }

void OptPmeXPencil::recv_trans const OptPmeFFTMsg  ) 
 

Definition at line 350 of file fftlib.C.

References PmeGrid::block1, OptPmePencilInitMsgData::grid, j, PmeGrid::K1, OptPmeFFTMsg::nx, ny, nz, OptPmeFFTMsg::qgrid, and OptPmeFFTMsg::sourceNode.

00350                                                       {
00351 
00352   int block1 = initdata.grid.block1;
00353   int K1 = initdata.grid.K1;
00354   int ib = msg->sourceNode;
00355   int nx = msg->nx;
00356   const float *md = msg->qgrid;
00357   for ( int i=ib*block1; i<(ib*block1+nx); ++i ) {
00358     float *d = data + i*ny*nz*2;
00359     for ( int j=0; j<ny; ++j, d += nz*2 ) {
00360       for ( int k=0; k<nz; ++k ) {
00361         d[2*k] = *(md++);
00362         d[2*k+1] = *(md++);
00363       }
00364     }
00365   }
00366 }

void OptPmeXPencil::send_untrans  ) 
 

Definition at line 400 of file fftlib.C.

References PmeGrid::block1, OptPmePencilInitMsgData::grid, j, PmeGrid::K1, OptPmeFFTMsg::nx, ny, nz, OptPmeFFTMsg::qgrid, OptPmeFFTMsg::sourceNode, OptPmePencilInitMsgData::xBlocks, and OptPmePencilInitMsgData::yPencil.

00400                                  {
00401   int xBlocks = initdata.xBlocks;
00402   int block1 = initdata.grid.block1;
00403   int K1 = initdata.grid.K1;
00404 
00405   for ( int isend=0; isend<xBlocks; ++isend ) {
00406     int ib = send_order[isend];
00407     int nx = block1;
00408     if ( (ib+1)*block1 > K1 ) nx = K1 - ib*block1;
00409     OptPmeFFTMsg *msg = new (nx*ny*nz*2,PRIORITY_SIZE) OptPmeFFTMsg;    
00410     msg->sourceNode = thisIndex.y;
00411     msg->nx = ny;
00412     float *md = msg->qgrid;
00413     for ( int i=ib*block1; i<(ib*block1+nx); ++i ) {
00414       float *d = data + i*ny*nz*2;
00415       for ( int j=0; j<ny; ++j, d += nz*2 ) {
00416         for ( int k=0; k<nz; ++k ) {
00417           *(md++) = d[2*k];
00418           *(md++) = d[2*k+1];
00419         }
00420       }
00421     }
00422     
00423     //printf ("%d, %d: Xpencil Sending untrans to %d, %d\n", thisIndex.y, thisIndex.z, ib, thisIndex.z);
00424     initdata.yPencil(ib,0,thisIndex.z).recvUntrans(msg);
00425   }
00426 }


Member Data Documentation

fftw_plan OptPmeXPencil::backward_plan
 

Definition at line 176 of file fftlib.h.

Referenced by backward_fft(), and fft_init().

CkCallbackWrapper OptPmeXPencil::cbw_recvtrans
 

Definition at line 180 of file fftlib.h.

Referenced by initialize_manytomany().

bool OptPmeXPencil::constant_pressure
 

Definition at line 181 of file fftlib.h.

Referenced by fft_init().

fftw_plan OptPmeXPencil::forward_plan
 

Definition at line 176 of file fftlib.h.

Referenced by fft_init(), and forward_fft().

PmeKSpace* OptPmeXPencil::myKSpace
 

Definition at line 179 of file fftlib.h.

Referenced by fft_init(), OptPmeXPencil(), and pme_kspace().

int OptPmeXPencil::ny
 

Definition at line 178 of file fftlib.h.

Referenced by backward_fft(), fft_init(), forward_fft(), many_to_many_recv_trans(), many_to_many_send_untrans(), recv_trans(), and send_untrans().

int OptPmeXPencil::nz
 

Definition at line 178 of file fftlib.h.

Referenced by backward_fft(), fft_init(), forward_fft(), many_to_many_recv_trans(), many_to_many_send_untrans(), recv_trans(), and send_untrans().


The documentation for this class was generated from the following files:
Generated on Mon Nov 23 05:00:03 2009 for NAMD by  doxygen 1.3.9.1