QMCPACK
CompositeSPOSet.cpp
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) 2016 Jeongnim Kim and QMCPACK developers.
6 //
7 // File developed by: Jaron T. Krogel, krogeljt@ornl.gov, Oak Ridge National Laboratory
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 //
11 // File created by: Jeongnim Kim, jeongnim.kim@gmail.com, University of Illinois at Urbana-Champaign
12 //////////////////////////////////////////////////////////////////////////////////////
13 
14 
15 #include "CompositeSPOSet.h"
17 #include <algorithm>
18 #include "OhmmsData/AttributeSet.h"
20 
21 namespace qmcplusplus
22 {
23 namespace MatrixOperators
24 {
25 /** copy a small matrix (N, M1) to a big matrix (N, M2), M2>M1
26  * @param small input matrix
27  * @param big outout matrix
28  * @param offset_c column offset
29  *
30  * @todo smater and more efficient matrix, move up for others
31  * The columns [0,M1) are inserted into [offset_c,offset_c+M1).
32  */
33 template<typename MAT1, typename MAT2>
34 inline void insert_columns(const MAT1& small, MAT2& big, int offset_c)
35 {
36  const int c = small.cols();
37  for (int i = 0; i < small.rows(); ++i)
38  std::copy(small[i], small[i] + c, big[i] + offset_c);
39 }
40 } // namespace MatrixOperators
41 
42 CompositeSPOSet::CompositeSPOSet(const std::string& my_name) : SPOSet(my_name)
43 {
44  OrbitalSetSize = 0;
45  component_offsets.reserve(4);
46 }
47 
49 {
50  for (auto& element : other.components)
51  {
52  this->add(element->makeClone());
53  }
54 }
55 
57 
58 void CompositeSPOSet::add(std::unique_ptr<SPOSet> component)
59 {
60  if (components.empty())
61  component_offsets.push_back(0); //add 0
62 
63  int norbs = component->size();
64  components.push_back(std::move(component));
65  component_values.emplace_back(norbs);
66  component_gradients.emplace_back(norbs);
67  component_laplacians.emplace_back(norbs);
68  component_spin_gradients.emplace_back(norbs);
69 
70  OrbitalSetSize += norbs;
72 }
73 
75 {
76  app_log() << "CompositeSPOSet" << std::endl;
77  app_log() << " ncomponents = " << components.size() << std::endl;
78  app_log() << " components" << std::endl;
79  for (int i = 0; i < components.size(); ++i)
80  {
81  app_log() << " " << i << std::endl;
82  components[i]->basic_report(" ");
83  }
84 }
85 
86 std::unique_ptr<SPOSet> CompositeSPOSet::makeClone() const { return std::make_unique<CompositeSPOSet>(*this); }
87 
89 {
90  int n = 0;
91  for (int c = 0; c < components.size(); ++c)
92  {
93  SPOSet& component = *components[c];
94  ValueVector& values = component_values[c];
95  component.evaluateValue(P, iat, values);
96  std::copy(values.begin(), values.end(), psi.begin() + n);
97  n += component.size();
98  }
99 }
100 
101 void CompositeSPOSet::evaluateVGL(const ParticleSet& P, int iat, ValueVector& psi, GradVector& dpsi, ValueVector& d2psi)
102 {
103  int n = 0;
104  for (int c = 0; c < components.size(); ++c)
105  {
106  SPOSet& component = *components[c];
107  ValueVector& values = component_values[c];
108  GradVector& gradients = component_gradients[c];
109  ValueVector& laplacians = component_laplacians[c];
110  component.evaluateVGL(P, iat, values, gradients, laplacians);
111  std::copy(values.begin(), values.end(), psi.begin() + n);
112  std::copy(gradients.begin(), gradients.end(), dpsi.begin() + n);
113  std::copy(laplacians.begin(), laplacians.end(), d2psi.begin() + n);
114  n += component.size();
115  }
116 }
117 
119  int iat,
120  ValueVector& psi,
121  GradVector& dpsi,
122  ValueVector& d2psi,
123  ValueVector& dspin_psi)
124 {
125  int n = 0;
126  for (int c = 0; c < components.size(); ++c)
127  {
128  SPOSet& component = *components[c];
129  ValueVector& values = component_values[c];
130  GradVector& gradients = component_gradients[c];
131  ValueVector& laplacians = component_laplacians[c];
132  ValueVector& spin_gradients = component_spin_gradients[c];
133  component.evaluateVGL_spin(P, iat, values, gradients, laplacians, spin_gradients);
134  std::copy(values.begin(), values.end(), psi.begin() + n);
135  std::copy(gradients.begin(), gradients.end(), dpsi.begin() + n);
136  std::copy(laplacians.begin(), laplacians.end(), d2psi.begin() + n);
137  std::copy(spin_gradients.begin(), spin_gradients.end(), dspin_psi.begin() + n);
138  n += component.size();
139  }
140 }
141 
143  int first,
144  int last,
145  ValueMatrix& logdet,
146  GradMatrix& dlogdet,
147  ValueMatrix& d2logdet)
148 {
149  const int nat = last - first;
150  for (int c = 0; c < components.size(); ++c)
151  {
152  int norb = components[c]->size();
153  ValueMatrix v(nat, norb);
154  GradMatrix g(nat, norb);
155  ValueMatrix l(nat, norb);
156  components[c]->evaluate_notranspose(P, first, last, v, g, l);
157  int n = component_offsets[c];
159  MatrixOperators::insert_columns(g, dlogdet, n);
160  MatrixOperators::insert_columns(l, d2logdet, n);
161  }
162 }
163 
165  int first,
166  int last,
167  ValueMatrix& logdet,
168  GradMatrix& dlogdet,
169  HessMatrix& grad_grad_logdet)
170 {
171  const int nat = last - first;
172  for (int c = 0; c < components.size(); ++c)
173  {
174  int norb = components[c]->size();
175  ValueMatrix v(nat, norb);
176  GradMatrix g(nat, norb);
177  HessMatrix h(nat, norb);
178  components[c]->evaluate_notranspose(P, first, last, v, g, h);
179  int n = component_offsets[c];
181  MatrixOperators::insert_columns(g, dlogdet, n);
182  MatrixOperators::insert_columns(h, grad_grad_logdet, n);
183  }
184 }
185 
187  int first,
188  int last,
189  ValueMatrix& logdet,
190  GradMatrix& dlogdet,
191  HessMatrix& grad_grad_logdet,
192  GGGMatrix& grad_grad_grad_logdet)
193 {
194  not_implemented("evaluate_notranspose(P,first,last,logdet,dlogdet,ddlogdet,dddlogdet)");
195 }
196 
197 
198 std::unique_ptr<SPOSet> CompositeSPOSetBuilder::createSPOSetFromXML(xmlNodePtr cur)
199 {
200  std::vector<std::string> spolist;
201  putContent(spolist, cur);
202  if (spolist.empty())
203  {
204  return nullptr;
205  }
206 
207  auto spo_now = std::make_unique<CompositeSPOSet>(getXMLAttributeValue(cur, "name"));
208  for (int i = 0; i < spolist.size(); ++i)
209  {
210  const SPOSet* spo = sposet_builder_factory_.getSPOSet(spolist[i]);
211  if (spo)
212  spo_now->add(spo->makeClone());
213  }
214  return (spo_now->size()) ? std::unique_ptr<SPOSet>{std::move(spo_now)} : nullptr;
215 }
216 
217 std::unique_ptr<SPOSet> CompositeSPOSetBuilder::createSPOSet(xmlNodePtr cur, SPOSetInputInfo& input)
218 {
219  return createSPOSetFromXML(cur);
220 }
221 
222 } // namespace qmcplusplus
base class for Single-particle orbital sets
Definition: SPOSet.h:46
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
class to read state range information from sposet input
const SPOSetBuilderFactory & sposet_builder_factory_
reference to the sposet_builder_factory
virtual std::unique_ptr< SPOSet > makeClone() const
make a clone of itself every derived class must implement this to have threading working correctly...
Definition: SPOSet.cpp:225
std::ostream & app_log()
Definition: OutputManager.h:65
std::vector< int > component_offsets
store the precomputed offsets
OrbitalSetTraits< ValueType >::ValueMatrix ValueMatrix
Definition: SPOSet.h:50
int size() const
return the size of the orbital set Ye: this needs to be replaced by getOrbitalSetSize(); ...
Definition: SPOSet.h:75
const SPOSet * getSPOSet(const std::string &name) const
returns a named sposet from the pool only use in serial portion of execution ie during initialization...
std::vector< ValueVector > component_values
temporary storage for values
void copy(const Array< T1, 3 > &src, Array< T2, 3 > &dest)
Definition: Blitz.h:639
OrbitalSetTraits< ValueType >::GradMatrix GradMatrix
Definition: SPOSet.h:52
CompositeSPOSet(const std::string &my_name)
virtual void evaluateValue(const ParticleSet &P, int iat, ValueVector &psi)=0
evaluate the values of this single-particle orbital set
Specialized paritlce class for atomistic simulations.
Definition: ParticleSet.h:55
std::unique_ptr< SPOSet > makeClone() const override
make a clone of itself every derived class must implement this to have threading working correctly...
void evaluateVGL_spin(const ParticleSet &P, int iat, ValueVector &psi, GradVector &dpsi, ValueVector &d2psi, ValueVector &dspin_psi) override
evaluate the values, gradients and laplacians and spin gradient of this single-particle orbital set ...
OrbitalSetTraits< ValueType >::ValueVector ValueVector
Definition: SPOSet.h:49
virtual void evaluateVGL(const ParticleSet &P, int iat, ValueVector &psi, GradVector &dpsi, ValueVector &d2psi)=0
evaluate the values, gradients and laplacians of this single-particle orbital set ...
virtual void evaluateVGL_spin(const ParticleSet &P, int iat, ValueVector &psi, GradVector &dpsi, ValueVector &d2psi, ValueVector &dspin)
evaluate the values, gradients and laplacians and spin gradient of this single-particle orbital set ...
Definition: SPOSet.cpp:83
IndexType OrbitalSetSize
number of Single-particle orbitals
Definition: SPOSet.h:566
void add(std::unique_ptr< SPOSet > component)
add a sposet component to this composite sposet
std::string getXMLAttributeValue(const xmlNodePtr cur, const std::string_view name)
get the value string for attribute name if name is unfound in cur you get an empty string back this i...
void evaluateValue(const ParticleSet &P, int iat, ValueVector &psi) override
evaluate the values of this single-particle orbital set
void report()
print out component info
std::vector< ValueVector > component_laplacians
temporary storage for laplacians
void insert_columns(const MAT1 &small, MAT2 &big, int offset_c)
copy a small matrix (N, M1) to a big matrix (N, M2), M2>M1
bool putContent(T &a, xmlNodePtr cur)
replaces a&#39;s value with the first "element" in the "string" returned by XMLNodeString{cur}.
Definition: libxmldefs.h:88
void evaluateVGL(const ParticleSet &P, int iat, ValueVector &psi, GradVector &dpsi, ValueVector &d2psi) override
evaluate the values, gradients and laplacians of this single-particle orbital set ...
OrbitalSetTraits< ValueType >::GradVector GradVector
Definition: SPOSet.h:51
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...
std::vector< std::unique_ptr< SPOSet > > components
component SPOSets
OrbitalSetTraits< ValueType >::GradHessMatrix GGGMatrix
Definition: SPOSet.h:56
std::vector< GradVector > component_gradients
temporary storage for gradients
std::unique_ptr< SPOSet > createSPOSetFromXML(xmlNodePtr cur) override
create an sposet from xml (legacy)
std::vector< ValueVector > component_spin_gradients
temporary storage for spin gradients
void not_implemented(const std::string &method)
unimplemented functions call this to abort
OrbitalSetTraits< ValueType >::HessMatrix HessMatrix
Definition: SPOSet.h:54
std::unique_ptr< SPOSet > createSPOSet(xmlNodePtr cur, SPOSetInputInfo &input) override
create an sposet from a general xml request