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

PmeZPencil Class Reference

Inheritance diagram for PmeZPencil:

PmePencil< CBase_PmeZPencil > CBase_PmeZPencil List of all members.

Public Member Functions

PmeZPencil_SDAG_CODE PmeZPencil ()
 PmeZPencil (CkMigrateMessage *)
void fft_init ()
void recv_grid (const PmeGridMsg *)
void forward_fft ()
void send_trans ()
void recv_untrans (const PmeUntransMsg *)
void backward_fft ()
void send_ungrid (PmeGridMsg *)

Constructor & Destructor Documentation

PmeZPencil_SDAG_CODE PmeZPencil::PmeZPencil  )  [inline]
 

Definition at line 2396 of file ComputePme.C.

02396 { __sdag_init(); setMigratable(false); }

PmeZPencil::PmeZPencil CkMigrateMessage *   )  [inline]
 

Definition at line 2397 of file ComputePme.C.

02397 { __sdag_init();  setMigratable (false); }


Member Function Documentation

void PmeZPencil::backward_fft  ) 
 

Definition at line 2959 of file ComputePme.C.

References PmeGrid::dim3, PmePencilInitMsgData::grid, PmeGrid::K1, PmeGrid::K2, and PmeGrid::K3.

02959                               {
02960 #ifdef NAMD_FFTW
02961   rfftwnd_complex_to_real(backward_plan, nx*ny,
02962             (fftw_complex *) data, 1, initdata.grid.dim3/2, work, 1, 0);
02963 #endif
02964   
02965 #if CMK_VERSION_BLUEGENE
02966   CmiNetworkProgress();
02967 #endif
02968 
02969 #ifdef FFTCHECK
02970   int dim3 = initdata.grid.dim3;
02971   int K1 = initdata.grid.K1;
02972   int K2 = initdata.grid.K2;
02973   int K3 = initdata.grid.K3;
02974   float scale = 1. / (1. * K1 * K2 * K3);
02975   float maxerr = 0.;
02976   float maxstd = 0.;
02977   int mi, mj, mk;  mi = mj = mk = -1;
02978   float std_base = 100. * (thisIndex.x+1.) + 10. * (thisIndex.y+1.);
02979   const float *d = data;
02980   for ( int i=0; i<nx; ++i ) {
02981    for ( int j=0; j<ny; ++j, d += dim3 ) {
02982     for ( int k=0; k<K3; ++k ) {
02983       float std = 10. * (10. * (10. * std_base + i) + j) + k;
02984       float err = scale * d[k] - std;
02985       if ( fabsf(err) > fabsf(maxerr) ) {
02986         maxerr = err;
02987         maxstd = std;
02988         mi = i;  mj = j;  mk = k;
02989       }
02990     }
02991    }
02992   }
02993   CkPrintf("pencil %d %d max error %f at %d %d %d (should be %f)\n",
02994                 thisIndex.x, thisIndex.y, maxerr, mi, mj, mk, maxstd);
02995 #endif
02996 }

void PmeZPencil::fft_init  ) 
 

Definition at line 2450 of file ComputePme.C.

References PmeGrid::block1, PmeGrid::block2, PmeGrid::dim3, SimParameters::FFTWEstimate, PmePencilInitMsgData::grid, PmeGrid::K1, PmeGrid::K2, PmeGrid::K3, NAMD_die(), PmePencil< CBase_PmeZPencil >::order_init(), Node::simParameters, simParams, and PmePencilInitMsgData::zBlocks.

02450                           {
02451   CProxy_Node nd(CpvAccess(BOCclass_group).node);
02452   Node *node = nd.ckLocalBranch();
02453   SimParameters *simParams = node->simParameters;
02454 
02455   int K1 = initdata.grid.K1;
02456   int K2 = initdata.grid.K2;
02457   int K3 = initdata.grid.K3;
02458   int dim3 = initdata.grid.dim3;
02459   int block1 = initdata.grid.block1;
02460   int block2 = initdata.grid.block2;
02461 
02462   nx = block1;
02463   if ( (thisIndex.x + 1) * block1 > K1 ) nx = K1 - thisIndex.x * block1;
02464   ny = block2;
02465   if ( (thisIndex.y + 1) * block2 > K2 ) ny = K2 - thisIndex.y * block2;
02466 
02467   data = new float[nx*ny*dim3];
02468   work = new float[dim3];
02469 
02470   order_init(initdata.zBlocks);
02471 
02472 #ifdef NAMD_FFTW
02473   CmiLock(ComputePmeMgr::fftw_plan_lock);
02474 
02475   forward_plan = rfftwnd_create_plan_specific(1, &K3, FFTW_REAL_TO_COMPLEX,
02476         ( simParams->FFTWEstimate ? FFTW_ESTIMATE : FFTW_MEASURE )
02477         | FFTW_IN_PLACE | FFTW_USE_WISDOM, data, 1, work, 1);
02478   backward_plan = rfftwnd_create_plan_specific(1, &K3, FFTW_COMPLEX_TO_REAL,
02479         ( simParams->FFTWEstimate ? FFTW_ESTIMATE : FFTW_MEASURE )
02480         | FFTW_IN_PLACE | FFTW_USE_WISDOM, data, 1, work, 1);
02481 
02482   CmiUnlock(ComputePmeMgr::fftw_plan_lock);
02483 #else
02484   NAMD_die("Sorry, FFTW must be compiled in to use PME.");
02485 #endif
02486 }

void PmeZPencil::forward_fft  ) 
 

Definition at line 2604 of file ComputePme.C.

References PmeGrid::dim3, PmePencilInitMsgData::grid, and PmeGrid::K3.

02604                              {
02605 #ifdef FFTCHECK
02606   int dim3 = initdata.grid.dim3;
02607   int K3 = initdata.grid.K3;
02608   float std_base = 100. * (thisIndex.x+1.) + 10. * (thisIndex.y+1.);
02609   float *d = data;
02610   for ( int i=0; i<nx; ++i ) {
02611    for ( int j=0; j<ny; ++j, d += dim3 ) {
02612     for ( int k=0; k<dim3; ++k ) {
02613       d[k] = 10. * (10. * (10. * std_base + i) + j) + k;
02614     }
02615    }
02616   }
02617 #endif
02618 #ifdef NAMD_FFTW
02619   rfftwnd_real_to_complex(forward_plan, nx*ny,
02620         data, 1, initdata.grid.dim3, (fftw_complex *) work, 1, 0);
02621 #endif
02622 #ifdef ZEROCHECK
02623   int dim3 = initdata.grid.dim3;
02624   int K3 = initdata.grid.K3;
02625   float *d = data;
02626   for ( int i=0; i<nx; ++i ) {
02627    for ( int j=0; j<ny; ++j, d += dim3 ) {
02628     for ( int k=0; k<dim3; ++k ) {
02629       if ( d[k] == 0. ) CkPrintf("0 in Z at %d %d %d %d %d %d %d %d %d\n",
02630         thisIndex.x, thisIndex.y, i, j, k, nx, ny, dim3);
02631     }
02632    }
02633   }
02634 #endif
02635 }

void PmeZPencil::recv_grid const PmeGridMsg  ) 
 

Definition at line 2574 of file ComputePme.C.

References PmeGrid::dim3, PmeGridMsg::fgrid, PmePencilInitMsgData::grid, PmeGridMsg::hasData, PmeGridMsg::lattice, PmeGridMsg::qgrid, PmeGridMsg::sequence, PmeGridMsg::zlist, and PmeGridMsg::zlistlen.

02574                                                 {
02575 
02576   int dim3 = initdata.grid.dim3;
02577   if ( imsg == 0 ) {
02578     lattice = msg->lattice;
02579     sequence = msg->sequence;
02580     memset(data, 0, sizeof(float) * nx*ny*dim3);
02581   }
02582 
02583   if ( ! msg->hasData ) return;
02584 
02585   int zlistlen = msg->zlistlen;
02586   int *zlist = msg->zlist;
02587   char *fmsg = msg->fgrid;
02588   float *qmsg = msg->qgrid;
02589   float *d = data;
02590   int numGrids = 1;  // pencil FFT doesn't support multiple grids
02591   for ( int g=0; g<numGrids; ++g ) {
02592     for ( int i=0; i<nx; ++i ) {
02593      for ( int j=0; j<ny; ++j, d += dim3 ) {
02594       if( *(fmsg++) ) {
02595         for ( int k=0; k<zlistlen; ++k ) {
02596           d[zlist[k]] += *(qmsg++);
02597         }
02598       }
02599      }
02600     }
02601   }
02602 }

void PmeZPencil::recv_untrans const PmeUntransMsg  ) 
 

Definition at line 2933 of file ComputePme.C.

References PmeGrid::block3, PmeGrid::dim3, PmeUntransMsg::evir, PmePencilInitMsgData::grid, PmeUntransMsg::has_evir, PmeUntransMsg::ny, PmeUntransMsg::qgrid, and PmeUntransMsg::sourceNode.

02933                                                       {
02934   if ( imsg == 0 ) evir = 0.;
02935   if ( msg->has_evir ) evir += msg->evir[0];
02936   int block3 = initdata.grid.block3;
02937   int dim3 = initdata.grid.dim3;
02938   int kb = msg->sourceNode;
02939   int nz = msg->ny;
02940   const float *md = msg->qgrid;
02941   float *d = data;
02942   for ( int i=0; i<nx; ++i ) {
02943 #if CMK_VERSION_BLUEGENE
02944     CmiNetworkProgress();
02945 #endif   
02946     for ( int j=0; j<ny; ++j, d += dim3 ) {
02947       for ( int k=kb*block3; k<(kb*block3+nz); ++k ) {
02948 #ifdef ZEROCHECK
02949         if ( (*md) == 0. ) CkPrintf("0 in YZ at %d %d %d %d %d %d %d %d %d\n",
02950                                     thisIndex.x, thisIndex.y, kb, i, j, k, nx, ny, nz);
02951 #endif
02952         d[2*k] = *(md++);
02953         d[2*k+1] = *(md++);
02954       }
02955     }
02956   }
02957 }

void PmeZPencil::send_trans  ) 
 

Definition at line 2637 of file ComputePme.C.

References PmeGrid::block3, PmeGrid::dim3, PmePencilInitMsgData::grid, PmeTransMsg::hasData, PmeTransMsg::lattice, PmeTransMsg::nx, PME_TRANS_PRIORITY, PmeTransMsg::qgrid, PmeTransMsg::sequence, SET_PRIORITY, PmeTransMsg::sourceNode, PmePencilInitMsgData::yPencil, and PmePencilInitMsgData::zBlocks.

02637                             {
02638   int zBlocks = initdata.zBlocks;
02639   int block3 = initdata.grid.block3;
02640   int dim3 = initdata.grid.dim3;
02641   for ( int isend=0; isend<zBlocks; ++isend ) {
02642     int kb = send_order[isend];
02643     int nz = block3;
02644     if ( (kb+1)*block3 > dim3/2 ) nz = dim3/2 - kb*block3;
02645     int hd = ( hasData ? 1 : 0 );
02646     PmeTransMsg *msg = new (hd*nx*ny*nz*2,PRIORITY_SIZE) PmeTransMsg;
02647     msg->lattice = lattice;
02648     msg->sourceNode = thisIndex.y;
02649     msg->hasData = hasData;
02650     msg->nx = ny;
02651    if ( hasData ) {
02652     float *md = msg->qgrid;
02653     const float *d = data;
02654     for ( int i=0; i<nx; ++i ) {
02655      for ( int j=0; j<ny; ++j, d += dim3 ) {
02656       for ( int k=kb*block3; k<(kb*block3+nz); ++k ) {
02657         *(md++) = d[2*k];
02658         *(md++) = d[2*k+1];
02659       }
02660      }
02661     }
02662    }
02663     msg->sequence = sequence;
02664     SET_PRIORITY(msg,sequence,PME_TRANS_PRIORITY)
02665     initdata.yPencil(thisIndex.x,0,kb).recvTrans(msg);
02666   }
02667 }

void PmeZPencil::send_ungrid PmeGridMsg  ) 
 

Definition at line 2998 of file ComputePme.C.

References PmeGrid::dim3, PmeGridMsg::fgrid, PmePencilInitMsgData::grid, PME_UNGRID_PRIORITY, PmePencilInitMsgData::pmeProxy, PmeGridMsg::qgrid, SET_PRIORITY, PmeGridMsg::sourceNode, PmePencilInitMsgData::yBlocks, PmeGridMsg::zlist, and PmeGridMsg::zlistlen.

02998                                             {
02999   int pe = msg->sourceNode;
03000   msg->sourceNode = thisIndex.x * initdata.yBlocks + thisIndex.y;
03001   int dim3 = initdata.grid.dim3;
03002   int zlistlen = msg->zlistlen;
03003   int *zlist = msg->zlist;
03004   char *fmsg = msg->fgrid;
03005   float *qmsg = msg->qgrid;
03006   float *d = data;
03007   int numGrids = 1;  // pencil FFT doesn't support multiple grids
03008   for ( int g=0; g<numGrids; ++g ) {
03009 #if CMK_VERSION_BLUEGENE
03010     CmiNetworkProgress();
03011 #endif    
03012     for ( int i=0; i<nx; ++i ) {
03013       for ( int j=0; j<ny; ++j, d += dim3 ) {
03014         if( *(fmsg++) ) {
03015           for ( int k=0; k<zlistlen; ++k ) {
03016             *(qmsg++) = d[zlist[k]];
03017           }
03018         }
03019       }
03020     }
03021   }
03022 
03023   SET_PRIORITY(msg,sequence,PME_UNGRID_PRIORITY)
03024   initdata.pmeProxy[pe].recvUngrid(msg);
03025 }


The documentation for this class was generated from the following file:
Generated on Fri Jul 4 04:07:20 2008 for NAMD by  doxygen 1.3.9.1