QMCPACK
HybridRepCplx.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 HybridRepCplx.h
15  *
16  * hold HybridRepCplx
17  */
18 #ifndef QMCPLUSPLUS_HYBRIDREP_CPLX_H
19 #define QMCPLUSPLUS_HYBRIDREP_CPLX_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 complex splines
31  */
32 template<typename SPLINEBASE>
33 class HybridRepCplx : 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::myG;
63  using SPLINEBASE::myH;
64  using SPLINEBASE::myL;
65  using SPLINEBASE::myV;
66 
67 public:
68  HybridRepCplx(const std::string& my_name) : SPLINEBASE(my_name) {}
69 
70  bool isRotationSupported() const override { return SPLINEBASE::isRotationSupported(); }
71  void storeParamsBeforeRotation() override
72  {
73  SPLINEBASE::storeParamsBeforeRotation();
75  }
76  void applyRotation(const ValueMatrix& rot_mat, bool use_stored_copy) override
77  {
78  SPLINEBASE::applyRotation(rot_mat, use_stored_copy);
79  HYBRIDBASE::applyRotation(rot_mat, use_stored_copy);
80  }
81 
82  std::string getClassName() const final { return "Hybrid" + SPLINEBASE::getClassName(); }
83  std::string getKeyword() const final { return "Hybrid" + SPLINEBASE::getKeyword(); }
84  bool isOMPoffload() const final { return false; }
85 
86  std::unique_ptr<SPOSet> makeClone() const override { return std::make_unique<HybridRepCplx>(*this); }
87 
89  {
90  SPLINEBASE::bcast_tables(comm);
92  }
93 
95  {
96  SPLINEBASE::gather_tables(comm);
97  HYBRIDBASE::gather_atomic_tables(comm, SPLINEBASE::offset);
98  }
99 
100  bool read_splines(hdf_archive& h5f) { return HYBRIDBASE::read_splines(h5f) && SPLINEBASE::read_splines(h5f); }
101 
102  bool write_splines(hdf_archive& h5f) { return HYBRIDBASE::write_splines(h5f) && SPLINEBASE::write_splines(h5f); }
103 
104  void evaluateValue(const ParticleSet& P, const int iat, ValueVector& psi) override
105  {
106  HYBRIDBASE::evaluate_v(P, iat, myV, info);
107  if (info.region == Region::INTER)
108  SPLINEBASE::evaluateValue(P, iat, psi);
109  else if (info.region == Region::INSIDE)
110  SPLINEBASE::assign_v(P.activeR(iat), myV, psi, 0, myV.size() / 2);
111  else
112  {
113  psi_AO.resize(psi.size());
114  SPLINEBASE::assign_v(P.activeR(iat), myV, psi_AO, 0, myV.size() / 2);
115  SPLINEBASE::evaluateValue(P, iat, psi);
117  }
118  }
119 
120 
122  ValueVector& psi,
123  const ValueVector& psiinv,
124  std::vector<ValueType>& ratios) override
125  {
127  {
128  // resize scratch space
129  psi_AO.resize(psi.size());
130  if (multi_myV.rows() < VP.getTotalNum())
131  multi_myV.resize(VP.getTotalNum(), myV.size());
133  for (int iat = 0; iat < VP.getTotalNum(); ++iat)
134  {
135  if (info.region == Region::INTER)
136  SPLINEBASE::evaluateValue(VP, iat, psi);
137  else if (info.region == Region::INSIDE)
138  {
139  Vector<ST, aligned_allocator<ST>> myV_one(multi_myV[iat], myV.size());
140  SPLINEBASE::assign_v(VP.R[iat], myV_one, psi, 0, myV.size() / 2);
141  }
142  else
143  {
144  Vector<ST, aligned_allocator<ST>> myV_one(multi_myV[iat], myV.size());
145  SPLINEBASE::assign_v(VP.R[iat], myV_one, psi_AO, 0, myV.size() / 2);
146  SPLINEBASE::evaluateValue(VP, iat, psi);
148  }
149  ratios[iat] = simd::dot(psi.data(), psiinv.data(), psi.size());
150  }
151  }
152  else
153  {
154  for (int iat = 0; iat < VP.getTotalNum(); ++iat)
155  {
156  evaluateValue(VP, iat, psi);
157  ratios[iat] = simd::dot(psi.data(), psiinv.data(), psi.size());
158  }
159  }
160  }
161 
164  const RefVector<ValueVector>& psi_list,
165  const std::vector<const ValueType*>& invRow_ptr_list,
166  std::vector<std::vector<ValueType>>& ratios_list) const final
167  {
168  BsplineSet::mw_evaluateDetRatios(spo_list, vp_list, psi_list, invRow_ptr_list, ratios_list);
169  }
170 
171  void evaluateVGL(const ParticleSet& P, const int iat, ValueVector& psi, GradVector& dpsi, ValueVector& d2psi) override
172  {
173  HYBRIDBASE::evaluate_vgl(P, iat, myV, myG, myL, info);
174  if (info.region == Region::INTER)
175  SPLINEBASE::evaluateVGL(P, iat, psi, dpsi, d2psi);
176  else if (info.region == Region::INSIDE)
177  SPLINEBASE::assign_vgl_from_l(P.activeR(iat), psi, dpsi, d2psi);
178  else
179  {
180  psi_AO.resize(psi.size());
181  dpsi_AO.resize(psi.size());
182  d2psi_AO.resize(psi.size());
183  SPLINEBASE::assign_vgl_from_l(P.activeR(iat), psi_AO, dpsi_AO, d2psi_AO);
184  SPLINEBASE::evaluateVGL(P, iat, psi, dpsi, d2psi);
186  }
187  }
188 
190  const RefVectorWithLeader<ParticleSet>& P_list,
191  int iat,
192  const RefVector<ValueVector>& psi_v_list,
193  const RefVector<GradVector>& dpsi_v_list,
194  const RefVector<ValueVector>& d2psi_v_list) const final
195  {
196  BsplineSet::mw_evaluateVGL(sa_list, P_list, iat, psi_v_list, dpsi_v_list, d2psi_v_list);
197  }
198 
200  const RefVectorWithLeader<ParticleSet>& P_list,
201  int iat,
202  const std::vector<const ValueType*>& invRow_ptr_list,
203  OffloadMWVGLArray& phi_vgl_v,
204  std::vector<ValueType>& ratios,
205  std::vector<GradType>& grads) const final
206  {
207  BsplineSet::mw_evaluateVGLandDetRatioGrads(spo_list, P_list, iat, invRow_ptr_list, phi_vgl_v, ratios, grads);
208  }
209 
210  void evaluateVGH(const ParticleSet& P,
211  const int iat,
212  ValueVector& psi,
213  GradVector& dpsi,
214  HessVector& grad_grad_psi) override
215  {
216  APP_ABORT("HybridRepCplx::evaluate_vgh not implemented!");
217  HYBRIDBASE::evaluate_vgh(P, iat, myV, myG, myH, info);
218  if (info.region == Region::INTER)
219  SPLINEBASE::evaluateVGH(P, iat, psi, dpsi, grad_grad_psi);
220  else
221  SPLINEBASE::assign_vgh(P.activeR(iat), psi, dpsi, grad_grad_psi, 0, myV.size() / 2);
222  }
223 
224  void evaluateVGHGH(const ParticleSet& P,
225  const int iat,
226  ValueVector& psi,
227  GradVector& dpsi,
228  HessVector& grad_grad_psi,
229  GGGVector& grad_grad_grad_psi) override
230  {
231  APP_ABORT("HybridRepCplx::evaluate_vghgh not implemented!");
232  }
233 
235  int first,
236  int last,
237  ValueMatrix& logdet,
238  GradMatrix& dlogdet,
239  ValueMatrix& d2logdet) final
240  {
241  // bypass SPLINEBASE::evaluate_notranspose
242  BsplineSet::evaluate_notranspose(P, first, last, logdet, dlogdet, d2logdet);
243  }
244 
245  template<class BSPLINESPO>
246  friend class HybridRepSetReader;
247  template<class BSPLINESPO>
248  friend class SplineSetReader;
249  friend struct BsplineReader;
250 };
251 
252 } // namespace qmcplusplus
253 #endif
typename SPLINEBASE::RealType RealType
Definition: HybridRepCplx.h:42
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
void gather_tables(Communicate *comm)
Definition: HybridRepCplx.h:94
typename SPLINEBASE::SingleSplineType SingleSplineType
Definition: HybridRepCplx.h:41
bool is_VP_batching_safe(const VirtualParticleSet &VP) const
void storeParamsBeforeRotation() override
Definition: HybridRepCplx.h:71
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
void evaluateVGL(const ParticleSet &P, const int iat, ValueVector &psi, GradVector &dpsi, ValueVector &d2psi) override
void applyRotation(const VM &rot_mat, bool use_stored_copy)
void evaluateVGH(const ParticleSet &P, const int iat, ValueVector &psi, GradVector &dpsi, HessVector &grad_grad_psi) override
Matrix< ST, aligned_allocator< ST > > multi_myV
Definition: HybridRepCplx.h:59
A ParticleSet that handles virtual moves of a selected particle of a given physical ParticleSet Virtu...
void evaluateValue(const ParticleSet &P, const int iat, ValueVector &psi) override
hybrid representation orbitals combining B-spline orbitals on a grid and atomic centered orbitals...
Definition: HybridRepCplx.h:33
LatticeGaussianProduct::GradType GradType
void gather_atomic_tables(Communicate *comm, std::vector< int > &offset)
class to handle hdf file
Definition: hdf_archive.h:51
bool isRotationSupported() const override
Definition: HybridRepCplx.h:70
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)
std::string getClassName() const final
Definition: HybridRepCplx.h:82
OrbitalSetTraits< ValueType >::ValueVector ValueVector
bool write_splines(hdf_archive &h5f)
Wrapping information on parallelism.
Definition: Communicate.h:68
typename SPLINEBASE::PointType PointType
Definition: HybridRepCplx.h:40
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 evaluate_v(const ParticleSet &P, const int iat, VV &myV, LocationSmoothingInfo &info)
HybridRepCplx(const std::string &my_name)
Definition: HybridRepCplx.h:68
void evaluateValuesC2X(const VirtualParticleSet &VP, VM &multi_myV, LocationSmoothingInfo &info)
bool isOMPoffload() const final
Definition: HybridRepCplx.h:84
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
void evaluate_vgh(const ParticleSet &P, const int iat, VV &myV, GV &myG, HT &myH, LocationSmoothingInfo &info)
BsplineSet is a SPOSet derived class and serves as a base class for B-spline SPO C2C/C2R/R2R implemen...
ParticlePos R
Position.
Definition: ParticleSet.h:79
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
typename SPLINEBASE::DataType ST
Definition: HybridRepCplx.h:38
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 applyRotation(const ValueMatrix &rot_mat, bool use_stored_copy) override
Definition: HybridRepCplx.h:76
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 interpolate_buffer_v(VV &psi, const VV &psi_AO, const RealType f) const
std::unique_ptr< SPOSet > makeClone() const override
Definition: HybridRepCplx.h:86
std::vector< std::reference_wrapper< T > > RefVector
QMCTraits::RealType RealType
std::string getKeyword() const final
Definition: HybridRepCplx.h:83
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
HYBRIDBASE::LocationSmoothingInfo info
Definition: HybridRepCplx.h:60
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
bool read_splines(hdf_archive &h5f)
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
LatticeGaussianProduct::ValueType ValueType
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
General HybridRepSetReader to handle any unitcell.
void evaluate_notranspose(const ParticleSet &P, int first, int last, ValueMatrix &logdet, GradMatrix &dlogdet, ValueMatrix &d2logdet) final
void evaluateDetRatios(const VirtualParticleSet &VP, ValueVector &psi, const ValueVector &psiinv, std::vector< ValueType > &ratios) override
void bcast_tables(Communicate *comm)
Definition: HybridRepCplx.h:88
void evaluateVGHGH(const ParticleSet &P, const int iat, ValueVector &psi, GradVector &dpsi, HessVector &grad_grad_psi, GGGVector &grad_grad_grad_psi) override
typename SPLINEBASE::DataType DataType
Definition: HybridRepCplx.h:39