#include <fftlib.h>
Inheritance diagram for OptPmeXPencil:

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 |
| PmeKSpace * | myKSpace |
| CkCallbackWrapper | cbw_recvtrans |
| bool | constant_pressure |
|
|
Definition at line 165 of file fftlib.h. References myKSpace. 00165 { __sdag_init(); myKSpace = 0; setMigratable(false); }
|
|
|
Definition at line 166 of file fftlib.h. 00166 { __sdag_init(); }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
Definition at line 176 of file fftlib.h. Referenced by backward_fft(), and fft_init(). |
|
|
Definition at line 180 of file fftlib.h. Referenced by initialize_manytomany(). |
|
|
Definition at line 181 of file fftlib.h. Referenced by fft_init(). |
|
|
Definition at line 176 of file fftlib.h. Referenced by fft_init(), and forward_fft(). |
|
|
Definition at line 179 of file fftlib.h. Referenced by fft_init(), OptPmeXPencil(), and pme_kspace(). |
|
|
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(). |
|
|
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(). |
1.3.9.1