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