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