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

PmeXPencil Class Reference

Inheritance diagram for PmeXPencil:

PmePencil< CBase_PmeXPencil > CBase_PmeXPencil List of all members.

Public Member Functions

PmeXPencil_SDAG_CODE PmeXPencil ()
 PmeXPencil (CkMigrateMessage *)
void fft_init ()
void recv_trans (const PmeTransMsg *)
void forward_fft ()
void pme_kspace ()
void backward_fft ()
void send_untrans ()

Public Attributes

int ny
int nz
PmeKSpacemyKSpace

Constructor & Destructor Documentation

PmeXPencil_SDAG_CODE PmeXPencil::PmeXPencil  )  [inline]
 

Definition at line 2565 of file ComputePme.C.

References myKSpace.

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

PmeXPencil::PmeXPencil CkMigrateMessage *   )  [inline]
 

Definition at line 2566 of file ComputePme.C.

02566 { __sdag_init(); }


Member Function Documentation

void PmeXPencil::backward_fft  ) 
 

Definition at line 2946 of file ComputePme.C.

References ny, and nz.

02946                               {
02947 #ifdef NAMD_FFTW
02948   fftw(backward_plan, ny*nz,
02949         ((fftw_complex *) data), ny*nz, 1, (fftw_complex *) work, 1, 0);
02950 #endif
02951 }

void PmeXPencil::fft_init  ) 
 

Definition at line 2658 of file ComputePme.C.

References PmeGrid::block2, PmeGrid::block3, PmeGrid::dim3, SimParameters::FFTWEstimate, PmePencilInitMsgData::grid, PmeGrid::K1, PmeGrid::K2, myKSpace, NAMD_die(), ny, nz, PmePencil< CBase_PmeXPencil >::order_init(), Node::simParameters, simParams, and PmePencilInitMsgData::xBlocks.

02658                           {
02659   CProxy_Node nd(CkpvAccess(BOCclass_group).node);
02660   Node *node = nd.ckLocalBranch();
02661   SimParameters *simParams = node->simParameters;
02662 
02663   int K1 = initdata.grid.K1;
02664   int K2 = initdata.grid.K2;
02665   int dim3 = initdata.grid.dim3;
02666   int block2 = initdata.grid.block2;
02667   int block3 = initdata.grid.block3;
02668 
02669   ny = block2;
02670   if ( (thisIndex.y + 1) * block2 > K2 ) ny = K2 - thisIndex.y * block2;
02671   nz = block3;
02672   if ( (thisIndex.z+1)*block3 > dim3/2 ) nz = dim3/2 - thisIndex.z*block3;
02673 
02674   data = new float[K1*block2*block3*2];
02675   work = new float[2*K1];
02676 
02677   order_init(initdata.xBlocks);
02678 
02679 #ifdef NAMD_FFTW
02680   CmiLock(ComputePmeMgr::fftw_plan_lock);
02681 
02682   forward_plan = fftw_create_plan_specific(K1, FFTW_FORWARD,
02683         ( simParams->FFTWEstimate ? FFTW_ESTIMATE : FFTW_MEASURE )
02684         | FFTW_IN_PLACE | FFTW_USE_WISDOM, (fftw_complex *) data,
02685         ny*nz, (fftw_complex *) work, 1);
02686   backward_plan = fftw_create_plan_specific(K1, FFTW_BACKWARD,
02687         ( simParams->FFTWEstimate ? FFTW_ESTIMATE : FFTW_MEASURE )
02688         | FFTW_IN_PLACE | FFTW_USE_WISDOM, (fftw_complex *) data,
02689         ny*nz, (fftw_complex *) work, 1);
02690 
02691   CmiUnlock(ComputePmeMgr::fftw_plan_lock);
02692 #else
02693   NAMD_die("Sorry, FFTW must be compiled in to use PME.");
02694 #endif
02695 
02696   myKSpace = new PmeKSpace(initdata.grid,
02697                 thisIndex.y*block2, thisIndex.y*block2 + ny,
02698                 thisIndex.z*block3, thisIndex.z*block3 + nz);
02699 }

void PmeXPencil::forward_fft  ) 
 

Definition at line 2921 of file ComputePme.C.

References ny, and nz.

02921                              {
02922 #ifdef NAMD_FFTW
02923   fftw(forward_plan, ny*nz,
02924         ((fftw_complex *) data), ny*nz, 1, (fftw_complex *) work, 1, 0);
02925 #endif
02926 }

void PmeXPencil::pme_kspace  ) 
 

Definition at line 2928 of file ComputePme.C.

References BigReal, PmeKSpace::compute_energy(), and myKSpace.

02928                             {
02929 
02930   evir = 0.;
02931 
02932 #ifdef FFTCHECK
02933   return;
02934 #endif
02935 
02936   BigReal ewaldcof = ComputeNonbondedUtil::ewaldcof;
02937 
02938   int numGrids = 1;
02939   for ( int g=0; g<numGrids; ++g ) {
02940     evir[0] = myKSpace->compute_energy(data+0*g,
02941                 lattice, ewaldcof, &(evir[1]));
02942   }
02943 
02944 }

void PmeXPencil::recv_trans const PmeTransMsg  ) 
 

Definition at line 2884 of file ComputePme.C.

References PmeGrid::block1, PmePencilInitMsgData::grid, PmeTransMsg::hasData, PmeGrid::K1, PmeTransMsg::lattice, PmeTransMsg::nx, ny, nz, PmeTransMsg::qgrid, PmeTransMsg::sequence, and PmeTransMsg::sourceNode.

02884                                                   {
02885   if ( imsg == 0 ) {
02886     lattice = msg->lattice;
02887     sequence = msg->sequence;
02888   }
02889   int block1 = initdata.grid.block1;
02890   int K1 = initdata.grid.K1;
02891   int ib = msg->sourceNode;
02892   int nx = msg->nx;
02893  if ( msg->hasData ) {
02894   const float *md = msg->qgrid;
02895   for ( int i=ib*block1; i<(ib*block1+nx); ++i ) {
02896    float *d = data + i*ny*nz*2;
02897    for ( int j=0; j<ny; ++j, d += nz*2 ) {
02898     for ( int k=0; k<nz; ++k ) {
02899 #ifdef ZEROCHECK
02900       if ( (*md) == 0. ) CkPrintf("0 in YX at %d %d %d %d %d %d %d %d %d\n",
02901         ib, thisIndex.y, thisIndex.z, i, j, k, nx, ny, nz);
02902 #endif
02903       d[2*k] = *(md++);
02904       d[2*k+1] = *(md++);
02905     }
02906    }
02907   }
02908  } else {
02909   for ( int i=ib*block1; i<(ib*block1+nx); ++i ) {
02910    float *d = data + i*ny*nz*2;
02911    for ( int j=0; j<ny; ++j, d += nz*2 ) {
02912     for ( int k=0; k<nz; ++k ) {
02913       d[2*k] = 0;
02914       d[2*k+1] = 0;
02915     }
02916    }
02917   }
02918  }
02919 }

void PmeXPencil::send_untrans  ) 
 

Definition at line 2953 of file ComputePme.C.

References PmeGrid::block1, PmeUntransMsg::evir, PmePencilInitMsgData::grid, PmeUntransMsg::has_evir, PmeGrid::K1, PmeUntransMsg::ny, ny, nz, PME_UNTRANS_PRIORITY, PmeUntransMsg::qgrid, SET_PRIORITY, PmeUntransMsg::sourceNode, PmePencilInitMsgData::xBlocks, and PmePencilInitMsgData::yPencil.

02953                               {
02954   int xBlocks = initdata.xBlocks;
02955   int block1 = initdata.grid.block1;
02956   int K1 = initdata.grid.K1;
02957   int send_evir = 1;
02958   for ( int isend=0; isend<xBlocks; ++isend ) {
02959     int ib = send_order[isend];
02960     if ( ! needs_reply[ib] ) continue;
02961     int nx = block1;
02962     if ( (ib+1)*block1 > K1 ) nx = K1 - ib*block1;
02963     PmeUntransMsg *msg = new (nx*ny*nz*2,send_evir,PRIORITY_SIZE) PmeUntransMsg;
02964     if ( send_evir ) {
02965       msg->evir[0] = evir;
02966       msg->has_evir = 1;
02967       send_evir = 0;
02968     } else {
02969       msg->has_evir = 0;
02970     }
02971     msg->sourceNode = thisIndex.y;
02972     msg->ny = ny;
02973     float *md = msg->qgrid;
02974     for ( int i=ib*block1; i<(ib*block1+nx); ++i ) {
02975      float *d = data + i*ny*nz*2;
02976      for ( int j=0; j<ny; ++j, d += nz*2 ) {
02977       for ( int k=0; k<nz; ++k ) {
02978         *(md++) = d[2*k];
02979         *(md++) = d[2*k+1];
02980       }
02981      }
02982     }
02983     SET_PRIORITY(msg,sequence,PME_UNTRANS_PRIORITY)
02984     initdata.yPencil(ib,0,thisIndex.z).recvUntrans(msg);
02985   }
02986 }


Member Data Documentation

PmeKSpace* PmeXPencil::myKSpace
 

Definition at line 2577 of file ComputePme.C.

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

int PmeXPencil::ny
 

Definition at line 2576 of file ComputePme.C.

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

int PmeXPencil::nz
 

Definition at line 2576 of file ComputePme.C.

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


The documentation for this class was generated from the following file:
Generated on Thu Jul 24 04:07:45 2008 for NAMD by  doxygen 1.3.9.1