QMCPACK
SplineR2R.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: Jeremy McMinnis, jmcminis@gmail.com, University of Illinois at Urbana-Champaign
8 // Jeongnim Kim, jeongnim.kim@gmail.com, University of Illinois at Urbana-Champaign
9 // Mark A. Berrill, berrillma@ornl.gov, Oak Ridge National Laboratory
10 // Ye Luo, yeluo@anl.gov, Argonne National Laboratory
11 //
12 // File created by: Jeongnim Kim, jeongnim.kim@gmail.com, University of Illinois at Urbana-Champaign
13 //////////////////////////////////////////////////////////////////////////////////////
14 
15 
16 #ifndef QMCPLUSPLUS_SPLINE_R2R_H
17 #define QMCPLUSPLUS_SPLINE_R2R_H
18 
19 #include <memory>
22 #include "spline2/MultiBspline.hpp"
23 #include "Utilities/FairDivide.h"
24 
25 namespace qmcplusplus
26 {
27 /** class to match ST real spline with BsplineSet::ValueType (real) SPOs
28  * @tparam ST precision of spline
29  *
30  * Requires temporage storage and multiplication of the sign of the real part of the phase
31  * Internal storage ST type arrays are aligned and padded.
32  */
33 template<typename ST>
34 class SplineR2R : public BsplineSet
35 {
36 public:
37  using SplineType = typename bspline_traits<ST, 3>::SplineType;
38  using BCType = typename bspline_traits<ST, 3>::BCType;
39  using DataType = ST;
41  using SingleSplineType = UBspline_3d_d;
42  // types for evaluation results
43  using TT = typename BsplineSet::ValueType;
48 
53 
54 private:
55  bool IsGamma;
56  ///\f$GGt=G^t G \f$, transformation for tensor in LatticeUnit to CartesianUnit, e.g. Hessian
58  ///multi bspline set
59  std::shared_ptr<MultiBspline<ST>> SplineInst;
60 
61  ///Copy of original splines for orbital rotation
62  std::shared_ptr<std::vector<ST>> coef_copy_;
63 
64  ///thread private ratios for reduction when using nested threading, numVP x numThread
66 
67 
68 protected:
69  ///primitive cell
71  /// intermediate result vectors
77 
78 public:
79  SplineR2R(const std::string& my_name) : BsplineSet(my_name) {}
80 
81  SplineR2R(const SplineR2R& in);
82  virtual std::string getClassName() const override { return "SplineR2R"; }
83  virtual std::string getKeyword() const override { return "SplineR2R"; }
84  bool isComplex() const override { return false; };
85  bool isRotationSupported() const override { return true; }
86 
87  std::unique_ptr<SPOSet> makeClone() const override { return std::make_unique<SplineR2R>(*this); }
88 
89  /// Store an original copy of the spline coefficients for orbital rotation
90  void storeParamsBeforeRotation() override;
91 
92  /*
93  Implements orbital rotations via [1,2].
94  Should be called by RotatedSPOs::apply_rotation()
95 
96  This implementation requires that NSPOs > Nelec. In other words,
97  if you want to run a orbopt wfn, you must include some virtual orbitals!
98 
99  Some results (using older Berkeley branch) were published in [3].
100 
101  [1] Filippi & Fahy, JCP 112, (2000)
102  [2] Toulouse & Umrigar, JCP 126, (2007)
103  [3] Townsend et al., PRB 102, (2020)
104  */
105  void applyRotation(const ValueMatrix& rot_mat, bool use_stored_copy) override;
106 
107  inline void resizeStorage(size_t n, size_t nvals)
108  {
109  init_base(n);
110  const size_t npad = getAlignedSize<ST>(n);
111  myV.resize(npad);
112  myG.resize(npad);
113  myL.resize(npad);
114  myH.resize(npad);
115  mygH.resize(npad);
116 
117  IsGamma = ((HalfG[0] == 0) && (HalfG[1] == 0) && (HalfG[2] == 0));
118  }
119 
120  void bcast_tables(Communicate* comm) { chunked_bcast(comm, SplineInst->getSplinePtr()); }
121 
123  {
124  if (comm->size() == 1)
125  return;
126  const int Nbands = kPoints.size();
127  const int Nbandgroups = comm->size();
128  offset.resize(Nbandgroups + 1, 0);
129  FairDivideLow(Nbands, Nbandgroups, offset);
130  gatherv(comm, SplineInst->getSplinePtr(), SplineInst->getSplinePtr()->z_stride, offset);
131  }
132 
133  template<typename GT, typename BCT>
134  void create_spline(GT& xyz_g, BCT& xyz_bc)
135  {
137  SplineInst = std::make_shared<MultiBspline<ST>>();
138  SplineInst->create(xyz_g, xyz_bc, myV.size());
139 
140  app_log() << "MEMORY " << SplineInst->sizeInByte() / (1 << 20) << " MB allocated "
141  << "for the coefficients in 3D spline orbital representation" << std::endl;
142  }
143 
144  inline void flush_zero() { SplineInst->flush_zero(); }
145 
146  void set_spline(SingleSplineType* spline_r, SingleSplineType* spline_i, int twist, int ispline, int level);
147 
148  bool read_splines(hdf_archive& h5f);
149 
150  bool write_splines(hdf_archive& h5f);
151 
152  /** convert position in PrimLattice unit and return sign */
153  inline int convertPos(const PointType& r, PointType& ru)
154  {
155  ru = PrimLattice.toUnit(r);
156  int bc_sign = 0;
157  for (int i = 0; i < D; i++)
158  if (-std::numeric_limits<ST>::epsilon() < ru[i] && ru[i] < 0)
159  ru[i] = ST(0.0);
160  else
161  {
162  ST img = std::floor(ru[i]);
163  ru[i] -= img;
164  bc_sign += HalfG[i] * (int)img;
165  }
166  return bc_sign;
167  }
168 
169  void assign_v(int bc_sign, const vContainer_type& myV, ValueVector& psi, int first, int last) const;
170 
171  void evaluateValue(const ParticleSet& P, const int iat, ValueVector& psi) override;
172 
173  void evaluateDetRatios(const VirtualParticleSet& VP,
174  ValueVector& psi,
175  const ValueVector& psiinv,
176  std::vector<TT>& ratios) override;
177 
178  void assign_vgl(int bc_sign, ValueVector& psi, GradVector& dpsi, ValueVector& d2psi, int first, int last) const;
179 
180  /** assign_vgl_from_l can be used when myL is precomputed and myV,myG,myL in cartesian
181  */
182  void assign_vgl_from_l(int bc_sign, ValueVector& psi, GradVector& dpsi, ValueVector& d2psi);
183 
184  void evaluateVGL(const ParticleSet& P,
185  const int iat,
186  ValueVector& psi,
187  GradVector& dpsi,
188  ValueVector& d2psi) override;
189 
190  void assign_vgh(int bc_sign, ValueVector& psi, GradVector& dpsi, HessVector& grad_grad_psi, int first, int last)
191  const;
192 
193  void evaluateVGH(const ParticleSet& P,
194  const int iat,
195  ValueVector& psi,
196  GradVector& dpsi,
197  HessVector& grad_grad_psi) override;
198 
199  void assign_vghgh(int bc_sign,
200  ValueVector& psi,
201  GradVector& dpsi,
202  HessVector& grad_grad_psi,
203  GGGVector& grad_grad_grad_psi,
204  int first = 0,
205  int last = -1) const;
206 
207  void evaluateVGHGH(const ParticleSet& P,
208  const int iat,
209  ValueVector& psi,
210  GradVector& dpsi,
211  HessVector& grad_grad_psi,
212  GGGVector& grad_grad_grad_psi) override;
213 
214  template<class BSPLINESPO>
215  friend class SplineSetReader;
216  friend struct BsplineReader;
217 };
218 
219 extern template class SplineR2R<float>;
220 extern template class SplineR2R<double>;
221 
222 } // namespace qmcplusplus
223 #endif
void resize(size_type n, Type_t val=Type_t())
Resize the container.
Definition: OhmmsVector.h:166
OrbitalSetTraits< ValueType >::HessVector HessVector
Definition: SPOSet.h:53
CrystalLattice< ST, 3 > PrimLattice
primitive cell
Definition: SplineR2R.h:70
static const int D
Definition: BsplineSet.h:37
Fixed-size array.
Definition: OhmmsTinyMeta.h:30
void resizeStorage(size_t n, size_t nvals)
Definition: SplineR2R.h:107
void assign_vgl(int bc_sign, ValueVector &psi, GradVector &dpsi, ValueVector &d2psi, int first, int last) const
Definition: SplineR2R.cpp:226
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
int convertPos(const PointType &r, PointType &ru)
convert position in PrimLattice unit and return sign
Definition: SplineR2R.h:153
BsplineSet is the base class for SplineC2C, SplineC2R, SplineR2R.
Definition: BsplineSet.h:34
Matrix< TT > ratios_private
thread private ratios for reduction when using nested threading, numVP x numThread ...
Definition: SplineR2R.h:65
Tensor< ST, 3 > GGt
, transformation for tensor in LatticeUnit to CartesianUnit, e.g. Hessian
Definition: SplineR2R.h:57
std::ostream & app_log()
Definition: OutputManager.h:65
hContainer_type myH
Definition: SplineR2R.h:75
A ParticleSet that handles virtual moves of a selected particle of a given physical ParticleSet Virtu...
Soa Container for D-dim vectors.
SplineR2R(const std::string &my_name)
Definition: SplineR2R.h:79
OrbitalSetTraits< ValueType >::ValueMatrix ValueMatrix
Definition: SPOSet.h:50
void evaluateDetRatios(const VirtualParticleSet &VP, ValueVector &psi, const ValueVector &psiinv, std::vector< TT > &ratios) override
Definition: SplineR2R.cpp:183
class to handle hdf file
Definition: hdf_archive.h:51
Vector< ST, aligned_allocator< ST > > vContainer_type
Definition: SplineR2R.h:49
Tensor_t G
Reciprocal unit vectors. G(j,i) i=vector and j=x,y,z.
bool isComplex() const override
Definition: SplineR2R.h:84
OrbitalSetTraits< ValueType >::ValueVector ValueVector
int size() const
return the number of tasks
Definition: Communicate.h:118
std::unique_ptr< SPOSet > makeClone() const override
make a clone of itself every derived class must implement this to have threading working correctly...
Definition: SplineR2R.h:87
void FairDivideLow(int ntot, int npart, IV &adist)
partition ntot elements among npart
Definition: FairDivide.h:114
void evaluateVGH(const ParticleSet &P, const int iat, ValueVector &psi, GradVector &dpsi, HessVector &grad_grad_psi) override
evaluate the values, gradients and hessians of this single-particle orbital set
Definition: SplineR2R.cpp:373
virtual std::string getKeyword() const override
Definition: SplineR2R.h:83
Wrapping information on parallelism.
Definition: Communicate.h:68
void assign_vgh(int bc_sign, ValueVector &psi, GradVector &dpsi, HessVector &grad_grad_psi, int first, int last) const
Definition: SplineR2R.cpp:310
std::shared_ptr< std::vector< ST > > coef_copy_
Copy of original splines for orbital rotation.
Definition: SplineR2R.h:62
void evaluateVGHGH(const ParticleSet &P, const int iat, ValueVector &psi, GradVector &dpsi, HessVector &grad_grad_psi, GGGVector &grad_grad_grad_psi) override
evaluate the values, gradients, hessians, and grad hessians of this single-particle orbital set ...
Definition: SplineR2R.cpp:551
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.
std::vector< int > offset
band offsets used for communication
Definition: BsplineSet.h:56
A collection of functions for dividing fairly.
size_type size() const
return the current size
Definition: OhmmsVector.h:162
QTBase::ValueType ValueType
Definition: Configuration.h:60
void applyRotation(const ValueMatrix &rot_mat, bool use_stored_copy) override
apply rotation to all the orbitals
Definition: SplineR2R.cpp:106
bool read_splines(hdf_archive &h5f)
Definition: SplineR2R.cpp:39
ghContainer_type mygH
Definition: SplineR2R.h:76
void gather_tables(Communicate *comm)
Definition: SplineR2R.h:122
void set_spline(SingleSplineType *spline_r, SingleSplineType *spline_i, int twist, int ispline, int level)
Definition: SplineR2R.cpp:29
vContainer_type myL
Definition: SplineR2R.h:73
void assign_vghgh(int bc_sign, ValueVector &psi, GradVector &dpsi, HessVector &grad_grad_psi, GGGVector &grad_grad_grad_psi, int first=0, int last=-1) const
Definition: SplineR2R.cpp:394
OrbitalSetTraits< ValueType >::ValueVector ValueVector
Definition: SPOSet.h:49
typename BsplineSet::ValueType TT
Definition: SplineR2R.h:43
BsplineSet is a SPOSet derived class and serves as a base class for B-spline SPO C2C/C2R/R2R implemen...
void bcast_tables(Communicate *comm)
Definition: SplineR2R.h:120
SingleParticlePos toUnit(const TinyVector< T1, D > &r) const
Convert a cartesian vector to a unit vector.
gContainer_type myG
Definition: SplineR2R.h:74
bool isRotationSupported() const override
return true if this SPOSet can be wrappered by RotatedSPO
Definition: SplineR2R.h:85
void storeParamsBeforeRotation() override
Store an original copy of the spline coefficients for orbital rotation.
Definition: SplineR2R.cpp:57
AntiSymTensor< T, D > transpose(const AntiSymTensor< T, D > &rhs)
vContainer_type myV
intermediate result vectors
Definition: SplineR2R.h:72
bool write_splines(hdf_archive &h5f)
Definition: SplineR2R.cpp:48
void evaluateVGL(const ParticleSet &P, const int iat, ValueVector &psi, GradVector &dpsi, ValueVector &d2psi) override
evaluate the values, gradients and laplacians of this single-particle orbital set ...
Definition: SplineR2R.cpp:289
void create_spline(GT &xyz_g, BCT &xyz_bc)
Definition: SplineR2R.h:134
OrbitalSetTraits< ValueType >::GradHessVector GGGVector
Definition: SPOSet.h:55
OrbitalSetTraits< ValueType >::GradVector GradVector
Definition: SPOSet.h:51
void evaluateValue(const ParticleSet &P, const int iat, ValueVector &psi) override
evaluate the values of this single-particle orbital set
Definition: SplineR2R.cpp:166
typename bspline_traits< ST, 3 >::BCType BCType
Definition: SplineR2R.h:38
UBspline_3d_d SingleSplineType
Definition: SplineR2R.h:41
typename bspline_traits< ST, 3 >::SplineType SplineType
Definition: SplineR2R.h:37
void init_base(int n)
Definition: BsplineSet.h:66
Tensor< typename BinaryReturn< T1, T2, OpMultiply >::Type_t, D > dot(const AntiSymTensor< T1, D > &lhs, const AntiSymTensor< T2, D > &rhs)
TinyVector< int, D > HalfG
sign bits at the G/2 boundaries
Definition: BsplineSet.h:45
virtual std::string getClassName() const override
return class name
Definition: SplineR2R.h:82
void resize(size_type n)
resize myData
void gatherv(T *sb, T *rb, int n, IT &counts, IT &displ, int dest)
void assign_vgl_from_l(int bc_sign, ValueVector &psi, GradVector &dpsi, ValueVector &d2psi)
assign_vgl_from_l can be used when myL is precomputed and myV,myG,myL in cartesian ...
Definition: SplineR2R.cpp:268
std::vector< SPOSet::PosType > kPoints
kpoints for each unique orbitals.
Definition: BsplineSet.h:52
void assign_v(int bc_sign, const vContainer_type &myV, ValueVector &psi, int first, int last) const
Definition: SplineR2R.cpp:152
MakeReturn< UnaryNode< FnFloor, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t floor(const Vector< T1, C1 > &l)
std::shared_ptr< MultiBspline< ST > > SplineInst
multi bspline set
Definition: SplineR2R.h:59
class to match ST real spline with BsplineSet::ValueType (real) SPOs
Definition: SplineR2R.h:34