NAMD
PmeSolver.C
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <iomanip>
3 #include "Priorities.h"
4 #if !(defined(NAMD_HIP) || defined(NAMD_CUDA))
5 struct float2 {float x,y;};
6 #endif
7 #include "PmeSolver.h"
8 #include "PatchData.h"
9 
10 //
11 // Data flow for PmePencilXYZ
12 //
13 // dataSrc [xyz] dataDst
14 //
15 // dataDst [solve] dataDst
16 //
17 // dataDst [xyz] dataSrc
18 //
19 // dataSrc [force]
20 //
21 
23  __sdag_init();
24  setMigratable(false);
25  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
26  pmeKSpaceComputes[iGrid] = NULL;
27  fftComputes[iGrid] = NULL;
28  }
30 // multipleGridLock = CmiCreateLock();
31  doEnergy = false;
32  doVirial = false;
33  simulationStep = 0;
34 }
35 
36 PmePencilXYZ::PmePencilXYZ(CkMigrateMessage *m) {
37  NAMD_bug("PmePencilXYZ cannot be migrated");
38  //__sdag_init();
39  // setMigratable(false);
40  // fftCompute = NULL;
41  // pmeKSpaceCompute = NULL;
42  // reduction = ReductionMgr::Object()->willSubmit(REDUCTIONS_BASIC);
43 }
44 
46  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
47  if (pmeKSpaceComputes[iGrid] != NULL) delete pmeKSpaceComputes[iGrid];
48  if (fftComputes[iGrid] != NULL) delete fftComputes[iGrid];
49  }
50  delete reduction;
51 // CmiDestroyLock(multipleGridLock);
52 }
53 
54 void PmePencilXYZ::initFFT(PmeStartMsg *msg) {
55  if (fftComputes[0] == NULL)
56  NAMD_bug("PmePencilXYZ::initFFT, fftCompute not initialized");
57 // fftCompute->init(msg->dataGrid[0], msg->dataSizes[0], NULL, 0, Perm_X_Y_Z, pmeGrid, 3, 0, 0, 0);
58 // fftCompute2->init(msg->dataGrid[1], msg->dataSizes[1], NULL, 0, Perm_X_Y_Z, pmeGrid, 3, 0, 0, 0);
59  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
60  if (msg->enabledGrid[iGrid] == true) {
61  fftComputes[iGrid]->init(msg->dataGrid[iGrid], msg->dataSizes[iGrid], NULL, 0, Perm_X_Y_Z, pmeGrid, 3, 0, 0, 0);
62  }
63  }
64 }
65 
66 void PmePencilXYZ::forwardFFT() {
67  if (fftComputes[0] == NULL)
68  NAMD_bug("PmePencilXYZ::forwardFFT, fftCompute not initialized");
69  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
70  if (fftComputes[iGrid] != NULL) fftComputes[iGrid]->forward();
71  }
72 }
73 
74 void PmePencilXYZ::backwardFFT() {
75  if (fftComputes[0] == NULL)
76  NAMD_bug("PmePencilXYZ::backwardFFT, fftCompute not initialized");
77  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
78  if (fftComputes[iGrid] != NULL) fftComputes[iGrid]->backward();
79  }
80 }
81 
82 void PmePencilXYZ::forwardDone() {
83  if (pmeKSpaceComputes[0] == NULL)
84  NAMD_bug("PmePencilXYZ::forwardDone, pmeKSpaceCompute not initialized");
85  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
86  if (pmeKSpaceComputes[iGrid] != NULL && fftComputes[iGrid] != NULL)
87  pmeKSpaceComputes[iGrid]->solve(lattice, doEnergy, doVirial, fftComputes[iGrid]->getDataDst());
88  }
89 }
90 
92  NAMD_bug("PmePencilXYZ::backwardDone(), base class method called");
93 }
94 
95 void PmePencilXYZ::submitReductions(unsigned int iGrid) {
96 // fprintf(stderr, "PmePencilXYZ::submitReductions\n");
97  if (pmeKSpaceComputes[iGrid] == NULL)
98  NAMD_bug("PmePencilXYZ::submitReductions, pmeKSpaceCompute not initialized");
100  double virial[9];
101  double energy = pmeKSpaceComputes[iGrid]->getEnergy();
102  pmeKSpaceComputes[iGrid]->getVirial(virial);
103  if (simParams->alchOn) {
104  if (simParams->alchFepOn) {
105  double energy_F = energy;
106  double scale1 = 1.0; // energy scaling factor for λ_1
107  double scale2 = 1.0; // energy scaling factor for λ_2
108  switch (iGrid) {
109  case 0: {
110  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
111  const BigReal alchLambda2 = simParams->getCurrentLambda2(simulationStep);
112  const BigReal elecLambdaUp = simParams->getElecLambda(alchLambda);
113  const BigReal elecLambda2Up = simParams->getElecLambda(alchLambda2);
114  scale1 = elecLambdaUp;
115  scale2 = elecLambda2Up;
116  break;
117  }
118  case 1: {
119  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
120  const BigReal alchLambda2 = simParams->getCurrentLambda2(simulationStep);
121  const BigReal elecLambdaDown = simParams->getElecLambda(1 - alchLambda);
122  const BigReal elecLambda2Down = simParams->getElecLambda(1 - alchLambda2);
123  scale1 = elecLambdaDown;
124  scale2 = elecLambda2Down;
125  break;
126  }
127  case 2: {
128  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
129  const BigReal alchLambda2 = simParams->getCurrentLambda2(simulationStep);
130  const BigReal elecLambdaUp = simParams->getElecLambda(alchLambda);
131  const BigReal elecLambda2Up = simParams->getElecLambda(alchLambda2);
132  scale1 = 1.0 - elecLambdaUp;
133  scale2 = 1.0 - elecLambda2Up;
134  break;
135  }
136  case 3: {
137  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
138  const BigReal alchLambda2 = simParams->getCurrentLambda2(simulationStep);
139  const BigReal elecLambdaDown = simParams->getElecLambda(1 - alchLambda);
140  const BigReal elecLambda2Down = simParams->getElecLambda(1 - alchLambda2);
141  scale1 = 1.0 - elecLambdaDown;
142  scale2 = 1.0 - elecLambda2Down;
143  break;
144  }
145  case 4: {
146  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
147  const BigReal alchLambda2 = simParams->getCurrentLambda2(simulationStep);
148  const BigReal elecLambdaUp = simParams->getElecLambda(alchLambda);
149  const BigReal elecLambda2Up = simParams->getElecLambda(alchLambda2);
150  const BigReal elecLambdaDown = simParams->getElecLambda(1 - alchLambda);
151  const BigReal elecLambda2Down = simParams->getElecLambda(1 - alchLambda2);
152  scale1 = -1.0 * (elecLambdaUp + elecLambdaDown - 1.0);
153  scale2 = -1.0 * (elecLambda2Up + elecLambda2Down - 1.0);
154  break;
155  }
156  }
157  energy *= scale1;
158  energy_F *= scale2;
159 // fprintf(stdout, "KSpace Grid %u ; E1 = %lf ; E2 = %lf ; scale1 = %lf ; scale2 = %lf\n", iGrid, energy, energy_F, scale1, scale2);
160  for (size_t i = 0; i < 9; ++i) {
161  virial[i] *= scale1;
162  }
163  reduction->item(REDUCTION_ELECT_ENERGY_SLOW_F) += energy_F;
164  }
165  if (simParams->alchThermIntOn) {
166  double energy_TI_1 = 0.0;
167  double energy_TI_2 = 0.0;
168  double scale1 = 1.0;
169  switch (iGrid) {
170  case 0: {
171  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
172  const BigReal elecLambdaUp = simParams->getElecLambda(alchLambda);
173  scale1 = elecLambdaUp;
174  energy_TI_1 = energy;
175  break;
176  }
177  case 1: {
178  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
179  const BigReal elecLambdaDown = simParams->getElecLambda(1 - alchLambda);
180  scale1 = elecLambdaDown;
181  energy_TI_2 = energy;
182  break;
183  }
184  case 2: {
185  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
186  const BigReal elecLambdaUp = simParams->getElecLambda(alchLambda);
187  scale1 = 1.0 - elecLambdaUp;
188  energy_TI_1 = -1.0 * energy;
189  break;
190  }
191  case 3: {
192  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
193  const BigReal elecLambdaDown = simParams->getElecLambda(1 - alchLambda);
194  scale1 = 1.0 - elecLambdaDown;
195  energy_TI_2 = -1.0 * energy;
196  break;
197  }
198  case 4: {
199  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
200  const BigReal elecLambdaUp = simParams->getElecLambda(alchLambda);
201  const BigReal elecLambdaDown = simParams->getElecLambda(1 - alchLambda);
202  scale1 = -1.0 * (elecLambdaUp + elecLambdaDown - 1.0);
203  energy_TI_1 = -1.0 * energy;
204  energy_TI_2 = -1.0 * energy;
205  break;
206  }
207  }
208  for (size_t i = 0; i < 9; ++i) {
209  virial[i] *= scale1;
210  }
211  energy *= scale1;
212 // fprintf(stdout, "Grid %u : energy_TI_1 = %lf ; energy_TI_2 = %lf\n", iGrid, energy_TI_1, energy_TI_2);
213  reduction->item(REDUCTION_ELECT_ENERGY_SLOW_TI_1) += energy_TI_1;
214  reduction->item(REDUCTION_ELECT_ENERGY_SLOW_TI_2) += energy_TI_2;
215  }
216  }
217  reduction->item(REDUCTION_ELECT_ENERGY_SLOW) += energy;
218  reduction->item(REDUCTION_VIRIAL_SLOW_XX) += virial[0];
219  reduction->item(REDUCTION_VIRIAL_SLOW_XY) += virial[1];
220  reduction->item(REDUCTION_VIRIAL_SLOW_XZ) += virial[2];
221  reduction->item(REDUCTION_VIRIAL_SLOW_YX) += virial[3];
222  reduction->item(REDUCTION_VIRIAL_SLOW_YY) += virial[4];
223  reduction->item(REDUCTION_VIRIAL_SLOW_YZ) += virial[5];
224  reduction->item(REDUCTION_VIRIAL_SLOW_ZX) += virial[6];
225  reduction->item(REDUCTION_VIRIAL_SLOW_ZY) += virial[7];
226  reduction->item(REDUCTION_VIRIAL_SLOW_ZZ) += virial[8];
228  energyReady[iGrid] = 1;
229 // CmiLock(multipleGridLock);
230  bool ready_to_submit = true;
231  for (size_t i = 0; i < NUM_GRID_MAX; ++i) {
232  if (energyReady[i] == -1) continue;
233  if (energyReady[i] == 0) ready_to_submit = false;
234  }
235  if (ready_to_submit) {
236 // fprintf(stdout, "all energy ready\n");
237  reduction->submit();
238  for (size_t i = 0; i < NUM_GRID_MAX; ++i) {
239  if (energyReady[i] == -1) continue;
240  if (energyReady[i] == 1) energyReady[i] = 0;
241  }
242  }
243 // CmiUnlock(multipleGridLock);
244 }
245 
247  reduction->submit();
248 }
249 
250 //###########################################################################
251 //###########################################################################
252 //###########################################################################
253 
254 //
255 // Data flow for PmePencilXY & PmePencilZ
256 //
257 // dataSrc(XY) [xy] dataDst(XY)
258 //
259 // dataDst(XY) [transp] dataSrc(Z)
260 //---------------------------------
261 //
262 // dataSrc(Z) [z] dataDst(Z)
263 //
264 // dataDst(Z) [solve] dataDst(Z)
265 //
266 // dataDst(Z) [z] dataSrc(Z)
267 //
268 // dataSrc(Z) [transp] dataDst(XY)
269 //---------------------------------
270 //
271 // dataDst(XY) [xy] dataSrc(XY)
272 //
273 // dataSrc(XY) [force]
274 //
275 
277  __sdag_init();
278  setMigratable(false);
279  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
280  pmeTransposes[iGrid] = NULL;
281  fftComputes[iGrid] = NULL;
282  }
283 }
284 
285 PmePencilXY::PmePencilXY(CkMigrateMessage *m) {
286  NAMD_bug("PmePencilXY cannot be migrated");
287 //__sdag_init();
288  // setMigratable(false);
289  // fftCompute = NULL;
290  // pmeTranspose = NULL;
291 }
292 
294 // if (fftCompute != NULL) delete fftCompute;
295 // if (pmeTranspose != NULL) delete pmeTranspose;
296 // if (fftCompute2 != NULL) delete fftCompute2;
297 // if (pmeTranspose2 != NULL) delete pmeTranspose2;
298  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
299  if (pmeTransposes[iGrid] != NULL) delete pmeTransposes[iGrid];
300  if (fftComputes[iGrid] != NULL) delete fftComputes[iGrid];
301  }
302 }
303 
304 void PmePencilXY::initFFT(PmeStartMsg *msg) {
305  if (fftComputes[0] == NULL)
306  NAMD_bug("PmePencilXY::initFFT, fftCompute not initialized");
307 // fftCompute->init(msg->dataGrid[0], msg->dataSizes[0], NULL, 0, Perm_X_Y_Z, pmeGrid, 2, 0, thisIndex.z, 0);
308 // fftCompute2->init(msg->dataGrid[1], msg->dataSizes[1], NULL, 0, Perm_X_Y_Z, pmeGrid, 2, 0, thisIndex.z, 0);
309  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
310  if (msg->enabledGrid[iGrid] == true) {
311  fftComputes[iGrid]->init(msg->dataGrid[iGrid], msg->dataSizes[iGrid], NULL, 0, Perm_X_Y_Z, pmeGrid, 2, 0, thisIndex.z, 0);
312  }
313  }
314 }
315 
316 void PmePencilXY::forwardFFT() {
317  if (fftComputes[0] == NULL)
318  NAMD_bug("PmePencilXY::forwardFFT, fftCompute not initialized");
319  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
320  if (fftComputes[iGrid] != NULL) fftComputes[iGrid]->forward();
321  }
322 }
323 
324 void PmePencilXY::backwardFFT() {
325  if (fftComputes[0] == NULL)
326  NAMD_bug("PmePencilXY::backwardFFT, fftCompute not initialized");
327  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
328  if (fftComputes[iGrid] != NULL) fftComputes[iGrid]->backward();
329  }
330 }
331 
333  blockSizes.resize(pmeGrid.xBlocks);
334  for (int x=0;x < pmeGrid.xBlocks;x++) {
335  int i0, i1, j0, j1, k0, k1;
336  getBlockDim(pmeGrid, Perm_cX_Y_Z, x, 0, thisIndex.z,
337  i0, i1, j0, j1, k0, k1);
338  int size = (i1-i0+1)*(j1-j0+1)*(k1-k0+1);
339  blockSizes[x] = size;
340  }
341 }
342 
343 void PmePencilXY::forwardDone() {
344  NAMD_bug("PmePencilXY::forwardDone(), base class method called");
345 }
346 
347 void PmePencilXY::backwardDone() {
348  NAMD_bug("PmePencilXY::backwardDone(), base class method called");
349 }
350 
351 void PmePencilXY::recvDataFromZ(PmeBlockMsg *msg) {
352  NAMD_bug("PmePencilXY::recvDataFromZ(), base class method called");
353 }
354 
355 void PmePencilXY::start(const CkCallback &) {
356  NAMD_bug("PmePencilXY::start(), base class method called");
357 }
358 
359 //###########################################################################
360 //###########################################################################
361 //###########################################################################
362 
363 //
364 // Data flow for PmePencilX & PmePencilX & PmePencilZ
365 //
366 // dataSrc(X) [x] dataDst(X)
367 //
368 // dataDst(X) [transp] dataSrc(Y)
369 //---------------------------------
370 //
371 // dataSrc(Y) [y] dataDst(Y)
372 //
373 // dataDst(Y) [transp] dataSrc(Z)
374 //---------------------------------
375 //
376 // dataSrc(Z) [z] dataDst(Z)
377 //
378 // dataDst(Z) [solve] dataDst(Z)
379 //
380 // dataDst(Z) [z] dataSrc(Z)
381 //
382 // dataSrc(Z) [transp] dataDst(Y)
383 //---------------------------------
384 //
385 // dataDst(Y) [y] dataSrc(Y)
386 //
387 // dataSrc(Y) [transp] dataDst(X)
388 //---------------------------------
389 //
390 // dataDst(X) [x] dataSrc(X)
391 //
392 // dataSrc(X) [force]
393 //
394 
396  __sdag_init();
397  setMigratable(false);
398  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
399  pmeTransposes[iGrid] = NULL;
400  fftComputes[iGrid] = NULL;
401  }
402  numStrayAtoms = 0;
403 }
404 
405 PmePencilX::PmePencilX(CkMigrateMessage *m) {
406  NAMD_bug("PmePencilX cannot be migrated");
407 //__sdag_init();
408  // setMigratable(false);
409  // fftCompute = NULL;
410  // pmeTranspose = NULL;
411 }
412 
414  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
415  if (pmeTransposes[iGrid] != NULL) delete pmeTransposes[iGrid];
416  if (fftComputes[iGrid] != NULL) delete fftComputes[iGrid];
417  }
418 }
419 
420 void PmePencilX::initFFT(PmeStartMsg *msg) {
421  if (fftComputes[0] == NULL)
422  NAMD_bug("PmePencilX::initFFT, fftCompute not initialized");
423 // fftCompute->init(msg->dataGrid[0], msg->dataSizes[0], NULL, 0, Perm_X_Y_Z, pmeGrid, 1, thisIndex.y, thisIndex.z, 0);
424 // fftCompute2->init(msg->dataGrid[1], msg->dataSizes[1], NULL, 0, Perm_X_Y_Z, pmeGrid, 1, thisIndex.y, thisIndex.z, 0);
425  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
426  if (msg->enabledGrid[iGrid] == true) {
427  fftComputes[iGrid]->init(msg->dataGrid[iGrid], msg->dataSizes[iGrid], NULL, 0, Perm_X_Y_Z, pmeGrid, 1, thisIndex.y, thisIndex.z, 0);
428  }
429  }
430 }
431 
432 void PmePencilX::forwardFFT() {
433  if (fftComputes[0] == NULL)
434  NAMD_bug("PmePencilX::forwardFFT, fftCompute not initialized");
435  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
436  if (fftComputes[iGrid] != NULL) fftComputes[iGrid]->forward();
437  }
438 }
439 
440 void PmePencilX::backwardFFT() {
441  if (fftComputes[0] == NULL)
442  NAMD_bug("PmePencilX::backwardFFT, fftCompute not initialized");
443  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
444  if (fftComputes[iGrid] != NULL) fftComputes[iGrid]->backward();
445  }
446 }
447 
449  blockSizes.resize(pmeGrid.xBlocks);
450  for (int x=0;x < pmeGrid.xBlocks;x++) {
451  int i0, i1, j0, j1, k0, k1;
452  getBlockDim(pmeGrid, Perm_cX_Y_Z, x, thisIndex.y, thisIndex.z,
453  i0, i1, j0, j1, k0, k1);
454  int size = (i1-i0+1)*(j1-j0+1)*(k1-k0+1);
455  blockSizes[x] = size;
456  }
457 }
458 
459 void PmePencilX::forwardDone() {
460  NAMD_bug("PmePencilX::forwardDone(), base class method called");
461 }
462 
463 void PmePencilX::backwardDone() {
464  NAMD_bug("PmePencilX::backwardDone(), base class method called");
465 }
466 
467 void PmePencilX::recvDataFromY(PmeBlockMsg *msg) {
468  NAMD_bug("PmePencilX::recvDataFromY(), base class method called");
469 }
470 
471 void PmePencilX::start(const CkCallback &) {
472  NAMD_bug("PmePencilX::start(), base class method called");
473 }
474 
475 //###########################################################################
476 //###########################################################################
477 //###########################################################################
478 
480  __sdag_init();
481  setMigratable(false);
482  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
483  pmeTransposes[iGrid] = NULL;
484  fftComputes[iGrid] = NULL;
485  }
486  numStrayAtoms = 0;
487 }
488 
489 PmePencilY::PmePencilY(CkMigrateMessage *m) {
490  NAMD_bug("PmePencilY cannot be migrated");
491  // __sdag_init();
492  // setMigratable(false);
493  // fftCompute = NULL;
494  // pmeTranspose = NULL;
495 }
496 
498  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
499  if (pmeTransposes[iGrid] != NULL) delete pmeTransposes[iGrid];
500  if (fftComputes[iGrid] != NULL) delete fftComputes[iGrid];
501  }
502 }
503 
504 void PmePencilY::initFFT(PmeStartMsg *msg) {
505  if (fftComputes[0] == NULL)
506  NAMD_bug("PmePencilY::initFFT, fftCompute not initialized");
507 // fftCompute->init(msg->dataGrid[0], msg->dataSizes[0], NULL, 0, Perm_Y_Z_cX, pmeGrid, 1, thisIndex.z, thisIndex.x, 0);
508 // fftCompute2->init(msg->dataGrid[1], msg->dataSizes[1], NULL, 0, Perm_Y_Z_cX, pmeGrid, 1, thisIndex.z, thisIndex.x, 0);
509  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
510  if (msg->enabledGrid[iGrid] == true) {
511  fftComputes[iGrid]->init(msg->dataGrid[iGrid], msg->dataSizes[iGrid], NULL, 0, Perm_Y_Z_cX, pmeGrid, 1, thisIndex.z, thisIndex.x, 0);
512  }
513  }
514 }
515 
516 void PmePencilY::forwardFFT() {
517  if (fftComputes[0] == NULL)
518  NAMD_bug("PmePencilY::forwardFFT, fftCompute not initialized");
519  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
520  if (fftComputes[iGrid] != NULL) fftComputes[iGrid]->forward();
521  }
522 }
523 
524 void PmePencilY::backwardFFT() {
525  if (fftComputes[0] == NULL)
526  NAMD_bug("PmePencilY::backwardFFT, fftCompute not initialized");
527  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
528  if (fftComputes[iGrid] != NULL) fftComputes[iGrid]->backward();
529  }
530 }
531 
533  blockSizes.resize(pmeGrid.yBlocks);
534  for (int y=0;y < pmeGrid.yBlocks;y++) {
535  int i0, i1, j0, j1, k0, k1;
536  getBlockDim(pmeGrid, Perm_Y_Z_cX, y, thisIndex.z, thisIndex.x,
537  i0, i1, j0, j1, k0, k1);
538  int size = (i1-i0+1)*(j1-j0+1)*(k1-k0+1);
539  blockSizes[y] = size;
540  }
541 }
542 
543 void PmePencilY::forwardDone() {
544  NAMD_bug("PmePencilY::forwardDone(), base class method called");
545 }
546 
547 void PmePencilY::backwardDone() {
548  NAMD_bug("PmePencilY::backwardDone(), base class method called");
549 }
550 
551 void PmePencilY::recvDataFromX(PmeBlockMsg *msg) {
552  NAMD_bug("PmePencilY::recvDataFromX(), base class method called");
553 }
554 
555 void PmePencilY::recvDataFromZ(PmeBlockMsg *msg) {
556  NAMD_bug("PmePencilY::recvDataFromZ(), base class method called");
557 }
558 
559 void PmePencilY::start(const CkCallback &) {
560  NAMD_bug("PmePencilY::start(), base class method called");
561 }
562 
563 //###########################################################################
564 //###########################################################################
565 //###########################################################################
566 
568  __sdag_init();
569  setMigratable(false);
570  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
571  pmeTransposes[iGrid] = NULL;
572  fftComputes[iGrid] = NULL;
573  pmeKSpaceComputes[iGrid] = NULL;
574  }
576  doEnergy = false;
577  doVirial = false;
578  numStrayAtoms = 0;
579 }
580 
581 PmePencilZ::PmePencilZ(CkMigrateMessage *m) {
582  NAMD_bug("PmePencilZ cannot be migrated");
583  //__sdag_init();
584  // setMigratable(false);
585  // fftCompute = NULL;
586  // pmeTranspose = NULL;
587 }
588 
590 // if (fftCompute != NULL) delete fftCompute;
591 // if (pmeTranspose != NULL) delete pmeTranspose;
592 // if (pmeKSpaceCompute != NULL) delete pmeKSpaceCompute;
593 // if (fftCompute2 != NULL) delete fftCompute2;
594 // if (pmeTranspose2 != NULL) delete pmeTranspose2;
595 // if (pmeKSpaceCompute2 != NULL) delete pmeKSpaceCompute2;
596  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
597  if (pmeTransposes[iGrid] != NULL) delete pmeTransposes[iGrid];
598  if (fftComputes[iGrid] != NULL) delete fftComputes[iGrid];
599  if (pmeKSpaceComputes[iGrid] != NULL) delete pmeKSpaceComputes[iGrid];
600  }
601  delete reduction;
602 }
603 
604 void PmePencilZ::initFFT(PmeStartMsg *msg) {
605  if (fftComputes[0] == NULL)
606  NAMD_bug("PmePencilZ::initFFT, fftCompute not initialized");
607 // fftCompute->init(msg->dataGrid[0], msg->dataSizes[0], NULL, 0, Perm_Z_cX_Y, pmeGrid, 1, thisIndex.x, thisIndex.y, 0);
608 // fftCompute2->init(msg->dataGrid[1], msg->dataSizes[1], NULL, 0, Perm_Z_cX_Y, pmeGrid, 1, thisIndex.x, thisIndex.y, 0);
609  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
610  if (msg->enabledGrid[iGrid] == true) {
611  fftComputes[iGrid]->init(msg->dataGrid[iGrid], msg->dataSizes[iGrid], NULL, 0, Perm_Z_cX_Y, pmeGrid, 1, thisIndex.x, thisIndex.y, 0);
612  }
613  }
614 }
615 
616 void PmePencilZ::forwardFFT() {
617  if (fftComputes[0] == NULL)
618  NAMD_bug("PmePencilZ::forwardFFT, fftCompute not initialized");
619  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
620  if (fftComputes[iGrid] != NULL) fftComputes[iGrid]->forward();
621  }
622 }
623 
624 void PmePencilZ::backwardFFT() {
625  if (fftComputes[0] == NULL)
626  NAMD_bug("PmePencilZ::backwardFFT, fftCompute not initialized");
627  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
628  if (fftComputes[iGrid] != NULL) fftComputes[iGrid]->backward();
629  }
630 }
631 
633  blockSizes.resize(pmeGrid.zBlocks);
634  for (int z=0;z < pmeGrid.zBlocks;z++) {
635  int i0, i1, j0, j1, k0, k1;
636  getBlockDim(pmeGrid, Perm_Z_cX_Y, z, thisIndex.x, thisIndex.y,
637  i0, i1, j0, j1, k0, k1);
638  int size = (i1-i0+1)*(j1-j0+1)*(k1-k0+1);
639  blockSizes[z] = size;
640  }
641 }
642 
643 void PmePencilZ::forwardDone() {
644  if (pmeKSpaceComputes[0] == NULL)
645  NAMD_bug("PmePencilZ::forwardDone, pmeKSpaceCompute not initialized");
646 // pmeKSpaceCompute->solve(lattice, doEnergy, doVirial, fftCompute->getDataDst());
647 // pmeKSpaceCompute2->solve(lattice, doEnergy, doVirial, fftCompute2->getDataDst());
648  for (unsigned int iGrid = 0; iGrid < NUM_GRID_MAX; ++iGrid) {
649  if (pmeKSpaceComputes[iGrid] != NULL) {
650  pmeKSpaceComputes[iGrid]->solve(lattice, doEnergy, doVirial, fftComputes[iGrid]->getDataDst());
651  }
652  }
653 }
654 
655 void PmePencilZ::submitReductions(unsigned int iGrid) {
656  if (pmeKSpaceComputes[iGrid] == NULL)
657  NAMD_bug("PmePencilZ::submitReductions, pmeKSpaceCompute not initialized");
658 // fprintf(stderr, "PmePencilZ::submitReductions\n");
660  double virial[9];
661  double energy = pmeKSpaceComputes[iGrid]->getEnergy();
662  pmeKSpaceComputes[iGrid]->getVirial(virial);
663  if (simParams->alchOn) {
664  double energy_F = energy;
665  double scale1 = 1.0;
666  double scale2 = 1.0;
667  if (simParams->alchFepOn) {
668  switch (iGrid) {
669  case 0: {
670  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
671  const BigReal alchLambda2 = simParams->getCurrentLambda2(simulationStep);
672  const BigReal elecLambdaUp = simParams->getElecLambda(alchLambda);
673  const BigReal elecLambda2Up = simParams->getElecLambda(alchLambda2);
674  scale1 = elecLambdaUp;
675  scale2 = elecLambda2Up;
676  break;
677  }
678  case 1: {
679  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
680  const BigReal alchLambda2 = simParams->getCurrentLambda2(simulationStep);
681  const BigReal elecLambdaDown = simParams->getElecLambda(1 - alchLambda);
682  const BigReal elecLambda2Down = simParams->getElecLambda(1 - alchLambda2);
683  scale1 = elecLambdaDown;
684  scale2 = elecLambda2Down;
685  break;
686  }
687  case 2: {
688  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
689  const BigReal alchLambda2 = simParams->getCurrentLambda2(simulationStep);
690  const BigReal elecLambdaUp = simParams->getElecLambda(alchLambda);
691  const BigReal elecLambda2Up = simParams->getElecLambda(alchLambda2);
692  scale1 = 1.0 - elecLambdaUp;
693  scale2 = 1.0 - elecLambda2Up;
694  break;
695  }
696  case 3: {
697  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
698  const BigReal alchLambda2 = simParams->getCurrentLambda2(simulationStep);
699  const BigReal elecLambdaDown = simParams->getElecLambda(1 - alchLambda);
700  const BigReal elecLambda2Down = simParams->getElecLambda(1 - alchLambda2);
701  scale1 = 1.0 - elecLambdaDown;
702  scale2 = 1.0 - elecLambda2Down;
703  break;
704  }
705  case 4: {
706  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
707  const BigReal alchLambda2 = simParams->getCurrentLambda2(simulationStep);
708  const BigReal elecLambdaUp = simParams->getElecLambda(alchLambda);
709  const BigReal elecLambda2Up = simParams->getElecLambda(alchLambda2);
710  const BigReal elecLambdaDown = simParams->getElecLambda(1 - alchLambda);
711  const BigReal elecLambda2Down = simParams->getElecLambda(1 - alchLambda2);
712  scale1 = -1.0 * (elecLambdaUp + elecLambdaDown - 1.0);
713  scale2 = -1.0 * (elecLambda2Up + elecLambda2Down - 1.0);
714  break;
715  }
716  }
717  energy *= scale1;
718  energy_F *= scale2;
719  for (size_t i = 0; i < 9; ++i) {
720  virial[i] *= scale1;
721  }
722  reduction->item(REDUCTION_ELECT_ENERGY_SLOW_F) += energy_F;
723  }
724  if (simParams->alchThermIntOn) {
725  double energy_TI_1 = 0.0;
726  double energy_TI_2 = 0.0;
727  double scale1 = 1.0;
728  switch (iGrid) {
729  case 0: {
730  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
731  const BigReal elecLambdaUp = simParams->getElecLambda(alchLambda);
732  scale1 = elecLambdaUp;
733  energy_TI_1 = energy;
734  break;
735  }
736  case 1: {
737  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
738  const BigReal elecLambdaDown = simParams->getElecLambda(1 - alchLambda);
739  scale1 = elecLambdaDown;
740  energy_TI_2 = energy;
741  break;
742  }
743  case 2: {
744  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
745  const BigReal elecLambdaUp = simParams->getElecLambda(alchLambda);
746  scale1 = 1.0 - elecLambdaUp;
747  energy_TI_1 = -1.0 * energy;
748  break;
749  }
750  case 3: {
751  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
752  const BigReal elecLambdaDown = simParams->getElecLambda(1 - alchLambda);
753  scale1 = 1.0 - elecLambdaDown;
754  energy_TI_2 = -1.0 * energy;
755  break;
756  }
757  case 4: {
758  const BigReal alchLambda = simParams->getCurrentLambda(simulationStep);
759  const BigReal elecLambdaUp = simParams->getElecLambda(alchLambda);
760  const BigReal elecLambdaDown = simParams->getElecLambda(1 - alchLambda);
761  scale1 = -1.0 * (elecLambdaUp + elecLambdaDown - 1.0);
762  energy_TI_1 = -1.0 * energy;
763  energy_TI_2 = -1.0 * energy;
764  break;
765  }
766  }
767 // fprintf(stdout, "Grid %u : energy_TI_1 = %lf ; energy_TI_2 = %lf\n", iGrid, energy_TI_1, energy_TI_2);
768  reduction->item(REDUCTION_ELECT_ENERGY_SLOW_TI_1) += energy_TI_1;
769  reduction->item(REDUCTION_ELECT_ENERGY_SLOW_TI_2) += energy_TI_2;
770  }
771  }
772  reduction->item(REDUCTION_ELECT_ENERGY_SLOW) += energy;
773  reduction->item(REDUCTION_VIRIAL_SLOW_XX) += virial[0];
774  reduction->item(REDUCTION_VIRIAL_SLOW_XY) += virial[1];
775  reduction->item(REDUCTION_VIRIAL_SLOW_XZ) += virial[2];
776  reduction->item(REDUCTION_VIRIAL_SLOW_YX) += virial[3];
777  reduction->item(REDUCTION_VIRIAL_SLOW_YY) += virial[4];
778  reduction->item(REDUCTION_VIRIAL_SLOW_YZ) += virial[5];
779  reduction->item(REDUCTION_VIRIAL_SLOW_ZX) += virial[6];
780  reduction->item(REDUCTION_VIRIAL_SLOW_ZY) += virial[7];
781  reduction->item(REDUCTION_VIRIAL_SLOW_ZZ) += virial[8];
783  numStrayAtoms = 0;
784  energyReady[iGrid] = 1;
785  bool ready_to_submit = true;
786  for (size_t i = 0; i < NUM_GRID_MAX; ++i) {
787  if (energyReady[i] == -1) continue;
788  if (energyReady[i] == 0) ready_to_submit = false;
789  }
790  if (ready_to_submit) {
791  reduction->submit();
792  for (size_t i = 0; i < NUM_GRID_MAX; ++i) {
793  if (energyReady[i] == -1) continue;
794  if (energyReady[i] == 1) energyReady[i] = 0;
795  }
796  }
797 }
798 
799 void PmePencilZ::backwardDone() {
800  NAMD_bug("PmePencilZ::backwardDone(), base class method called");
801 }
802 
803 void PmePencilZ::recvDataFromY(PmeBlockMsg *msg) {
804  NAMD_bug("PmePencilY::recvDataFromY(), base class method called");
805 }
806 
807 void PmePencilZ::start(const CkCallback &) {
808  NAMD_bug("PmePencilZ::start(), base class method called");
809 }
810 
812  reduction->submit();
813 }
814 
815 #include "PmeSolver.def.h"
static Node * Object()
Definition: Node.h:86
virtual ~PmePencilXYZ()
Definition: PmeSolver.C:45
int zBlocks
Definition: PmeBase.h:25
std::array< PmeKSpaceCompute *, NUM_GRID_MAX > pmeKSpaceComputes
Definition: PmeSolver.h:266
Lattice lattice
Definition: PmeSolver.h:269
bool doEnergy
Definition: PmeSolver.h:262
std::vector< int > blockSizes
Definition: PmeSolver.h:268
virtual ~PmePencilXY()
Definition: PmeSolver.C:293
virtual void submit(void)=0
virtual void backwardDone()
Definition: PmeSolver.C:91
SimParameters * simParameters
Definition: Node.h:181
std::array< FFTCompute *, NUM_GRID_MAX > fftComputes
Definition: PmeSolver.h:178
void submitReductions(unsigned int iGrid)
Definition: PmeSolver.C:95
BigReal & item(int i)
Definition: ReductionMgr.h:336
int simulationStep
Definition: PmeSolver.h:263
std::array< PmeTranspose *, NUM_GRID_MAX > pmeTransposes
Definition: PmeSolver.h:179
SubmitReduction * willSubmit(int setID, int size=-1)
Definition: ReductionMgr.C:368
Lattice lattice
Definition: PmeSolver.h:155
PmePencilX_SDAG_CODE PmePencilX()
Definition: PmeSolver.C:395
static ReductionMgr * Object(void)
Definition: ReductionMgr.h:290
int numStrayAtoms
Definition: PmeSolver.h:156
const unsigned int NUM_GRID_MAX
Definition: PmeSolverUtil.h:9
std::vector< int > blockSizes
Definition: PmeSolver.h:236
PmeGrid pmeGrid
Definition: PmeSolver.h:175
bool doVirial
Definition: PmeSolver.h:262
std::vector< int > blockSizes
Definition: PmeSolver.h:208
std::array< PmeTranspose *, NUM_GRID_MAX > pmeTransposes
Definition: PmeSolver.h:207
virtual ~PmePencilY()
Definition: PmeSolver.C:497
std::array< FFTCompute *, NUM_GRID_MAX > fftComputes
Definition: PmeSolver.h:206
std::array< int, NUM_GRID_MAX > dataSizes
Definition: PmeSolver.h:106
std::array< float *, NUM_GRID_MAX > dataGrid
Definition: PmeSolver.h:105
int yBlocks
Definition: PmeBase.h:25
bool doVirial
Definition: PmeSolver.h:146
void initBlockSizes()
Definition: PmeSolver.C:448
std::array< int, NUM_GRID_MAX > energyReady
Definition: PmeSolver.h:153
int numStrayAtoms
Definition: PmeSolver.h:238
PmeGrid pmeGrid
Definition: PmeSolver.h:261
PmeGrid pmeGrid
Definition: PmeSolver.h:145
std::array< PmeKSpaceCompute *, NUM_GRID_MAX > pmeKSpaceComputes
Definition: PmeSolver.h:150
void NAMD_bug(const char *err_msg)
Definition: common.C:195
void initBlockSizes()
Definition: PmeSolver.C:532
PmePencilXY_SDAG_CODE PmePencilXY()
Definition: PmeSolver.C:276
std::vector< int > blockSizes
Definition: PmeSolver.h:180
PmePencilXYZ_SDAG_CODE PmePencilXYZ()
Definition: PmeSolver.C:22
bool doEnergy
Definition: PmeSolver.h:146
std::array< PmeTranspose *, NUM_GRID_MAX > pmeTransposes
Definition: PmeSolver.h:235
std::array< int, NUM_GRID_MAX > energyReady
Definition: PmeSolver.h:267
PmePencilZ_SDAG_CODE PmePencilZ()
Definition: PmeSolver.C:567
int simulationStep
Definition: PmeSolver.h:148
std::array< FFTCompute *, NUM_GRID_MAX > fftComputes
Definition: PmeSolver.h:149
int numStrayAtoms
Definition: PmeSolver.h:270
void skip()
Definition: PmeSolver.C:246
std::array< FFTCompute *, NUM_GRID_MAX > fftComputes
Definition: PmeSolver.h:234
virtual ~PmePencilX()
Definition: PmeSolver.C:413
#define simParams
Definition: Output.C:131
std::array< PmeTranspose *, NUM_GRID_MAX > pmeTransposes
Definition: PmeSolver.h:265
static void getBlockDim(const PmeGrid &pmeGrid, const int permutation, const int iblock, const int jblock, const int kblock, int &i0, int &i1, int &j0, int &j1, int &k0, int &k1)
Definition: PmeSolverUtil.h:89
void submitReductions(unsigned int iGrid)
Definition: PmeSolver.C:655
std::array< FFTCompute *, NUM_GRID_MAX > fftComputes
Definition: PmeSolver.h:264
void initBlockSizes()
Definition: PmeSolver.C:632
std::array< bool, NUM_GRID_MAX > enabledGrid
Definition: PmeSolver.h:107
int xBlocks
Definition: PmeBase.h:25
void initBlockSizes()
Definition: PmeSolver.C:332
PmePencilY_SDAG_CODE PmePencilY()
Definition: PmeSolver.C:479
virtual ~PmePencilZ()
Definition: PmeSolver.C:589
PmeGrid pmeGrid
Definition: PmeSolver.h:231
PmeGrid pmeGrid
Definition: PmeSolver.h:203
int numStrayAtoms
Definition: PmeSolver.h:210
void skip()
Definition: PmeSolver.C:811
double BigReal
Definition: common.h:123