QMCPACK
HybridRepReal.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) 2019 QMCPACK developers.
6 //
7 // File developed by: Ye Luo, yeluo@anl.gov, Argonne National Laboratory
8 //
9 // File created by: Ye Luo, yeluo@anl.gov, Argonne National Laboratory
10 //
11 //////////////////////////////////////////////////////////////////////////////////////
12 
13 
14 /** @file HybridRepReal.h
15  *
16  * hold HybridRepReal
17  */
18 #ifndef QMCPLUSPLUS_HYBRIDREP_REAL_H
19 #define QMCPLUSPLUS_HYBRIDREP_REAL_H
20 
23 #include "BsplineSet.h"
24 
25 namespace qmcplusplus
26 {
27 /** hybrid representation orbitals combining B-spline orbitals on a grid and atomic centered orbitals.
28  * @tparam SPLINEBASE B-spline orbital class.
29  *
30  * Only works with SPLINEBASE class containing real splines
31  */
32 template<typename SPLINEBASE>
33 class HybridRepReal : public SPLINEBASE, private HybridRepCenterOrbitals<typename SPLINEBASE::DataType>
34 {
35 public:
36  using SplineBase = SPLINEBASE;
38  using ST = typename SPLINEBASE::DataType;
39  using DataType = typename SPLINEBASE::DataType;
40  using PointType = typename SPLINEBASE::PointType;
41  using SingleSplineType = typename SPLINEBASE::SingleSplineType;
42  using RealType = typename SPLINEBASE::RealType;
43  // types for evaluation results
44  using typename SPLINEBASE::GGGVector;
45  using typename SPLINEBASE::GradMatrix;
46  using typename SPLINEBASE::GradType;
47  using typename SPLINEBASE::GradVector;
48  using typename SPLINEBASE::HessVector;
49  using typename SPLINEBASE::OffloadMWVGLArray;
50  using typename SPLINEBASE::ValueMatrix;
51  using typename SPLINEBASE::ValueType;
52  using typename SPLINEBASE::ValueVector;
53 
54 private:
55  using typename HYBRIDBASE::Region;
56 
58  GradVector dpsi_AO;
61 
62  using SPLINEBASE::HalfG;
63  using SPLINEBASE::myG;
64  using SPLINEBASE::myH;
65  using SPLINEBASE::myL;
66  using SPLINEBASE::myV;
67  using SPLINEBASE::PrimLattice;
68 
69 public:
70  HybridRepReal(const std::string& my_name) : SPLINEBASE(my_name) {}
71 
72  bool isRotationSupported() const override { return SPLINEBASE::isRotationSupported(); }
73  void storeParamsBeforeRotation() override
74  {
75  SPLINEBASE::storeParamsBeforeRotation();
77  }
78  void applyRotation(const ValueMatrix& rot_mat, bool use_stored_copy) override
79  {
80  SPLINEBASE::applyRotation(rot_mat, use_stored_copy);
81  HYBRIDBASE::applyRotation(rot_mat, use_stored_copy);
82  }
83 
84  std::string getClassName() const final { return "Hybrid" + SPLINEBASE::getClassName(); }
85  std::string getKeyword() const final { return "Hybrid" + SPLINEBASE::getKeyword(); }
86  bool isOMPoffload() const final { return false; }
87 
88  std::unique_ptr<SPOSet> makeClone() const override { return std::make_unique<HybridRepReal>(*this); }
89 
91  {
92  SPLINEBASE::bcast_tables(comm);
94  }
95 
97  {
98  SPLINEBASE::gather_tables(comm);
99  HYBRIDBASE::gather_atomic_tables(comm, SPLINEBASE::offset);
100  }
101 
102  bool read_splines(hdf_archive& h5f) { return HYBRIDBASE::read_splines(h5f) && SPLINEBASE::read_splines(h5f); }
103 
104  bool write_splines(hdf_archive& h5f) { return HYBRIDBASE::write_splines(h5f) && SPLINEBASE::write_splines(h5f); }
105 
106  void evaluateValue(const ParticleSet& P, const int iat, ValueVector& psi) override
107  {
108  HYBRIDBASE::evaluate_v(P, iat, myV, info);
109  if (info.region == Region::INTER)
110  SPLINEBASE::evaluateValue(P, iat, psi);
111  else if (info.region == Region::INSIDE)
112  {
113  int bc_sign = HYBRIDBASE::get_bc_sign(P.activeR(iat), info.r_image, PrimLattice, HalfG);
114  SPLINEBASE::assign_v(bc_sign, myV, psi, 0, myV.size());
115  }
116  else
117  {
118  psi_AO.resize(psi.size());
119  int bc_sign = HYBRIDBASE::get_bc_sign(P.activeR(iat), info.r_image, PrimLattice, HalfG);
120  SPLINEBASE::assign_v(bc_sign, myV, psi_AO, 0, myV.size());
121  SPLINEBASE::evaluateValue(P, iat, psi);
123  }
124  }
125 
127  ValueVector& psi,
128  const ValueVector& psiinv,
129  std::vector<ValueType>& ratios) override
130  {
132  {
133  // resize scratch space
134  psi_AO.resize(psi.size());
135  if (multi_myV.rows() < VP.getTotalNum())
136  multi_myV.resize(VP.getTotalNum(), myV.size());
137  std::vector<int> bc_signs(VP.getTotalNum());
138  HYBRIDBASE::evaluateValuesR2R(VP, PrimLattice, HalfG, multi_myV, bc_signs, info);
139  for (int iat = 0; iat < VP.getTotalNum(); ++iat)
140  {
141  if (info.region == Region::INTER)
142  SPLINEBASE::evaluateValue(VP, iat, psi);
143  else if (info.region == Region::INSIDE)
144  {
145  Vector<ST, aligned_allocator<ST>> myV_one(multi_myV[iat], myV.size());
146  SPLINEBASE::assign_v(bc_signs[iat], myV_one, psi, 0, myV.size());
147  }
148  else
149  {
150  Vector<ST, aligned_allocator<ST>> myV_one(multi_myV[iat], myV.size());
151  SPLINEBASE::assign_v(bc_signs[iat], myV_one, psi_AO, 0, myV.size());
152  SPLINEBASE::evaluateValue(VP, iat, psi);
154  }
155  ratios[iat] = simd::dot(psi.data(), psiinv.data(), psi.size());
156  }
157  }
158  else
159  for (int iat = 0; iat < VP.getTotalNum(); ++iat)
160  {
161  evaluateValue(VP, iat, psi);
162  ratios[iat] = simd::dot(psi.data(), psiinv.data(), psi.size());
163  }
164  }
165 
168  const RefVector<ValueVector>& psi_list,
169  const std::vector<const ValueType*>& invRow_ptr_list,
170  std::vector<std::vector<ValueType>>& ratios_list) const final
171  {
172  BsplineSet::mw_evaluateDetRatios(spo_list, vp_list, psi_list, invRow_ptr_list, ratios_list);
173  }
174 
175  void evaluateVGL(const ParticleSet& P, const int iat, ValueVector& psi, GradVector& dpsi, ValueVector& d2psi) override
176  {
177  HYBRIDBASE::evaluate_vgl(P, iat, myV, myG, myL, info);
178  if (info.region == Region::INTER)
179  SPLINEBASE::evaluateVGL(P, iat, psi, dpsi, d2psi);
180  else if (info.region == Region::INSIDE)
181  SPLINEBASE::assign_vgl_from_l(HYBRIDBASE::get_bc_sign(P.activeR(iat), info.r_image, PrimLattice, HalfG), psi,
182  dpsi, d2psi);
183  else
184  {
185  psi_AO.resize(psi.size());
186  dpsi_AO.resize(psi.size());
187  d2psi_AO.resize(psi.size());
188  int bc_sign = HYBRIDBASE::get_bc_sign(P.activeR(iat), info.r_image, PrimLattice, HalfG);
189  SPLINEBASE::assign_vgl_from_l(bc_sign, psi_AO, dpsi_AO, d2psi_AO);
190  SPLINEBASE::evaluateVGL(P, iat, psi, dpsi, d2psi);
192  }
193  }
194 
196  const RefVectorWithLeader<ParticleSet>& P_list,
197  int iat,
198  const RefVector<ValueVector>& psi_v_list,
199  const RefVector<GradVector>& dpsi_v_list,
200  const RefVector<ValueVector>& d2psi_v_list) const final
201  {
202  BsplineSet::mw_evaluateVGL(sa_list, P_list, iat, psi_v_list, dpsi_v_list, d2psi_v_list);
203  }
204 
206  const RefVectorWithLeader<ParticleSet>& P_list,
207  int iat,
208  const std::vector<const ValueType*>& invRow_ptr_list,
209  OffloadMWVGLArray& phi_vgl_v,
210  std::vector<ValueType>& ratios,
211  std::vector<GradType>& grads) const final
212  {
213  BsplineSet::mw_evaluateVGLandDetRatioGrads(spo_list, P_list, iat, invRow_ptr_list, phi_vgl_v, ratios, grads);
214  }
215 
216  void evaluateVGH(const ParticleSet& P,
217  const int iat,
218  ValueVector& psi,
219  GradVector& dpsi,
220  HessVector& grad_grad_psi) override
221  {
222  APP_ABORT("HybridRepReal::evaluateVGH not implemented!");
223  HYBRIDBASE::evaluate_vgh(P, iat, myV, myG, myH, info);
224  if (info.region == Region::INTER)
225  SPLINEBASE::assign_vgh(HYBRIDBASE::get_bc_sign(P.activeR(iat), info.r_image, PrimLattice, HalfG), psi, dpsi,
226  grad_grad_psi, 0, myV.size());
227  else
228  SPLINEBASE::evaluateVGH(P, iat, psi, dpsi, grad_grad_psi);
229  }
230 
231  void evaluateVGHGH(const ParticleSet& P,
232  const int iat,
233  ValueVector& psi,
234  GradVector& dpsi,
235  HessVector& grad_grad_psi,
236  GGGVector& grad_grad_grad_psi) override
237  {
238  APP_ABORT("HybridRepCplx::evaluateVGHGH not implemented!");
239  }
240 
242  int first,
243  int last,
244  ValueMatrix& logdet,
245  GradMatrix& dlogdet,
246  ValueMatrix& d2logdet) final
247  {
248  // bypass SPLINEBASE::evaluate_notranspose
249  BsplineSet::evaluate_notranspose(P, first, last, logdet, dlogdet, d2logdet);
250  }
251 
252  template<class BSPLINESPO>
253  friend class HybridRepSetReader;
254  template<class BSPLINESPO>
255  friend class SplineSetReader;
256  friend struct BsplineReader;
257 };
258 
259 } // namespace qmcplusplus
260 #endif
void evaluateValuesR2R(const VirtualParticleSet &VP, const Cell &PrimLattice, TinyVector< int, D > &HalfG, VM &multi_myV, SV &bc_signs, LocationSmoothingInfo &info)
HYBRIDBASE::LocationSmoothingInfo info
Definition: HybridRepReal.h:60
void interpolate_buffer_vgl(VV &psi, GV &dpsi, VV &d2psi, const VV &psi_AO, const GV &dpsi_AO, const VV &d2psi_AO, const LocationSmoothingInfo &info) const
typename SPLINEBASE::RealType RealType
Definition: HybridRepReal.h:42
bool isOMPoffload() const final
Definition: HybridRepReal.h:86
bool is_VP_batching_safe(const VirtualParticleSet &VP) const
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
Hybrid representation atomic centered orbitals.
T dot(const T *restrict a, const T *restrict b, int n, TRES res=TRES())
dot product
bool read_splines(hdf_archive &h5f)
int get_bc_sign(const PointType &r, const PointType &r_image, const Cell &PrimLattice, TinyVector< int, D > &HalfG) const
void applyRotation(const VM &rot_mat, bool use_stored_copy)
HybridRepReal(const std::string &my_name)
Definition: HybridRepReal.h:70
A ParticleSet that handles virtual moves of a selected particle of a given physical ParticleSet Virtu...
LatticeGaussianProduct::GradType GradType
Matrix< ST, aligned_allocator< ST > > multi_myV
Definition: HybridRepReal.h:59
void gather_atomic_tables(Communicate *comm, std::vector< int > &offset)
class to handle hdf file
Definition: hdf_archive.h:51
void assign_v(ST x, ST y, ST z, TT *restrict results_scratch_ptr, const ST *restrict offload_scratch_ptr, const ST *restrict myKcart_ptr, size_t myKcart_padded_size, size_t first_spo, int index)
void bcast_tables(Communicate *comm)
Definition: HybridRepReal.h:90
OrbitalSetTraits< ValueType >::ValueVector ValueVector
bool isRotationSupported() const override
Definition: HybridRepReal.h:72
std::string getClassName() const final
Definition: HybridRepReal.h:84
std::unique_ptr< SPOSet > makeClone() const override
Definition: HybridRepReal.h:88
Wrapping information on parallelism.
Definition: Communicate.h:68
typename SPLINEBASE::SingleSplineType SingleSplineType
Definition: HybridRepReal.h:41
Each SplineC2X needs a reader derived from BsplineReader.
Definition: BsplineReader.h:39
Specialized paritlce class for atomistic simulations.
Definition: ParticleSet.h:55
General SplineSetReader to handle any unitcell.
void evaluateDetRatios(const VirtualParticleSet &VP, ValueVector &psi, const ValueVector &psiinv, std::vector< ValueType > &ratios) override
void evaluate_v(const ParticleSet &P, const int iat, VV &myV, LocationSmoothingInfo &info)
void evaluateVGHGH(const ParticleSet &P, const int iat, ValueVector &psi, GradVector &dpsi, HessVector &grad_grad_psi, GGGVector &grad_grad_grad_psi) override
virtual void mw_evaluateVGL(const RefVectorWithLeader< SPOSet > &spo_list, const RefVectorWithLeader< ParticleSet > &P_list, int iat, const RefVector< ValueVector > &psi_v_list, const RefVector< GradVector > &dpsi_v_list, const RefVector< ValueVector > &d2psi_v_list) const
evaluate the values, gradients and laplacians of this single-particle orbital sets of multiple walker...
Definition: SPOSet.cpp:93
virtual void mw_evaluateVGLandDetRatioGrads(const RefVectorWithLeader< SPOSet > &spo_list, const RefVectorWithLeader< ParticleSet > &P_list, int iat, const std::vector< const ValueType *> &invRow_ptr_list, OffloadMWVGLArray &phi_vgl_v, std::vector< ValueType > &ratios, std::vector< GradType > &grads) const
evaluate the values, gradients and laplacians of this single-particle orbital sets and determinant ra...
Definition: SPOSet.cpp:126
typename SPLINEBASE::PointType PointType
Definition: HybridRepReal.h:40
void evaluate_vgh(const ParticleSet &P, const int iat, VV &myV, GV &myG, HT &myH, LocationSmoothingInfo &info)
std::string getKeyword() const final
Definition: HybridRepReal.h:85
BsplineSet is a SPOSet derived class and serves as a base class for B-spline SPO C2C/C2R/R2R implemen...
void evaluate_vgl(const ParticleSet &P, const int iat, VV &myV, GV &myG, VV &myL, LocationSmoothingInfo &info)
#define APP_ABORT(msg)
Widely used but deprecated fatal error macros from legacy code.
Definition: AppAbort.h:27
const PosType & activeR(int iat) const
return the active position if the particle is active or the return current position if not ...
Definition: ParticleSet.h:265
void storeParamsBeforeRotation() override
Definition: HybridRepReal.h:73
void mw_evaluateVGL(const RefVectorWithLeader< SPOSet > &sa_list, const RefVectorWithLeader< ParticleSet > &P_list, int iat, const RefVector< ValueVector > &psi_v_list, const RefVector< GradVector > &dpsi_v_list, const RefVector< ValueVector > &d2psi_v_list) const final
void interpolate_buffer_v(VV &psi, const VV &psi_AO, const RealType f) const
bool write_splines(hdf_archive &h5f)
std::vector< std::reference_wrapper< T > > RefVector
QMCTraits::RealType RealType
void mw_evaluateVGLandDetRatioGrads(const RefVectorWithLeader< SPOSet > &spo_list, const RefVectorWithLeader< ParticleSet > &P_list, int iat, const std::vector< const ValueType *> &invRow_ptr_list, OffloadMWVGLArray &phi_vgl_v, std::vector< ValueType > &ratios, std::vector< GradType > &grads) const final
void evaluate_notranspose(const ParticleSet &P, int first, int last, ValueMatrix &logdet, GradMatrix &dlogdet, ValueMatrix &d2logdet) final
virtual void mw_evaluateDetRatios(const RefVectorWithLeader< SPOSet > &spo_list, const RefVectorWithLeader< const VirtualParticleSet > &vp_list, const RefVector< ValueVector > &psi_list, const std::vector< const ValueType *> &invRow_ptr_list, std::vector< std::vector< ValueType >> &ratios_list) const
evaluate determinant ratios for virtual moves, e.g., sphere move for nonlocalPP, of multiple walkers ...
Definition: SPOSet.cpp:69
void evaluate_notranspose(const ParticleSet &P, int first, int last, ValueMatrix &logdet, GradMatrix &dlogdet, ValueMatrix &d2logdet) override
evaluate the values, gradients and laplacians of this single-particle orbital for [first...
Definition: BsplineSet.h:121
LatticeGaussianProduct::ValueType ValueType
typename SPLINEBASE::DataType ST
Definition: HybridRepReal.h:38
General HybridRepSetReader to handle any unitcell.
void applyRotation(const ValueMatrix &rot_mat, bool use_stored_copy) override
Definition: HybridRepReal.h:78
void gather_tables(Communicate *comm)
Definition: HybridRepReal.h:96
void mw_evaluateDetRatios(const RefVectorWithLeader< SPOSet > &spo_list, const RefVectorWithLeader< const VirtualParticleSet > &vp_list, const RefVector< ValueVector > &psi_list, const std::vector< const ValueType *> &invRow_ptr_list, std::vector< std::vector< ValueType >> &ratios_list) const final
hybrid representation orbitals combining B-spline orbitals on a grid and atomic centered orbitals...
Definition: HybridRepReal.h:33
void evaluateVGL(const ParticleSet &P, const int iat, ValueVector &psi, GradVector &dpsi, ValueVector &d2psi) override
void evaluateValue(const ParticleSet &P, const int iat, ValueVector &psi) override
void evaluateVGH(const ParticleSet &P, const int iat, ValueVector &psi, GradVector &dpsi, HessVector &grad_grad_psi) override
typename SPLINEBASE::DataType DataType
Definition: HybridRepReal.h:39