OpenAtom  Version1.5a
CP_Rho_GHartExt.C
Go to the documentation of this file.
1 //////////////////////////////////////////////////////////////////////////////
2 //////////////////////////////////////////////////////////////////////////////
3 //////////////////////////////////////////////////////////////////////////////
4 /** \file CP_Rho_GHartExt.C
5  * This is a description of the "life" of a CP_Rho_GHartExc object
6  *
7  * At the start of the program, the constructor CP_Rho_GHartExc is
8  * called. We create our own rho_gs slab because we need the
9  * kvectors and the fft code.
10  *
11  * Each iteration, the CP_Rho_GpacePlane object sends us the same rho
12  * data it will use in its own FFTs. We then call the very intensive
13  * HartExtVksG function on the data. We contribute the energy to the
14  * reduction, fft the vks, and ship the vks to rhoReal.
15  *
16  * Then we're done until the next iteration.
17  *
18  * There is no RthThread control loop here because there is no
19  * meaningful flow of entry methods. We get a message, we calculate,
20  * we send, we're done. This object exists solely as a way to
21  * parallelize the uncomfortably long HartExtVks computation.
22  */
23 //////////////////////////////////////////////////////////////////////////////
24 
25 #include "charm++.h"
26 
27 #include "debug_flags.h"
28 #include "utility/util.h"
29 #include "main/cpaimd.h"
30 #include "main/AtomsCache.h"
32 #include "main/eesCache.h"
34 
35 #include "src_piny_physics_v1.0/include/class_defs/CP_OPERATIONS/class_cplocal.h"
36 #include "src_piny_physics_v1.0/include/class_defs/CP_OPERATIONS/class_cpxcfnctls.h"
37 #include "src_piny_physics_v1.0/include/proto_defs/proto_cp_ewald_corrs.h"
38 #include "src_piny_physics_v1.0/include/class_defs/Interface_ctrl.h"
39 #include "main/PhysScratchCache.h"
40 #include <iostream>
41 #include <fstream>
42 #include <cmath>
43 
44 //////////////////////////////////////////////////////////////////////////////
45 
46 extern int sizeX;
47 extern Config config;
48 
49 extern CkVec <CProxy_CP_Rho_RealSpacePlane> UrhoRealProxy;
50 extern CProxy_CPcharmParaInfoGrp scProxy;
51 extern CProxy_PhysScratchCache pScratchProxy;
52 extern CkVec <CProxy_AtomsCache> UatomsCacheProxy;
53 extern CkVec <CProxy_CP_Rho_GHartExt> UrhoGHartExtProxy;
54 extern CkVec <CProxy_CP_Rho_RHartExt> UrhoRHartExtProxy;
55 extern CkVec <CProxy_eesCache> UeesCacheProxy;
56 extern CkVec <CProxy_FFTcache> UfftCacheProxy;
57 
58 extern ComlibInstanceHandle commGHartInstance;
59 extern ComlibInstanceHandle commGHartRHartIns0;
60 extern ComlibInstanceHandle commGHartRHartIns1;
61 
62 //#define _DEBUG_INT_TRANS_FWD_
63 //#define _CP_GHART_VERBOSE_
64 
65 /** @addtogroup Density
66  @{
67 */
68 
69 //////////////////////////////////////////////////////////////////////////////
70 //////////////////////////////////////////////////////////////////////////////
71 /**
72  * This object just gets a rho message, computes GHartExt, and sends
73  * vks.
74  */
75 //////////////////////////////////////////////////////////////////////////////
76 CP_Rho_GHartExt::CP_Rho_GHartExt(
77  int _ngridaEext, int _ngridbEext, int _ngridcEext, int _ees_eext_on,
78  int _natmTyp, UberCollection _instance) :thisInstance(_instance)
79 //////////////////////////////////////////////////////////////////////////////
80  {//begin routine
81 //////////////////////////////////////////////////////////////////////////////
82 
83  CkAssert(sizeX>0); ///heck for startup wackiness
84  CPcharmParaInfo *sim = CPcharmParaInfo::get();
85  CkVec <RunDescriptor> *sortedRunDescriptors = sim->RhosortedRunDescriptors;
86 
87 //////////////////////////////////////////////////////////////////////////////
88 /// Fetch and compute the useful variables : zero counters
89 
90  rhoRsubplanes = config.rhoRsubplanes;
91  rhoGHelpers = config.rhoGHelpers;
92  nchareHartAtmT = config.nchareHartAtmT;
93  iperd = sim->iperd;
94 
95  ngridaEext = _ngridaEext;
96  ngridbEext = _ngridbEext;
97  ngridcEext = _ngridcEext;
98  ees_eext_on = _ees_eext_on;
99  natmTypTot = _natmTyp;
100  CkAssert(natmTypTot>=nchareHartAtmT);
101 
102  iopt = 0;
103  iteration = 0;
104  iterAtmTyp = 0;
105  atmSFHere = 0;
106  densityHere = 0;
107  countEextFFT = 0;
108  ehart_ret = 0.0;
109  eext_ret = 0.0;
110  ewd_ret = 0.0;
111  registrationFlag= 0;
112  launchFlag = 0;
113  nsendAtmTyp = 0;
114  countVksTot = 0;
115  countAtmSFtot = 0;
116  CountDebug = 0;
117 
118  if(rhoRsubplanes>1){
119  recvCountFromRHartExt = 0;
120  for(int i=0;i<rhoRsubplanes;i++){
121  if(sim->nline_send_eext_y[thisIndex.x][i]>0){recvCountFromRHartExt++;}
122  }//endfor
123  recvCountFromRHartExt*=ngridcEext;
124  }else{
125  recvCountFromRHartExt=ngridcEext;
126  }//endif
127 
128 ///////////////////////////////////////////////////////////////////////////////////=
129 /// AtmTyp parallelization
130 
131  int div = (natmTypTot/nchareHartAtmT);
132  int rem = (natmTypTot % nchareHartAtmT);
133  int max = (thisIndex.y < rem ? thisIndex.y : rem);
134  natmTyp = (thisIndex.y<rem ? div+1 : div);
135  atmTypoff = div*thisIndex.y + max;
136 
137  if(ees_eext_on==0 && nchareHartAtmT>1){
138  CkPrintf("@@@@@@@@@@@@@@@@@@@@_error_@@@@@@@@@@@@@@@@@@@@\n");
139  CkPrintf("Parallel atom type not supported without ees Eext\n");
140  CkPrintf("@@@@@@@@@@@@@@@@@@@@_error_@@@@@@@@@@@@@@@@@@@@\n");
141  CkExit();
142  }//endif
143 
144 ///////////////////////////////////////////////////////////////////////////////////=
145 /// Decomposition rhoG lines into slices of size rhoGHelper
146 
147  ind_x = thisIndex.x;
148  ind_xdiv = (ind_x/rhoGHelpers);
149  ind_xrem = (ind_x%rhoGHelpers);
150  int numLines_tot = sortedRunDescriptors[ind_xdiv].size()/2;
151 
152  getSplitDecomp(&istrt_lines,&iend_lines,&numLines,numLines_tot,
153  rhoGHelpers,ind_xrem);
154 
155 ///////////////////////////////////////////////////////////////////////////////////=
156 /// Set up rho_gs : Carve out your rundescriptor : Make the k-vectors (donuts)
157 
158  rho_gs.sizeX = sizeX;
159  rho_gs.sizeY = sim->sizeY;
160  rho_gs.sizeZ = sim->sizeZ;
161  rho_gs.xdim = rho_gs.sizeX;
162  rho_gs.ydim = rho_gs.sizeY;
163  rho_gs.zdim = 1;
164 
165  rho_gs.numLines = numLines;
166  rho_gs.numRuns = (numLines*2);
167  rho_gs.numFull = (numLines*rho_gs.sizeZ);
168  rho_gs.size = rho_gs.numFull;
169 
170  rho_gs.runs = new RunDescriptor[(rho_gs.numRuns)];
171  rho_gs.numPoints = 0;
172  for (int r = (2*istrt_lines),s=0; r < (2*iend_lines); r++,s++) {
173  rho_gs.numPoints += sortedRunDescriptors[ind_xdiv][r].length;
174  rho_gs.runs[s] = sortedRunDescriptors[ind_xdiv][r];
175  }//endfor
176 
177  int nPacked;
178  rho_gs.setKVectors(&nPacked);
179  rho_gs.nPacked=nPacked;
180  CkAssert(nPacked==rho_gs.numPoints);
181 
182  int numFull = rho_gs.numFull;
183  numFullEext = numLines*ngridcEext;
184 
185 ///////////////////////////////////////////////////////////////////////////////////=
186 /// Malloc your memory : more juice for ees_ext and yet to support atmtyp parallel
187 
188  atmSF = NULL;
189  atmSFtot = NULL;
190  VksRecv = NULL;
191  atmSFtotRecv = NULL;
192  rho_gs.divRhoX = NULL;
193  rho_gs.divRhoY = NULL;
194  rho_gs.divRhoZ = NULL;
195  rho_gs.Rho = NULL;
196 
197  rho_gs.packedRho = (complex *)fftw_malloc(nPacked*sizeof(complex));
198  rho_gs.Vks = (complex *)fftw_malloc(nPacked*sizeof(complex));
199  if(ees_eext_on==1 && nchareHartAtmT>1 && thisIndex.y==1){
200  VksRecv = (complex *)fftw_malloc(nPacked*sizeof(complex));
201  }//endif
202 
203  if(ees_eext_on==1){
204  atmSF = (complex *)fftw_malloc(numFullEext*sizeof(complex));
205  atmSFtot = (complex *)fftw_malloc(numFullEext*sizeof(complex));
206  if(nchareHartAtmT>1 && thisIndex.y==0){
207  atmSFtotRecv = (complex *)fftw_malloc(numFullEext*sizeof(complex));
208  }//endif
209  }//endif
210 
211 
212 ///////////////////////////////////////////////////////////////////////////////////=
213 /// Set some proxies, set the migratable flag
214 
215  setMigratable(false);
216 
217  usesAtSync = true;
218  if(config.lbdensity){
219  setMigratable(true);
220  }else{
221  setMigratable(false);
222  }//endif
223 
224 //---------------------------------------------------------------------------
225  }//end routine
226 //////////////////////////////////////////////////////////////////////////////
227 
228 
229 //////////////////////////////////////////////////////////////////////////////
230 /// Post constructor initialization
231 //////////////////////////////////////////////////////////////////////////////
232 //////////////////////////////////////////////////////////////////////////////
233 //////////////////////////////////////////////////////////////////////////////
235 ///////////////////////////////////////////////////////////////////////////////////=
236 /// Register in the cache : contribute to a reduction to be sure everyone is done
237 
238  if(ees_eext_on==1){
239  eesCache *eesData = UeesCacheProxy[thisInstance.proxyOffset].ckLocalBranch ();
240  eesData->registerCacheGHart(thisIndex.x,rho_gs.nPacked,rho_gs.k_x,rho_gs.k_y,rho_gs.k_z);
241  int i=1;
242  CkCallback cb(CkIndex_CP_Rho_GHartExt::registrationDone(NULL),UrhoGHartExtProxy[thisInstance.proxyOffset]);
243  contribute(sizeof(int),&i,CkReduction::sum_int,cb);
244  }//endif
245 
246 ///////////////////////////////////////////////////////////////////////////////////=
247 /// Set up periodicity corrections if necessary
248 
249  rho_gs.iperd = iperd;
250  if(iperd!=3){
251  int nPacked = rho_gs.nPacked;
252  rho_gs.perdCorr = (double *)fftw_malloc(nPacked*sizeof(double));
253  setput_nd_eext_corrs(nPacked,rho_gs.k_x,rho_gs.k_y,rho_gs.k_z,rho_gs.perdCorr);
254  }//endif
255 
256 ///////////////////////////////////////////////////////////////////////////////////=
257 /// Set some proxies, set the migratable flag
258 
259  setMigratable(false);
260 
261  rhoRealProxy_com = UrhoRealProxy[thisInstance.proxyOffset];
262 
263 #ifdef USE_COMLIB
264  if(config.useGHartInsRhoRP){
265  ComlibAssociateProxy(commGHartInstance,rhoRealProxy_com);
266  }//endif
267 #endif
268 
269  if (ees_eext_on == 1)
270  {
271  rhoRHartProxy_com0 = UrhoRHartExtProxy[thisInstance.proxyOffset];
272  rhoRHartProxy_com1 = UrhoRHartExtProxy[thisInstance.proxyOffset];
273  #ifdef USE_COMLIB
274  if(config.useGHartInsRHart)
275  {
276  ComlibAssociateProxy(commGHartRHartIns0,rhoRHartProxy_com0);
277  ComlibAssociateProxy(commGHartRHartIns1,rhoRHartProxy_com1);
278  }//endif
279  #endif
280  }
281 //---------------------------------------------------------------------------
282 }//end routine
283 //////////////////////////////////////////////////////////////////////////////
284 
285 //////////////////////////////////////////////////////////////////////////////
286 /// Destructor
287 //////////////////////////////////////////////////////////////////////////////
288 //////////////////////////////////////////////////////////////////////////////
289 //////////////////////////////////////////////////////////////////////////////
291 
292  if(ees_eext_on==1){
293  fftw_free(atmSF);
294  fftw_free(atmSFtot);
295  if(nchareHartAtmT>1 && thisIndex.y==1){fftw_free(VksRecv);}
296  if(nchareHartAtmT>1 && thisIndex.y==0){fftw_free(atmSFtotRecv);}
297  }//endif
298  atmSF = NULL;
299  atmSFtot = NULL;
300  VksRecv = NULL;
301  atmSFtotRecv = NULL;
302 
303 }
304 //////////////////////////////////////////////////////////////////////////////
305 
306 
307 //////////////////////////////////////////////////////////////////////////////
308 //////////////////////////////////////////////////////////////////////////////
309 //////////////////////////////////////////////////////////////////////////////
310 void CP_Rho_GHartExt::pup(PUP::er &p){
311 //////////////////////////////////////////////////////////////////////////////
312 
313  ArrayElement2D::pup(p);
314  rho_gs.pup(p);
315 
316  p|iperd;
317  p|rhoRsubplanes;
318  p|ngridaEext;
319  p|ngridbEext;
320  p|ngridcEext;
321  p|ees_eext_on;
322  p|numFullEext;
323  p|registrationFlag;
324  p|launchFlag;
325  p|natmTypTot;
326  p|atmTypoff;
327  p|nchareHartAtmT;
328  p|natmTyp;
329  p|iterAtmTyp;
330  p|nsendAtmTyp;
331  p|atmSFHere;
332  p|densityHere;
333  p|countEextFFT;
334  p|ehart_ret;
335  p|eext_ret;
336  p|ewd_ret;
337  p|countAtmSFtot;
338  p|countVksTot;
339  p|iopt;
340  p|iteration;
341  p|ind_x;
342  p|ind_xdiv;
343  p|ind_xrem;
344  p|rhoGHelpers;
345  p|istrt_lines;
346  p|iend_lines;
347  p|numLines;
348  p|rhoRealProxy_com;
349  p|rhoRHartProxy_com0;
350  p|rhoRHartProxy_com1;
351 
352  // if(config.useCommlib)
353  // ComlibResetProxy(&UrhoRealProxy[thisInstance.proxyOffset]_com);
354 
355 //---------------------------------------------------------------------------
356  }//endif
357 //////////////////////////////////////////////////////////////////////////////
358 
359 //////////////////////////////////////////////////////////////////////////////
360 /// The density arrives from RhoGspace ONCE a time step
361 //////////////////////////////////////////////////////////////////////////////
362 //////////////////////////////////////////////////////////////////////////////
363 //////////////////////////////////////////////////////////////////////////////
365 //////////////////////////////////////////////////////////////////////////////
366 /// Check the flow of control to see if we can use the data.
367 
368  CPcharmParaInfo *sim = CPcharmParaInfo::get();
369  int cp_min_opt = sim->cp_min_opt;
370 
371  iteration ++;
372 
373  // the atoms haven't moved yet
374  if(cp_min_opt==0){
375  if(UatomsCacheProxy[thisInstance.proxyOffset].ckLocalBranch()->iteration != iteration-1){
376  CkPrintf("@@@@@@@@@@@@@@@@@@@@_error_@@@@@@@@@@@@@@@@@@@@\n");
377  CkPrintf("Flow of Control Error in GHartExtVks : atoms slow %d %d\n",
378  UatomsCacheProxy[thisInstance.proxyOffset].ckLocalBranch()->iteration,iteration);
379  CkPrintf("@@@@@@@@@@@@@@@@@@@@_error_@@@@@@@@@@@@@@@@@@@@\n");
380  CkExit();
381  }//endif
382  }//endif
383 
384 #ifdef _NAN_CHECK_
385  for(int i=0;i<msg->size ;i++){
386  CkAssert(isnan(msg->data[i].re)==0);
387  CkAssert(isnan(msg->data[i].im)==0);
388  }
389 #endif
390 
391 //////////////////////////////////////////////////////////////////////////////
392 /// Copy out the data and flip arrival flag
393 
394  int ncoef = rho_gs.numPoints;
395  CkAssert(ncoef==msg->size);
396 
397  CmiMemcpy(rho_gs.packedRho,msg->data,sizeof(complex)*ncoef);
398  delete msg;
399 
400  densityHere = 1;
401 
402 //////////////////////////////////////////////////////////////////////////////
403 /// If ees is off, go ahead with the N^2 method.
404 /// If ees is on, either go ahead or chill depending on whether atmSF is here
405 
406  if(ees_eext_on==0){HartExtVksG();}
407  if(ees_eext_on==1 && atmSFHere==1){getHartEextEes();}
408 
409 //////////////////////////////////////////////////////////////////////////////
410  }//end routine
411 //////////////////////////////////////////////////////////////////////////////
412 
413 
414 //////////////////////////////////////////////////////////////////////////////
415 /// Compute hartree eext and vks using the N^2 method
416 //////////////////////////////////////////////////////////////////////////////
417 //////////////////////////////////////////////////////////////////////////////
418 //////////////////////////////////////////////////////////////////////////////
420 //////////////////////////////////////////////////////////////////////////////
421 /// Get the variables
422 
423 #ifdef _CP_GHART_VERBOSE_
424  CkPrintf("Ghart %d Here in hartextvskg at %d on %d\n",thisIndex.x,CkMyPe());
425 #endif
426 
427  AtomsCache *ag = UatomsCacheProxy[thisInstance.proxyOffset].ckLocalBranch(); // find me the local copy
428  int natm = ag->natm;
429  FastAtoms *fastAtoms = &(ag->fastAtoms);
430 
431  int numPoints = rho_gs.numPoints;
432  int numFull = rho_gs.numFull;
433  complex *rho = rho_gs.packedRho;
434  complex *vks = rho_gs.Vks;
435  int *k_x = rho_gs.k_x;
436  int *k_y = rho_gs.k_y;
437  int *k_z = rho_gs.k_z;
438 
439  ehart_ret = 0.0;
440  eext_ret = 0.0;
441  ewd_ret = 0.0;
442 
443 //////////////////////////////////////////////////////////////////////////////
444 /// compute vks(g) from hart eext and reduce eext and ehart
445 
446 #if CMK_TRACE_ENABLED
447  double StartTime=CmiWallTimer();
448 #endif
449 
450  double *perdCorr = rho_gs.perdCorr;
451  CPLOCAL::CP_hart_eext_calc(numPoints,rho,natm,fastAtoms,vks,
452  &ehart_ret,&eext_ret,&ewd_ret,k_x,k_y,k_z,perdCorr,
453  thisIndex.x, pScratchProxy.ckLocalBranch()->psscratch, config.nfreq_cplocal_hartext);
454 #if CMK_TRACE_ENABLED
455  traceUserBracketEvent(HartExcVksG_, StartTime, CmiWallTimer());
456 #endif
457 
458 #ifdef _CP_DEBUG_RHOG_VKSA_
459  char myFileName[100];
460  sprintf(myFileName, "Vks_Gspace_%d%d.out", thisIndex.x,thisIndex.y);
461  FILE *fp = fopen(myFileName,"w");
462  for (int i = 0; i < numPoints; i++){
463  fprintf(fp," %d %d %d : %g %g\n",
464  k_x[i],k_y[i],k_z[i],
465  vks[i].re,vks[i].im);
466  }//endfor
467  fclose(fp);
468 #endif
469 
470 #ifdef _CP_GHART_VERBOSE_
471  CkPrintf("Ghart %d Here in hartextvskg completed at %d on %d\n",thisIndex.x,CkMyPe());
472 #endif
473 
474 //////////////////////////////////////////////////////////////////////////////
475 /// Reduce the energies computed then FFT Vks into Real space (part way)
476 
477  double e[3];
478  e[0] = ehart_ret;
479  e[1] = eext_ret;
480  e[2] = ewd_ret;
481  contribute(3 * sizeof(double),e,CkReduction::sum_double);
482 
483  FFTVks();
484 
485 //---------------------------------------------------------------------------
486  }//end routine
487 //////////////////////////////////////////////////////////////////////////////
488 
489 
490 //////////////////////////////////////////////////////////////////////////////
491 /// Partly fft vks(gx,gy,gz) -> vks(gx,gy,z)
492 //////////////////////////////////////////////////////////////////////////////
494 //////////////////////////////////////////////////////////////////////////////
495 /// Perform the FFT(gx,gy,gz) to FFT(gx,gy,z)
496 
497 #ifdef _CP_GHART_VERBOSE_
498  CkPrintf("Ghart %d %d Here in fftvks at %d on %d\n",
499  thisIndex.x,thisIndex.y,iterAtmTyp,CkMyPe());
500 #endif
501 
502  FFTcache *fftcache = UfftCacheProxy[thisInstance.proxyOffset].ckLocalBranch();
503  fftcache->getCacheMem("CP_Rho_GHartExt::FFTVks");
504  complex *vks = rho_gs.Vks;
505  complex *vksScr = fftcache->tmpData; // scratch from the cache has FFT output
506 
507  fftcache->doHartFFTGtoR_Gchare(vks,vksScr,rho_gs.numFull,rho_gs.numPoints,numLines,
508  rho_gs.numRuns,rho_gs.runs,rho_gs.sizeZ,ind_x);
509 
510 #ifdef _CP_DEBUG_RHOG_VKSA_
511  int numFull = rho_gs.numFull;
512  sprintf(myFileName, "Vks_GspaceAFFT_%d%d.out", thisIndex.x,thisIndex.y);
513  fp = fopen(myFileName,"w");
514  for(int i = 0; i < numFull; i++){
515  fprintf(fp," %g %g\n",VksExpd[i].re, VksExpd[i].im);
516  }//endfor
517  fclose(fp);
518 #endif
519 
520 //////////////////////////////////////////////////////////////////////////////
521 /// Send partly ffted vks off to real space where FFT will be completed
522 
523  sendVks();
524 
525 //////////////////////////////////////////////////////////////////////////////
526  }//end routine
527 //////////////////////////////////////////////////////////////////////////////
528 
529 
530 //////////////////////////////////////////////////////////////////////////////
531 /// Send vks_hart_ext back to rho_real where fft(gx,gy) will be performed
532 //////////////////////////////////////////////////////////////////////////////
533 //////////////////////////////////////////////////////////////////////////////
534 //////////////////////////////////////////////////////////////////////////////
536 //////////////////////////////////////////////////////////////////////////////
537 
538 #ifdef _CP_GHART_VERBOSE_
539  CkPrintf("Ghart %d %d Here in sendvks at %d on %d\n",
540  thisIndex.x,thisIndex.y,iterAtmTyp,CkMyPe());
541 #endif
542 
543 #ifdef _CP_DEBUG_RHOG_VERBOSE_
544  CkPrintf("Communicating data from RhoGHart to RhoR : %d %d\n",
545  thisIndex.x,thisIndex.y);
546 #endif
547 
548 //////////////////////////////////////////////////////////////////////////////
549 
550  CPcharmParaInfo *sim = CPcharmParaInfo::get();
551  FFTcache *fftcache = UfftCacheProxy[thisInstance.proxyOffset].ckLocalBranch();
552  complex *vksScr = fftcache->tmpData; // scratch from the cache has FFT output
553 
554  int ix = thisIndex.x;
555  int sendLines = numLines;
556 
557  int **index_pack;
558  int *nline_send;
559  if(rhoRsubplanes>1){
560  nline_send = sim->nline_send_eext_y[ix];
561  index_pack = sim->index_tran_pack_eext_ys[ix];
562  }//endif
563 
564 //////////////////////////////////////////////////////////////////////////////
565 /// Do a Comlib Dance
566 #ifdef USE_COMLIB
567  if(rhoRsubplanes==1){
568 #ifdef OLD_COMMLIB
569  if(config.useGHartInsRhoRP){commGHartInstance.beginIteration();}
570 #else
571  if(config.useGHartInsRhoRP){ComlibBegin(rhoRealProxy_com,0);}
572 #endif
573  }//endif
574 #endif
575 
576 //////////////////////////////////////////////////////////////////////////////
577 
578  int sizeZ=rho_gs.sizeZ;
579  for(int z=0; z < sizeZ; z++) {
580  for(int s=0;s<rhoRsubplanes;s++){
581 
582  if(rhoRsubplanes>1){sendLines = nline_send[s];}
583  if(sendLines >0)
584  {
585 
586  RhoHartRSFFTMsg *msg = new (sendLines,8*sizeof(int)) RhoHartRSFFTMsg;
587  msg->size = sendLines; // number of z-lines in this batch
588  msg->index = thisIndex.x; // regular old index
589  msg->senderBigIndex = ind_xdiv; // big line batch index
590  msg->senderStrtLine = istrt_lines; // where my lines start in big batch
591  msg->iopt = 0; // iopt always 0 for us
592  if(config.prioFFTMsg){
593  CkSetQueueing(msg, CK_QUEUEING_IFIFO);
594  *(int*)CkPriorityPtr(msg) = config.rhorpriority + thisIndex.x + thisIndex.y;
595  }//endif
596 
597  // beam out all points with same z to chare array index z
598  complex *data = msg->data;
599  if(rhoRsubplanes==1){
600  for (int i=0,j=z; i<sendLines; i++,j+=sizeZ){data[i] = vksScr[j];}
601  }else{
602  for(int i=0; i< sendLines; i++){
603  data[i] = vksScr[(z+index_pack[s][i])];
604  }//endif
605  }//endif
606 
607  if(rhoRsubplanes==1){
608  rhoRealProxy_com(z,0).acceptHartVks(msg);
609  }else{
610  UrhoRealProxy[thisInstance.proxyOffset](z,s).acceptHartVks(msg);
611  }//endif
612 
613  } //endif
614  }//endfor : subplanes
615  }//endfor : z plane parallel index
616 
617 //////////////////////////////////////////////////////////////////////////////
618 /// Complete the commlib dance and hang out.
619 
620 #ifdef USE_COMLIB
621  if(rhoRsubplanes==1){
622 #ifdef OLD_COMMLIB
623  if(config.useGHartInsRhoRP){commGHartInstance.endIteration();}
624 #else
625  if(config.useGHartInsRhoRP){ComlibEnd(rhoRealProxy_com,0);}
626 #endif
627  }//endif
628 #endif
629 
630  fftcache->freeCacheMem("CP_Rho_GHartExt::sendVks");
631 
632 //---------------------------------------------------------------------------
633  }// end routine
634 //////////////////////////////////////////////////////////////////////////////
635 
636 ///////////////////////////////////////////////////////////////////////////=
637 /// Make sure everyone is registered on the 1st time step
638 ///////////////////////////////////////////////////////////////////////////=
639 ///////////////////////////////////////////////////////////////////////////c
640 ///////////////////////////////////////////////////////////////////////////=
641  void CP_Rho_GHartExt::registrationDone(CkReductionMsg *msg) {
642 ///////////////////////////////////////////////////////////////////////////=
643 
644  int sum = ((int *)msg->getData())[0];
645  delete msg;
646 
647 #ifdef _CP_GHART_VERBOSE_
648  CkPrintf("HI, I am Ghart chare %d in reg : %d %d on %d\n",
649  thisIndex.x,sum,natmTyp,CkMyPe());
650 #endif
651 
652  registrationFlag=1;
653  if(launchFlag==1){launchFlag=0;FFTEesBck();}
654 
655 }//end routine
656 ///////////////////////////////////////////////////////////////////////////=
657 
658 
659 //////////////////////////////////////////////////////////////////////////////
660 /// Recv Atm SF from RhoRhart : Euler Exponential spline based method
661 //////////////////////////////////////////////////////////////////////////////
662 //////////////////////////////////////////////////////////////////////////////
663 //////////////////////////////////////////////////////////////////////////////
665 //////////////////////////////////////////////////////////////////////////////
666 /// Unpack the message
667 
668  if(ees_eext_on==0){
669  CkPrintf("@@@@@@@@@@@@@@@@@@@@_error_@@@@@@@@@@@@@@@@@@@@\n");
670  CkPrintf("Yo dawg, ees eext is off. You can't recvFromRhoRhart\n");
671  CkPrintf("@@@@@@@@@@@@@@@@@@@@_error_@@@@@@@@@@@@@@@@@@@@\n");
672  CkExit();
673  }//endif
674 
675 //////////////////////////////////////////////////////////////////////////////
676 /// Unpack the message and then delete it
677 /// atmSFT: numLines collections of lines of lth ngridcEext each with constant (gx,gy)
678 /// Each message contains 1 pt on each line
679 
680  CPcharmParaInfo *sim = CPcharmParaInfo::get();
681  int size = msg->size;
682  int offset = msg->offset; // z index
683  int isub = msg->offsetGx; // subplane index
684  int iter = msg->iter;
685  complex *partlyIFFTd = msg->data;
686 
687  int ix = thisIndex.x;
688  int numLinesNow = numLines;
689  int **index_pack;
690  if(rhoRsubplanes>1){
691  int *nline_send = sim->nline_send_eext_y[ix];
692  index_pack = sim->index_tran_pack_eext_y[ix];
693  numLinesNow = nline_send[isub];
694  }//endif
695 
696 //////////////////////////////////////////////////////////////////////////////
697 /// Check for errors
698 
699 #ifdef _NAN_CHECK_
700  for(int i=0;i<msg->size ;i++){
701  CkAssert(isnan(msg->data[i].re)==0);
702  CkAssert(isnan(msg->data[i].im)==0);
703  }//endfor
704 #endif
705 
706  if(iter!= (iterAtmTyp+1) ){
707  CkPrintf("@@@@@@@@@@@@@@@@@@@@_error_@@@@@@@@@@@@@@@@@@@@\n");
708  CkPrintf("Atm Type Iteration out of whack. %d %d : chare %d %d : %d %d\n",
709  iter,iterAtmTyp,thisIndex.x,thisIndex.y,natmTyp,atmTypoff);
710  CkPrintf("@@@@@@@@@@@@@@@@@@@@_error_@@@@@@@@@@@@@@@@@@@@\n");
711  CkExit();
712  }//endif
713  CkAssert(numLinesNow == size);
714 
715 //////////////////////////////////////////////////////////////////////////////
716 /// No need to zero : Every value is set.
717 
718  if(rhoRsubplanes==1){
719  for(int i=0,j=offset; i< numLines; i++,j+=ngridcEext){atmSF[j] = partlyIFFTd[i];}
720  }else{
721  for(int i=0; i< numLinesNow; i++){
722  atmSF[(offset+index_pack[isub][i])] = partlyIFFTd[i];
723  }//endif
724  }//endif
725 
726  delete msg;
727 
728 //////////////////////////////////////////////////////////////////////////////
729 /// You must receive 1 message from each R-chare before continuing
730 
731  countEextFFT++;
732  if (countEextFFT == recvCountFromRHartExt) {
733 #ifdef _DEBUG_GLENN_KPT_
734  char name[100];
735  sprintf(name,"SfAtmGxGyZ_inG.p%d.t%d.out",thisIndex.x,iter);
736  FILE *fp = fopen(name,"w");
737  for(int ix =0;ix<numLines;ix++){
738  for(int iy =0;iy<ngridcEext;iy++){
739  int i = ix*ngridcEext + iy;
740  fprintf(fp,"%d %d : %g %g\n",iy,ix,atmSF[i].re,atmSF[i].im);
741  }//endfor
742  }//endof
743  fclose(fp);
744 #endif
745  countEextFFT = 0;
746 #ifndef _DEBUG_INT_TRANS_FWD_
747  launchFlag = 1;
748  if(registrationFlag==1){launchFlag=0; thisProxy(thisIndex.x, thisIndex.y).FFTEesBck();}
749 #else
750  char name[100];
751  sprintf(name,"partFFTGxGyZT%d.out.%d",rhoRsubplanes,thisIndex.x);
752  FILE *fp = fopen(name,"w");
753  for(int ix =0;ix<numLines;ix++){
754  for(int iy =0;iy<ngridcEext;iy++){
755  int i = ix*ngridcEext + iy;
756  fprintf(fp,"%d %d : %g %g\n",iy,ix,atmSF[i].re,atmSF[i].im);
757  }//endfor
758  }//endof
759  fclose(fp);
760  UrhoGHartExtProxy[thisInstance.proxyOffset](0,0).exitForDebugging();
761 #endif
762  }//endif
763 
764 //////////////////////////////////////////////////////////////////////////////
765  }//end routine
766 //////////////////////////////////////////////////////////////////////////////
767 
768 
769 //////////////////////////////////////////////////////////////////////////////
770 /// Finish FFting to G-space ::
771 /// 2D) atmSF(gx,gy,z) -> atmSF(gx,gy,gz)
772 //////////////////////////////////////////////////////////////////////////////
773 //////////////////////////////////////////////////////////////////////////////
774 //////////////////////////////////////////////////////////////////////////////
776 //////////////////////////////////////////////////////////////////////////////
777 /// Increment Counters set faux booleans
778 
779  atmSFHere = 1;
780  iterAtmTyp ++;
781 
782  if(iterAtmTyp>1 && densityHere==0){
783  CkPrintf("@@@@@@@@@@@@@@@@@@@@_error_@@@@@@@@@@@@@@@@@@@@\n");
784  CkPrintf("Yo dawg, the density has not arrived. You can't keep going. GhartEext\n");
785  CkPrintf("@@@@@@@@@@@@@@@@@@@@_error_@@@@@@@@@@@@@@@@@@@@\n");
786  CkExit();
787  }//endif
788 
789 //////////////////////////////////////////////////////////////////////////////
790 /// FFT yourself to heaven
791 
792 #ifdef _CP_GHART_VERBOSE_
793  CkPrintf("GHart %d %d starting FFTBck at %d on %d\n",thisIndex.x, thisIndex.y,
794  iterAtmTyp,CkMyPe());
795 #endif
796 
797  int numPoints = rho_gs.numPoints;
798  UfftCacheProxy[thisInstance.proxyOffset].ckLocalBranch()->doEextFFTRtoG_Gchare(atmSF,numFullEext,numPoints,
799  numLines,rho_gs.numRuns,rho_gs.runs,ngridcEext,ind_x);
800 
801 //////////////////////////////////////////////////////////////////////////////
802 /// If the density has arrived, you can get the energy otherwise chill
803 
804  if(densityHere==1){getHartEextEes();}
805 
806 //----------------------------------------------------------------------------
807  }//end routine
808 //////////////////////////////////////////////////////////////////////////////
809 
810 
811 //////////////////////////////////////////////////////////////////////////////
812 /// compute HartreeEextEes
813 //////////////////////////////////////////////////////////////////////////////
815 //////////////////////////////////////////////////////////////////////////////
816 /// Output and Error check
817 
818 #ifdef _CP_GHART_VERBOSE_
819  CkPrintf("GHart %d %d starting getHartEextEes at %d on %d\n",
820  thisIndex.x,thisIndex.y,iterAtmTyp,CkMyPe());
821 #endif
822 
823  if(ees_eext_on==0){
824  CkPrintf("@@@@@@@@@@@@@@@@@@@@_error_@@@@@@@@@@@@@@@@@@@@\n");
825  CkPrintf("Yo dawg, ees eext is off. You can't getHartEextEes\n");
826  CkPrintf("@@@@@@@@@@@@@@@@@@@@_error_@@@@@@@@@@@@@@@@@@@@\n");
827  CkExit();
828  }//endif
829 
830 //////////////////////////////////////////////////////////////////////////////
831 /// Compute eext energy, hartree, total SF and VKS
832 
833  //----------------------------------------------------------
834  // Local Variables
835  eesCache *eesData = UeesCacheProxy[thisInstance.proxyOffset].ckLocalBranch ();
836 
837  int myChareG = thisIndex.x;
838  int iterAtmTypFull = iterAtmTyp+atmTypoff;
839 
840  int ncoef = rho_gs.nPacked;
841  complex *vks = rho_gs.Vks;
842  complex *rho = rho_gs.packedRho;
843  int *k_x = rho_gs.k_x;
844  int *k_y = rho_gs.k_y;
845  int *k_z = rho_gs.k_z;
846  double *b_re = eesData->RhoGHartData[myChareG]->b_re;
847  double *b_im = eesData->RhoGHartData[myChareG]->b_im;
848 
849  //----------------------------------------------------------
850  // Initialize
851  if(iterAtmTyp==1){
852  bzero(vks,ncoef*sizeof(complex)); // no getting around these zeros
853  bzero(atmSFtot,ncoef*sizeof(complex));
854  ehart_ret = 0.0;
855  eext_ret = 0.0;
856  ewd_ret = 0.0;
857  }//endif
858 
859  //----------------------------------------------------------
860  // Get the energy, vks, modifiy atmSF, contribute to total SF
861 #if CMK_TRACE_ENABLED
862  double StartTime=CmiWallTimer();
863 #endif
864  double *perdCorr = rho_gs.perdCorr;
865  CPLOCAL::eesHartEextGchare(ncoef,iterAtmTypFull,rho,vks,atmSF,atmSFtot,
866  b_re,b_im,&ehart_ret,&eext_ret,k_x,k_y,k_z,perdCorr,myChareG,config.nfreq_cplocal_eeshart);
867 #if CMK_TRACE_ENABLED
868  traceUserBracketEvent(eesHartExcG_, StartTime, CmiWallTimer());
869 #endif
870 
871 #ifdef _CP_GHART_VERBOSE_
872  CkPrintf("Ghart %d %d Here in hartees: EHart %.10g Eext %.10g at %d on %d\n",
873  thisIndex.x,thisIndex.y,ehart_ret,eext_ret,iterAtmTyp,CkMyPe());
874 #endif
875 
876 //////////////////////////////////////////////////////////////////////////////
877 /// If you have SFtot get the ewald energy : A reduction is required when atmTyp parallel
878 
879  if(iterAtmTyp==natmTyp && nchareHartAtmT==1){
880 #if CMK_TRACE_ENABLED
881  double StartTime=CmiWallTimer();
882 #endif
883  double *perdCorr = rho_gs.perdCorr;
884  CPLOCAL::eesEwaldGchare(ncoef,atmSFtot,b_re,b_im,&ewd_ret,k_x,k_y,k_z,perdCorr,myChareG,config.nfreq_cplocal_eesewald);
885 #if CMK_TRACE_ENABLED
886  traceUserBracketEvent(eesEwaldG_, StartTime, CmiWallTimer());
887 #endif
888 #ifdef _CP_GHART_VERBOSE_
889  CkPrintf("Ghart %d %d iter %d Here in hartees: EwaldRecip : %.10g on\n",
890  thisIndex.x,thisIndex.y,iterAtmTyp,ewd_ret,CkMyPe());
891 #endif
892  }//endif
893 
894 
895 //////////////////////////////////////////////////////////////////////////////
896 /// Blast out the energies when done with atom type stuff : index=0 may have to wait
897 
898  if(iterAtmTyp==natmTyp){
899 #ifdef _CP_GHART_VERBOSE_
900  CkPrintf("Ghart %d reduces energies at %d on %d\n",iterAtmTyp,CkMyPe());
901 #endif
902  if(thisIndex.y!=0 || nchareHartAtmT==1){
903  double e[3];
904  e[0] = ehart_ret;
905  e[1] = eext_ret;
906  e[2] = ewd_ret;
907  contribute(3*sizeof(double),e,CkReduction::sum_double);
908  }//endif
909  }//endif
910 
911 //////////////////////////////////////////////////////////////////////////////
912 /// Perform the back FFT SF and SFtot to get atm forces and VKS to get e-forces
913 
914  //-----------------------------------------------------------------
915  // Ewald needs contribs from all SF : chare index 0 is large and in charge
916  if(iterAtmTyp==natmTyp){
917  if(nchareHartAtmT==1){
918  FFTEesFwd(1);
919  }else{
920  UrhoGHartExtProxy[thisInstance.proxyOffset](thisIndex.x,0).acceptAtmSFTot(ncoef,atmSFtot);
921  }//endif
922  }//endif
923 
924  //-----------------------------------------------------------------
925  // Vks needs contribs from all SF : chare index 1 is large and in charge
926  if(iterAtmTyp==natmTyp){
927  if(nchareHartAtmT==1) {
928  FFTVks();
929  }else{
930  UrhoGHartExtProxy[thisInstance.proxyOffset](thisIndex.x,1).acceptVks(ncoef,vks);
931  }//endif
932  }//endif
933 
934  //-----------------------------------------------------------------
935  // we always geneterate an SF : we have everthing for this atmtype
936  // : flow of control says ``this guy goes last''
937  // : This guy controls exit condition.
938  FFTEesFwd(0); // DON'T MOVE HIM
939 
940 //////////////////////////////////////////////////////////////////////////////
941  }//end routine
942 //////////////////////////////////////////////////////////////////////////////
943 
944 
945 //////////////////////////////////////////////////////////////////////////////
946 /// Statr FFting to R-space atmSF(gx,gy,gz) -> atmSF(gx,gy,z)
947 //////////////////////////////////////////////////////////////////////////////
948 //////////////////////////////////////////////////////////////////////////////
949 //////////////////////////////////////////////////////////////////////////////
951 //////////////////////////////////////////////////////////////////////////////
952 #ifdef _CP_GHART_VERBOSE_
953  CkPrintf("Ghart %d %d Here in FFT to r: %.10g %.10g : with %d at %d %d on %d\n",
954  thisIndex.x,thisIndex.y,ehart_ret,eext_ret,flag,iterAtmTyp,natmTyp,CkMyPe());
955 #endif
956 
957  //--------------------------------------------
958  // Get the data and some scratch
959  FFTcache *fftcache = UfftCacheProxy[thisInstance.proxyOffset].ckLocalBranch();
960  fftcache->getCacheMem("CP_Rho_GHartExt::FFTEesFwd");
961  complex *data_out = fftcache->tmpData;
962  complex *data; if(flag==0){data=atmSF;}else{data=atmSFtot;}
963 
964  //--------------------------------------------
965  // FFT the data : result goes into scratch
966  fftcache->doEextFFTGtoR_Gchare(data,data_out,numFullEext,rho_gs.numPoints,numLines,
967  rho_gs.numRuns,rho_gs.runs,ngridcEext,ind_x);
968 
969  //--------------------------------------------
970  // send yourself back to real space
971  sendAtmSF(flag);
972 
973 //////////////////////////////////////////////////////////////////////////////
974  }//end routine
975 //////////////////////////////////////////////////////////////////////////////
976 
977 
978 //////////////////////////////////////////////////////////////////////////////
979 /// Send the SF data to back to Rhart to get atm forces
980 //////////////////////////////////////////////////////////////////////////////
981 //////////////////////////////////////////////////////////////////////////////
982 //////////////////////////////////////////////////////////////////////////////
984 //////////////////////////////////////////////////////////////////////////////
985 #ifdef _CP_GHART_VERBOSE_
986  CkPrintf("Ghart %d %d Here in send to Rhart with opt %d at %d %d on %d\n",
987  thisIndex.x,thisIndex.y,flag,iterAtmTyp,natmTyp,CkMyPe());
988 #endif
989 
990  CPcharmParaInfo *sim = CPcharmParaInfo::get();
991  FFTcache *fftcache = UfftCacheProxy[thisInstance.proxyOffset].ckLocalBranch();
992  complex *senddata = fftcache->tmpData;
993  int ix = thisIndex.x;
994  int numLinesNow = numLines;
995  int **index_pack;
996  int *nline_send;
997  if(rhoRsubplanes>1){
998  nline_send = sim->nline_send_eext_y[ix];
999  index_pack = sim->index_tran_pack_eext_y[ix];
1000  }//endif
1001 
1002 //////////////////////////////////////////////////////////////////////////////
1003 /// start commlib
1004 #ifdef USE_COMLIB
1005  if(rhoRsubplanes==1){
1006  switch(flag){
1007 #ifdef OLD_COMMLIB
1008  case 0 : if(config.useGHartInsRHart) commGHartRHartIns0.beginIteration();break;
1009  case 1 : if(config.useGHartInsRHart) commGHartRHartIns1.beginIteration();break;
1010 #else
1011  case 0 : if(config.useGHartInsRHart) ComlibBegin(rhoRHartProxy_com0,1); break;
1012  case 1 : if(config.useGHartInsRHart) ComlibBegin(rhoRHartProxy_com1,1);break;
1013 #endif
1014  }//endif
1015  }//endif
1016 #endif
1017 
1018 //////////////////////////////////////////////////////////////////////////////
1019 /// Send the message : 1 pt from each line to each chareR
1020 
1021  int priority =config.rhorHartpriority + thisIndex.x*10;
1022  int prioritybits = 8*sizeof(int);
1023 
1024  for(int z=0; z < ngridcEext; z++) {
1025  for(int s=0;s<rhoRsubplanes;s++){
1026 
1027  if(rhoRsubplanes>1){numLinesNow = nline_send[s];}
1028  if(numLinesNow >0){
1029  RhoRHartMsg *msg = new (numLinesNow, prioritybits) RhoRHartMsg;
1030  msg->size = numLinesNow; // number of z-lines in this batch
1031  msg->senderIndex = thisIndex.x; // line batch index
1032  msg->iopt = flag; // iopt
1033  msg->iter = iterAtmTyp;
1034 
1035  if(config.prioEextFFTMsg){
1036  CkSetQueueing(msg, CK_QUEUEING_IFIFO);
1037  *(int*)CkPriorityPtr(msg) = priority;
1038  }//endif
1039 
1040  // beam out all points with same z to chare array index z
1041  complex *data = msg->data;
1042  if(rhoRsubplanes==1){
1043  for (int i=0,j=z; i<numLines; i++,j+=ngridcEext){data[i] = senddata[j];}
1044  }else{
1045  int *index_packs=index_pack[s];
1046  for(int i=0; i< numLinesNow; i++){
1047  data[i] = senddata[(z+index_packs[i])];
1048  }//endif
1049  }//endif
1050 
1051  if(rhoRsubplanes==1){
1052  switch(iopt){
1053  case 0 : rhoRHartProxy_com0(z,0,thisIndex.y).recvAtmForcFromRhoGHart(msg);break;
1054  case 1 : rhoRHartProxy_com1(z,0,thisIndex.y).recvAtmForcFromRhoGHart(msg);break;
1055  }//end switch
1056  }else{
1057  switch(iopt){
1058  case 0 : UrhoRHartExtProxy[thisInstance.proxyOffset](z,s,thisIndex.y).recvAtmForcFromRhoGHart(msg);break;
1059  case 1 : UrhoRHartExtProxy[thisInstance.proxyOffset](z,s,thisIndex.y).recvAtmForcFromRhoGHart(msg);break;
1060  }//end switch
1061  }//endif
1062 
1063  }// endif : we need to send to this subplane
1064  }// endfor : subplane loop
1065  }//endfor : z-plane parallel loop
1066 
1067 //////////////////////////////////////////////////////////////////////////////
1068 /// end commlib
1069 
1070 #ifdef USE_COMLIB
1071  if(rhoRsubplanes==1){
1072  switch(flag){
1073 #ifdef OLD_COMMLIB
1074  case 0 : if(config.useGHartInsRHart) commGHartRHartIns0.endIteration();break;
1075  case 1 : if(config.useGHartInsRHart) commGHartRHartIns1.endIteration();break;
1076 #else
1077  case 0 : if(config.useGHartInsRHart) ComlibEnd(rhoRHartProxy_com0,1); break;
1078  case 1 : if(config.useGHartInsRHart) ComlibEnd(rhoRHartProxy_com1,1);break;
1079 #endif
1080 
1081  }//end switch
1082  }//endif
1083 #endif
1084 
1085 //////////////////////////////////////////////////////////////////////////////
1086 /// We are done when when have sent out all SFs and the Ewald total SF (index=0)
1087 
1088  int nsendExpect=natmTyp;
1089  if(thisIndex.y==0){nsendExpect++;} // chare 0 sends out SFtot, too.
1090 
1091  nsendAtmTyp ++;
1092  if(nsendAtmTyp==nsendExpect){
1093  nsendAtmTyp = 0;
1094  iterAtmTyp = 0;
1095  atmSFHere = 0;
1096  densityHere = 0;
1097  }//endif
1098 
1099  fftcache->freeCacheMem("CP_Rho_GHartExt::FFTEesFwd");
1100 
1101 //////////////////////////////////////////////////////////////////////////////
1102  }//end routine
1103 //////////////////////////////////////////////////////////////////////////////
1104 
1105 //////////////////////////////////////////////////////////////////////////////
1106 /// Collect the SF from all the atm type chares on chare 0
1107 //////////////////////////////////////////////////////////////////////////////
1108 //////////////////////////////////////////////////////////////////////////////
1109 //////////////////////////////////////////////////////////////////////////////
1111 //////////////////////////////////////////////////////////////////////////////
1112 /// Recv the contribs.
1113 
1114  CkAssert(thisIndex.y==0);
1115 
1116  if(countAtmSFtot==0){bzero(atmSFtotRecv,size*sizeof(complex));}
1117  countAtmSFtot++;
1118 
1119  for(int i=0;i<size;i++){atmSFtotRecv[i]+=inSF[i];}
1120 
1121 //////////////////////////////////////////////////////////////////////////////
1122 /// Once you have it all, compute the energy, contribute, fft back, send to Rhart
1123 
1124  if(countAtmSFtot==nchareHartAtmT){
1125  countAtmSFtot=0;
1126 
1127  //---------------------------------------------------------
1128  // Compute ewald energy, modify the atmSFtot appropriately
1129  int myChareG = thisIndex.x;
1130  int ncoef = rho_gs.nPacked;
1131  int *k_x = rho_gs.k_x;
1132  int *k_y = rho_gs.k_y;
1133  int *k_z = rho_gs.k_z;
1134  eesCache *eesData = UeesCacheProxy[thisInstance.proxyOffset].ckLocalBranch ();
1135  double *b_re = eesData->RhoGHartData[myChareG]->b_re;
1136  double *b_im = eesData->RhoGHartData[myChareG]->b_im;
1137 #if CMK_TRACE_ENABLED
1138  double StartTime=CmiWallTimer();
1139 #endif
1140  double *perdCorr = rho_gs.perdCorr;
1141  CPLOCAL::eesEwaldGchare(ncoef,atmSFtotRecv,b_re,b_im,&ewd_ret,k_x,k_y,k_z,perdCorr,myChareG,config.nfreq_cplocal_eesewald);
1142 #if CMK_TRACE_ENABLED
1143  traceUserBracketEvent(eesEwaldG_, StartTime, CmiWallTimer());
1144 #endif
1145 
1146  //---------------------------------------------------------
1147  // Contribute your energies now that you have them all
1148  double e[3];
1149  e[0] = ehart_ret;
1150  e[1] = eext_ret;
1151  e[2] = ewd_ret;
1152  contribute(3*sizeof(double),e,CkReduction::sum_double);
1153 
1154  //---------------------------------------------------------
1155  // FFT back, which generates a send back to RHart
1156  complex *junk=atmSFtot;
1157  atmSFtot=atmSFtotRecv; // avoid a CmiMemcpy : tricky, tricky
1158  FFTEesFwd(1);
1159  atmSFtot=junk;
1160 
1161  }//endif
1162 
1163 //////////////////////////////////////////////////////////////////////////////
1164  }//end routine
1165 //////////////////////////////////////////////////////////////////////////////
1166 
1167 
1168 //////////////////////////////////////////////////////////////////////////////
1169 /// Collect the VKS from all the atm type chares on chare 1
1170 //////////////////////////////////////////////////////////////////////////////
1171 //////////////////////////////////////////////////////////////////////////////
1172 //////////////////////////////////////////////////////////////////////////////
1173 void CP_Rho_GHartExt::acceptVks(int size, complex * inVks){
1174 //////////////////////////////////////////////////////////////////////////////
1175 /// Recv the contributions
1176 
1177  CkAssert(thisIndex.y==1);
1178 
1179  if(countVksTot==0){bzero(VksRecv,size*sizeof(complex));}
1180  countVksTot++;
1181 
1182  for(int i=0;i<size;i++){VksRecv[i] += inVks[i];}
1183 
1184 //////////////////////////////////////////////////////////////////////////////
1185 /// When all the guys have reported, you can do the fft and then send vks to RhoReal
1186 
1187  if(countVksTot==nchareHartAtmT){
1188  countVksTot=0;
1189  complex *junk=rho_gs.Vks;
1190  rho_gs.Vks= VksRecv; // save a CmiMemcpy : tricky, tricky
1191  FFTVks();
1192  rho_gs.Vks=junk;
1193  }//endif
1194 
1195 //////////////////////////////////////////////////////////////////////////////
1196  }//end routine
1197 //////////////////////////////////////////////////////////////////////////////
1198 
1199 
1200 //////////////////////////////////////////////////////////////////////////////
1201 ///////////////////////////////////////////////////////////////////////////cc
1202 //////////////////////////////////////////////////////////////////////////////
1203 /// Glenn's special exit
1204 //////////////////////////////////////////////////////////////////////////////
1206 //////////////////////////////////////////////////////////////////////////////
1207 
1208  CPcharmParaInfo *sim = CPcharmParaInfo::get();
1209  int nchareG = sim->nchareRhoGEext;
1210 
1211  CountDebug++;
1212  if(CountDebug==nchareG*nchareHartAtmT){
1213  CountDebug=0;
1214  CkPrintf("I am in the exitfordebuging rhoghartext puppy. Bye-bye\n");
1215  CkExit();
1216  }//endif
1217 
1218 //////////////////////////////////////////////////////////////////////////////
1219  }//end routine
1220 //////////////////////////////////////////////////////////////////////////////
1221 /*@}*/
void acceptAtmSFTot(int size, complex *inAtm)
Collect the SF from all the atm type chares on chare 0 //////////////////////////////////////////////...
void getHartEextEes()
compute HartreeEextEes
holds the UberIndex and the offset for proxies
Definition: Uber.h:68
void doEextFFTGtoR_Gchare(complex *, complex *, int, int, int, int, RunDescriptor *, int, int)
Eext : Gchare : data(gx,gy,gz) -> data(gx,gy,z) : forward ///////////////////////////////////////////...
Definition: fftCache.C:890
void registrationDone(CkReductionMsg *msg)
= Make sure everyone is registered on the 1st time step
void recvAtmSFFromRhoRHart(RhoGHartMsg *msg)
Recv Atm SF from RhoRhart : Euler Exponential spline based method ///////////////////////////////////...
int nfreq_cplocal_eesewald
CPLOCAL::eesEwaldGchare.
Definition: configure.h:210
void FFTEesFwd(int)
Statr FFting to R-space atmSF(gx,gy,gz) -> atmSF(gx,gy,z) ///////////////////////////////////////////...
void registerCacheGHart(int, int, int *, int *, int *)
= RhoGhart Cache Management tool
Definition: eesCache.C:181
void setKVectors(int *n)
Definition: rhoSlab.C:371
void acceptVks(int size, complex *inVks)
Collect the VKS from all the atm type chares on chare 1 /////////////////////////////////////////////...
Add type declarations for simulationConstants class (readonly vars) and once class for each type of o...
== Index logic for lines of constant x,y in gspace.
Definition: RunDescriptor.h:22
void sendAtmSF(int)
Send the SF data to back to Rhart to get atm forces /////////////////////////////////////////////////...
void FFTVks()
Partly fft vks(gx,gy,gz) -> vks(gx,gy,z)
void acceptData(RhoGHartMsg *msg)
The density arrives from RhoGspace ONCE a time step /////////////////////////////////////////////////...
~CP_Rho_GHartExt()
Destructor /////////////////////////////////////////////////////////////////////////// //////////////...
int nfreq_cplocal_hartext
CPLOCAL::CP_hart_eext_calc.
Definition: configure.h:208
Some basic data structures and the array map classes are defined here.
void init()
Post constructor initialization /////////////////////////////////////////////////////////////////////...
void getSplitDecomp(int *, int *, int *, int, int, int)
Initialization Function /////////////////////////////////////////////////////////////////////////// /...
Definition: util.C:2250
void sendVks()
Send vks_hart_ext back to rho_real where fft(gx,gy) will be performed ///////////////////////////////...
Group Container class : Only allowed chare data classes have data.
Definition: eesCache.h:18
void FFTEesBck()
Finish FFting to G-space :: 2D) atmSF(gx,gy,z) -> atmSF(gx,gy,gz)
int nfreq_cplocal_eeshart
CPLOCAL::eesHartEextGchare.
Definition: configure.h:209
Useful debugging flags.
void HartExtVksG()
Compute hartree eext and vks using the N^2 method ///////////////////////////////////////////////////...
void doHartFFTGtoR_Gchare(complex *, complex *, int, int, int, int, RunDescriptor *, int, int)
Hartree : Gchare : data(gx,gy,gz) -> data(gx,gy,z) : forward ////////////////////////////////////////...
Definition: fftCache.C:664
void exitForDebugging()
Glenn's special exit.