QMCPACK
PadeFunctors.h
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: Ken Esler, kpesler@gmail.com, University of Illinois at Urbana-Champaign
8 // Miguel Morales, moralessilva2@llnl.gov, Lawrence Livermore National Laboratory
9 // Jeremy McMinnis, jmcminis@gmail.com, University of Illinois at Urbana-Champaign
10 // Jeongnim Kim, jeongnim.kim@gmail.com, University of Illinois at Urbana-Champaign
11 // Mark A. Berrill, berrillma@ornl.gov, Oak Ridge National Laboratory
12 // Luke Shulenburger, lshulen@sandia.gov, Sandia National Laboratories
13 //
14 // File created by: Ken Esler, kpesler@gmail.com, University of Illinois at Urbana-Champaign
15 //////////////////////////////////////////////////////////////////////////////////////
16 
17 
18 /** @file PadeFunctors.h
19  * @brief Functors which implement Pade functions
20  */
21 #ifndef QMCPLUSPLUS_PADEFUNCTORS_H
22 #define QMCPLUSPLUS_PADEFUNCTORS_H
23 #include "OptimizableFunctorBase.h"
24 #include "OhmmsData/AttributeSet.h"
25 #include <cmath>
26 // #include <vector>
27 #include "OhmmsPETE/TinyVector.h"
29 
30 
31 namespace qmcplusplus
32 {
33 /** Implements a Pade Function \f$u[r]=A*r/(1+B*r)\f$
34  *
35  * Similar to PadeJastrow with a scale.
36  */
37 template<class T>
39 {
40  ///true, if A is optimizable
41  bool Opt_A;
42  ///true, if B is optimizable
43  bool Opt_B;
44  ///input A
46  ///input B
48  ///input scaling, default=1.0
50  ///B=B0*Scale
52  ///AB=A*B
54  ///B2=2*B
56  ///AoverB=A/B
58  ///id of A
59  std::string ID_A;
60  ///id of B
61  std::string ID_B;
62 
63  ///default constructor
64  PadeFunctor(const std::string& my_name)
65  : OptimizableFunctorBase(my_name), Opt_A(false), Opt_B(true), A(1.0), B0(1.0), Scale(1.0), ID_A("0"), ID_B("0")
66  {
67  reset();
68  }
69 
70  void setCusp(real_type cusp) override
71  {
72  A = cusp;
73  Opt_A = false;
74  reset();
75  }
76 
77  OptimizableFunctorBase* makeClone() const override { return new PadeFunctor(*this); }
78 
79  void reset() override
80  {
81  cutoff_radius = 1.0e4; //some big range
82  //A=a; B0=b; Scale=s;
83  B = B0 * Scale;
84  AB = A * B;
85  B2 = 2.0 * B;
86  AoverB = A / B;
87  }
88 
89  inline real_type evaluate(real_type r) const { return A * r / (1.0 + B * r) - AoverB; }
90 
91  inline real_type evaluate(real_type r, real_type& dudr, real_type& d2udr2) const
92  {
93  real_type u = 1.0 / (1.0 + B * r);
94  dudr = A * u * u;
95  d2udr2 = -B2 * dudr * u;
96  return A * u * r - AoverB;
97  }
98 
99  inline real_type evaluate(real_type r, real_type& dudr, real_type& d2udr2, real_type& d3udr3) const
100  {
101  real_type u = 1.0 / (1.0 + B * r);
102  dudr = A * u * u;
103  d2udr2 = -B2 * dudr * u;
104  d3udr3 = -3.0 * B * d2udr2 * u;
105  return A * u * r - AoverB;
106  }
107 
108  inline real_type evaluateV(const int iat,
109  const int iStart,
110  const int iEnd,
111  const T* restrict _distArray,
112  T* restrict distArrayCompressed) const
113  {
114  real_type sum(0);
115  for (int idx = iStart; idx < iEnd; idx++)
116  if (idx != iat)
117  sum += evaluate(_distArray[idx]);
118  return sum;
119  }
120 
121  /** evaluate sum of the pair potentials FIXME
122  * @return \f$\sum u(r_j)\f$ for r_j < cutoff_radius
123  */
124  static void mw_evaluateV(const int num_groups,
125  const PadeFunctor* const functors[],
126  const int n_src,
127  const int* grp_ids,
128  const int num_pairs,
129  const int* ref_at,
130  const T* mw_dist,
131  const int dist_stride,
132  T* mw_vals,
133  Vector<char, OffloadPinnedAllocator<char>>& transfer_buffer)
134  {
135  for (int ip = 0; ip < num_pairs; ip++)
136  {
137  mw_vals[ip] = 0;
138  for (int j = 0; j < n_src; j++)
139  {
140  const int ig = grp_ids[j];
141  auto& functor(*functors[ig]);
142  if (j != ref_at[ip])
143  mw_vals[ip] += functor.evaluate(mw_dist[ip * dist_stride + j]);
144  }
145  }
146  }
147 
148  inline void evaluateVGL(const int iat,
149  const int iStart,
150  const int iEnd,
151  const T* distArray,
152  T* restrict valArray,
153  T* restrict gradArray,
154  T* restrict laplArray,
155  T* restrict distArrayCompressed,
156  int* restrict distIndices) const
157  {
158  for (int idx = iStart; idx < iEnd; idx++)
159  {
160  valArray[idx] = evaluate(distArray[idx], gradArray[idx], laplArray[idx]);
161  gradArray[idx] /= distArray[idx];
162  }
163  if (iat >= iStart && iat < iEnd)
164  valArray[iat] = gradArray[iat] = laplArray[iat] = T(0);
165  }
166 
167  static void mw_evaluateVGL(const int iat,
168  const int num_groups,
169  const PadeFunctor* const functors[],
170  const int n_src,
171  const int* grp_ids,
172  const int nw,
173  T* mw_vgl, // [nw][DIM+2]
174  const int n_padded,
175  const T* mw_dist, // [nw][DIM+1][n_padded]
176  T* mw_cur_allu, // [nw][3][n_padded]
177  Vector<char, OffloadPinnedAllocator<char>>& transfer_buffer)
178  {
179  throw std::runtime_error("PadeFunctor mw_evaluateVGL not implemented!");
180  }
181 
182  inline real_type f(real_type r) override { return evaluate(r) - AoverB; }
183 
184  inline real_type df(real_type r) override
185  {
186  real_type dudr, d2udr2;
187  real_type res = evaluate(r, dudr, d2udr2);
188  return dudr;
189  }
190 
191  static void mw_updateVGL(const int iat,
192  const std::vector<bool>& isAccepted,
193  const int num_groups,
194  const PadeFunctor* const functors[],
195  const int n_src,
196  const int* grp_ids,
197  const int nw,
198  T* mw_vgl, // [nw][DIM+2]
199  const int n_padded,
200  const T* mw_dist, // [nw][DIM+1][n_padded]
201  T* mw_allUat, // [nw][DIM+2][n_padded]
202  T* mw_cur_allu, // [nw][3][n_padded]
203  Vector<char, OffloadPinnedAllocator<char>>& transfer_buffer)
204  {
205  throw std::runtime_error("PadeFunctor mw_updateVGL not implemented!");
206  }
207 
208  /// compute derivatives with respect to A and B
209  inline bool evaluateDerivatives(real_type r, std::vector<TinyVector<real_type, 3>>& derivs) override
210  {
211  int i = 0;
212  real_type u = 1.0 / (1.0 + B * r);
213  if (Opt_A)
214  {
215  derivs[i][0] = r * u - 1 / B; //du/da
216  derivs[i][1] = u * u; //d(du/da)/dr
217  derivs[i][2] = -B2 * u * u * u; //d^2 (du/da)/dr
218  ++i;
219  }
220  if (Opt_B)
221  {
222  derivs[i][0] = -A * r * r * u * u + AoverB / B; //du/db
223  derivs[i][1] = -2.0 * A * r * u * u * u; //d(du/db)/dr
224  derivs[i][2] = 2.0 * A * (B2 * r - 1) * u * u * u * u; //d^2(du/db)/dr^2
225  }
226  return true;
227  }
228 
229  /// compute derivatives with respect to A and B
230  inline bool evaluateDerivatives(real_type r, std::vector<real_type>& derivs) override
231  {
232  int i = 0;
233  real_type u = 1.0 / (1.0 + B * r);
234  if (Opt_A)
235  {
236  derivs[i] = r * u - 1 / B; //du/da
237  ++i;
238  }
239  if (Opt_B)
240  {
241  derivs[i] = -A * r * r * u * u + AoverB / B; //du/db
242  }
243  return true;
244  }
245 
246  bool put(xmlNodePtr cur) override
247  {
248  real_type Atemp(A), Btemp(B0);
249  cur = cur->xmlChildrenNode;
250  while (cur != NULL)
251  {
252  std::string cname((const char*)(cur->name));
253  if (cname == "var") //only accept var
254  {
255  std::string id_in("0");
256  std::string p_name("B");
257  OhmmsAttributeSet rAttrib;
258  rAttrib.add(id_in, "id");
259  rAttrib.add(p_name, "name");
260  rAttrib.put(cur);
261  if (p_name == "A")
262  {
263  ID_A = id_in;
264  putContent(Atemp, cur);
265  Opt_A = true;
266  }
267  else if (p_name == "B")
268  {
269  ID_B = id_in;
270  putContent(Btemp, cur);
271  Opt_B = true;
272  }
273  }
274  cur = cur->next;
275  }
276  A = Atemp;
277  B0 = Btemp;
278  reset();
279  myVars.clear();
280  if (Opt_A)
282  if (Opt_B)
284  int left_pad_space = 5;
285  app_log() << std::endl;
286  myVars.print(app_log(), left_pad_space, true);
287  return true;
288  }
289 
291  {
292  active.insertFrom(myVars);
293  }
294 
295  void checkOutVariables(const opt_variables_type& active) override
296  {
297  myVars.getIndex(active);
298  }
299 
300  void resetParametersExclusive(const opt_variables_type& active) override
301  {
302  if (myVars.size())
303  {
304  int ia = myVars.where(0);
305  if (ia > -1)
306  {
307  int i = 0;
308  if (Opt_A)
309  A = std::real(myVars[i++] = active[ia++]);
310  if (Opt_B)
311  B0 = std::real(myVars[i] = active[ia]);
312  }
313  reset();
314  }
315  }
316 };
317 
318 
319 /** Pade function of \f[ u(r) = \frac{a*r+c*r^2}{1+b*r} \f]
320  *
321  * Prototype of the template parameter of TwoBodyJastrow and OneBodyJastrow
322  */
323 template<class T>
325 {
326  ///coefficients
328  bool Opt_A, Opt_B, Opt_C;
329  ///id for A
330  std::string ID_A;
331  ///id for B
332  std::string ID_B;
333  ///id for C
334  std::string ID_C;
335 
336  ///constructor
337  Pade2ndOrderFunctor(const std::string& my_name, real_type a = 1.0, real_type b = 1.0, real_type c = 1.0)
338  : OptimizableFunctorBase(my_name), A(a), B(b), C(c), ID_A("0"), ID_B("0"), ID_C("0")
339  {
340  reset();
341  }
342 
343  OptimizableFunctorBase* makeClone() const override { return new Pade2ndOrderFunctor(*this); }
344 
345  /** reset the internal variables.
346  */
347  void reset() override
348  {
349  // A = a; B=b; C = c;
350  cutoff_radius = 1.0e4; //some big range
351  C2 = 2.0 * C;
352  }
353 
354  /**@param r the distance
355  @return \f$ u(r) = \frac{a*r+c*r^2}{1+b*r} \f$
356  */
357  inline real_type evaluate(real_type r) const
358  {
359  real_type u = 1.0 / (1.0 + B * r);
360  real_type v = A * r + C * r * r;
361  return u * v;
362  }
363 
364  /** evaluate the value at r
365  * @param r the distance
366  @param dudr return value \f$ du/dr = a/(1+br)^2 \f$
367  @param d2udr2 return value \f$ d^2u/dr^2 = -2ab/(1+br)^3 \f$
368  @return \f$ u(r) = \frac{a*r+c*r^2}{1+b*r} \f$
369  */
370  inline real_type evaluate(real_type r, real_type& dudr, real_type& d2udr2) const
371  {
372  real_type u = 1.0 / (1.0 + B * r);
373  real_type v = A * r + C * r * r;
374  real_type w = A + C2 * r;
375  dudr = u * (w - B * u * v);
376  d2udr2 = 2.0 * u * u * u * (C - B * A);
377  return u * v;
378  }
379 
380  inline real_type evaluate(real_type r, real_type& dudr, real_type& d2udr2, real_type& d3udr3) const
381  {
382  real_type u = 1.0 / (1.0 + B * r);
383  real_type v = A * r + C * r * r;
384  real_type w = A + C2 * r;
385  dudr = u * (w - B * u * v);
386  d2udr2 = 2.0 * u * u * u * (C - B * A);
387  std::cerr << "Third derivative not imlemented for Pade functor.\n";
388  return u * v;
389  }
390 
391  inline real_type evaluateV(const int iat,
392  const int iStart,
393  const int iEnd,
394  const T* restrict _distArray,
395  T* restrict distArrayCompressed) const
396  {
397  real_type sum(0);
398  for (int idx = iStart; idx < iEnd; idx++)
399  if (idx != iat)
400  sum += evaluate(_distArray[idx]);
401  return sum;
402  }
403 
404  /** evaluate sum of the pair potentials FIXME
405  * @return \f$\sum u(r_j)\f$ for r_j < cutoff_radius
406  */
407  static void mw_evaluateV(const int num_groups,
408  const Pade2ndOrderFunctor* const functors[],
409  const int n_src,
410  const int* grp_ids,
411  const int num_pairs,
412  const int* ref_at,
413  const T* mw_dist,
414  const int dist_stride,
415  T* mw_vals,
416  Vector<char, OffloadPinnedAllocator<char>>& transfer_buffer)
417  {
418  for (int ip = 0; ip < num_pairs; ip++)
419  {
420  mw_vals[ip] = 0;
421  for (int j = 0; j < n_src; j++)
422  {
423  const int ig = grp_ids[j];
424  auto& functor(*functors[ig]);
425  if (j != ref_at[ip])
426  mw_vals[ip] += functor.evaluate(mw_dist[ip * dist_stride + j]);
427  }
428  }
429  }
430 
431  inline void evaluateVGL(const int iat,
432  const int iStart,
433  const int iEnd,
434  const T* distArray,
435  T* restrict valArray,
436  T* restrict gradArray,
437  T* restrict laplArray,
438  T* restrict distArrayCompressed,
439  int* restrict distIndices) const
440  {
441  for (int idx = iStart; idx < iEnd; idx++)
442  {
443  valArray[idx] = evaluate(distArray[idx], gradArray[idx], laplArray[idx]);
444  gradArray[idx] /= distArray[idx];
445  }
446  if (iat >= iStart && iat < iEnd)
447  valArray[iat] = gradArray[iat] = laplArray[iat] = T(0);
448  }
449 
450  real_type f(real_type r) override { return evaluate(r); }
451 
452  real_type df(real_type r) override
453  {
454  real_type dudr, d2udr2;
455  real_type res = evaluate(r, dudr, d2udr2);
456  return dudr;
457  }
458 
459  inline bool evaluateDerivatives(real_type r, std::vector<TinyVector<real_type, 3>>& derivs) override
460  {
461  real_type u = 1.0 / (1.0 + B * r);
462  real_type u2 = u * u;
463  real_type u3 = u * u * u;
464  real_type u4 = u * u * u * u;
465  int i = 0;
466  if (Opt_A)
467  {
468  derivs[i][0] = r * u;
469  derivs[i][1] = u2;
470  derivs[i][2] = -2.0 * B * u3;
471  i++;
472  }
473 
474  if (Opt_B)
475  {
476  derivs[i][0] = -r * r * (A + C * r) * u2;
477  derivs[i][1] = -r * (2.0 * A + C * r * (3.0 + B * r)) * u3;
478  derivs[i][2] = -2.0 * u4 * (A - 2.0 * A * B * r + 3.0 * C * r);
479  i++;
480  }
481 
482  if (Opt_C)
483  {
484  derivs[i][0] = r * r * u;
485  derivs[i][1] = r * (2.0 + B * r) * u2;
486  derivs[i][2] = 2.0 * u3;
487  i++;
488  }
489  return true;
490  }
491 
492 
493  inline bool evaluateDerivatives(real_type r, std::vector<real_type>& derivs) override
494  {
495  real_type u = 1.0 / (1.0 + B * r);
496  int i = 0;
497  if (Opt_A)
498  {
499  derivs[i] = r * u;
500  i++;
501  }
502  if (Opt_B)
503  {
504  derivs[i] = -r * r * (A + C * r) * u * u;
505  i++;
506  }
507  if (Opt_C)
508  {
509  derivs[i] = r * r * u;
510  i++;
511  }
512  return true;
513  }
514 
515 
516  /** process input xml node
517  * @param cur current xmlNode from which the data members are reset
518  *
519  * Read in the Pade parameters from the xml input file.
520  */
521  bool put(xmlNodePtr cur) override
522  {
523  real_type Atemp, Btemp, Ctemp;
524  //jastrow[iab]->put(cur->xmlChildrenNode,wfs_ref.RealVars);
525  xmlNodePtr tcur = cur->xmlChildrenNode;
526  bool renewed = false;
527  while (tcur != NULL)
528  {
529  std::string cname((const char*)(tcur->name));
530  if (cname == "parameter")
531  {
532  throw std::runtime_error(
533  "Keyword 'parameter' has been replaced by 'var' in the 'correlation' of pade2 Jastrow!");
534  }
535  else if (cname == "var" || cname == "Var")
536  {
537  std::string doopt("yes");
538  std::string id_in("0");
539  std::string p_name("B");
540  OhmmsAttributeSet rAttrib;
541  rAttrib.add(id_in, "id");
542  rAttrib.add(p_name, "name");
543  rAttrib.add(doopt, "optimize");
544  rAttrib.put(tcur);
545  if (p_name == "A")
546  {
547  ID_A = id_in;
548  Opt_A = (doopt != "no");
549  putContent(Atemp, tcur);
550  renewed = true;
551  }
552  else if (p_name == "B")
553  {
554  ID_B = id_in;
555  Opt_B = (doopt != "no");
556  putContent(Btemp, tcur);
557  renewed = true;
558  }
559  else if (p_name == "C")
560  {
561  ID_C = id_in;
562  Opt_C = (doopt != "no");
563  putContent(Ctemp, tcur);
564  renewed = true;
565  }
566  }
567  tcur = tcur->next;
568  }
569  if (renewed)
570  {
571  A = Atemp;
572  B = Btemp;
573  C = Ctemp;
574  reset();
575  //these are always active
576  myVars.clear();
577  if (Opt_A)
579  if (Opt_B)
581  if (Opt_C)
583  }
584  int left_pad_space = 5;
585  app_log() << std::endl;
586  myVars.print(app_log(), left_pad_space, true);
587  //LOGMSG("Jastrow (A*r+C*r*r)/(1+Br) = (" << A << "," << B << "," << C << ")")
588  return true;
589  }
590 
591  void checkInVariablesExclusive(opt_variables_type& active) override { active.insertFrom(myVars); }
592 
593  void checkOutVariables(const opt_variables_type& active) override { myVars.getIndex(active); }
594  void resetParametersExclusive(const opt_variables_type& active) override
595  {
596  int i = 0;
597  if (ID_A != "0")
598  {
599  int ia = myVars.where(i);
600  if (ia > -1)
601  A = std::real(myVars[i] = active[ia]);
602  i++;
603  }
604  if (ID_B != "0")
605  {
606  int ib = myVars.where(i);
607  if (ib > -1)
608  B = std::real(myVars[i] = active[ib]);
609  i++;
610  }
611  if (ID_C != "0")
612  {
613  int ic = myVars.where(i);
614  if (ic > -1)
615  C = std::real(myVars[i] = active[ic]);
616  i++;
617  }
618  C2 = 2.0 * C;
619  }
620 };
621 
622 /** Pade function of \f[ u(r) = \frac{a*r+b*r^2}{1+c*r+d*r^2} \f]
623 *
624 * Prototype of the template parameter of TwoBodyJastrow and OneBodyJastrow
625 */
626 template<class T>
628 {
629  ///coefficients
632  ///id for A
633  std::string ID_A;
634  ///id for B
635  std::string ID_B;
636  ///id for C
637  std::string ID_C;
638  ///id for D
639  std::string ID_D;
640 
641  ///constructor
642  PadeTwo2ndOrderFunctor(real_type a = 1.0, real_type b = 1.0, real_type c = 1.0, real_type d = 1.0)
643  : A(a),
644  B(b),
645  C(c),
646  D(d),
647  Opt_A(false),
648  Opt_B(false),
649  Opt_C(false),
650  Opt_D(false),
651  ID_A("0"),
652  ID_B("0"),
653  ID_C("0"),
654  ID_D("0")
655  {
656  reset();
657  }
658 
659  OptimizableFunctorBase* makeClone() const override { return new PadeTwo2ndOrderFunctor(*this); }
660 
661  /** reset the internal variables.
662  */
663  void reset() override
664  {
665  // A = a; B=b; C = c;
666  }
667 
669  {
670  real_type br(B * r);
671  real_type dr(D * r);
672  return (A * r + br * r) / (1.0 + C * C * r + dr * dr);
673  }
674 
675  inline real_type evaluate(real_type r, real_type& dudr, real_type& d2udr2)
676  {
677  real_type ar(A * r);
678  real_type br(B * r);
679  real_type cr(C * r);
680  real_type dr(D * r);
681  real_type bttm(1.0 / (1.0 + C * cr + dr * dr));
682  dudr = (A - A * dr * dr + br * (2.0 + C * cr)) * bttm * bttm;
683  d2udr2 = -2.0 * (A * (C * C + 3.0 * dr * D - dr * dr * dr * D) + B * (-1.0 + dr * dr * (3.0 + C * cr))) * bttm *
684  bttm * bttm;
685  return (A * r + br * r) * bttm;
686  }
687 
688  inline real_type evaluate(real_type r, real_type& dudr, real_type& d2udr2, real_type& d3udr3)
689  {
690  d3udr3 = 0;
691  return evaluate(r, dudr, d2udr2);
692  }
693 
694  inline real_type evaluateV(const int iat,
695  const int iStart,
696  const int iEnd,
697  const T* restrict _distArray,
698  T* restrict distArrayCompressed) const
699  {
700  real_type sum(0);
701  for (int idx = iStart; idx < iEnd; idx++)
702  if (idx != iat)
703  sum += evaluate(_distArray[idx]);
704  return sum;
705  }
706 
707  inline void evaluateVGL(const int iat,
708  const int iStart,
709  const int iEnd,
710  const T* distArray,
711  T* restrict valArray,
712  T* restrict gradArray,
713  T* restrict laplArray,
714  T* restrict distArrayCompressed,
715  int* restrict distIndices) const
716  {
717  for (int idx = iStart; idx < iEnd; idx++)
718  {
719  valArray[idx] = evaluate(distArray[idx], gradArray[idx], laplArray[idx]);
720  gradArray[idx] /= distArray[idx];
721  }
722  if (iat >= iStart && iat < iEnd)
723  valArray[iat] = gradArray[iat] = laplArray[iat] = T(0);
724  }
725 
726  real_type f(real_type r) override { return evaluate(r); }
727 
728  real_type df(real_type r) override
729  {
730  real_type dudr, d2udr2;
731  real_type res = evaluate(r, dudr, d2udr2);
732  return dudr;
733  }
734 
735  inline bool evaluateDerivatives(real_type r, std::vector<TinyVector<real_type, 3>>& derivs) override
736  {
737  real_type ar(A * r);
738  real_type br(B * r);
739  real_type cr(C * r);
740  real_type dr(D * r);
741  real_type r2(r * r);
742  real_type dr2(D * r2);
743  real_type d2r2(dr * dr);
744  real_type c2(C * C);
745  real_type c2r(c2 * r);
746  real_type bttm(1.0 / (1.0 + c2r + d2r2));
747  real_type tp(A * r + br * r);
748  real_type c2r2(cr * cr);
749  real_type d4r4(d2r2 * d2r2);
750  real_type bttm2(bttm * bttm);
751  real_type bttm3(bttm * bttm2);
752  real_type bttm4(bttm2 * bttm2);
753  int i = 0;
754  if (Opt_A)
755  {
756  derivs[i][0] = r2 * bttm;
757  derivs[i][1] = r * (2.0 + c2r) * bttm2;
758  derivs[i][2] = (2.0 - 2.0 * d2r2 * (3.0 + c2r)) * bttm3;
759  i++;
760  }
761 
762  if (Opt_B)
763  {
764  derivs[i][0] = -2.0 * cr * tp * bttm2;
765  derivs[i][1] = -2 * cr * (A * (2.0 - 2.0 * d2r2) + br * (3.0 + c2r - d2r2)) * bttm3;
766  derivs[i][2] = 4.0 * C *
767  (A * (-1.0 + 2.0 * c2r + 8.0 * d2r2 - 3.0 * d4r4) + br * (-3.0 - d4r4 + 2.0 * d2r2 * (4.0 + c2r))) * bttm4;
768  i++;
769  }
770 
771  if (Opt_C)
772  {
773  derivs[i][0] = -2.0 * dr2 * tp * bttm2;
774  derivs[i][1] = -2.0 * dr2 * (2.0 * br * (2.0 + c2r) + A * (3.0 + c2r - d2r2)) * bttm3;
775  derivs[i][2] = -4.0 * dr *
776  (br * (6.0 + 4.0 * c2r + c2 * c2r2 - 6.0 * d2r2 - 2.0 * c2r * d2r2) +
777  A * (3.0 + d4r4 - 2.0 * d2r2 * (4.0 + c2r))) *
778  bttm4;
779  i++;
780  }
781  return true;
782  }
783 
784 
785  inline bool evaluateDerivatives(real_type r, std::vector<real_type>& derivs)
786  {
787  real_type ar(A * r);
788  real_type br(B * r);
789  real_type cr(C * r);
790  real_type dr(D * r);
791  real_type r2(r * r);
792  real_type dr2(D * r2);
793  real_type d2r2(dr * dr);
794  real_type c2(C * C);
795  real_type c2r(c2 * r);
796  real_type bttm(1.0 / (1.0 + c2r + d2r2));
797  real_type tp(A * r + br * r);
798  real_type c2r2(cr * cr);
799  real_type d4r4(d2r2 * d2r2);
800  real_type bttm2(bttm * bttm);
801  int i = 0;
802  if (Opt_A)
803  {
804  derivs[i] = r2 * bttm;
805  i++;
806  }
807 
808  if (Opt_B)
809  {
810  derivs[i] = -2.0 * cr * tp * bttm2;
811  i++;
812  }
813 
814  if (Opt_C)
815  {
816  derivs[i] = -2.0 * dr2 * tp * bttm2;
817  i++;
818  }
819  return true;
820  }
821 
822 
823  /** process input xml node
824  * @param cur current xmlNode from which the data members are reset
825  *
826  * Read in the Pade parameters from the xml input file.
827  */
828  bool put(xmlNodePtr cur) override
829  {
830  std::string fcup("yes");
832  p.add(fcup, "fixcusp");
833  p.put(cur);
834  if (fcup == "true")
835  fcup = "yes";
836  // if (fcup=="yes") app_log()<<" fixing cusp conditions"<< std::endl;
837  real_type Atemp = A, Btemp = B, Ctemp = C, Dtemp = D;
838  //jastrow[iab]->put(cur->xmlChildrenNode,wfs_ref.RealVars);
839  xmlNodePtr tcur = cur->xmlChildrenNode;
840  bool renewed = false;
841  while (tcur != NULL)
842  {
843  std::string cname((const char*)(tcur->name));
844  if (cname == "parameter")
845  {
846  throw std::runtime_error(
847  "Keyword 'parameter' has been replaced by 'var' in the 'correlation' of pade2 Jastrow!");
848  }
849  else if (cname == "var" || cname == "Var")
850  {
851  std::string id_in("0");
852  std::string p_name("B");
853  std::string doopt("yes");
854  OhmmsAttributeSet rAttrib;
855  rAttrib.add(id_in, "id");
856  rAttrib.add(p_name, "name");
857  rAttrib.add(doopt, "optimize");
858  rAttrib.put(tcur);
859  if (p_name == "A")
860  {
861  ID_A = id_in;
862  Opt_A = (doopt != "no");
863  putContent(Atemp, tcur);
864  renewed = true;
865  }
866  else if (p_name == "B")
867  {
868  ID_B = id_in;
869  Opt_B = (doopt != "no");
870  putContent(Btemp, tcur);
871  renewed = true;
872  }
873  else if (p_name == "C")
874  {
875  ID_C = id_in;
876  Opt_C = (doopt != "no");
877  putContent(Ctemp, tcur);
878  renewed = true;
879  }
880  else if (p_name == "D")
881  {
882  ID_D = id_in;
883  Opt_D = (doopt != "no");
884  putContent(Dtemp, tcur);
885  renewed = true;
886  }
887  }
888  tcur = tcur->next;
889  }
890  if (renewed)
891  {
892  A = Atemp;
893  B = Btemp;
894  C = Ctemp;
895  D = Dtemp;
896  reset();
897  //these are always active
898  myVars.clear();
899  if (Opt_A)
901  if (Opt_B)
903  if (Opt_C)
905  if (Opt_D)
907  //myVars.insert(ID_A,A,fcup!="yes");
908  }
909  int left_pad_space = 5;
910  app_log() << std::endl;
911  myVars.print(app_log(), left_pad_space, true);
912  //LOGMSG("Jastrow (A*r+C*r*r)/(1+Br) = (" << A << "," << B << "," << C << ")")
913  return true;
914  }
915 
916  void checkInVariablesExclusive(opt_variables_type& active) override { active.insertFrom(myVars); }
917 
918  void checkOutVariables(const opt_variables_type& active) override { myVars.getIndex(active); }
919  void resetParametersExclusive(const opt_variables_type& active) override
920  {
921  if (myVars.size() == 0)
922  return;
923 
924  int ia = myVars.where(0);
925  if (ia < 0)
926  return;
927 
928  int i = 0;
929  if (Opt_A)
930  A = std::real(myVars[i++] = active[ia++]);
931  if (Opt_B)
932  B = std::real(myVars[i++] = active[ia++]);
933  if (Opt_C)
934  C = std::real(myVars[i++] = active[ia++]);
935  if (Opt_D)
936  D = std::real(myVars[i++] = active[ia++]);
937 
938  reset();
939  }
940 };
941 
942 /** Pade functional of \f[ u(r) = \frac{a*f(r)}{1+b*f(r)} \f] with a scale function f(r)
943  *
944  * Prototype of the template parameter of TwoBodyJastrow and OneBodyJastrow
945  */
946 template<class T>
948 {
949  ///coefficients
952 
953  ///constructor
954  explicit ScaledPadeFunctor(real_type a = 1.0, real_type b = 1.0, real_type c = 1.0) : A(a), B(b), C(c) { reset(); }
955 
956  OptimizableFunctorBase* makeClone() const override { return new ScaledPadeFunctor(*this); }
957 
958  /** reset the internal variables.
959  */
960  void reset() override
961  {
962  OneOverC = 1.0 / C;
963  B2 = 2.0 * B;
964  }
965 
966  /** evaluate the value at r
967  * @param r the distance
968  * @return \f$ u(r_{eff}) = a*r_{eff}/(1+b*r_{eff}) \f$
969  */
971  {
972  real_type reff((1.0 - std::exp(-C * r)) * OneOverC);
973  return A * reff / (1.0 + B * reff);
974  }
975 
976  /** evaluate the value, first derivative and second derivative
977  * @param r the distance
978  * @param dudr return value \f$ du/dr\f$
979  * @param d2udr2 return value \f$ d^2u/dr^2 \f$
980  * @return \f$ u(r_{eff}) = a*r_{eff}/(1+b*r_{eff}) \f$
981  */
982  inline real_type evaluate(real_type r, real_type& dudr, real_type& d2udr2)
983  {
984  real_type reff_1(std::exp(-C * r));
985  real_type reff((1.0 - reff_1) * OneOverC);
986  real_type u(1.0 / (1.0 + B * reff));
987  real_type auu(A * u * u);
988  dudr = reff_1 * auu;
989  //d2udr=auu*(-C*reff_1*reff_2-B2*reff_1*reff_1*u);
990  d2udr2 = -reff_1 * auu * (C + B2 * reff_1 * u);
991  return A * u * reff;
992  }
993 
994  inline real_type evaluate(real_type r, real_type& dudr, real_type& d2udr2, real_type d3udr3)
995  {
996  real_type reff_1(std::exp(-C * r));
997  real_type reff((1.0 - reff_1) * OneOverC);
998  real_type u(1.0 / (1.0 + B * reff));
999  real_type auu(A * u * u);
1000  dudr = reff_1 * auu;
1001  //d2udr=auu*(-C*reff_1*reff_2-B2*reff_1*reff_1*u);
1002  d2udr2 = -reff_1 * auu * (C + B2 * reff_1 * u);
1003  std::cerr << "Third derivative not imlemented for Pade functor.\n";
1004  return A * u * reff;
1005  }
1006 
1007 
1008  real_type f(real_type r) override { return evaluate(r); }
1009 
1010  real_type df(real_type r) override
1011  {
1012  real_type dudr, d2udr2;
1013  real_type res = evaluate(r, dudr, d2udr2);
1014  return dudr;
1015  }
1016 
1017  bool put(xmlNodePtr cur) override { return true; }
1018 
1020 
1021  void checkOutVariables(const opt_variables_type& active) override { myVars.getIndex(active); }
1022 
1023  inline void resetParametersExclusive(const opt_variables_type& active) override
1024  {
1025  OneOverC = 1.0 / C;
1026  B2 = 2.0 * B;
1027  }
1028 };
1029 } // namespace qmcplusplus
1030 #endif
void checkInVariablesExclusive(opt_variables_type &active) override
check in variational parameters to the global list of parameters used by the optimizer.
real_type B0
input B
Definition: PadeFunctors.h:47
Fixed-size array.
Definition: OhmmsTinyMeta.h:30
QMCTraits::RealType real
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
void evaluateVGL(const int iat, const int iStart, const int iEnd, const T *distArray, T *restrict valArray, T *restrict gradArray, T *restrict laplArray, T *restrict distArrayCompressed, int *restrict distIndices) const
Definition: PadeFunctors.h:431
real_type evaluate(real_type r)
evaluate the value at r
Definition: PadeFunctors.h:970
void checkOutVariables(const opt_variables_type &active) override
check out variational optimizable variables
Pade functional of with a scale function f(r)
Definition: PadeFunctors.h:947
real_type df(real_type r) override
evaluate the first derivative
Definition: PadeFunctors.h:184
real_type evaluate(real_type r) const
Definition: PadeFunctors.h:357
OptimizableFunctorBase * makeClone() const override
create a clone of this object
Definition: PadeFunctors.h:956
real_type AoverB
AoverB=A/B.
Definition: PadeFunctors.h:57
std::ostream & app_log()
Definition: OutputManager.h:65
bool put(xmlNodePtr cur)
assign attributes to the set
Definition: AttributeSet.h:55
real_type Scale
input scaling, default=1.0
Definition: PadeFunctors.h:49
void evaluateVGL(const int iat, const int iStart, const int iEnd, const T *distArray, T *restrict valArray, T *restrict gradArray, T *restrict laplArray, T *restrict distArrayCompressed, int *restrict distIndices) const
Definition: PadeFunctors.h:148
real_type A
coefficients
Definition: PadeFunctors.h:327
real_type B
B=B0*Scale.
Definition: PadeFunctors.h:51
OptimizableFunctorBase * makeClone() const override
create a clone of this object
Definition: PadeFunctors.h:343
real_type df(real_type r) override
evaluate the first derivative
void resetParametersExclusive(const opt_variables_type &active) override
reset the parameters during optimizations.
real_type f(real_type r) override
evaluate the value at r
Define a base class for one-dimensional functions with optimizable variables.
real_type evaluate(real_type r, real_type &dudr, real_type &d2udr2, real_type &d3udr3)
Definition: PadeFunctors.h:688
real_type evaluate(real_type r, real_type &dudr, real_type &d2udr2) const
evaluate the value at r
Definition: PadeFunctors.h:370
void evaluateVGL(const int iat, const int iStart, const int iEnd, const T *distArray, T *restrict valArray, T *restrict gradArray, T *restrict laplArray, T *restrict distArrayCompressed, int *restrict distIndices) const
Definition: PadeFunctors.h:707
OptimizableFunctorBase * makeClone() const override
create a clone of this object
Definition: PadeFunctors.h:77
real_type df(real_type r) override
evaluate the first derivative
Definition: PadeFunctors.h:728
real_type evaluate(real_type r, real_type &dudr, real_type &d2udr2, real_type &d3udr3) const
Definition: PadeFunctors.h:99
bool evaluateDerivatives(real_type r, std::vector< real_type > &derivs) override
Definition: PadeFunctors.h:493
real_type evaluate(real_type r, real_type &dudr, real_type &d2udr2)
Definition: PadeFunctors.h:675
real_type A
coefficients
Definition: PadeFunctors.h:950
real_type A
input A
Definition: PadeFunctors.h:45
bool put(xmlNodePtr cur) override
process xmlnode and registers variables to optimize
Definition: PadeFunctors.h:246
real_type B2
B2=2*B.
Definition: PadeFunctors.h:55
void reset() override
reset function
Definition: PadeFunctors.h:79
real_type evaluate(real_type r, real_type &dudr, real_type &d2udr2)
evaluate the value, first derivative and second derivative
Definition: PadeFunctors.h:982
bool evaluateDerivatives(real_type r, std::vector< TinyVector< real_type, 3 >> &derivs) override
Definition: PadeFunctors.h:735
void insert(const std::string &vname, real_type v, bool enable=true, int type=OTHER_P)
Definition: VariableSet.h:133
PadeTwo2ndOrderFunctor(real_type a=1.0, real_type b=1.0, real_type c=1.0, real_type d=1.0)
constructor
Definition: PadeFunctors.h:642
real_type evaluate(real_type r)
Definition: PadeFunctors.h:668
void checkOutVariables(const opt_variables_type &active) override
check out variational optimizable variables
Definition: PadeFunctors.h:918
ScaledPadeFunctor(real_type a=1.0, real_type b=1.0, real_type c=1.0)
constructor
Definition: PadeFunctors.h:954
class to handle a set of attributes of an xmlNode
Definition: AttributeSet.h:24
class to handle a set of variables that can be modified during optimizations
Definition: VariableSet.h:49
std::string ID_A
id of A
Definition: PadeFunctors.h:59
int where(int i) const
return the locator of the i-th Index
Definition: VariableSet.h:90
static void mw_evaluateV(const int num_groups, const PadeFunctor *const functors[], const int n_src, const int *grp_ids, const int num_pairs, const int *ref_at, const T *mw_dist, const int dist_stride, T *mw_vals, Vector< char, OffloadPinnedAllocator< char >> &transfer_buffer)
evaluate sum of the pair potentials FIXME
Definition: PadeFunctors.h:124
MakeReturn< UnaryNode< FnExp, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t exp(const Vector< T1, C1 > &l)
real_type f(real_type r) override
evaluate the value at r
Definition: PadeFunctors.h:182
OMPallocator is an allocator with fused device and dualspace allocator functionality.
real_type evaluate(real_type r, real_type &dudr, real_type &d2udr2) const
Definition: PadeFunctors.h:91
real_type evaluate(real_type r) const
Definition: PadeFunctors.h:89
void clear()
clear the variable set
Definition: VariableSet.cpp:28
Implements a Pade Function .
Definition: PadeFunctors.h:38
size_type size() const
return the size
Definition: VariableSet.h:88
bool Opt_A
true, if A is optimizable
Definition: PadeFunctors.h:41
bool Opt_B
true, if B is optimizable
Definition: PadeFunctors.h:43
Base class for any functor with optimizable parameters.
void resetParametersExclusive(const opt_variables_type &active) override
reset the parameters during optimizations.
Definition: PadeFunctors.h:919
real_type f(real_type r) override
evaluate the value at r
Definition: PadeFunctors.h:726
void checkInVariablesExclusive(opt_variables_type &active) override
check in variational parameters to the global list of parameters used by the optimizer.
Definition: PadeFunctors.h:916
bool evaluateDerivatives(real_type r, std::vector< TinyVector< real_type, 3 >> &derivs) override
compute derivatives with respect to A and B
Definition: PadeFunctors.h:209
bool putContent(T &a, xmlNodePtr cur)
replaces a&#39;s value with the first "element" in the "string" returned by XMLNodeString{cur}.
Definition: libxmldefs.h:88
bool put(xmlNodePtr cur) override
process input xml node
Definition: PadeFunctors.h:521
static void mw_evaluateV(const int num_groups, const Pade2ndOrderFunctor *const functors[], const int n_src, const int *grp_ids, const int num_pairs, const int *ref_at, const T *mw_dist, const int dist_stride, T *mw_vals, Vector< char, OffloadPinnedAllocator< char >> &transfer_buffer)
evaluate sum of the pair potentials FIXME
Definition: PadeFunctors.h:407
bool evaluateDerivatives(real_type r, std::vector< real_type > &derivs)
Definition: PadeFunctors.h:785
void checkOutVariables(const opt_variables_type &active) override
check out variational optimizable variables
Definition: PadeFunctors.h:295
real_type df(real_type r) override
evaluate the first derivative
Definition: PadeFunctors.h:452
void checkInVariablesExclusive(opt_variables_type &active) override
check in variational parameters to the global list of parameters used by the optimizer.
Definition: PadeFunctors.h:591
bool put(xmlNodePtr cur) override
process xmlnode and registers variables to optimize
PadeFunctor(const std::string &my_name)
default constructor
Definition: PadeFunctors.h:64
real_type AB
AB=A*B.
Definition: PadeFunctors.h:53
void checkOutVariables(const opt_variables_type &active) override
check out variational optimizable variables
Definition: PadeFunctors.h:593
OptimizableFunctorBase * makeClone() const override
create a clone of this object
Definition: PadeFunctors.h:659
bool put(xmlNodePtr cur) override
process input xml node
Definition: PadeFunctors.h:828
void resetParametersExclusive(const opt_variables_type &active) override
reset the parameters during optimizations.
Definition: PadeFunctors.h:594
void insertFrom(const VariableSet &input)
insert a VariableSet to the list
Definition: VariableSet.cpp:37
void resetParametersExclusive(const opt_variables_type &active) override
reset the parameters during optimizations.
Definition: PadeFunctors.h:300
real_type evaluate(real_type r, real_type &dudr, real_type &d2udr2, real_type d3udr3)
Definition: PadeFunctors.h:994
void reset() override
reset the internal variables.
Definition: PadeFunctors.h:663
real_type f(real_type r) override
evaluate the value at r
Definition: PadeFunctors.h:450
void setCusp(real_type cusp) override
empty virtual function to help builder classes
Definition: PadeFunctors.h:70
static void mw_updateVGL(const int iat, const std::vector< bool > &isAccepted, const int num_groups, const PadeFunctor *const functors[], const int n_src, const int *grp_ids, const int nw, T *mw_vgl, const int n_padded, const T *mw_dist, T *mw_allUat, T *mw_cur_allu, Vector< char, OffloadPinnedAllocator< char >> &transfer_buffer)
Definition: PadeFunctors.h:191
void checkInVariablesExclusive(opt_variables_type &active) override
check in variational parameters to the global list of parameters used by the optimizer.
Definition: PadeFunctors.h:290
void add(PDT &aparam, const std::string &aname, std::vector< PDT > candidate_values={}, TagStatus status=TagStatus::OPTIONAL)
add a new attribute
Definition: AttributeSet.h:42
real_type evaluateV(const int iat, const int iStart, const int iEnd, const T *restrict _distArray, T *restrict distArrayCompressed) const
Definition: PadeFunctors.h:694
bool evaluateDerivatives(real_type r, std::vector< real_type > &derivs) override
compute derivatives with respect to A and B
Definition: PadeFunctors.h:230
real_type evaluateV(const int iat, const int iStart, const int iEnd, const T *restrict _distArray, T *restrict distArrayCompressed) const
Definition: PadeFunctors.h:108
void print(std::ostream &os, int leftPadSpaces=0, bool printHeader=false) const
optimize::VariableSet::real_type real_type
typedef for real values
real_type evaluateV(const int iat, const int iStart, const int iEnd, const T *restrict _distArray, T *restrict distArrayCompressed) const
Definition: PadeFunctors.h:391
int getIndex(const std::string &vname) const
return the Index vaule for the named parameter
real_type evaluate(real_type r, real_type &dudr, real_type &d2udr2, real_type &d3udr3) const
Definition: PadeFunctors.h:380
bool evaluateDerivatives(real_type r, std::vector< TinyVector< real_type, 3 >> &derivs) override
Definition: PadeFunctors.h:459
void reset() override
reset the internal variables.
Definition: PadeFunctors.h:960
Pade2ndOrderFunctor(const std::string &my_name, real_type a=1.0, real_type b=1.0, real_type c=1.0)
constructor
Definition: PadeFunctors.h:337
static void mw_evaluateVGL(const int iat, const int num_groups, const PadeFunctor *const functors[], const int n_src, const int *grp_ids, const int nw, T *mw_vgl, const int n_padded, const T *mw_dist, T *mw_cur_allu, Vector< char, OffloadPinnedAllocator< char >> &transfer_buffer)
Definition: PadeFunctors.h:167
std::string ID_B
id of B
Definition: PadeFunctors.h:61
opt_variables_type myVars
set of variables to be optimized
void reset() override
reset the internal variables.
Definition: PadeFunctors.h:347