Inheritance diagram for PmeZPencil:

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 *) |
|
|
Definition at line 2396 of file ComputePme.C. 02396 { __sdag_init(); setMigratable(false); }
|
|
|
Definition at line 2397 of file ComputePme.C. 02397 { __sdag_init(); setMigratable (false); }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
1.3.9.1