QMCPACK
BackflowTransformation.cpp
Go to the documentation of this file.
1 //////////////////////////////////////////////////////////////////////////////////////
2 // This file is distributed under the University of Illinois/NCSA Open Source License.
3 // See LICENSE file in top directory for details.
4 //
5 // Copyright (c) 2016 Jeongnim Kim and QMCPACK developers.
6 //
7 // File developed by: Miguel Morales, moralessilva2@llnl.gov, Lawrence Livermore National Laboratory
8 // Jeongnim Kim, jeongnim.kim@gmail.com, University of Illinois at Urbana-Champaign
9 // Jeremy McMinnis, jmcminis@gmail.com, University of Illinois at Urbana-Champaign
10 // Mark A. Berrill, berrillma@ornl.gov, Oak Ridge National Laboratory
11 //
12 // File created by: Miguel Morales, moralessilva2@llnl.gov, Lawrence Livermore National Laboratory
13 //////////////////////////////////////////////////////////////////////////////////////
14 
15 
17 #include "DistanceTable.h"
20 
21 namespace qmcplusplus
22 {
24  : OptimizableObject("bf"), QP(els), cutOff(0.0), myTableIndex_(els.addTable(els))
25 {
26  NumTargets = els.getTotalNum();
32  indexQP.resize(NumTargets);
33  HESS_ID.diagonal(1.0);
34  DummyHess = 0.0;
35  numVarBefore = 0;
36 }
37 
39 {
40  cutOff = tr.cutOff;
41  numParams = tr.numParams;
44  bfFuns.resize(tr.bfFuns.size());
45  auto it(tr.bfFuns.begin());
46  for (int i = 0; i < (tr.bfFuns).size(); i++, it++)
47  bfFuns[i] = (*it)->makeClone(targetPtcl);
48 }
49 
50 // FIX FIX FIX
51 std::unique_ptr<BackflowTransformation> BackflowTransformation::makeClone(ParticleSet& tqp) const
52 {
53  auto clone = std::make_unique<BackflowTransformation>(tqp);
54  clone->copyFrom(*this, tqp);
55  // std::vector<BackflowFunctionBase*>::iterator it((bfFuns).begin());
56  // for(int i=0; i<(bfFuns).size() ; i++,it++)
57  // {
58  // clone->bfFuns[i]->reportStatus(cerr);
59  // }
60  return clone;
61 }
62 
64 
66 {
67  // update QP table
68  // may be faster if I do this one qp at a time, for now do full update
69  for (int i = 0; i < NumTargets; i++)
70  QP.R[i] = newQP[i];
71  QP.update(0);
72  indexQP.clear();
73  switch (UpdateMode)
74  {
75  case ORB_PBYP_RATIO:
76  break;
77  case ORB_PBYP_PARTIAL:
79  break;
80  case ORB_PBYP_ALL:
83  break;
84  default:
87  break;
88  }
89  for (int i = 0; i < bfFuns.size(); i++)
90  bfFuns[i]->acceptMove(iat, UpdateMode);
91 }
92 
94 {
95  indexQP.clear();
96  for (int i = 0; i < bfFuns.size(); i++)
97  bfFuns[i]->restore(iat, UpdateMode);
98 }
99 
101 {
102  for (int i = 0; i < bfFuns.size(); i++)
103  bfFuns[i]->checkInVariables(active);
104 }
105 
107 {
108  for (int i = 0; i < bfFuns.size(); i++)
109  bfFuns[i]->reportStatus(os);
110 }
111 
113 {
114  for (int i = 0; i < bfFuns.size(); i++)
115  bfFuns[i]->checkOutVariables(active);
116 }
117 
119 {
120  for (int i = 0; i < bfFuns.size(); i++)
121  if (bfFuns[i]->isOptimizable())
122  return true;
123  return false;
124 }
125 
127 {
128  //reset each unique basis functions
129  for (int i = 0; i < bfFuns.size(); i++)
130  if (bfFuns[i]->isOptimizable())
131  bfFuns[i]->resetParameters(active);
132 }
133 
135 {
136  if (storeQP.size() == 0)
137  {
140  storeQP.resize(NumTargets);
141  }
142  evaluate(P);
143  FirstOfP = &(storeQP[0][0]);
145  FirstOfA = &(Amat(0, 0)[0]);
147  FirstOfB = &(Bmat_full(0, 0)[0]);
149  FirstOfA_temp = &(Amat_temp(0, 0)[0]);
151  FirstOfB_temp = &(Bmat_temp(0, 0)[0]);
153  for (int i = 0; i < NumTargets; i++)
154  storeQP[i] = QP.R[i];
155  buf.add(FirstOfP, LastOfP);
156  buf.add(FirstOfA, LastOfA);
157  buf.add(FirstOfB, LastOfB);
158  for (int i = 0; i < bfFuns.size(); i++)
159  bfFuns[i]->registerData(buf);
160 }
161 
163 {
164  //if(redo) evaluate(P);
165  evaluate(P);
166  for (int i = 0; i < NumTargets; i++)
167  storeQP[i] = QP.R[i];
168  buf.put(FirstOfP, LastOfP);
169  buf.put(FirstOfA, LastOfA);
170  buf.put(FirstOfB, LastOfB);
171  for (int i = 0; i < bfFuns.size(); i++)
172  bfFuns[i]->updateBuffer(buf);
173 }
174 
176 {
177  buf.get(FirstOfP, LastOfP);
178  buf.get(FirstOfA, LastOfA);
179  buf.get(FirstOfB, LastOfB);
180  for (int i = 0; i < NumTargets; i++)
181  QP.R[i] = storeQP[i];
182  QP.update(0);
183  for (int i = 0; i < bfFuns.size(); i++)
184  bfFuns[i]->copyFromBuffer(buf);
185 }
186 
187 /** calculate quasi-particle coordinates only
188  */
190 {
191  for (int i = 0; i < NumTargets; i++)
192  QP.R[i] = P.R[i];
193  for (int i = 0; i < bfFuns.size(); i++)
194  bfFuns[i]->evaluate(P, QP);
195  QP.update(0); // update distance tables
196 }
197 
198 /** calculate new quasi-particle coordinates after pbyp move
199  */
201 //evaluatePbyP( ParticleSet& P, int iat)
202 {
204  // there should be no need for this, but there is (missing calls in QMCHam...)
205  for (int i = 0; i < bfFuns.size(); i++)
206  bfFuns[i]->restore(iat, UpdateMode);
207  activeParticle = iat;
208  for (int i = 0; i < NumTargets; i++)
209  oldQP[i] = newQP[i] = QP.R[i];
210  const auto& myTable = P.getDistTableAA(myTableIndex_);
211  newQP[iat] -= myTable.getTempDispls()[iat];
212  indexQP.clear();
213  for (int i = 0; i < bfFuns.size(); i++)
214  bfFuns[i]->evaluatePbyP(P, iat, newQP);
215  for (int jat = 0; jat < NumTargets; jat++)
216  {
217  // make direct routine in OhmmsPETE later
218  RealType dr = std::sqrt(dot(newQP[jat] - QP.R[jat], newQP[jat] - QP.R[jat]));
219  if (dr > 1e-10)
220  indexQP.push_back(jat);
221  }
222  //debug
223  /*
224  dummyQP2.R = P.R;
225  dummyQP2.update();
226  evaluate(P,dummyQP);
227  std::cout <<"index: ";
228  for(int i=0; i<indexQP.size(); i++) std::cout <<indexQP[i] <<" ";
229  std::cout << std::endl;
230  for(int jat=0; jat<NumTargets; jat++)
231  std::cout <<jat <<" "
232  <<(newQP[jat]-dummyQP.R[jat]) <<" " <<newQP[jat] <<" " <<QP.R[jat] <<"\n";
233  for(int i=0; i<NumTargets; i++) newQP[i] = dummyQP.R[i];
234  * /
235  indexQP.clear();
236  indexQP.push_back(iat); // set in the beginning by default
237  for(int jat=0; jat<NumTargets; jat++) {
238  if(jat!=iat) // && myTable.Temp[jat].r1 < cutOff )
239  indexQP.push_back(jat);
240  }
241  */
242 }
243 
244 /** calculate new quasi-particle coordinates after pbyp move
245  */
247 {
249  // there should be no need for this, but there is (missing calls in QMCHam...)
250  for (int i = 0; i < bfFuns.size(); i++)
251  bfFuns[i]->restore(iat, UpdateMode);
252  activeParticle = iat;
253  for (int i = 0; i < NumTargets; i++)
254  oldQP[i] = newQP[i] = QP.R[i];
255  const auto& myTable = P.getDistTableAA(myTableIndex_);
256  newQP[iat] -= myTable.getTempDispls()[iat];
257  indexQP.clear();
259  for (int i = 0; i < bfFuns.size(); i++)
260  bfFuns[i]->evaluatePbyP(P, iat, newQP, Amat_temp);
261  for (int jat = 0; jat < NumTargets; jat++)
262  {
263  RealType dr = std::sqrt(dot(newQP[jat] - QP.R[jat], newQP[jat] - QP.R[jat]));
264  if (dr > 1e-10)
265  indexQP.push_back(jat);
266  }
267 }
268 
269 /** calculate new quasi-particle coordinates after pbyp move
270  */
272 {
274  // there should be no need for this, but there is (missing calls in QMCHam...)
275  for (int i = 0; i < bfFuns.size(); i++)
276  bfFuns[i]->restore(iat, UpdateMode);
277  activeParticle = iat;
278  for (int i = 0; i < NumTargets; i++)
279  oldQP[i] = newQP[i] = QP.R[i];
280  const auto& myTable = P.getDistTableAA(myTableIndex_);
281 
282  // this is from AoS, is it needed or not?
283  //newQP[iat] += myTable.Temp[iat].dr1;
284 
285  indexQP.clear();
288  for (int i = 0; i < bfFuns.size(); i++)
290  for (int jat = 0; jat < NumTargets; jat++)
291  {
292  // make direct routine in OhmmsPETE later
293  RealType dr = std::sqrt(dot(newQP[jat] - QP.R[jat], newQP[jat] - QP.R[jat]));
294  if (dr > 1e-10)
295  indexQP.push_back(jat);
296  }
297 }
298 
299 
300 /** calculate only Bmat. Assume that QP and Amat are current
301  * This is used in pbyp moves, in updateBuffer()
302  */
304 {
305  Bmat_full = 0.0;
306  for (int i = 0; i < bfFuns.size(); i++)
308 }
309 
310 /** calculate quasi-particle coordinates, Bmat and Amat
311  */
313 {
314  Bmat = 0.0;
315  Amat = 0.0;
316  Bmat_full = 0.0;
317  QP.R = P.R;
318  for (int i = 0; i < NumTargets; i++)
319  {
320  //QP.R[i] = P.R[i];
321  Amat(i, i).diagonal(1.0);
322  }
323  for (int i = 0; i < bfFuns.size(); i++)
324  bfFuns[i]->evaluate(P, QP, Bmat_full, Amat);
325  // std::cerr <<"P.R \n";
326  // std::cerr <<P.R[0] << std::endl;
327  // std::cerr <<"QP.R " << std::endl;
328  // std::cerr <<QP.R[0] << std::endl;
329  // std::cerr <<omp_get_thread_num()<<" "<<P.R[0]-QP.R[0] << std::endl;
330  // APP_ABORT("TESTING BF \n");
331  /*Bmat=0.0;
332  Amat=0.0;
333  Bmat_full=0.0;
334  for(int i=0; i<NumTargets; i++) {
335  Amat(i,i).diagonal(1.0);
336  }*/
337  /*
338  // testing bf
339  for(int i=0; i<NumTargets; i++) {
340  std::cout <<"i: " <<i << std::endl;
341  std::cout <<P.R[i] << std::endl;
342  std::cout <<QP.R[i] << std::endl;
343  std::cout <<P.R[i]-QP.R[i] << std::endl;
344  }
345  //
346  */
347  QP.update(0); // update distance tables
348 }
349 
350 /** calculate quasi-particle coordinates and store in Pnew
351  */
353 {
354  Pnew.R = P.R;
355  for (int i = 0; i < bfFuns.size(); i++)
356  bfFuns[i]->evaluate(P, Pnew);
357  Pnew.update(0);
358 }
359 
361 {
362  if (Cmat.size() == 0)
363  // initialize in the first call
364  {
365  // assumes that all BF parameters are packed together in
366  // active variable set. is this always correct???
367  numParams = 0;
368  for (int i = 0; i < bfFuns.size(); i++)
369  {
370  int tmp = bfFuns[i]->setParamIndex(numParams);
371  numParams += tmp;
372  }
373  numVarBefore = bfFuns[0]->indexOffset();
374  //app_log() <<"numVarBefore: " <<numVarBefore << std::endl;
375  for (int i = 0; i < numParams; i++)
376  {
377  optIndexMap[i] = i + numVarBefore;
378  //app_log() <<"prm, map: " <<i <<" " <<optIndexMap[i] << std::endl;
379  }
383  }
384  // Uncomment to test calculation of Cmat,Xmat,Ymat
385  //testDeriv(P);
386  Bmat = 0.0;
387  Amat = 0.0;
388  Bmat_full = 0.0;
389  Cmat = 0.0;
390  Ymat = 0.0;
391  std::fill_n(Xmat.data(), Xmat.size(), 0);
392  for (int i = 0; i < NumTargets; i++)
393  {
394  QP.R[i] = P.R[i];
395  Amat(i, i).diagonal(1.0);
396  }
397  for (int i = 0; i < bfFuns.size(); i++)
398  bfFuns[i]->evaluateWithDerivatives(P, QP, Bmat_full, Amat, Cmat, Ymat, Xmat);
399  QP.update(0);
400 }
401 
403 {
404  if (Cmat.size() == 0)
405  // initialize in the first call
406  {
410  }
411  Bmat = 0.0;
412  Amat = 0.0;
413  Bmat_full = 0.0;
414  Cmat = 0.0;
415  Ymat = 0.0;
416  std::fill_n(Xmat.data(), Xmat.size(), 0);
417  for (int i = 0; i < NumTargets; i++)
418  {
419  QP.R[i] = P.R[i];
420  Amat(i, i).diagonal(1.0);
421  }
422  for (int i = 0; i < bfFuns.size(); i++)
423  bfFuns[i]->evaluateWithDerivatives(P, QP, Bmat_full, Amat, Cmat, Ymat, Xmat);
427  GradMatrix Bmat_full_1;
428  HessMatrix Amat_1;
429  GradMatrix Bmat_full_2;
430  HessMatrix Amat_2;
431  RealType dh = 0.00001;
432  qp_0.resize(NumTargets);
433  qp_1.resize(NumTargets);
434  qp_2.resize(NumTargets);
435  Bmat_full_1.resize(NumTargets, NumTargets);
436  Bmat_full_2.resize(NumTargets, NumTargets);
437  Amat_1.resize(NumTargets, NumTargets);
438  Amat_2.resize(NumTargets, NumTargets);
439  for (int i = 0; i < NumTargets; i++)
440  {
441  qp_0[i] = QP.R[i];
442  }
443  app_log() << " Testing derivatives of backflow transformation. \n";
444  app_log() << " Numtargets: " << NumTargets << std::endl;
445  opt_variables_type wfVars, wfvar_prime;
446  checkInVariables(wfVars);
447  checkOutVariables(wfVars);
448  int Nvars = wfVars.size();
449  wfvar_prime = wfVars;
450  wfVars.print(std::cout);
451  for (int i = 0; i < Nvars; i++)
452  {
453  for (int j = 0; j < Nvars; j++)
454  wfvar_prime[j] = wfVars[j];
455  wfvar_prime[i] = wfVars[i] + dh;
456  resetParameters(wfvar_prime);
457  Bmat_full_1 = 0.0;
458  Amat_1 = 0.0;
459  for (int k = 0; k < NumTargets; k++)
460  {
461  QP.R[k] = P.R[k];
462  Amat_1(k, k).diagonal(1.0);
463  }
464  for (int k = 0; k < bfFuns.size(); k++)
465  bfFuns[k]->evaluate(P, QP, Bmat_full_1, Amat_1);
466  for (int k = 0; k < NumTargets; k++)
467  qp_1[k] = QP.R[k];
468  for (int j = 0; j < Nvars; j++)
469  wfvar_prime[j] = wfVars[j];
470  wfvar_prime[i] = wfVars[i] - dh;
471  resetParameters(wfvar_prime);
472  Bmat_full_2 = 0.0;
473  Amat_2 = 0.0;
474  for (int k = 0; k < NumTargets; k++)
475  {
476  QP.R[k] = P.R[k];
477  Amat_2(k, k).diagonal(1.0);
478  }
479  for (int k = 0; k < bfFuns.size(); k++)
480  bfFuns[k]->evaluate(P, QP, Bmat_full_2, Amat_2);
481  for (int k = 0; k < NumTargets; k++)
482  qp_2[k] = QP.R[k];
483  app_log() << "Cmat: \n"
484  << "i, AvDiff, max: \n";
485  //2011-07-17: what is the proper data type?
486  RealType df, av = 0.0, cnt = 0.0;
487  RealType maxD = -100.0;
488  const RealType ConstOne(1.0);
489  for (int k = 0; k < NumTargets; k++)
490  {
491  for (int q = 0; q < OHMMS_DIM; q++)
492  {
493  cnt += ConstOne;
494  df = (((qp_1[k])[q] - (qp_2[k])[q]) / (2.0 * dh) - Cmat(i, k)[q]);
495  av += df;
496  if (std::abs(df) > maxD)
497  maxD = std::abs(df);
498  //app_log() <<k <<" " <<q <<" "
499  // <<( (qp_1[k])[q] - (qp_2[k])[0] )/(2.0*dh) <<" "
500  // <<Cmat(i,k)[q] <<" " <<(( (qp_1[k])[q] - (qp_2[k])[q] )/(2.0*dh)-Cmat(i,k)[q]) << std::endl;
501  }
502  }
503  app_log() << i << " " << av / cnt << " " << maxD << std::endl;
504  av = cnt = maxD = 0.0;
505  app_log() << "Ymat: \n";
506  for (int k = 0; k < NumTargets; k++)
507  {
508  for (int q = 0; q < 3; q++)
509  {
510  RealType dB = 0.0;
511  for (int j = 0; j < NumTargets; j++)
512  dB += (Bmat_full_1(j, k)[q] - Bmat_full_2(j, k)[q]);
513  cnt += ConstOne;
514  df = (dB / (2.0 * dh) - Ymat(i, k)[q]);
515  av += df;
516  if (std::abs(df) > maxD)
517  maxD = std::abs(df);
518  //app_log() <<k <<" " <<q <<" "
519  // <<dB/(2.0*dh) <<" "
520  // <<Ymat(i,k)[q] <<" " <<(dB/(2.0*dh)-Ymat(i,k)[q]) << std::endl;
521  }
522  }
523  app_log() << i << " " << av / cnt << " " << maxD << std::endl;
524  av = cnt = maxD = 0.0;
525  app_log() << "Xmat: \n";
526  for (int k1 = 0; k1 < NumTargets; k1++)
527  for (int k2 = 0; k2 < NumTargets; k2++)
528  {
529  for (int q1 = 0; q1 < 3; q1++)
530  {
531  for (int q2 = 0; q2 < 3; q2++)
532  {
533  RealType dB = (Amat_1(k1, k2))(q1, q2) - (Amat_2(k1, k2))(q1, q2);
534  cnt += ConstOne;
535  df = (dB / (2.0 * dh) - (Xmat(i, k1, k2))(q1, q2));
536  av += df;
537  if (std::abs(df) > maxD)
538  maxD = std::abs(df);
539  //app_log() <<k1 <<" " <<k2 <<" " <<q1 <<" " <<q2 <<" "
540  // <<(Xmat(i,k1,k2))(q1,q2) <<" " <<(dB/(2.0*dh)-(Xmat(i,k1,k2))(q1,q2)) << std::endl;
541  }
542  }
543  }
544  app_log() << i << " " << av / cnt << " " << maxD << std::endl;
545  av = cnt = maxD = 0.0;
546  }
547 }
548 
550 {
551  GradMatrix Bmat_full_0;
552  HessMatrix Amat_0;
553  GradMatrix Bmat_full_1;
554  HessMatrix Amat_1;
557  ParticleSet::ParticlePos qp_2, qp_3;
558  qp_0.resize(NumTargets);
559  qp_1.resize(NumTargets);
560  qp_2.resize(NumTargets);
561  qp_3.resize(NumTargets);
562  Bmat_full_0.resize(NumTargets, NumTargets);
563  Bmat_full_1.resize(NumTargets, NumTargets);
564  Amat_0.resize(NumTargets, NumTargets);
565  Amat_1.resize(NumTargets, NumTargets);
566  P.update();
567  WFBufferType tbuffer;
568  size_t BufferCursor = tbuffer.current();
569  registerData(P, tbuffer);
570  tbuffer.rewind(BufferCursor);
571  updateBuffer(P, tbuffer, true);
572  qp_3 = P.R;
573  evaluate(P);
574  qp_2 = QP.R;
575  app_log() << "after 1st eval: " << cutOff << std::endl;
576  for (int jat = 0; jat < NumTargets; jat++)
577  app_log() << jat << " " << P.R[jat] - QP.R[jat] << std::endl;
578  //for(int iat=0; iat<NumTargets; iat++) {
579  for (int iat = 0; iat < 1; iat++)
580  {
581  PosType dr;
582  dr[0] = 0.1;
583  dr[1] = 0.05;
584  dr[2] = -0.3;
585  P.makeMove(iat, dr);
586  const auto& myTable = P.getDistTableAA(myTableIndex_);
587 
588  //app_log() << "Move: " << myTable.Temp[iat].dr1 << std::endl;
589  //app_log() << "cutOff: " << cutOff << std::endl;
590  //for (int jat = 0; jat < NumTargets; jat++)
591  // app_log() << jat << " " << myTable.Temp[jat].r1 << std::endl;
592 
593  //evaluatePbyP(P,iat);
594  evaluatePbyPWithGrad(P, iat);
595  app_log() << "Moving: ";
596  for (int i = 0; i < indexQP.size(); i++)
597  app_log() << indexQP[i] << " ";
598  app_log() << std::endl;
599  acceptMove(P, iat);
600  P.acceptMove(iat);
601  }
602  qp_0 = QP.R;
603  Amat_0 = Amat;
604  tbuffer.rewind(BufferCursor);
605  updateBuffer(P, tbuffer, false);
606  P.update();
607  evaluate(P);
608  Amat_1 = Amat_0 - Amat;
609  qp_1 = QP.R - qp_0;
610  RealType qpdiff = Dot(qp_1, qp_1);
611  RealType Amdiff = 0.0;
612  for (int i = 0; i < NumTargets; i++)
613  for (int k = 0; k < NumTargets; k++)
614  for (int j = 0; j < OHMMS_DIM * OHMMS_DIM; j++)
615  Amdiff += Amat_1(i, k)[j] * Amat_1(i, k)[j];
616  app_log() << "Error in pbyp QP transformation: " << qpdiff << std::endl;
617  app_log() << "Error in pbyp QP Amat: " << Amdiff << std::endl;
618  app_log() << "i, diff, newPbyP, newEval: \n";
619  for (int i = 0; i < NumTargets; i++)
620  app_log() << i << "\n" << qp_0[i] - QP.R[i] << "\n" << qp_0[i] << "\n" << QP.R[i] << std::endl << std::endl;
621  APP_ABORT("Finished BackflowTransformation::testPbyP() \n.");
622 }
623 } // namespace qmcplusplus
void resize(size_type n, Type_t val=Type_t())
Resize the container.
Definition: OhmmsVector.h:166
void evaluateBmatOnly(const ParticleSet &P, int iat)
calculate only Bmat.
void evaluatePbyP(const ParticleSet &P, int iat)
calculate new quasi-particle coordinates after pbyp move
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
const DistanceTableAA & getDistTableAA(int table_ID) const
get a distance table by table_ID and dyanmic_cast to DistanceTableAA
MakeReturn< UnaryNode< FnFabs, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t abs(const Vector< T1, C1 > &l)
size_t getTotalNum() const
Definition: ParticleSet.h:493
void fill_n(T *x, size_t count, const T &value)
Definition: OMPstd.hpp:21
ParticleSet::ParticlePos newQP
new qp coordinates for pbyp moves.
std::ostream & app_log()
Definition: OutputManager.h:65
Type_t * data()
Definition: OhmmsArray.h:87
void updateBuffer(ParticleSet &P, WFBufferType &buf, bool redo)
void resize(size_type n, size_type m)
Resize the container.
Definition: OhmmsMatrix.h:99
void update(bool skipSK=false)
update the internal data
Attaches a unit to a Vector for IO.
void resize(const std::array< SIZET, D > &dims)
Resize the container.
Definition: OhmmsArray.h:65
void registerData(ParticleSet &P, WFBufferType &buf)
#define OHMMS_DIM
Definition: config.h:64
T Dot(const ParticleAttrib< TinyVector< T, D >> &pa, const ParticleAttrib< TinyVector< T, D >> &pb)
void evaluateDerivatives(const ParticleSet &P)
for(int i=0;i< size_test;++i) CHECK(Approx(gauss_random_vals[offset_for_rs+i])
void copy(const Array< T1, 3 > &src, Array< T2, 3 > &dest)
Definition: Blitz.h:639
void evaluatePbyPAll(const ParticleSet &P, int iat)
calculate new quasi-particle coordinates after pbyp move
Specialized paritlce class for atomistic simulations.
Definition: ParticleSet.h:55
size_type size() const
Definition: OhmmsMatrix.h:76
void checkOutVariables(const opt_variables_type &active)
class to handle a set of variables that can be modified during optimizations
Definition: VariableSet.h:49
size_t size() const
Definition: OhmmsArray.h:57
ParticlePos R
Position.
Definition: ParticleSet.h:79
#define APP_ABORT(msg)
Widely used but deprecated fatal error macros from legacy code.
Definition: AppAbort.h:27
size_type size() const
return the size
Definition: VariableSet.h:88
void checkInVariables(opt_variables_type &active)
void diagonal(const T &rhs)
Definition: Tensor.h:205
size_type current() const
Definition: PooledMemory.h:76
MakeReturn< UnaryNode< FnSqrt, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t sqrt(const Vector< T1, C1 > &l)
int NumTargets
number of quantum particles
void reportStatus(std::ostream &os) final
print the state, e.g., optimizables
std::vector< std::unique_ptr< BackflowFunctionBase > > bfFuns
void makeMove(Index_t iat, const SingleParticlePos &displ, bool maybe_accept=true)
move the iat-th particle to active_pos_
void copyFrom(const BackflowTransformation &tr, ParticleSet &targetPtcl)
void resetParameters(const opt_variables_type &active)
Declaraton of ParticleAttrib<T>
void evaluate(const ParticleSet &P)
calculate quasi-particle coordinates, Bmat and Amat
void acceptMove(const ParticleSet &P, int iat)
Tensor< typename BinaryReturn< T1, T2, OpMultiply >::Type_t, D > dot(const AntiSymTensor< T1, D > &lhs, const AntiSymTensor< T2, D > &rhs)
void evaluatePbyPWithGrad(const ParticleSet &P, int iat)
calculate new quasi-particle coordinates after pbyp move
std::unique_ptr< BackflowTransformation > makeClone(ParticleSet &tqp) const
void acceptMove(Index_t iat)
accept the move and update the particle attribute by the proposed move in regular mode ...
void rewind(size_type cur=0, size_type cur_scalar=0)
set the cursors
Definition: PooledMemory.h:85
void print(std::ostream &os, int leftPadSpaces=0, bool printHeader=false) const
int activeParticle
active particle in pbyp moves
void copyFromBuffer(ParticleSet &P, WFBufferType &buf)
void put(std::complex< T1 > &x)
Definition: PooledMemory.h:165
void transformOnly(const ParticleSet &P)
calculate quasi-particle coordinates only
ParticleSet QP
quasiparticle coordinates
std::vector< int > indexQP
store index of qp coordinates that changed during pbyp move
void add(std::complex< T1 > &x)
Definition: PooledMemory.h:113
void get(std::complex< T1 > &x)
Definition: PooledMemory.h:132