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

fftw_plan forward_plan
fftw_plan backward_plan
int ny
int nz
PmeKSpacemyKSpace

Constructor & Destructor Documentation

PmeXPencil_SDAG_CODE PmeXPencil::PmeXPencil  )  [inline]
 

Definition at line 2459 of file ComputePme.C.

References myKSpace.

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

PmeXPencil::PmeXPencil CkMigrateMessage *   )  [inline]
 

Definition at line 2460 of file ComputePme.C.

02460 { __sdag_init(); }


Member Function Documentation

void PmeXPencil::backward_fft  ) 
 

Definition at line 2840 of file ComputePme.C.

References backward_plan, ny, and nz.

02840                               {
02841 #ifdef NAMD_FFTW
02842   fftw(backward_plan, ny*nz,
02843         ((fftw_complex *) data), ny*nz, 1, (fftw_complex *) work, 1, 0);
02844 #endif
02845 }

void PmeXPencil::fft_init  ) 
 

Definition at line 2552 of file ComputePme.C.

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

02552                           {
02553   CProxy_Node nd(CkpvAccess(BOCclass_group).node);
02554   Node *node = nd.ckLocalBranch();
02555   SimParameters *simParams = node->simParameters;
02556 
02557   int K1 = initdata.grid.K1;
02558   int K2 = initdata.grid.K2;
02559   int dim3 = initdata.grid.dim3;
02560   int block2 = initdata.grid.block2;
02561   int block3 = initdata.grid.block3;
02562 
02563   ny = block2;
02564   if ( (thisIndex.y + 1) * block2 > K2 ) ny = K2 - thisIndex.y * block2;
02565   nz = block3;
02566   if ( (thisIndex.z+1)*block3 > dim3/2 ) nz = dim3/2 - thisIndex.z*block3;
02567 
02568   data = new float[K1*block2*block3*2];
02569   work = new float[2*K1];
02570 
02571   order_init(initdata.xBlocks);
02572 
02573 #ifdef NAMD_FFTW
02574   CmiLock(ComputePmeMgr::fftw_plan_lock);
02575 
02576   forward_plan = fftw_create_plan_specific(K1, FFTW_FORWARD,
02577         ( simParams->FFTWEstimate ? FFTW_ESTIMATE : FFTW_MEASURE )
02578         | FFTW_IN_PLACE | FFTW_USE_WISDOM, (fftw_complex *) data,
02579         ny*nz, (fftw_complex *) work, 1);
02580   backward_plan = fftw_create_plan_specific(K1, FFTW_BACKWARD,
02581         ( simParams->FFTWEstimate ? FFTW_ESTIMATE : FFTW_MEASURE )
02582         | FFTW_IN_PLACE | FFTW_USE_WISDOM, (fftw_complex *) data,
02583         ny*nz, (fftw_complex *) work, 1);
02584 
02585   CmiUnlock(ComputePmeMgr::fftw_plan_lock);
02586 #else
02587   NAMD_die("Sorry, FFTW must be compiled in to use PME.");
02588 #endif
02589 
02590   myKSpace = new PmeKSpace(initdata.grid,
02591                 thisIndex.y*block2, thisIndex.y*block2 + ny,
02592                 thisIndex.z*block3, thisIndex.z*block3 + nz);
02593 }

void PmeXPencil::forward_fft  ) 
 

Definition at line 2815 of file ComputePme.C.

References forward_plan, ny, and nz.

02815                              {
02816 #ifdef NAMD_FFTW
02817   fftw(forward_plan, ny*nz,
02818         ((fftw_complex *) data), ny*nz, 1, (fftw_complex *) work, 1, 0);
02819 #endif
02820 }

void PmeXPencil::pme_kspace  ) 
 

Definition at line 2822 of file ComputePme.C.

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

02822                             {
02823 
02824   evir = 0.;
02825 
02826 #ifdef FFTCHECK
02827   return;
02828 #endif
02829 
02830   BigReal ewaldcof = ComputeNonbondedUtil::ewaldcof;
02831 
02832   int numGrids = 1;
02833   for ( int g=0; g<numGrids; ++g ) {
02834     evir[0] = myKSpace->compute_energy(data+0*g,
02835                 lattice, ewaldcof, &(evir[1]));
02836   }
02837 
02838 }

void PmeXPencil::recv_trans const PmeTransMsg  ) 
 

Definition at line 2778 of file ComputePme.C.

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

02778                                                   {
02779   if ( imsg == 0 ) {
02780     lattice = msg->lattice;
02781     sequence = msg->sequence;
02782   }
02783   int block1 = initdata.grid.block1;
02784   int K1 = initdata.grid.K1;
02785   int ib = msg->sourceNode;
02786   int nx = msg->nx;
02787  if ( msg->hasData ) {
02788   const float *md = msg->qgrid;
02789   for ( int i=ib*block1; i<(ib*block1+nx); ++i ) {
02790    float *d = data + i*ny*nz*2;
02791    for ( int j=0; j<ny; ++j, d += nz*2 ) {
02792     for ( int k=0; k<nz; ++k ) {
02793 #ifdef ZEROCHECK
02794       if ( (*md) == 0. ) CkPrintf("0 in YX at %d %d %d %d %d %d %d %d %d\n",
02795         ib, thisIndex.y, thisIndex.z, i, j, k, nx, ny, nz);
02796 #endif
02797       d[2*k] = *(md++);
02798       d[2*k+1] = *(md++);
02799     }
02800    }
02801   }
02802  } else {
02803   for ( int i=ib*block1; i<(ib*block1+nx); ++i ) {
02804    float *d = data + i*ny*nz*2;
02805    for ( int j=0; j<ny; ++j, d += nz*2 ) {
02806     for ( int k=0; k<nz; ++k ) {
02807       d[2*k] = 0;
02808       d[2*k+1] = 0;
02809     }
02810    }
02811   }
02812  }
02813 }

void PmeXPencil::send_untrans  ) 
 

Definition at line 2847 of file ComputePme.C.

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

02847                               {
02848   int xBlocks = initdata.xBlocks;
02849   int block1 = initdata.grid.block1;
02850   int K1 = initdata.grid.K1;
02851   int send_evir = 1;
02852   for ( int isend=0; isend<xBlocks; ++isend ) {
02853     int ib = send_order[isend];
02854     if ( ! needs_reply[ib] ) continue;
02855     int nx = block1;
02856     if ( (ib+1)*block1 > K1 ) nx = K1 - ib*block1;
02857     PmeUntransMsg *msg = new (nx*ny*nz*2,send_evir,PRIORITY_SIZE) PmeUntransMsg;
02858     if ( send_evir ) {
02859       msg->evir[0] = evir;
02860       msg->has_evir = 1;
02861       send_evir = 0;
02862     } else {
02863       msg->has_evir = 0;
02864     }
02865     msg->sourceNode = thisIndex.y;
02866     msg->ny = ny;
02867     float *md = msg->qgrid;
02868     for ( int i=ib*block1; i<(ib*block1+nx); ++i ) {
02869      float *d = data + i*ny*nz*2;
02870      for ( int j=0; j<ny; ++j, d += nz*2 ) {
02871       for ( int k=0; k<nz; ++k ) {
02872         *(md++) = d[2*k];
02873         *(md++) = d[2*k+1];
02874       }
02875      }
02876     }
02877     SET_PRIORITY(msg,sequence,PME_UNTRANS_PRIORITY)
02878     initdata.yPencil(ib,0,thisIndex.z).recvUntrans(msg);
02879   }
02880 }


Member Data Documentation

fftw_plan PmeXPencil::backward_plan
 

Definition at line 2468 of file ComputePme.C.

Referenced by backward_fft(), and fft_init().

fftw_plan PmeXPencil::forward_plan
 

Definition at line 2468 of file ComputePme.C.

Referenced by fft_init(), and forward_fft().

PmeKSpace* PmeXPencil::myKSpace
 

Definition at line 2471 of file ComputePme.C.

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

int PmeXPencil::ny
 

Definition at line 2470 of file ComputePme.C.

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

int PmeXPencil::nz
 

Definition at line 2470 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 Mon Nov 23 05:00:06 2009 for NAMD by  doxygen 1.3.9.1