QMCPACK
QMCHamiltonian Class Reference

Collection of Local Energy Operators. More...

+ Collaboration diagram for QMCHamiltonian:

Classes

struct  QMCHamiltonianMultiWalkerResource
 

Public Types

enum  { DIM = OHMMS_DIM }
 
using Return_t = OperatorBase::Return_t
 
using PosType = OperatorBase::PosType
 
using TensorType = OperatorBase::TensorType
 
using RealType = OperatorBase::RealType
 
using ValueType = OperatorBase::ValueType
 
using FullPrecRealType = QMCTraits::FullPrecRealType
 
using PropertySetType = OperatorBase::PropertySetType
 
using BufferType = OperatorBase::BufferType
 
using Walker_t = OperatorBase::Walker_t
 
using WP = WalkerProperties::Indexes
 
using ValueMatrix = SPOSet::ValueMatrix
 

Public Member Functions

 QMCHamiltonian (const std::string &aname="psi0")
 constructor More...
 
 ~QMCHamiltonian ()
 destructor More...
 
void addOperator (std::unique_ptr< OperatorBase > &&h, const std::string &aname, bool physical=true)
 add an operator More...
 
void addOperatorType (const std::string &name, const std::string &type)
 record the name-type pair of an operator More...
 
const std::string & getOperatorType (const std::string &name)
 return type of named H element or fail More...
 
int size () const
 return the number of Hamiltonians More...
 
int total_size () const
 return the total number of Hamiltonians (physical + aux) More...
 
OperatorBasegetHamiltonian (const std::string &aname)
 return OperatorBase with the name aname More...
 
OperatorBasegetHamiltonian (int i)
 return i-th OperatorBase More...
 
RefVector< OperatorBasegetTWFDependentComponents ()
 return components, auxH not included, depending on TWF. More...
 
void initialize_traces (TraceManager &tm, ParticleSet &P)
 initialize trace data More...
 
void collect_walker_traces (Walker_t &walker, int step)
 collect walker trace data More...
 
void finalize_traces ()
 finalize trace data More...
 
int addObservables (ParticleSet &P)
 add each term to the PropertyList for averages More...
 
void registerObservables (std::vector< ObservableHelper > &h5desc, hdf_archive &file) const
 register obsevables so that their averages can be dumped to hdf5 More...
 
void registerCollectables (std::vector< ObservableHelper > &h5desc, hdf_archive &file) const
 register collectables so that their averages can be dumped to hdf5 More...
 
void informOperatorsOfListener ()
 Some Hamiltonian components need to be informed that they are in a per particle reporting situation so additional state can be added either to them or the objects they are strongly coupled with. More...
 
int startIndex () const
 retrun the starting index More...
 
int sizeOfObservables () const
 return the size of observables More...
 
int sizeOfCollectables () const
 return the size of collectables More...
 
RealType getObservable (int i) const
 return the value of the i-th observable More...
 
int getObservable (std::string Oname) const
 return the value of the observable with a set name if it exists More...
 
std::string getObservableName (int i) const
 return the name of the i-th observable More...
 
template<class IT , typename = std::enable_if_t<std::is_same<std::add_pointer<FullPrecRealType>::type, IT>::value>>
void saveProperty (IT first)
 save the values of Hamiltonian elements to the Properties More...
 
template<class IT , typename = std::enable_if_t<std::is_same<std::add_pointer<FullPrecRealType>::type, IT>::value>>
void setProperty (IT first)
 
void updateSource (ParticleSet &s)
 remove a named Hamiltonian from the list More...
 
FullPrecRealType getLocalEnergy ()
 
FullPrecRealType getLocalPotential ()
 
FullPrecRealType getKineticEnergy ()
 
void auxHevaluate (ParticleSet &P)
 
void auxHevaluate (ParticleSet &P, Walker_t &ThisWalker)
 This is more efficient. Only calculate auxH elements if moves are accepted. More...
 
void auxHevaluate (ParticleSet &P, Walker_t &ThisWalker, bool do_properties, bool do_collectables)
 Evaluate properties only. More...
 
void rejectedMove (ParticleSet &P, Walker_t &ThisWalker)
 Looks like a hack see DMCBatched.cpp and DMC.cpp weight is used like temporary flag from DMC. More...
 
void setPrimary (bool primary)
 set PRIMARY bit of all the components More...
 
FullPrecRealType evaluate (ParticleSet &P)
 evaluate Local Energy More...
 
FullPrecRealType evaluateDeterministic (ParticleSet &P)
 evaluate Local Energy deterministically. More...
 
FullPrecRealType evaluateWithToperator (ParticleSet &P)
 evaluate Local energy with Toperators updated. More...
 
FullPrecRealType evaluateValueAndDerivatives (ParticleSet &P, const opt_variables_type &optvars, Vector< ValueType > &dlogpsi, Vector< ValueType > &dhpsioverpsi)
 evaluate energy and derivatives wrt to the variables More...
 
FullPrecRealType evaluateIonDerivsDeterministicFast (ParticleSet &P, ParticleSet &ions, TrialWaveFunction &psi_in, TWFFastDerivWrapper &psi_wrapper, ParticleSet::ParticlePos &dedr, ParticleSet::ParticlePos &wf_grad)
 evaluate local energy and derivatives w.r.t ionic coordinates, but deterministically. More...
 
void evaluateElecGrad (ParticleSet &P, TrialWaveFunction &psi, ParticleSet::ParticlePos &EGrad, RealType delta=1e-5)
 Evaluate the electron gradient of the local energy. More...
 
FullPrecRealType evaluateIonDerivs (ParticleSet &P, ParticleSet &ions, TrialWaveFunction &psi, ParticleSet::ParticlePos &hf_terms, ParticleSet::ParticlePos &pulay_terms, ParticleSet::ParticlePos &wf_grad)
 evaluate local energy and derivatives w.r.t ionic coordinates. More...
 
FullPrecRealType evaluateIonDerivsDeterministic (ParticleSet &P, ParticleSet &ions, TrialWaveFunction &psi, ParticleSet::ParticlePos &hf_terms, ParticleSet::ParticlePos &pulay_terms, ParticleSet::ParticlePos &wf_grad)
 evaluate local energy and derivatives w.r.t ionic coordinates, but deterministically. More...
 
void setNonLocalMoves (xmlNodePtr cur)
 set non local moves options More...
 
void setNonLocalMoves (const std::string &non_local_move_option, const double tau, const double alpha, const double gamma)
 
int makeNonLocalMoves (ParticleSet &P)
 make non local moves More...
 
bool has_L2 ()
 determine if L2 potential is present More...
 
void computeL2DK (ParticleSet &P, int iel, TensorType &D, PosType &K)
 compute D matrix and K vector for L2 potential propagator More...
 
void computeL2D (ParticleSet &P, int iel, TensorType &D)
 compute D matrix for L2 potential propagator More...
 
FullPrecRealType evaluateVariableEnergy (ParticleSet &P, bool free_nlpp)
 evaluate energy More...
 
FullPrecRealType getEnsembleAverage ()
 return an average value of the LocalEnergy More...
 
void resetTargetParticleSet (ParticleSet &P)
 
const std::string & getName () const
 
bool get (std::ostream &os) const
 
void setRandomGenerator (RandomBase< FullPrecRealType > *rng)
 
void createResource (ResourceCollection &collection) const
 initialize a shared resource and hand it to a collection More...
 
std::unique_ptr< QMCHamiltonianmakeClone (ParticleSet &qp, TrialWaveFunction &psi) const
 return a clone More...
 

Static Public Member Functions

static void mw_registerKineticListener (QMCHamiltonian &ham_leader, ListenerVector< RealType > listener)
 Listener Registration This must be called on a QMCHamiltonian that has acquired multiwalker resources. More...
 
static void mw_registerLocalEnergyListener (QMCHamiltonian &ham_leader, ListenerVector< RealType > listener)
 
static void mw_registerLocalPotentialListener (QMCHamiltonian &ham_leader, ListenerVector< RealType > listener)
 
static void mw_registerLocalIonPotentialListener (QMCHamiltonian &ham_leader, ListenerVector< RealType > listener)
 
static std::vector< QMCHamiltonian::FullPrecRealTypemw_evaluate (const RefVectorWithLeader< QMCHamiltonian > &ham_list, const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list)
 batched version of evaluate for LocalEnergy More...
 
static std::vector< QMCHamiltonian::FullPrecRealTypemw_evaluateWithToperator (const RefVectorWithLeader< QMCHamiltonian > &ham_list, const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list)
 batched version of evaluate Local energy with Toperators updated. More...
 
static std::vector< QMCHamiltonian::FullPrecRealTypemw_evaluateValueAndDerivatives (const RefVectorWithLeader< QMCHamiltonian > &ham_list, const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list, const opt_variables_type &optvars, RecordArray< ValueType > &dlogpsi, RecordArray< ValueType > &dhpsioverpsi)
 
static std::vector< int > mw_makeNonLocalMoves (const RefVectorWithLeader< QMCHamiltonian > &ham_list, const RefVectorWithLeader< TrialWaveFunction > &wf_list, const RefVectorWithLeader< ParticleSet > &p_list)
 
static void updateComponent (OperatorBase &op, QMCHamiltonian &ham, ParticleSet &pset)
 accumulate local energy and update Observables and PropertyList More...
 
static void updateKinetic (QMCHamiltonian &ham, ParticleSet &pset)
 extract kinetic and potential energies. More...
 
static void acquireResource (ResourceCollection &collection, const RefVectorWithLeader< QMCHamiltonian > &ham_list)
 acquire external resource Note: use RAII ResourceCollectionLock whenever possible More...
 
static void releaseResource (ResourceCollection &collection, const RefVectorWithLeader< QMCHamiltonian > &ham_list)
 release external resource Note: use RAII ResourceCollectionLock whenever possible More...
 

Private Member Functions

void resetObservables (int start, int ncollects)
 reset Observables and counters More...
 
void reportToListeners ()
 

Static Private Member Functions

static RefVectorWithLeader< OperatorBaseextract_HC_list (const RefVectorWithLeader< QMCHamiltonian > &ham_list, int id)
 

Private Attributes

int myIndex
 starting index More...
 
int numCollectables
 starting index More...
 
FullPrecRealType LocalEnergy
 Current Local Energy. More...
 
FullPrecRealType KineticEnergy
 Current Kinetic Energy. More...
 
FullPrecRealType NewLocalEnergy
 Current Local Energy for the proposed move. More...
 
const std::string myName
 getName is in the way More...
 
std::vector< std::unique_ptr< OperatorBase > > H
 vector of Hamiltonians More...
 
NonLocalECPotentialnlpp_ptr
 pointer to NonLocalECP More...
 
L2Potentiall2_ptr
 pointer to L2Potential More...
 
std::vector< std::unique_ptr< OperatorBase > > auxH
 vector of Hamiltonians More...
 
NewTimerham_timer_
 Total timer for H evaluation. More...
 
NewTimereval_vals_derivs_timer_
 Total timer for H evaluation. More...
 
NewTimereval_ion_derivs_fast_timer_
 Total timer for H ion deriv evaluation;. More...
 
std::vector< std::reference_wrapper< NewTimer > > my_timers_
 timers for H components More...
 
std::map< std::string, std::string > operator_types
 types of component operators More...
 
PropertySetType Observables
 data More...
 
TraceRequest request
 traces variables More...
 
bool streaming_position
 
Array< TraceInt, 1 > * id_sample
 
Array< TraceInt, 1 > * pid_sample
 
Array< TraceInt, 1 > * step_sample
 
Array< TraceInt, 1 > * gen_sample
 
Array< TraceInt, 1 > * age_sample
 
Array< TraceInt, 1 > * mult_sample
 
Array< TraceReal, 1 > * weight_sample
 
Array< TraceReal, 2 > * position_sample
 
ResourceHandle< QMCHamiltonianMultiWalkerResourcemw_res_handle_
 

Static Private Attributes

static constexpr std::array< std::string_view, 8 > available_quantities_
 

Friends

class HamiltonianFactory
 

Detailed Description

Collection of Local Energy Operators.

Note that QMCHamiltonian is not derived from QMCHmailtonianBase.

Definition at line 49 of file QMCHamiltonian.h.

Member Typedef Documentation

◆ BufferType

Definition at line 61 of file QMCHamiltonian.h.

◆ FullPrecRealType

Definition at line 59 of file QMCHamiltonian.h.

◆ PosType

Definition at line 55 of file QMCHamiltonian.h.

◆ PropertySetType

using PropertySetType = OperatorBase::PropertySetType

Definition at line 60 of file QMCHamiltonian.h.

◆ RealType

Definition at line 57 of file QMCHamiltonian.h.

◆ Return_t

Definition at line 54 of file QMCHamiltonian.h.

◆ TensorType

Definition at line 56 of file QMCHamiltonian.h.

◆ ValueMatrix

Definition at line 64 of file QMCHamiltonian.h.

◆ ValueType

Definition at line 58 of file QMCHamiltonian.h.

◆ Walker_t

Definition at line 62 of file QMCHamiltonian.h.

◆ WP

Definition at line 63 of file QMCHamiltonian.h.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
Enumerator
DIM 

Definition at line 65 of file QMCHamiltonian.h.

66  {
67  DIM = OHMMS_DIM
68  };
#define OHMMS_DIM
Definition: config.h:64

Constructor & Destructor Documentation

◆ QMCHamiltonian()

QMCHamiltonian ( const std::string &  aname = "psi0")

constructor

Definition at line 48 of file QMCHamiltonian.cpp.

49  : myIndex(0),
50  numCollectables(0),
51  myName(aname),
52  nlpp_ptr(nullptr),
53  l2_ptr(nullptr),
54  ham_timer_(createGlobalTimer("Hamiltonian:" + aname + "::evaluate", timer_level_medium)),
55  eval_vals_derivs_timer_(createGlobalTimer("Hamiltonian:" + aname + "::ValueParamDerivs", timer_level_medium)),
57  createGlobalTimer("Hamiltonian:" + aname + ":::evaluateIonDerivsDeterministicFast", timer_level_medium))
58 #if !defined(REMOVE_TRACEMANAGER)
59  ,
60  streaming_position(false),
61  id_sample(nullptr),
62  pid_sample(nullptr),
63  step_sample(nullptr),
64  gen_sample(nullptr),
65  age_sample(nullptr),
66  mult_sample(nullptr),
67  weight_sample(nullptr),
68  position_sample(nullptr)
69 #endif
70 {}
NewTimer & createGlobalTimer(const std::string &myname, timer_levels mylevel)
NewTimer & eval_vals_derivs_timer_
Total timer for H evaluation.
int myIndex
starting index
NewTimer & ham_timer_
Total timer for H evaluation.
Array< TraceInt, 1 > * step_sample
Array< TraceReal, 1 > * weight_sample
NonLocalECPotential * nlpp_ptr
pointer to NonLocalECP
Array< TraceInt, 1 > * mult_sample
Array< TraceReal, 2 > * position_sample
Array< TraceInt, 1 > * id_sample
const std::string myName
getName is in the way
L2Potential * l2_ptr
pointer to L2Potential
Array< TraceInt, 1 > * gen_sample
int numCollectables
starting index
Array< TraceInt, 1 > * pid_sample
Array< TraceInt, 1 > * age_sample
NewTimer & eval_ion_derivs_fast_timer_
Total timer for H ion deriv evaluation;.

◆ ~QMCHamiltonian()

destructor

Definition at line 77 of file QMCHamiltonian.cpp.

78 {
79  //@todo clean up H and auxH
80 }

Member Function Documentation

◆ acquireResource()

void acquireResource ( ResourceCollection collection,
const RefVectorWithLeader< QMCHamiltonian > &  ham_list 
)
static

acquire external resource Note: use RAII ResourceCollectionLock whenever possible

Definition at line 1041 of file QMCHamiltonian.cpp.

References QMCHamiltonian::extract_HC_list(), RefVectorWithLeader< T >::getLeader(), and ResourceCollection::lendResource().

1043 {
1044  auto& ham_leader = ham_list.getLeader();
1045  ham_leader.mw_res_handle_ = collection.lendResource<QMCHamiltonianMultiWalkerResource>();
1046  for (int i_ham_op = 0; i_ham_op < ham_leader.H.size(); ++i_ham_op)
1047  {
1048  const auto HC_list(extract_HC_list(ham_list, i_ham_op));
1049  ham_leader.H[i_ham_op]->acquireResource(collection, HC_list);
1050  }
1051 }
static RefVectorWithLeader< OperatorBase > extract_HC_list(const RefVectorWithLeader< QMCHamiltonian > &ham_list, int id)

◆ addOperator()

void addOperator ( std::unique_ptr< OperatorBase > &&  h,
const std::string &  aname,
bool  physical = true 
)

add an operator

add a new Hamiltonian the the list of Hamiltonians.

Parameters
han operator
anamename of h
physicalif true, a physical operator

Definition at line 98 of file QMCHamiltonian.cpp.

References APP_ABORT, qmcplusplus::app_log(), qmcplusplus::app_warning(), QMCHamiltonian::auxH, qmcplusplus::createGlobalTimer(), QMCHamiltonian::getName(), QMCHamiltonian::H, QMCHamiltonian::l2_ptr, QMCHamiltonian::my_timers_, QMCHamiltonian::nlpp_ptr, OperatorBase::PHYSICAL, and qmcplusplus::timer_level_fine.

Referenced by ACForce::add2Hamiltonian(), OperatorBase::add2Hamiltonian(), CostFunctionCrowdData::CostFunctionCrowdData(), ECPotentialBuilder::put(), and qmcplusplus::TEST_CASE().

99 {
100  //change UpdateMode[PHYSICAL] of h so that cloning can be done correctly
101  h->getUpdateMode()[OperatorBase::PHYSICAL] = physical;
102  if (physical)
103  {
104  for (int i = 0; i < H.size(); ++i)
105  {
106  if (H[i]->getName() == aname)
107  {
108  app_warning() << "QMCHamiltonian::addOperator cannot " << aname << ". The name is already used" << std::endl;
109  return;
110  }
111  }
112  app_log() << " QMCHamiltonian::addOperator " << aname << " to H, physical Hamiltonian " << std::endl;
113  h->setName(aname);
114  H.push_back(std::move(h));
115  std::string tname = "Hamiltonian:" + aname;
116  my_timers_.push_back(createGlobalTimer(tname, timer_level_fine));
117  }
118  else
119  {
120  //ignore timers for now
121  for (int i = 0; i < auxH.size(); ++i)
122  {
123  if (auxH[i]->getName() == aname)
124  {
125  app_warning() << "QMCHamiltonian::addOperator cannot " << aname << ". The name is already used" << std::endl;
126  return;
127  }
128  }
129  app_log() << " QMCHamiltonian::addOperator " << aname << " to auxH " << std::endl;
130  h->setName(aname);
131  auxH.push_back(std::move(h));
132  }
133 
134  //assign save NLPP if found
135  // name is fixed in ECPotentialBuilder::put()
136  if (aname == "NonLocalECP")
137  {
138  if (nlpp_ptr == nullptr)
139  {
140  // original h arguments moved to either H or auxH
141  nlpp_ptr = physical ? dynamic_cast<NonLocalECPotential*>(H.back().get())
142  : dynamic_cast<NonLocalECPotential*>(auxH.back().get());
143  }
144  else
145  {
146  APP_ABORT("QMCHamiltonian::addOperator nlpp_ptr is supposed to be null. Something went wrong!");
147  }
148  }
149 
150  //save L2 potential if found
151  // name is fixed in ECPotentialBuilder::put()
152  if (aname == "L2")
153  {
154  if (l2_ptr == nullptr)
155  {
156  l2_ptr = physical ? dynamic_cast<L2Potential*>(H.back().get()) : dynamic_cast<L2Potential*>(auxH.back().get());
157  }
158  else
159  {
160  APP_ABORT("QMCHamiltonian::addOperator l2_ptr is supposed to be null. Something went wrong!");
161  }
162  }
163 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
NewTimer & createGlobalTimer(const std::string &myname, timer_levels mylevel)
std::vector< std::unique_ptr< OperatorBase > > auxH
vector of Hamiltonians
NonLocalECPotential * nlpp_ptr
pointer to NonLocalECP
std::ostream & app_warning()
Definition: OutputManager.h:69
L2Potential * l2_ptr
pointer to L2Potential
std::ostream & app_log()
Definition: OutputManager.h:65
#define APP_ABORT(msg)
Widely used but deprecated fatal error macros from legacy code.
Definition: AppAbort.h:27
std::vector< std::reference_wrapper< NewTimer > > my_timers_
timers for H components
const std::string & getName() const

◆ addOperatorType()

void addOperatorType ( const std::string &  name,
const std::string &  type 
)

record the name-type pair of an operator

Definition at line 166 of file QMCHamiltonian.cpp.

References qmcplusplus::app_log(), and QMCHamiltonian::operator_types.

167 {
168  app_log() << "QMCHamiltonian::addOperatorType added type " << type << " named " << name << std::endl;
169  operator_types[name] = type;
170 }
std::ostream & app_log()
Definition: OutputManager.h:65
std::map< std::string, std::string > operator_types
types of component operators

◆ auxHevaluate() [1/3]

void auxHevaluate ( ParticleSet P)

Definition at line 722 of file QMCHamiltonian.cpp.

References QMCHamiltonian::auxH, QMCHamiltonian::myIndex, QMCHamiltonian::Observables, and ParticleSet::PropertyList.

Referenced by SOVMCUpdateAll::advanceWalker(), SODMCUpdatePbyPWithRejectionFast::advanceWalker(), DMCUpdateAllWithRejection::advanceWalker(), VMCUpdateAll::advanceWalker(), VMCUpdatePbyP::advanceWalker(), DMCUpdatePbyPWithRejectionFast::advanceWalker(), SOVMCUpdatePbyP::advanceWalker(), DMCUpdatePbyPL2::advanceWalker(), DMCUpdateAllWithKill::advanceWalker(), VMCBatched::advanceWalkers(), RMCUpdatePbyPWithDrift::advanceWalkersRMC(), RMCUpdateAllWithDrift::advanceWalkersRMC(), RMCUpdatePbyPWithDrift::advanceWalkersVMC(), RMCUpdateAllWithDrift::advanceWalkersVMC(), QMCDriverNew::initialLogEvaluation(), RMCUpdateAllWithDrift::initWalkers(), QMCUpdateBase::initWalkersForPbyP(), and WaveFunctionTester::runGradSourceTest().

723 {
724  for (int i = 0; i < auxH.size(); ++i)
725  {
726  RealType sink = auxH[i]->evaluate(P);
727  auxH[i]->setObservables(Observables);
728 #if !defined(REMOVE_TRACEMANAGER)
729  auxH[i]->collectScalarTraces();
730 #endif
731  auxH[i]->setParticlePropertyList(P.PropertyList, myIndex);
732  //H[i]->setParticlePropertyList(P.PropertyList,myIndex);
733  }
734 }
int myIndex
starting index
PropertySetType Observables
data
std::vector< std::unique_ptr< OperatorBase > > auxH
vector of Hamiltonians
QMCTraits::RealType RealType

◆ auxHevaluate() [2/3]

void auxHevaluate ( ParticleSet P,
Walker_t ThisWalker 
)

This is more efficient. Only calculate auxH elements if moves are accepted.

Definition at line 737 of file QMCHamiltonian.cpp.

References QMCHamiltonian::auxH, QMCHamiltonian::collect_walker_traces(), ParticleSet::current_step, QMCHamiltonian::myIndex, QMCHamiltonian::Observables, and ParticleSet::PropertyList.

738 {
739 #if !defined(REMOVE_TRACEMANAGER)
740  collect_walker_traces(ThisWalker, P.current_step);
741 #endif
742  for (int i = 0; i < auxH.size(); ++i)
743  {
744  auxH[i]->setHistories(ThisWalker);
745  RealType sink = auxH[i]->evaluate(P);
746  auxH[i]->setObservables(Observables);
747 #if !defined(REMOVE_TRACEMANAGER)
748  auxH[i]->collectScalarTraces();
749 #endif
750  auxH[i]->setParticlePropertyList(P.PropertyList, myIndex);
751  }
752 }
int myIndex
starting index
PropertySetType Observables
data
std::vector< std::unique_ptr< OperatorBase > > auxH
vector of Hamiltonians
void collect_walker_traces(Walker_t &walker, int step)
collect walker trace data
QMCTraits::RealType RealType

◆ auxHevaluate() [3/3]

void auxHevaluate ( ParticleSet P,
Walker_t ThisWalker,
bool  do_properties,
bool  do_collectables 
)

Evaluate properties only.

Definition at line 754 of file QMCHamiltonian.cpp.

References QMCHamiltonian::auxH, QMCHamiltonian::collect_walker_traces(), OperatorBase::COLLECTABLE, ParticleSet::current_step, QMCHamiltonian::myIndex, QMCHamiltonian::Observables, and ParticleSet::PropertyList.

755 {
756 #if !defined(REMOVE_TRACEMANAGER)
757  collect_walker_traces(ThisWalker, P.current_step);
758 #endif
759  for (int i = 0; i < auxH.size(); ++i)
760  {
761  bool is_property = !(auxH[i]->getMode(OperatorBase::COLLECTABLE));
762  bool is_collectable = (auxH[i]->getMode(OperatorBase::COLLECTABLE));
763  if ((is_property && do_properties) || (is_collectable && do_collectables))
764  {
765  auxH[i]->setHistories(ThisWalker);
766  RealType sink = auxH[i]->evaluate(P);
767  auxH[i]->setObservables(Observables);
768 #if !defined(REMOVE_TRACEMANAGER)
769  auxH[i]->collectScalarTraces();
770 #endif
771  auxH[i]->setParticlePropertyList(P.PropertyList, myIndex);
772  }
773  }
774 }
int myIndex
starting index
PropertySetType Observables
data
std::vector< std::unique_ptr< OperatorBase > > auxH
vector of Hamiltonians
void collect_walker_traces(Walker_t &walker, int step)
collect walker trace data
QMCTraits::RealType RealType

◆ collect_walker_traces()

void collect_walker_traces ( Walker_t walker,
int  step 
)

collect walker trace data

Definition at line 490 of file QMCHamiltonian.cpp.

References QMCHamiltonian::age_sample, QMCHamiltonian::DIM, QMCHamiltonian::mult_sample, QMCHamiltonian::position_sample, QMCHamiltonian::request, TraceRequest::streaming_default_scalars, QMCHamiltonian::streaming_position, qmcplusplus::walker, and QMCHamiltonian::weight_sample.

Referenced by QMCHamiltonian::auxHevaluate(), and QMCHamiltonian::rejectedMove().

491 {
493  {
494  (*id_sample)(0) = walker.getWalkerID();
495  (*pid_sample)(0) = walker.getParentID();
496  (*step_sample)(0) = step;
497  (*gen_sample)(0) = walker.Generation;
498  (*age_sample)(0) = walker.Age;
499  (*mult_sample)(0) = walker.Multiplicity;
500  (*weight_sample)(0) = walker.Weight;
501  }
502  if (streaming_position)
503  for (int i = 0; i < walker.R.size(); ++i)
504  for (int d = 0; d < DIM; ++d)
505  (*position_sample)(i, d) = walker.R[i][d];
506 }
Array< TraceReal, 1 > * weight_sample
TraceRequest request
traces variables
Array< TraceInt, 1 > * mult_sample
Array< TraceReal, 2 > * position_sample
Array< TraceInt, 1 > * age_sample

◆ computeL2D()

void computeL2D ( ParticleSet P,
int  iel,
TensorType D 
)
inline

compute D matrix for L2 potential propagator

Parameters
rsingle particle coordinate
Ddiffusion matrix (outputted)

Definition at line 381 of file QMCHamiltonian.h.

References L2Potential::evaluateD(), and QMCHamiltonian::l2_ptr.

Referenced by DMCUpdatePbyPL2::advanceWalker().

382  {
383  if (l2_ptr != nullptr)
384  l2_ptr->evaluateD(P, iel, D);
385  }
L2Potential * l2_ptr
pointer to L2Potential
void evaluateD(ParticleSet &P, int iel, TensorType &D)

◆ computeL2DK()

void computeL2DK ( ParticleSet P,
int  iel,
TensorType D,
PosType K 
)
inline

compute D matrix and K vector for L2 potential propagator

Parameters
rsingle particle coordinate
Ddiffusion matrix (outputted)
Kdrift modification vector (outputted)

Definition at line 371 of file QMCHamiltonian.h.

References L2Potential::evaluateDK(), qmcplusplus::Units::energy::K, and QMCHamiltonian::l2_ptr.

Referenced by DMCUpdatePbyPL2::advanceWalker().

372  {
373  if (l2_ptr != nullptr)
374  l2_ptr->evaluateDK(P, iel, D, K);
375  }
void evaluateDK(ParticleSet &P, int iel, TensorType &D, PosType &K)
Definition: L2Potential.cpp:97
L2Potential * l2_ptr
pointer to L2Potential

◆ createResource()

void createResource ( ResourceCollection collection) const

initialize a shared resource and hand it to a collection

Definition at line 1034 of file QMCHamiltonian.cpp.

References ResourceCollection::addResource(), and QMCHamiltonian::H.

Referenced by CostFunctionCrowdData::CostFunctionCrowdData(), and QMCDriverNew::initializeQMC().

1035 {
1036  auto resource_index = collection.addResource(std::make_unique<QMCHamiltonianMultiWalkerResource>());
1037  for (int i = 0; i < H.size(); ++i)
1038  H[i]->createResource(collection);
1039 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
void createResource(ResourceCollection &collection) const
initialize a shared resource and hand it to a collection

◆ evaluate()

evaluate Local Energy

Evaluate all the Hamiltonians for the N-particle configuration.

Parameters
PParticleSet
Returns
the local energy

P.R, P.G and P.L are used to evaluate the LocalEnergy.

Parameters
Pinput configuration containing N particles
Returns
the local energy

Definition at line 539 of file QMCHamiltonian.cpp.

References QMCHamiltonian::H, QMCHamiltonian::ham_timer_, QMCHamiltonian::LocalEnergy, QMCHamiltonian::my_timers_, QMCHamiltonian::updateComponent(), and QMCHamiltonian::updateKinetic().

Referenced by SOVMCUpdateAll::advanceWalker(), VMCUpdateAll::advanceWalker(), SOVMCUpdatePbyP::advanceWalker(), VMCUpdatePbyP::advanceWalker(), DMCUpdateAllWithKill::advanceWalker(), RMCUpdatePbyPWithDrift::advanceWalkersRMC(), RMCUpdateAllWithDrift::advanceWalkersRMC(), RMCUpdatePbyPWithDrift::advanceWalkersVMC(), RMCUpdateAllWithDrift::advanceWalkersVMC(), QMCHamiltonian::evaluateVariableEnergy(), QMCMain::executeCMCSection(), RMCUpdateAllWithDrift::initWalkers(), QMCUpdateBase::initWalkers(), RMCUpdatePbyPWithDrift::initWalkersForPbyP(), QMCUpdateBase::initWalkersForPbyP(), WaveFunctionTester::printEloc(), WaveFunctionTester::runCloneTest(), WaveFunctionTester::runDerivCloneTest(), WaveFunctionTester::runDerivNLPPTest(), WaveFunctionTester::runDerivTest(), WaveFunctionTester::runGradSourceTest(), WaveFunctionTester::runRatioTest(), WaveFunctionTester::runRatioTest2(), WaveFunctionTester::runZeroVarianceTest(), and qmcplusplus::test_hcpBe_rotation().

540 {
541  ScopedTimer local_timer(ham_timer_);
542  LocalEnergy = 0.0;
543  for (int i = 0; i < H.size(); ++i)
544  {
545  ScopedTimer h_timer(my_timers_[i]);
546  H[i]->evaluate(P);
547  updateComponent(*H[i], *this, P);
548 #if !defined(REMOVE_TRACEMANAGER)
549  H[i]->collectScalarTraces();
550 #endif
551  }
552  updateKinetic(*this, P);
553  return LocalEnergy;
554 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
static void updateKinetic(QMCHamiltonian &ham, ParticleSet &pset)
extract kinetic and potential energies.
ScopeGuard< NewTimer > ScopedTimer
Definition: NewTimer.h:257
NewTimer & ham_timer_
Total timer for H evaluation.
static void updateComponent(OperatorBase &op, QMCHamiltonian &ham, ParticleSet &pset)
accumulate local energy and update Observables and PropertyList
FullPrecRealType LocalEnergy
Current Local Energy.
std::vector< std::reference_wrapper< NewTimer > > my_timers_
timers for H components

◆ evaluateDeterministic()

QMCHamiltonian::FullPrecRealType evaluateDeterministic ( ParticleSet P)

evaluate Local Energy deterministically.

Defaults to evaluate(P) for operators without a stochastic component. For the nonlocal PP, the quadrature grid is not rerandomized.

Parameters
PParticleSet
Returns
Local energy.

Definition at line 556 of file QMCHamiltonian.cpp.

References QMCHamiltonian::H, QMCHamiltonian::ham_timer_, QMCHamiltonian::LocalEnergy, QMCHamiltonian::my_timers_, QMCHamiltonian::updateComponent(), and QMCHamiltonian::updateKinetic().

Referenced by QMCHamiltonian::evaluateElecGrad(), and qmcplusplus::TEST_CASE().

557 {
558  ScopedTimer local_timer(ham_timer_);
559  LocalEnergy = 0.0;
560  for (int i = 0; i < H.size(); ++i)
561  {
562  ScopedTimer h_timer(my_timers_[i]);
563  H[i]->evaluateDeterministic(P);
564  updateComponent(*H[i], *this, P);
565 #if !defined(REMOVE_TRACEMANAGER)
566  H[i]->collectScalarTraces();
567 #endif
568  }
569  updateKinetic(*this, P);
570  return LocalEnergy;
571 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
static void updateKinetic(QMCHamiltonian &ham, ParticleSet &pset)
extract kinetic and potential energies.
ScopeGuard< NewTimer > ScopedTimer
Definition: NewTimer.h:257
NewTimer & ham_timer_
Total timer for H evaluation.
static void updateComponent(OperatorBase &op, QMCHamiltonian &ham, ParticleSet &pset)
accumulate local energy and update Observables and PropertyList
FullPrecRealType LocalEnergy
Current Local Energy.
std::vector< std::reference_wrapper< NewTimer > > my_timers_
timers for H components

◆ evaluateElecGrad()

void evaluateElecGrad ( ParticleSet P,
TrialWaveFunction psi,
ParticleSet::ParticlePos EGrad,
RealType  delta = 1e-5 
)

Evaluate the electron gradient of the local energy.

Parameters
psiTrial Wave Function
Pelectron particle set
EGradan Nelec x 3 real array which corresponds to d/d[r_i]_j E_L
Afinite difference step size if applicable. Default is to use finite diff with delta=1e-5.
Returns
EGrad. Function itself returns nothing.

Definition at line 862 of file QMCHamiltonian.cpp.

References QMCHamiltonian::evaluateDeterministic(), TrialWaveFunction::evaluateLog(), ParticleSet::getTotalNum(), OHMMS_DIM, ParticleSet::R, and ParticleSet::update().

Referenced by ACForce::evaluate().

866 {
867  int nelec = P.getTotalNum();
868  RealType ep(0.0);
869  RealType em(0.0);
870  RealType e0(0.0);
871  for (int iel = 0; iel < nelec; iel++)
872  {
873  for (int dim = 0; dim < OHMMS_DIM; dim++)
874  {
875  RealType r0 = P.R[iel][dim];
876  ep = 0;
877  em = 0;
878  //Plus
879  RealType rp = r0 + delta;
880  P.R[iel][dim] = rp;
881  P.update();
882  psi.evaluateLog(P);
883  ep = evaluateDeterministic(P);
884 
885  //minus
886  RealType rm = r0 - delta;
887  P.R[iel][dim] = rm;
888  P.update();
889  psi.evaluateLog(P);
890  em = evaluateDeterministic(P);
891 
892  Egrad[iel][dim] = (ep - em) / (2.0 * delta);
893  P.R[iel][dim] = r0;
894  P.update();
895  psi.evaluateLog(P);
896  }
897  }
898 }
FullPrecRealType evaluateDeterministic(ParticleSet &P)
evaluate Local Energy deterministically.
#define OHMMS_DIM
Definition: config.h:64
QMCTraits::RealType RealType

◆ evaluateIonDerivs()

QMCHamiltonian::FullPrecRealType evaluateIonDerivs ( ParticleSet P,
ParticleSet ions,
TrialWaveFunction psi,
ParticleSet::ParticlePos hf_terms,
ParticleSet::ParticlePos pulay_terms,
ParticleSet::ParticlePos wf_grad 
)

evaluate local energy and derivatives w.r.t ionic coordinates.

Parameters
Ptarget particle set (electrons)
ionssource particle set (ions)
psiTrial wave function
hf_termsRe [(dH)Psi]/Psi
pulay_termsRe [(H-E_L)dPsi]/Psi
wf_gradRe (dPsi/Psi)
Returns
Local Energy.

Definition at line 899 of file QMCHamiltonian.cpp.

References qmcplusplus::convertToReal(), TrialWaveFunction::evalGradSource(), ParticleSet::getTotalNum(), and QMCHamiltonian::H.

Referenced by qmcplusplus::TEST_CASE().

905 {
906  ParticleSet::ParticleGradient wfgradraw_(ions.getTotalNum());
907  wfgradraw_ = 0.0;
908  RealType localEnergy = 0.0;
909 
910  for (int i = 0; i < H.size(); ++i)
911  localEnergy += H[i]->evaluateWithIonDerivs(P, ions, psi, hf_term, pulay_terms);
912 
913  for (int iat = 0; iat < ions.getTotalNum(); iat++)
914  {
915  wfgradraw_[iat] = psi.evalGradSource(P, ions, iat);
916  convertToReal(wfgradraw_[iat], wf_grad[iat]);
917  }
918  return localEnergy;
919 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
ParticleAttrib< QTFull::GradType > ParticleGradient
Definition: Configuration.h:95
void convertToReal(const T1 &in, T2 &out)
generic conversion from type T1 to type T2 using implicit conversion
Definition: ConvertToReal.h:32
QMCTraits::RealType RealType

◆ evaluateIonDerivsDeterministic()

QMCHamiltonian::FullPrecRealType evaluateIonDerivsDeterministic ( ParticleSet P,
ParticleSet ions,
TrialWaveFunction psi,
ParticleSet::ParticlePos hf_terms,
ParticleSet::ParticlePos pulay_terms,
ParticleSet::ParticlePos wf_grad 
)

evaluate local energy and derivatives w.r.t ionic coordinates, but deterministically.

Parameters
Ptarget particle set (electrons)
ionssource particle set (ions)
psiTrial wave function
hf_termsRe [(dH)Psi]/Psi
pulay_termsRe [(H-E_L)dPsi]/Psi
wf_gradRe (dPsi/Psi)
Returns
Local Energy.

Definition at line 921 of file QMCHamiltonian.cpp.

References qmcplusplus::convertToReal(), TrialWaveFunction::evalGradSource(), ParticleSet::getTotalNum(), and QMCHamiltonian::H.

Referenced by ACForce::evaluate(), and qmcplusplus::TEST_CASE().

927 {
928  ParticleSet::ParticleGradient wfgradraw_(ions.getTotalNum());
929  wfgradraw_ = 0.0;
930  RealType localEnergy = 0.0;
931 
932  for (int i = 0; i < H.size(); ++i)
933  localEnergy += H[i]->evaluateWithIonDerivsDeterministic(P, ions, psi, hf_term, pulay_terms);
934 
935  for (int iat = 0; iat < ions.getTotalNum(); iat++)
936  {
937  wfgradraw_[iat] = psi.evalGradSource(P, ions, iat);
938  convertToReal(wfgradraw_[iat], wf_grad[iat]);
939  }
940  return localEnergy;
941 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
ParticleAttrib< QTFull::GradType > ParticleGradient
Definition: Configuration.h:95
void convertToReal(const T1 &in, T2 &out)
generic conversion from type T1 to type T2 using implicit conversion
Definition: ConvertToReal.h:32
QMCTraits::RealType RealType

◆ evaluateIonDerivsDeterministicFast()

QMCHamiltonian::FullPrecRealType evaluateIonDerivsDeterministicFast ( ParticleSet P,
ParticleSet ions,
TrialWaveFunction psi_in,
TWFFastDerivWrapper psi_wrapper,
ParticleSet::ParticlePos dedr,
ParticleSet::ParticlePos wf_grad 
)

evaluate local energy and derivatives w.r.t ionic coordinates, but deterministically.

Parameters
Ptarget particle set (electrons)
ionssource particle set (ions)
psiTrial wave function
hf_termsRe [(dH)Psi]/Psi
pulay_termsRe [(H-E_L)dPsi]/Psi
wf_gradRe (dPsi/Psi)
Returns
Local Energy.

Definition at line 1096 of file QMCHamiltonian.cpp.

References TWFFastDerivWrapper::buildX(), TWFFastDerivWrapper::computeGSDerivative(), qmcplusplus::convertToReal(), QMCHamiltonian::eval_ion_derivs_fast_timer_, TWFFastDerivWrapper::evaluateJastrowGradSource(), ParticleSet::first(), TWFFastDerivWrapper::getGSMatrices(), TWFFastDerivWrapper::getIonGradM(), TWFFastDerivWrapper::getM(), ParticleSet::getTotalNum(), TWFFastDerivWrapper::getTWFGroupIndex(), QMCHamiltonian::H, TWFFastDerivWrapper::invertMatrices(), ParticleSet::last(), TWFFastDerivWrapper::numGroups(), TWFFastDerivWrapper::numOrbitals(), OHMMS_DIM, TWFFastDerivWrapper::trAB(), ParticleSet::update(), and TWFFastDerivWrapper::wipeMatrices().

Referenced by ACForce::evaluate(), and qmcplusplus::TEST_CASE().

1102 {
1104  P.update();
1105  //resize everything;
1106  const int ngroups = psi_wrapper_in.numGroups();
1107 
1108  std::vector<ValueMatrix> X_; //Working arrays for derivatives
1109  std::vector<ValueMatrix> Minv_; //Working array for derivatives.
1110  std::vector<ValueMatrix> B_;
1111  std::vector<ValueMatrix> B_gs_;
1112  std::vector<ValueMatrix> M_;
1113  std::vector<ValueMatrix> M_gs_;
1114 
1115  std::vector<std::vector<ValueMatrix>> dM_;
1116  std::vector<std::vector<ValueMatrix>> dM_gs_;
1117  std::vector<std::vector<ValueMatrix>> dB_;
1118  std::vector<std::vector<ValueMatrix>> dB_gs_;
1119 
1120  {
1121  M_.resize(ngroups);
1122  M_gs_.resize(ngroups);
1123  X_.resize(ngroups);
1124  B_.resize(ngroups);
1125  B_gs_.resize(ngroups);
1126  Minv_.resize(ngroups);
1127 
1128  for (int gid = 0; gid < ngroups; gid++)
1129  {
1130  const int sid = psi_wrapper_in.getTWFGroupIndex(gid);
1131  const int norbs = psi_wrapper_in.numOrbitals(sid);
1132  const int first = P.first(gid);
1133  const int last = P.last(gid);
1134  const int nptcls = last - first;
1135 
1136  M_[sid].resize(nptcls, norbs);
1137  B_[sid].resize(nptcls, norbs);
1138 
1139  M_gs_[sid].resize(nptcls, nptcls);
1140  Minv_[sid].resize(nptcls, nptcls);
1141  B_gs_[sid].resize(nptcls, nptcls);
1142  X_[sid].resize(nptcls, nptcls);
1143  }
1144 
1145  dM_.resize(OHMMS_DIM);
1146  dM_gs_.resize(OHMMS_DIM);
1147  dB_.resize(OHMMS_DIM);
1148  dB_gs_.resize(OHMMS_DIM);
1149 
1150  for (int idim = 0; idim < OHMMS_DIM; idim++)
1151  {
1152  dM_[idim].resize(ngroups);
1153  dB_[idim].resize(ngroups);
1154  dM_gs_[idim].resize(ngroups);
1155  dB_gs_[idim].resize(ngroups);
1156 
1157  for (int gid = 0; gid < ngroups; gid++)
1158  {
1159  const int sid = psi_wrapper_in.getTWFGroupIndex(gid);
1160  const int norbs = psi_wrapper_in.numOrbitals(sid);
1161  const int first = P.first(gid);
1162  const int last = P.last(gid);
1163  const int nptcls = last - first;
1164 
1165  dM_[idim][sid].resize(nptcls, norbs);
1166  dB_[idim][sid].resize(nptcls, norbs);
1167  dM_gs_[idim][sid].resize(nptcls, nptcls);
1168  dB_gs_[idim][sid].resize(nptcls, nptcls);
1169  }
1170  }
1171  psi_wrapper_in.wipeMatrices(M_);
1172  psi_wrapper_in.wipeMatrices(M_gs_);
1173  psi_wrapper_in.wipeMatrices(X_);
1174  psi_wrapper_in.wipeMatrices(B_);
1175  psi_wrapper_in.wipeMatrices(Minv_);
1176  psi_wrapper_in.wipeMatrices(B_gs_);
1177 
1178  for (int idim = 0; idim < OHMMS_DIM; idim++)
1179  {
1180  psi_wrapper_in.wipeMatrices(dM_[idim]);
1181  psi_wrapper_in.wipeMatrices(dM_gs_[idim]);
1182  psi_wrapper_in.wipeMatrices(dB_[idim]);
1183  psi_wrapper_in.wipeMatrices(dB_gs_[idim]);
1184  }
1185  }
1186  ParticleSet::ParticleGradient wfgradraw_(ions.getTotalNum());
1187  ParticleSet::ParticleGradient pulay_(ions.getTotalNum());
1188  ParticleSet::ParticleGradient hf_(ions.getTotalNum());
1189  ParticleSet::ParticleGradient dedr_complex(ions.getTotalNum());
1190  ParticleSet::ParticlePos pulayterms_(ions.getTotalNum());
1191  ParticleSet::ParticlePos hfdiag_(ions.getTotalNum());
1192  wfgradraw_ = 0.0;
1193  RealType localEnergy = 0.0;
1194 
1195  {
1196  psi_wrapper_in.getM(P, M_);
1197  }
1198  {
1199  psi_wrapper_in.getGSMatrices(M_, M_gs_);
1200  psi_wrapper_in.invertMatrices(M_gs_, Minv_);
1201  }
1202  //Build B-matrices. Only for non-diagonal observables right now.
1203  for (int i = 0; i < H.size(); ++i)
1204  {
1205  if (H[i]->dependsOnWaveFunction())
1206  {
1207  H[i]->evaluateOneBodyOpMatrix(P, psi_wrapper_in, B_);
1208  }
1209  else
1210  {
1211  localEnergy += H[i]->evaluateWithIonDerivsDeterministic(P, ions, psi_in, hfdiag_, pulayterms_);
1212  }
1213  }
1214 
1215  ValueType nondiag_cont = 0.0;
1216  RealType nondiag_cont_re = 0.0;
1217 
1218  psi_wrapper_in.getGSMatrices(B_, B_gs_);
1219  nondiag_cont = psi_wrapper_in.trAB(Minv_, B_gs_);
1220  convertToReal(nondiag_cont, nondiag_cont_re);
1221  localEnergy += nondiag_cont_re;
1222 
1223  {
1224  psi_wrapper_in.buildX(Minv_, B_gs_, X_);
1225  }
1226  //And now we compute the 3N force derivatives. 3 at a time for each atom.
1227  for (int iat = 0; iat < ions.getTotalNum(); iat++)
1228  {
1229  //The total wavefunction derivative has two contributions. One from determinantal piece,
1230  //One from the Jastrow. Jastrow is easy, so we evaluate it here, then add on the
1231  //determinantal piece at the end of this block.
1232 
1233  wfgradraw_[iat] = psi_wrapper_in.evaluateJastrowGradSource(P, ions, iat);
1234  for (int idim = 0; idim < OHMMS_DIM; idim++)
1235  {
1236  psi_wrapper_in.wipeMatrices(dM_[idim]);
1237  psi_wrapper_in.wipeMatrices(dM_gs_[idim]);
1238  psi_wrapper_in.wipeMatrices(dB_[idim]);
1239  psi_wrapper_in.wipeMatrices(dB_gs_[idim]);
1240  }
1241 
1242  {
1243  //ion derivative of slater matrix.
1244  psi_wrapper_in.getIonGradM(P, ions, iat, dM_);
1245  }
1246  for (int i = 0; i < H.size(); ++i)
1247  {
1248  if (H[i]->dependsOnWaveFunction())
1249  {
1250  H[i]->evaluateOneBodyOpMatrixForceDeriv(P, ions, psi_wrapper_in, iat, dB_);
1251  }
1252  }
1253 
1254  for (int idim = 0; idim < OHMMS_DIM; idim++)
1255  {
1256  psi_wrapper_in.getGSMatrices(dB_[idim], dB_gs_[idim]);
1257  psi_wrapper_in.getGSMatrices(dM_[idim], dM_gs_[idim]);
1258 
1259  ValueType fval = 0.0;
1260  fval = psi_wrapper_in.computeGSDerivative(Minv_, X_, dM_gs_[idim], dB_gs_[idim]);
1261  dedr_complex[iat][idim] = fval;
1262 
1263  ValueType wfcomp = 0.0;
1264  wfcomp = psi_wrapper_in.trAB(Minv_, dM_gs_[idim]);
1265  wfgradraw_[iat][idim] += wfcomp; //The determinantal piece of the WF grad.
1266  }
1267  convertToReal(dedr_complex[iat], dEdR[iat]);
1268  convertToReal(wfgradraw_[iat], wf_grad[iat]);
1269  }
1270  dEdR += hfdiag_;
1271  return localEnergy;
1272 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
ScopeGuard< NewTimer > ScopedTimer
Definition: NewTimer.h:257
ParticleAttrib< QTFull::GradType > ParticleGradient
Definition: Configuration.h:95
void convertToReal(const T1 &in, T2 &out)
generic conversion from type T1 to type T2 using implicit conversion
Definition: ConvertToReal.h:32
#define OHMMS_DIM
Definition: config.h:64
OperatorBase::ValueType ValueType
NewTimer & eval_ion_derivs_fast_timer_
Total timer for H ion deriv evaluation;.
ParticleAttrib< SingleParticlePos > ParticlePos
Definition: Configuration.h:92
QMCTraits::RealType RealType

◆ evaluateValueAndDerivatives()

QMCHamiltonian::FullPrecRealType evaluateValueAndDerivatives ( ParticleSet P,
const opt_variables_type optvars,
Vector< ValueType > &  dlogpsi,
Vector< ValueType > &  dhpsioverpsi 
)

evaluate energy and derivatives wrt to the variables

Parameters
PParticleSet
optvarscurrent optimiable variables
dlogpsi$\partial \ln \Psi({\bf R})/\partial \alpha $
dhpsioverpsi$\partial(\hat{h}\Psi({\bf R})/\Psi({\bf R})) /\partial \alpha $
compute_derivif true, compute dhpsioverpsi of the non-local potential component

Definition at line 648 of file QMCHamiltonian.cpp.

References QMCHamiltonian::eval_vals_derivs_timer_, QMCHamiltonian::H, QMCHamiltonian::KineticEnergy, QMCHamiltonian::LocalEnergy, and QMCHamiltonian::my_timers_.

Referenced by WaveFunctionTester::runDerivNLPPTest(), and qmcplusplus::test_hcpBe_rotation().

652 {
653  // The first componennt must be BareKineticEnergy for both handling KineticEnergy and dlogpsi computation
654  // by calling TWF::evaluateDerivatives inside BareKineticEnergy::evaluateValueAndDerivatives
655  assert(dynamic_cast<BareKineticEnergy*>(H[0].get()) &&
656  "BUG: The first componennt in Hamiltonian must be BareKineticEnergy.");
658 
659  {
660  ScopedTimer h_timer(my_timers_[0]);
661  LocalEnergy = KineticEnergy = H[0]->evaluateValueAndDerivatives(P, optvars, dlogpsi, dhpsioverpsi);
662  }
663 
664  for (int i = 1; i < H.size(); ++i)
665  {
666  ScopedTimer h_timer(my_timers_[i]);
667  LocalEnergy += H[i]->evaluateValueAndDerivatives(P, optvars, dlogpsi, dhpsioverpsi);
668  }
669  return LocalEnergy;
670 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
NewTimer & eval_vals_derivs_timer_
Total timer for H evaluation.
ScopeGuard< NewTimer > ScopedTimer
Definition: NewTimer.h:257
FullPrecRealType KineticEnergy
Current Kinetic Energy.
FullPrecRealType LocalEnergy
Current Local Energy.
std::vector< std::reference_wrapper< NewTimer > > my_timers_
timers for H components

◆ evaluateVariableEnergy()

QMCHamiltonian::FullPrecRealType evaluateVariableEnergy ( ParticleSet P,
bool  free_nlpp 
)

evaluate energy

Parameters
Pquantum particleset
free_nlppif true, non-local PP is a variable
Returns
KE + NonLocal potential

Definition at line 709 of file QMCHamiltonian.cpp.

References QMCHamiltonian::evaluate(), and QMCHamiltonian::H.

Referenced by WaveFunctionTester::runDerivNLPPTest().

710 {
711  RealType nlpp = 0.0;
712  RealType ke = H[0]->evaluate(P);
713  if (free_nlpp)
714  for (int i = 1; i < H.size(); ++i)
715  {
716  if (H[i]->isNonLocal())
717  nlpp += H[i]->evaluate(P);
718  }
719  return ke + nlpp;
720 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
FullPrecRealType evaluate(ParticleSet &P)
evaluate Local Energy
QMCTraits::RealType RealType

◆ evaluateWithToperator()

QMCHamiltonian::FullPrecRealType evaluateWithToperator ( ParticleSet P)

evaluate Local energy with Toperators updated.

Parameters
PParticleSEt
Returns
Local energy

Definition at line 795 of file QMCHamiltonian.cpp.

References QMCHamiltonian::H, QMCHamiltonian::ham_timer_, QMCHamiltonian::LocalEnergy, QMCHamiltonian::my_timers_, QMCHamiltonian::updateComponent(), and QMCHamiltonian::updateKinetic().

Referenced by DMCUpdateAllWithRejection::advanceWalker(), SODMCUpdatePbyPWithRejectionFast::advanceWalker(), DMCUpdatePbyPWithRejectionFast::advanceWalker(), and DMCUpdatePbyPL2::advanceWalker().

796 {
797  ScopedTimer local_timer(ham_timer_);
798  LocalEnergy = 0.0;
799  for (int i = 0; i < H.size(); ++i)
800  {
801  ScopedTimer h_timer(my_timers_[i]);
802  H[i]->evaluateWithToperator(P);
803  updateComponent(*H[i], *this, P);
804 #if !defined(REMOVE_TRACEMANAGER)
805  H[i]->collectScalarTraces();
806 #endif
807  }
808  updateKinetic(*this, P);
809  return LocalEnergy;
810 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
static void updateKinetic(QMCHamiltonian &ham, ParticleSet &pset)
extract kinetic and potential energies.
ScopeGuard< NewTimer > ScopedTimer
Definition: NewTimer.h:257
NewTimer & ham_timer_
Total timer for H evaluation.
static void updateComponent(OperatorBase &op, QMCHamiltonian &ham, ParticleSet &pset)
accumulate local energy and update Observables and PropertyList
FullPrecRealType LocalEnergy
Current Local Energy.
std::vector< std::reference_wrapper< NewTimer > > my_timers_
timers for H components

◆ extract_HC_list()

RefVectorWithLeader< OperatorBase > extract_HC_list ( const RefVectorWithLeader< QMCHamiltonian > &  ham_list,
int  id 
)
staticprivate

Definition at line 1086 of file QMCHamiltonian.cpp.

References RefVectorWithLeader< T >::getLeader(), and QMCHamiltonian::H.

Referenced by QMCHamiltonian::acquireResource(), QMCHamiltonian::mw_evaluate(), QMCHamiltonian::mw_evaluateValueAndDerivatives(), QMCHamiltonian::mw_evaluateWithToperator(), and QMCHamiltonian::releaseResource().

1088 {
1089  RefVectorWithLeader<OperatorBase> HC_list(*ham_list.getLeader().H[id]);
1090  HC_list.reserve(ham_list.size());
1091  for (QMCHamiltonian& H : ham_list)
1092  HC_list.push_back(*(H.H[id]));
1093  return HC_list;
1094 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
QMCHamiltonian(const std::string &aname="psi0")
constructor

◆ finalize_traces()

void finalize_traces ( )

finalize trace data

Definition at line 509 of file QMCHamiltonian.cpp.

References QMCHamiltonian::age_sample, QMCHamiltonian::auxH, QMCHamiltonian::gen_sample, QMCHamiltonian::H, QMCHamiltonian::id_sample, QMCHamiltonian::mult_sample, QMCHamiltonian::pid_sample, QMCHamiltonian::position_sample, QMCHamiltonian::request, TraceRequest::reset(), QMCHamiltonian::step_sample, TraceRequest::streaming(), TraceRequest::streaming_default_scalars, QMCHamiltonian::streaming_position, and QMCHamiltonian::weight_sample.

Referenced by QMCUpdateBase::stopRun2().

510 {
512  {
513  delete id_sample;
514  delete pid_sample;
515  delete step_sample;
516  delete gen_sample;
517  delete age_sample;
518  delete mult_sample;
519  delete weight_sample;
520  }
521  if (streaming_position)
522  delete position_sample;
523  if (request.streaming())
524  {
525  for (int i = 0; i < H.size(); ++i)
526  H[i]->deleteTraceQuantities();
527  for (int i = 0; i < auxH.size(); ++i)
528  auxH[i]->deleteTraceQuantities();
529  }
530  streaming_position = false;
531  request.reset();
532 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
Array< TraceInt, 1 > * step_sample
std::vector< std::unique_ptr< OperatorBase > > auxH
vector of Hamiltonians
Array< TraceReal, 1 > * weight_sample
TraceRequest request
traces variables
Array< TraceInt, 1 > * mult_sample
bool streaming(const std::string &name)
Definition: TraceManager.h:256
Array< TraceReal, 2 > * position_sample
Array< TraceInt, 1 > * id_sample
Array< TraceInt, 1 > * gen_sample
Array< TraceInt, 1 > * pid_sample
Array< TraceInt, 1 > * age_sample

◆ get()

bool get ( std::ostream &  os) const

Definition at line 82 of file QMCHamiltonian.cpp.

References QMCHamiltonian::H.

83 {
84  for (int i = 0; i < H.size(); i++)
85  {
86  os << " " << std::setw(16) << std::left << H[i]->getName();
87  H[i]->get(os);
88  os << "\n";
89  }
90  return true;
91 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians

◆ getEnsembleAverage()

QMCHamiltonian::FullPrecRealType getEnsembleAverage ( )

return an average value of the LocalEnergy

Introduced to get a collective value

Definition at line 943 of file QMCHamiltonian.cpp.

References QMCHamiltonian::H.

944 {
945  FullPrecRealType sum = 0.0;
946  for (int i = 0; i < H.size(); i++)
947  sum += H[i]->getEnsembleAverage();
948  return sum;
949 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
QMCTraits::FullPrecRealType FullPrecRealType
FullPrecRealType getEnsembleAverage()
return an average value of the LocalEnergy

◆ getHamiltonian() [1/2]

OperatorBase * getHamiltonian ( const std::string &  aname)

return OperatorBase with the name aname

return pointer to the QMCHamtiltonian with the name

Parameters
anamename of a OperatorBase
Returns
0 if aname is not found.
Parameters
anamethe name of Hamiltonian
Returns
the pointer to the named term.

If not found, return 0

Definition at line 957 of file QMCHamiltonian.cpp.

References QMCHamiltonian::auxH, QMCHamiltonian::getName(), and QMCHamiltonian::H.

Referenced by qmcplusplus::TEST_CASE(), and qmcplusplus::test_hcpBe_rotation().

958 {
959  for (int i = 0; i < H.size(); ++i)
960  if (H[i]->getName() == aname)
961  return H[i].get();
962  for (int i = 0; i < auxH.size(); ++i)
963  if (auxH[i]->getName() == aname)
964  return auxH[i].get();
965  return nullptr;
966 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
std::vector< std::unique_ptr< OperatorBase > > auxH
vector of Hamiltonians
const std::string & getName() const

◆ getHamiltonian() [2/2]

OperatorBase* getHamiltonian ( int  i)
inline

return i-th OperatorBase

Parameters
iindex of the OperatorBase
Returns
H[i]

Definition at line 101 of file QMCHamiltonian.h.

References QMCHamiltonian::H.

101 { return H[i].get(); }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians

◆ getKineticEnergy()

FullPrecRealType getKineticEnergy ( )
inline

Definition at line 216 of file QMCHamiltonian.h.

References QMCHamiltonian::KineticEnergy.

Referenced by qmcplusplus::test_hcpBe_rotation().

216 { return KineticEnergy; }
FullPrecRealType KineticEnergy
Current Kinetic Energy.

◆ getLocalEnergy()

◆ getLocalPotential()

FullPrecRealType getLocalPotential ( )
inline

Definition at line 215 of file QMCHamiltonian.h.

References QMCHamiltonian::KineticEnergy, and QMCHamiltonian::LocalEnergy.

Referenced by WaveFunctionTester::runDerivCloneTest(), and WaveFunctionTester::runDerivTest().

215 { return LocalEnergy - KineticEnergy; }
FullPrecRealType KineticEnergy
Current Kinetic Energy.
FullPrecRealType LocalEnergy
Current Local Energy.

◆ getName()

const std::string& getName ( ) const
inline

Definition at line 405 of file QMCHamiltonian.h.

References QMCHamiltonian::myName.

Referenced by QMCHamiltonian::addOperator(), and QMCHamiltonian::getHamiltonian().

405 { return myName; }
const std::string myName
getName is in the way

◆ getOperatorType()

const std::string & getOperatorType ( const std::string &  name)

return type of named H element or fail

Definition at line 173 of file QMCHamiltonian.cpp.

References APP_ABORT, and QMCHamiltonian::operator_types.

Referenced by qmcplusplus::TEST_CASE().

174 {
175  std::map<std::string, std::string>::iterator type = operator_types.find(name);
176  if (type == operator_types.end())
177  APP_ABORT("QMCHamiltonian::getOperatorType\n operator type not found for name " + name);
178  return type->second;
179 }
std::map< std::string, std::string > operator_types
types of component operators
#define APP_ABORT(msg)
Widely used but deprecated fatal error macros from legacy code.
Definition: AppAbort.h:27

◆ getTWFDependentComponents()

RefVector< OperatorBase > getTWFDependentComponents ( )

return components, auxH not included, depending on TWF.

Definition at line 968 of file QMCHamiltonian.cpp.

References QMCHamiltonian::H.

Referenced by QMCCostFunctionBatched::correlatedSampling(), CostFunctionCrowdData::CostFunctionCrowdData(), and QMCCostFunctionBatched::getConfigurations().

969 {
970  RefVector<OperatorBase> components;
971  for (int i = 0; i < H.size(); i++)
972  if (H[i]->dependsOnWaveFunction())
973  components.push_back(*H[i]);
974  return components;
975 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians

◆ has_L2()

bool has_L2 ( )
inline

determine if L2 potential is present

Definition at line 364 of file QMCHamiltonian.h.

References QMCHamiltonian::l2_ptr.

Referenced by DMCUpdatePbyPL2::advanceWalker().

364 { return l2_ptr != nullptr; }
L2Potential * l2_ptr
pointer to L2Potential

◆ initialize_traces()

void initialize_traces ( TraceManager tm,
ParticleSet P 
)

initialize trace data

Definition at line 309 of file QMCHamiltonian.cpp.

References QMCHamiltonian::age_sample, APP_ABORT, qmcplusplus::app_log(), QMCHamiltonian::auxH, TraceManager::checkout_int(), TraceManager::checkout_real(), TraceRequest::contribute_array(), TraceRequest::contribute_combined(), TraceRequest::contribute_scalar(), TraceRequest::determine_stream_write(), QMCHamiltonian::DIM, QMCHamiltonian::gen_sample, OperatorBase::getName(), QMCHamiltonian::H, QMCHamiltonian::id_sample, TraceRequest::incorporate(), OperatorBase::isClassical(), OperatorBase::isClassicalClassical(), OperatorBase::isQuantum(), OperatorBase::isQuantumClassical(), OperatorBase::isQuantumQuantum(), TraceManager::make_combined_trace(), QMCHamiltonian::mult_sample, omp_get_thread_num(), QMCHamiltonian::pid_sample, QMCHamiltonian::position_sample, TraceRequest::relay_stream_info(), QMCHamiltonian::request, TraceManager::request, TraceManager::screen_writes(), QMCHamiltonian::step_sample, TraceRequest::streaming(), TraceRequest::streaming_array(), TraceRequest::streaming_default_scalars, QMCHamiltonian::streaming_position, TraceManager::streaming_traces, TraceManager::update_status(), TraceManager::user_report(), TraceManager::verbose, and QMCHamiltonian::weight_sample.

Referenced by QMCUpdateBase::startRun().

310 {
311  static bool first_init = true;
312  bool trace_log = first_init && tm.verbose && omp_get_thread_num() == 0;
313  if (trace_log)
314  app_log() << "\n Hamiltonian is initializing traces" << std::endl;
315 
316  //fill std::string vectors for combined trace quantities
317  std::vector<std::string> Eloc;
318  std::vector<std::string> Vloc;
319  std::vector<std::string> Vq, Vc, Vqq, Vqc, Vcc;
320  for (int i = 0; i < H.size(); ++i)
321  Eloc.push_back(H[i]->getName());
322  for (int i = 1; i < H.size(); ++i)
323  Vloc.push_back(H[i]->getName());
324 
325  // These contributions are based on the potential energy components.
326  // Loop starts at one to skip the kinetic energy component.
327  for (int i = 1; i < H.size(); ++i)
328  {
329  OperatorBase& h = *H[i];
330  if (h.isQuantum())
331  Vq.push_back(h.getName());
332  else if (h.isClassical())
333  Vc.push_back(h.getName());
334  else if (h.isQuantumQuantum())
335  Vqq.push_back(h.getName());
336  else if (h.isQuantumClassical())
337  Vqc.push_back(h.getName());
338  else if (h.isClassicalClassical())
339  Vcc.push_back(h.getName());
340  else if (omp_get_thread_num() == 0)
341  app_log() << " warning: potential named " << h.getName()
342  << " has not been classified according to its quantum domain (q,c,qq,qc,cc)\n estimators depending "
343  "on this classification may not function properly"
344  << std::endl;
345  }
346 
347 
348  //make trace quantities available
349  request.contribute_scalar("id", true); //default trace quantity
350  request.contribute_scalar("parent_id", true); //default trace quantity
351  request.contribute_scalar("step", true); //default trace quantity
352  request.contribute_scalar("generation", true); //default trace quantity
353  request.contribute_scalar("age", true); //default trace quantity
354  request.contribute_scalar("multiplicity", true); //default trace quantity
355  request.contribute_scalar("weight", true); //default trace quantity
356  request.contribute_array("position");
357  for (int i = 0; i < H.size(); ++i)
358  H[i]->contributeTraceQuantities();
359  for (int i = 0; i < auxH.size(); ++i)
360  auxH[i]->contributeTraceQuantities();
361 
362 
363  //note availability of combined quantities
364  request.contribute_combined("LocalEnergy", Eloc, true);
365  request.contribute_combined("LocalPotential", Vloc, true, true);
366  if (Vq.size() > 0)
367  request.contribute_combined("Vq", Vq, true, true);
368  if (Vc.size() > 0)
369  request.contribute_combined("Vc", Vc, true, true);
370  if (Vqq.size() > 0)
371  request.contribute_combined("Vqq", Vqq, true, true);
372  if (Vqc.size() > 0)
373  request.contribute_combined("Vqc", Vqc, true, true);
374  if (Vcc.size() > 0)
375  request.contribute_combined("Vcc", Vcc, true, true);
376 
377 
378  //collect trace requests
379  std::vector<TraceRequest*> requests;
380  // Hamiltonian request (id, step, weight, positions)
381  requests.push_back(&request);
382  // requests from Hamiltonian components
383  for (int i = 0; i < H.size(); ++i)
384  requests.push_back(&H[i]->getRequest());
385  // requests from other observables
386  for (int i = 0; i < auxH.size(); ++i)
387  requests.push_back(&auxH[i]->getRequest());
388 
389  //collect trace quantity availability/requests from contributors/requestors
390  for (int i = 0; i < requests.size(); ++i)
391  tm.request.incorporate(*requests[i]);
392 
393  //balance requests with availability, mark quantities as streaming/writing
394  tm.request.determine_stream_write();
395 
396  //relay updated streaming information to all contributors/requestors
397  for (int i = 0; i < requests.size(); ++i)
398  tm.request.relay_stream_info(*requests[i]);
399 
400  //set streaming/writing traces in general
401  tm.update_status();
402 
403  // setup traces, if any quantities should be streaming
404 
405  // tracing
406  bool tracing = request.streaming();
407  if (tracing != tm.streaming_traces)
408  APP_ABORT("QMCHamiltonian::initialize_traces trace request failed to initialize properly");
409  if (!tracing)
410  {
411  // Empty. Do not log if nothing will be done
412 
413  if (trace_log)
414  app_log() << " no traces streaming" << std::endl;
415  }
416  else
417  {
418  if (trace_log)
419  app_log() << " traces streaming" << std::endl;
420  //checkout trace quantities
421  //(requested sources checkout arrays to place samples in for streaming)
422  // checkout walker trace quantities
425  {
426  id_sample = tm.checkout_int<1>("id");
427  pid_sample = tm.checkout_int<1>("parent_id");
428  step_sample = tm.checkout_int<1>("step");
429  gen_sample = tm.checkout_int<1>("generation");
430  age_sample = tm.checkout_int<1>("age");
431  mult_sample = tm.checkout_int<1>("multiplicity");
432  weight_sample = tm.checkout_real<1>("weight");
433  }
434  if (streaming_position)
435  position_sample = tm.checkout_real<2>("position", P, DIM);
436  // checkout observable trace quantities
437  for (int i = 0; i < H.size(); ++i)
438  {
439  if (trace_log)
440  app_log() << " OperatorBase::checkoutTraceQuantities " << H[i]->getName() << std::endl;
441  H[i]->checkoutTraceQuantities(tm);
442  }
443  for (int i = 0; i < auxH.size(); ++i)
444  {
445  if (trace_log)
446  app_log() << " OperatorBase::checkoutTraceQuantities " << auxH[i]->getName() << std::endl;
447  auxH[i]->checkoutTraceQuantities(tm);
448  }
449  //setup combined traces that depend on H information
450  // LocalEnergy, LocalPotential, Vq, Vc, Vqq, Vqc, Vcc
451  if (Vloc.size() > 0 && request.streaming("LocalPotential"))
452  tm.make_combined_trace("LocalPotential", Vloc);
453  if (Eloc.size() > 0 && request.streaming("LocalEnergy"))
454  tm.make_combined_trace("LocalEnergy", Eloc);
455  if (Vq.size() > 0 && request.streaming("Vq"))
456  tm.make_combined_trace("Vq", Eloc);
457  if (Vc.size() > 0 && request.streaming("Vc"))
458  tm.make_combined_trace("Vc", Eloc);
459  if (Vqq.size() > 0 && request.streaming("Vqq"))
460  tm.make_combined_trace("Vqq", Eloc);
461  if (Vqc.size() > 0 && request.streaming("Vqc"))
462  tm.make_combined_trace("Vqc", Eloc);
463  if (Vcc.size() > 0 && request.streaming("Vcc"))
464  tm.make_combined_trace("Vcc", Eloc);
465 
466  //all trace samples have been created ( streaming instances)
467  // mark the ones that will be writing also
468  tm.screen_writes();
469 
470  //observables that depend on traces check them out
471  if (trace_log)
472  app_log() << "\n Hamiltonian is fulfilling trace requests from observables" << std::endl;
473  for (int i = 0; i < auxH.size(); ++i)
474  {
475  if (trace_log)
476  app_log() << " OperatorBase::getRequiredTraces " << auxH[i]->getName() << std::endl;
477  auxH[i]->getRequiredTraces(tm);
478  }
479  //report
480 
481  //write traces status to the log
482  if (trace_log)
483  tm.user_report();
484 
485  first_init = false;
486  }
487 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
bool streaming_array(const std::string &name)
Definition: TraceManager.h:249
void contribute_combined(const std::string &name, std::vector< std::string > &deps, bool scalar=false, bool array=false, bool default_quantity=false)
Definition: TraceManager.h:207
Array< TraceInt, 1 > * step_sample
std::vector< std::unique_ptr< OperatorBase > > auxH
vector of Hamiltonians
Array< TraceReal, 1 > * weight_sample
omp_int_t omp_get_thread_num()
Definition: OpenMP.h:25
TraceRequest request
traces variables
void contribute_array(const std::string &name, bool default_quantity=false)
Definition: TraceManager.h:198
Array< TraceInt, 1 > * mult_sample
bool streaming(const std::string &name)
Definition: TraceManager.h:256
Array< TraceReal, 2 > * position_sample
Array< TraceInt, 1 > * id_sample
void contribute_scalar(const std::string &name, bool default_quantity=false)
Definition: TraceManager.h:189
Array< TraceInt, 1 > * gen_sample
Array< TraceInt, 1 > * pid_sample
std::ostream & app_log()
Definition: OutputManager.h:65
Array< TraceInt, 1 > * age_sample
#define APP_ABORT(msg)
Widely used but deprecated fatal error macros from legacy code.
Definition: AppAbort.h:27

◆ makeClone()

std::unique_ptr< QMCHamiltonian > makeClone ( ParticleSet qp,
TrialWaveFunction psi 
) const

return a clone

Definition at line 1065 of file QMCHamiltonian.cpp.

References QMCHamiltonian::auxH, PooledData< T >::clear(), ParticleSet::Collectables, QMCHamiltonian::H, QMCHamiltonian::myIndex, QMCHamiltonian::myName, QMCHamiltonian::numCollectables, and PooledData< T >::resize().

Referenced by CostFunctionCrowdData::CostFunctionCrowdData(), MCPopulation::createWalkers(), Crowd::Crowd(), CloneManager::makeClones(), WaveFunctionTester::runCloneTest(), WaveFunctionTester::runDerivCloneTest(), and MCPopulation::spawnWalker().

1066 {
1067  auto myclone = std::make_unique<QMCHamiltonian>(myName);
1068  for (int i = 0; i < H.size(); ++i)
1069  H[i]->add2Hamiltonian(qp, psi, *myclone);
1070  for (int i = 0; i < auxH.size(); ++i)
1071  auxH[i]->add2Hamiltonian(qp, psi, *myclone);
1072  //sync indices
1073  myclone->resetObservables(myIndex, numCollectables);
1074  //Hamiltonian needs to make sure qp.Collectables are the same as defined by the original Hamiltonian
1075  if (numCollectables)
1076  {
1077  qp.Collectables.clear();
1078  qp.Collectables.resize(numCollectables);
1079  }
1080  //Assume tau is correct for the Kinetic energy operator and assign to the rest of the clones
1081  //Return_t tau = H[0]->Tau;
1082  //myclone->setTau(tau);
1083  return myclone;
1084 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
int myIndex
starting index
std::vector< std::unique_ptr< OperatorBase > > auxH
vector of Hamiltonians
const std::string myName
getName is in the way
int numCollectables
starting index

◆ makeNonLocalMoves()

int makeNonLocalMoves ( ParticleSet P)

make non local moves

Parameters
Pparticle set
Returns
the number of accepted moves

Definition at line 1010 of file QMCHamiltonian.cpp.

References NonLocalECPotential::makeNonLocalMovesPbyP(), and QMCHamiltonian::nlpp_ptr.

Referenced by DMCUpdateAllWithRejection::advanceWalker(), SODMCUpdatePbyPWithRejectionFast::advanceWalker(), DMCUpdatePbyPWithRejectionFast::advanceWalker(), and DMCUpdatePbyPL2::advanceWalker().

1011 {
1012  if (nlpp_ptr == nullptr)
1013  return 0;
1014  else
1015  return nlpp_ptr->makeNonLocalMovesPbyP(P);
1016 }
NonLocalECPotential * nlpp_ptr
pointer to NonLocalECP
int makeNonLocalMovesPbyP(ParticleSet &P)
make non local moves with particle-by-particle moves

◆ mw_evaluate()

std::vector< QMCHamiltonian::FullPrecRealType > mw_evaluate ( const RefVectorWithLeader< QMCHamiltonian > &  ham_list,
const RefVectorWithLeader< TrialWaveFunction > &  wf_list,
const RefVectorWithLeader< ParticleSet > &  p_list 
)
static

batched version of evaluate for LocalEnergy

Encapsulation is ignored for ham_list hamiltonians method uses its status as QMCHamiltonian to break encapsulation. ParticleSet is also updated. Bugs could easily be created by accessing this scope. This should be set to static and fixed.

Definition at line 595 of file QMCHamiltonian.cpp.

References QMCHamiltonian::extract_HC_list(), RefVectorWithLeader< T >::getLeader(), QMCHamiltonian::getLocalEnergy(), qmcplusplus::ham, QMCHamiltonian::LocalEnergy, QMCHamiltonian::updateComponent(), and QMCHamiltonian::updateKinetic().

Referenced by QMCCostFunctionBatched::checkConfigurations(), QMCCostFunctionBatched::correlatedSampling(), Hdispatcher::flex_evaluate(), and qmcplusplus::TEST_CASE().

599 {
600  auto& ham_leader = ham_list.getLeader();
601  ScopedTimer local_timer(ham_leader.ham_timer_);
602  for (QMCHamiltonian& ham : ham_list)
603  ham.LocalEnergy = 0.0;
604 
605  const int num_ham_operators = ham_leader.H.size();
606 
607  // It is an invariant of the class that H[0] be the kinetic energy operator.
608  // This is enforced by HamiltonianFactory's constuctor and not QMCHamiltonians
609  int kinetic_index = 0;
610  {
611  ScopedTimer h_timer(ham_leader.my_timers_[kinetic_index]);
612  const auto HC_list(extract_HC_list(ham_list, kinetic_index));
613  if (ham_leader.mw_res_handle_.getResource().kinetic_listeners_.size() > 0)
614  ham_leader.H[kinetic_index]
615  ->mw_evaluatePerParticle(HC_list, wf_list, p_list, ham_leader.mw_res_handle_.getResource().kinetic_listeners_,
616  ham_leader.mw_res_handle_.getResource().ion_kinetic_listeners_);
617  else
618  ham_leader.H[kinetic_index]->mw_evaluate(HC_list, wf_list, p_list);
619  for (int iw = 0; iw < ham_list.size(); iw++)
620  updateComponent(HC_list[iw], ham_list[iw], p_list[iw]);
621  }
622 
623  for (int i_ham_op = 1; i_ham_op < num_ham_operators; ++i_ham_op)
624  {
625  ScopedTimer h_timer(ham_leader.my_timers_[i_ham_op]);
626  const auto HC_list(extract_HC_list(ham_list, i_ham_op));
627 
628  if (ham_leader.mw_res_handle_.getResource().potential_listeners_.size() > 0)
629  ham_leader.H[i_ham_op]->mw_evaluatePerParticle(HC_list, wf_list, p_list,
630  ham_leader.mw_res_handle_.getResource().potential_listeners_,
631  ham_leader.mw_res_handle_.getResource().ion_potential_listeners_);
632  else
633  ham_leader.H[i_ham_op]->mw_evaluate(HC_list, wf_list, p_list);
634  for (int iw = 0; iw < ham_list.size(); iw++)
635  updateComponent(HC_list[iw], ham_list[iw], p_list[iw]);
636  }
637 
638  for (int iw = 0; iw < ham_list.size(); iw++)
639  updateKinetic(ham_list[iw], p_list[iw]);
640 
641  std::vector<FullPrecRealType> local_energies(ham_list.size(), 0.0);
642  for (int iw = 0; iw < ham_list.size(); ++iw)
643  local_energies[iw] = ham_list[iw].getLocalEnergy();
644 
645  return local_energies;
646 }
static void updateKinetic(QMCHamiltonian &ham, ParticleSet &pset)
extract kinetic and potential energies.
ScopeGuard< NewTimer > ScopedTimer
Definition: NewTimer.h:257
QMCHamiltonian(const std::string &aname="psi0")
constructor
static void updateComponent(OperatorBase &op, QMCHamiltonian &ham, ParticleSet &pset)
accumulate local energy and update Observables and PropertyList
static RefVectorWithLeader< OperatorBase > extract_HC_list(const RefVectorWithLeader< QMCHamiltonian > &ham_list, int id)
FullPrecRealType LocalEnergy
Current Local Energy.
FullPrecRealType getLocalEnergy()

◆ mw_evaluateValueAndDerivatives()

std::vector< QMCHamiltonian::FullPrecRealType > mw_evaluateValueAndDerivatives ( const RefVectorWithLeader< QMCHamiltonian > &  ham_list,
const RefVectorWithLeader< TrialWaveFunction > &  wf_list,
const RefVectorWithLeader< ParticleSet > &  p_list,
const opt_variables_type optvars,
RecordArray< ValueType > &  dlogpsi,
RecordArray< ValueType > &  dhpsioverpsi 
)
static

Definition at line 672 of file QMCHamiltonian.cpp.

References QMCHamiltonian::extract_HC_list(), RefVectorWithLeader< T >::getLeader(), QMCHamiltonian::getLocalEnergy(), QMCHamiltonian::LocalEnergy, QMCHamiltonian::updateComponent(), and QMCHamiltonian::updateKinetic().

Referenced by QMCCostFunctionBatched::checkConfigurations(), QMCCostFunctionBatched::correlatedSampling(), and qmcplusplus::test_hcpBe_rotation().

679 {
680  std::vector<FullPrecRealType> local_energies(ham_list.size(), 0.0);
681  for (int iw = 0; iw < ham_list.size(); iw++)
682  ham_list[iw].LocalEnergy = 0.0;
683 
684  if (ham_list.size() > 0)
685  {
686  auto& ham_leader = ham_list.getLeader();
687  const int num_ham_operators = ham_leader.H.size();
688  for (int i_ham_op = 0; i_ham_op < num_ham_operators; ++i_ham_op)
689  {
690  ScopedTimer local_timer(ham_leader.my_timers_[i_ham_op]);
691  const auto HC_list(extract_HC_list(ham_list, i_ham_op));
692 
693  ham_leader.H[i_ham_op]->mw_evaluateWithParameterDerivatives(HC_list, p_list, optvars, dlogpsi, dhpsioverpsi);
694 
695  for (int iw = 0; iw < ham_list.size(); iw++)
696  updateComponent(HC_list[iw], ham_list[iw], p_list[iw]);
697  }
698 
699  for (int iw = 0; iw < ham_list.size(); iw++)
700  updateKinetic(ham_list[iw], p_list[iw]);
701 
702  for (int iw = 0; iw < ham_list.size(); ++iw)
703  local_energies[iw] = ham_list[iw].getLocalEnergy();
704  }
705 
706  return local_energies;
707 }
static void updateKinetic(QMCHamiltonian &ham, ParticleSet &pset)
extract kinetic and potential energies.
ScopeGuard< NewTimer > ScopedTimer
Definition: NewTimer.h:257
static void updateComponent(OperatorBase &op, QMCHamiltonian &ham, ParticleSet &pset)
accumulate local energy and update Observables and PropertyList
static RefVectorWithLeader< OperatorBase > extract_HC_list(const RefVectorWithLeader< QMCHamiltonian > &ham_list, int id)
FullPrecRealType LocalEnergy
Current Local Energy.
FullPrecRealType getLocalEnergy()

◆ mw_evaluateWithToperator()

std::vector< QMCHamiltonian::FullPrecRealType > mw_evaluateWithToperator ( const RefVectorWithLeader< QMCHamiltonian > &  ham_list,
const RefVectorWithLeader< TrialWaveFunction > &  wf_list,
const RefVectorWithLeader< ParticleSet > &  p_list 
)
static

batched version of evaluate Local energy with Toperators updated.

Definition at line 812 of file QMCHamiltonian.cpp.

References QMCHamiltonian::extract_HC_list(), QMCHamiltonian::getLocalEnergy(), qmcplusplus::ham, QMCHamiltonian::LocalEnergy, QMCHamiltonian::updateComponent(), and QMCHamiltonian::updateKinetic().

Referenced by Hdispatcher::flex_evaluateWithToperator().

816 {
817  for (QMCHamiltonian& ham : ham_list)
818  ham.LocalEnergy = 0.0;
819 
820  auto& ham_leader = ham_list.getLeader();
821  const int num_ham_operators = ham_leader.H.size();
822 
823  const int kinetic_index = 0;
824  {
825  ScopedTimer h_timer(ham_leader.my_timers_[kinetic_index]);
826  const auto HC_list(extract_HC_list(ham_list, kinetic_index));
827  if (ham_leader.mw_res_handle_.getResource().kinetic_listeners_.size() > 0)
828  ham_leader.H[kinetic_index]
829  ->mw_evaluatePerParticleWithToperator(HC_list, wf_list, p_list,
830  ham_leader.mw_res_handle_.getResource().kinetic_listeners_,
831  ham_leader.mw_res_handle_.getResource().ion_kinetic_listeners_);
832  else
833  ham_leader.H[kinetic_index]->mw_evaluateWithToperator(HC_list, wf_list, p_list);
834  for (int iw = 0; iw < ham_list.size(); iw++)
835  updateComponent(HC_list[iw], ham_list[iw], p_list[iw]);
836  }
837 
838  for (int i_ham_op = 1; i_ham_op < num_ham_operators; ++i_ham_op)
839  {
840  ScopedTimer local_timer(ham_leader.my_timers_[i_ham_op]);
841  const auto HC_list(extract_HC_list(ham_list, i_ham_op));
842  if (ham_leader.mw_res_handle_.getResource().potential_listeners_.size() > 0)
843  ham_leader.H[i_ham_op]
844  ->mw_evaluatePerParticleWithToperator(HC_list, wf_list, p_list,
845  ham_leader.mw_res_handle_.getResource().potential_listeners_,
846  ham_leader.mw_res_handle_.getResource().ion_potential_listeners_);
847  else
848  ham_leader.H[i_ham_op]->mw_evaluateWithToperator(HC_list, wf_list, p_list);
849  for (int iw = 0; iw < ham_list.size(); ++iw)
850  updateComponent(HC_list[iw], ham_list[iw], p_list[iw]);
851  }
852 
853  for (int iw = 0; iw < ham_list.size(); iw++)
854  updateKinetic(ham_list[iw], p_list[iw]);
855 
856  std::vector<FullPrecRealType> local_energies(ham_list.size());
857  for (int iw = 0; iw < ham_list.size(); ++iw)
858  local_energies[iw] = ham_list[iw].getLocalEnergy();
859 
860  return local_energies;
861 }
static void updateKinetic(QMCHamiltonian &ham, ParticleSet &pset)
extract kinetic and potential energies.
ScopeGuard< NewTimer > ScopedTimer
Definition: NewTimer.h:257
QMCHamiltonian(const std::string &aname="psi0")
constructor
static void updateComponent(OperatorBase &op, QMCHamiltonian &ham, ParticleSet &pset)
accumulate local energy and update Observables and PropertyList
static RefVectorWithLeader< OperatorBase > extract_HC_list(const RefVectorWithLeader< QMCHamiltonian > &ham_list, int id)
FullPrecRealType LocalEnergy
Current Local Energy.
FullPrecRealType getLocalEnergy()

◆ mw_makeNonLocalMoves()

std::vector< int > mw_makeNonLocalMoves ( const RefVectorWithLeader< QMCHamiltonian > &  ham_list,
const RefVectorWithLeader< TrialWaveFunction > &  wf_list,
const RefVectorWithLeader< ParticleSet > &  p_list 
)
static

Definition at line 1019 of file QMCHamiltonian.cpp.

References RefVectorWithLeader< T >::getLeader(), NonLocalECPotential::makeNonLocalMovesPbyP(), and QMCHamiltonian::nlpp_ptr.

Referenced by Hdispatcher::flex_makeNonLocalMoves().

1022 {
1023  auto& ham_leader = ham_list.getLeader();
1024 
1025  std::vector<int> num_accepts(ham_list.size(), 0);
1026  if (ham_list.getLeader().nlpp_ptr)
1027  {
1028  for (int iw = 0; iw < ham_list.size(); ++iw)
1029  num_accepts[iw] = ham_list[iw].nlpp_ptr->makeNonLocalMovesPbyP(p_list[iw]);
1030  }
1031  return num_accepts;
1032 }
NonLocalECPotential * nlpp_ptr
pointer to NonLocalECP
int makeNonLocalMovesPbyP(ParticleSet &P)
make non local moves with particle-by-particle moves

◆ rejectedMove()

void rejectedMove ( ParticleSet P,
Walker_t ThisWalker 
)

Looks like a hack see DMCBatched.cpp and DMC.cpp weight is used like temporary flag from DMC.

Definition at line 779 of file QMCHamiltonian.cpp.

References QMCHamiltonian::auxH, QMCHamiltonian::collect_walker_traces(), and ParticleSet::current_step.

Referenced by SODMCUpdatePbyPWithRejectionFast::advanceWalker(), DMCUpdatePbyPWithRejectionFast::advanceWalker(), DMCUpdatePbyPL2::advanceWalker(), DMCUpdateAllWithKill::advanceWalker(), RMCUpdatePbyPWithDrift::advanceWalkersRMC(), RMCUpdateAllWithDrift::advanceWalkersRMC(), RMCUpdatePbyPWithDrift::advanceWalkersVMC(), and RMCUpdateAllWithDrift::advanceWalkersVMC().

780 {
781  // weight should be 0 from DMC
782  // since other traced properties will be invalid
783  // (they will be from the walker moved before this one)
784 #if !defined(REMOVE_TRACEMANAGER)
785  collect_walker_traces(ThisWalker, P.current_step);
786 #endif
787  // ThisWalker.rejectedMove();
788  for (int i = 0; i < auxH.size(); ++i)
789  {
790  auxH[i]->setHistories(ThisWalker);
791  RealType sink = auxH[i]->rejectedMove(P);
792  }
793 }
std::vector< std::unique_ptr< OperatorBase > > auxH
vector of Hamiltonians
void collect_walker_traces(Walker_t &walker, int step)
collect walker trace data
QMCTraits::RealType RealType

◆ releaseResource()

void releaseResource ( ResourceCollection collection,
const RefVectorWithLeader< QMCHamiltonian > &  ham_list 
)
static

release external resource Note: use RAII ResourceCollectionLock whenever possible

Definition at line 1053 of file QMCHamiltonian.cpp.

References QMCHamiltonian::extract_HC_list(), RefVectorWithLeader< T >::getLeader(), and ResourceCollection::takebackResource().

1055 {
1056  auto& ham_leader = ham_list.getLeader();
1057  collection.takebackResource(ham_leader.mw_res_handle_);
1058  for (int i_ham_op = 0; i_ham_op < ham_leader.H.size(); ++i_ham_op)
1059  {
1060  const auto HC_list(extract_HC_list(ham_list, i_ham_op));
1061  ham_leader.H[i_ham_op]->releaseResource(collection, HC_list);
1062  }
1063 }
static RefVectorWithLeader< OperatorBase > extract_HC_list(const RefVectorWithLeader< QMCHamiltonian > &ham_list, int id)

◆ reportToListeners()

void reportToListeners ( )
private

◆ resetObservables()

void resetObservables ( int  start,
int  ncollects 
)
private

reset Observables and counters

Parameters
startstarting index within PropertyList
ncollectsnumber of collectables

Definition at line 244 of file QMCHamiltonian.cpp.

References QMCHamiltonian::addObservables(), APP_ABORT, QMCHamiltonian::auxH, QMCHamiltonian::H, QMCHamiltonian::myIndex, QMCHamiltonian::numCollectables, QMCHamiltonian::Observables, PooledData< T >::rewind(), and PooledData< T >::size().

245 {
246  Observables.clear();
247  BufferType collectables;
248  collectables.rewind();
249  for (int i = 0; i < H.size(); ++i)
250  H[i]->addObservables(Observables, collectables);
251  for (int i = 0; i < auxH.size(); ++i)
252  auxH[i]->addObservables(Observables, collectables);
253  if (collectables.size() != ncollects)
254  {
255  APP_ABORT(" QMCHamiltonian::resetObservables numCollectables != ncollects");
256  }
257  myIndex = start;
258  numCollectables = ncollects;
259 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
int myIndex
starting index
PropertySetType Observables
data
std::vector< std::unique_ptr< OperatorBase > > auxH
vector of Hamiltonians
void rewind(size_type cur=0)
set the Current to a cursor
Definition: PooledData.h:56
int addObservables(ParticleSet &P)
add each term to the PropertyList for averages
int numCollectables
starting index
OperatorBase::BufferType BufferType
#define APP_ABORT(msg)
Widely used but deprecated fatal error macros from legacy code.
Definition: AppAbort.h:27

◆ resetTargetParticleSet()

void resetTargetParticleSet ( ParticleSet P)

Definition at line 977 of file QMCHamiltonian.cpp.

References QMCHamiltonian::auxH, and QMCHamiltonian::H.

978 {
979  for (int i = 0; i < H.size(); i++)
980  H[i]->resetTargetParticleSet(P);
981  for (int i = 0; i < auxH.size(); i++)
983 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
std::vector< std::unique_ptr< OperatorBase > > auxH
vector of Hamiltonians
void resetTargetParticleSet(ParticleSet &P)

◆ setNonLocalMoves() [1/2]

void setNonLocalMoves ( xmlNodePtr  cur)

set non local moves options

Parameters
curthe xml input

Definition at line 995 of file QMCHamiltonian.cpp.

References QMCHamiltonian::nlpp_ptr, and NonLocalECPotential::setNonLocalMoves().

Referenced by QMCUpdateBase::put(), and DMCBatched::setNonLocalMoveHandler().

996 {
997  if (nlpp_ptr != nullptr)
999 }
NonLocalECPotential * nlpp_ptr
pointer to NonLocalECP
void setNonLocalMoves(xmlNodePtr cur)
set non local moves options

◆ setNonLocalMoves() [2/2]

void setNonLocalMoves ( const std::string &  non_local_move_option,
const double  tau,
const double  alpha,
const double  gamma 
)

Definition at line 1001 of file QMCHamiltonian.cpp.

References QMCHamiltonian::nlpp_ptr, and NonLocalECPotential::setNonLocalMoves().

1005 {
1006  if (nlpp_ptr != nullptr)
1007  nlpp_ptr->setNonLocalMoves(non_local_move_option, tau, alpha, gamma);
1008 }
NonLocalECPotential * nlpp_ptr
pointer to NonLocalECP
void setNonLocalMoves(xmlNodePtr cur)
set non local moves options

◆ setPrimary()

void setPrimary ( bool  primary)
inline

set PRIMARY bit of all the components

Definition at line 224 of file QMCHamiltonian.h.

References QMCHamiltonian::H, and OperatorBase::PRIMARY.

Referenced by QMCDriverFactory::createQMCDriver(), WaveFunctionTester::runDerivNLPPTest(), and WaveFunctionTester::runDerivTest().

225  {
226  for (int i = 0; i < H.size(); i++)
227  H[i]->getUpdateMode().set(OperatorBase::PRIMARY, primary);
228  }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians

◆ setProperty()

void setProperty ( IT  first)
inline

Definition at line 203 of file QMCHamiltonian.h.

References copy(), QMCHamiltonian::myIndex, and QMCHamiltonian::Observables.

204  {
205  // LocalEnergy=first[WP::LOCALENERGY];
206  // KineticEnergy=LocalEnergy-first[LOCALPOTENTIAL];
207  copy(first + myIndex, first + myIndex + Observables.size(), Observables.begin());
208  }
int myIndex
starting index
PropertySetType Observables
data
void copy(const Array< T1, 3 > &src, Array< T2, 3 > &dest)
Definition: Blitz.h:639

◆ setRandomGenerator()

void setRandomGenerator ( RandomBase< FullPrecRealType > *  rng)

Definition at line 985 of file QMCHamiltonian.cpp.

References QMCHamiltonian::auxH, QMCHamiltonian::H, QMCHamiltonian::nlpp_ptr, and NonLocalECPotential::setRandomGenerator().

Referenced by QMCCostFunctionBatched::checkConfigurations(), QMCCostFunctionBatched::correlatedSampling(), WaveFunctionTester::run(), WaveFunctionTester::runDerivCloneTest(), Crowd::setRNGForHamiltonian(), qmcplusplus::TEST_CASE(), and qmcplusplus::test_hcpBe_rotation().

986 {
987  for (int i = 0; i < H.size(); i++)
988  H[i]->setRandomGenerator(rng);
989  for (int i = 0; i < auxH.size(); i++)
990  auxH[i]->setRandomGenerator(rng);
991  if (nlpp_ptr)
993 }
void setRandomGenerator(RandomBase< FullPrecRealType > *rng) override
set the internal RNG pointer as the given pointer
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
std::vector< std::unique_ptr< OperatorBase > > auxH
vector of Hamiltonians
NonLocalECPotential * nlpp_ptr
pointer to NonLocalECP
void setRandomGenerator(RandomBase< FullPrecRealType > *rng)

◆ size()

int size ( void  ) const
inline

return the number of Hamiltonians

Definition at line 86 of file QMCHamiltonian.h.

References QMCHamiltonian::H.

Referenced by qmcplusplus::TEST_CASE(), and QMCMain::validateXML().

86 { return H.size(); }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians

◆ total_size()

int total_size ( ) const
inline

return the total number of Hamiltonians (physical + aux)

Definition at line 89 of file QMCHamiltonian.h.

References QMCHamiltonian::auxH, and QMCHamiltonian::H.

Referenced by qmcplusplus::TEST_CASE().

89 { return H.size() + auxH.size(); }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
std::vector< std::unique_ptr< OperatorBase > > auxH
vector of Hamiltonians

◆ updateComponent()

void updateComponent ( OperatorBase op,
QMCHamiltonian ham,
ParticleSet pset 
)
static

accumulate local energy and update Observables and PropertyList

Definition at line 572 of file QMCHamiltonian.cpp.

References OperatorBase::getName(), OperatorBase::getValue(), qmcplusplus::ham, qmcplusplus::isnan(), QMCHamiltonian::LocalEnergy, QMCHamiltonian::myIndex, QMCHamiltonian::Observables, qmcplusplus::pset, OperatorBase::setObservables(), and OperatorBase::setParticlePropertyList().

Referenced by QMCHamiltonian::evaluate(), QMCHamiltonian::evaluateDeterministic(), QMCHamiltonian::evaluateWithToperator(), QMCHamiltonian::mw_evaluate(), QMCHamiltonian::mw_evaluateValueAndDerivatives(), and QMCHamiltonian::mw_evaluateWithToperator().

573 {
574  // It's much better to be able to see where this is coming from. It is caught just fine.
575  if (qmcplusplus::isnan(op.getValue()))
576  {
577  std::ostringstream msg;
578  msg << "QMCHamiltonian::updateComponent component " << op.getName() << " returns NaN." << std::endl;
579  pset.print(msg);
580  throw std::runtime_error(msg.str());
581  }
582  // The following is a ridiculous breach of encapsulation.
583  ham.LocalEnergy += op.getValue();
584  op.setObservables(ham.Observables);
585  op.setParticlePropertyList(pset.PropertyList, ham.myIndex);
586 }
int myIndex
starting index
PropertySetType Observables
data
bool isnan(float a)
return true if the value is NaN.
Definition: math.cpp:15
FullPrecRealType LocalEnergy
Current Local Energy.

◆ updateKinetic()

void updateKinetic ( QMCHamiltonian ham,
ParticleSet pset 
)
static

extract kinetic and potential energies.

Definition at line 588 of file QMCHamiltonian.cpp.

References QMCHamiltonian::H, qmcplusplus::ham, QMCHamiltonian::KineticEnergy, QMCHamiltonian::LocalEnergy, and qmcplusplus::pset.

Referenced by QMCHamiltonian::evaluate(), QMCHamiltonian::evaluateDeterministic(), QMCHamiltonian::evaluateWithToperator(), QMCHamiltonian::mw_evaluate(), QMCHamiltonian::mw_evaluateValueAndDerivatives(), and QMCHamiltonian::mw_evaluateWithToperator().

589 {
590  ham.KineticEnergy = ham.H[0]->getValue();
591  pset.PropertyList[WP::LOCALENERGY] = ham.LocalEnergy;
592  pset.PropertyList[WP::LOCALPOTENTIAL] = ham.LocalEnergy - ham.KineticEnergy;
593 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
FullPrecRealType KineticEnergy
Current Kinetic Energy.
FullPrecRealType LocalEnergy
Current Local Energy.

◆ updateSource()

void updateSource ( ParticleSet s)

remove a named Hamiltonian from the list

Parameters
anamethe name of the Hamiltonian
Returns
true, if the request hamiltonian exists and is removed.

Definition at line 191 of file QMCHamiltonian.cpp.

References QMCHamiltonian::auxH, QMCHamiltonian::H, and qmcplusplus::Units::time::s.

Referenced by QMCMain::executeCMCSection().

192 {
193  for (int i = 0; i < H.size(); ++i)
194  H[i]->updateSource(s);
195  for (int i = 0; i < auxH.size(); ++i)
196  auxH[i]->updateSource(s);
197 }
std::vector< std::unique_ptr< OperatorBase > > H
vector of Hamiltonians
std::vector< std::unique_ptr< OperatorBase > > auxH
vector of Hamiltonians
void updateSource(ParticleSet &s)
remove a named Hamiltonian from the list

Friends And Related Function Documentation

◆ HamiltonianFactory

friend class HamiltonianFactory
friend

Definition at line 51 of file QMCHamiltonian.h.

Member Data Documentation

◆ age_sample

◆ auxH

◆ available_quantities_

constexpr std::array<std::string_view, 8> available_quantities_
staticprivate
Initial value:
{"weight", "LocalEnergy", "LocalPotential",
"Vq", "Vc", "Vqq",
"Vqc", "Vcc"}

Definition at line 431 of file QMCHamiltonian.h.

◆ eval_ion_derivs_fast_timer_

NewTimer& eval_ion_derivs_fast_timer_
private

Total timer for H ion deriv evaluation;.

Definition at line 460 of file QMCHamiltonian.h.

Referenced by QMCHamiltonian::evaluateIonDerivsDeterministicFast().

◆ eval_vals_derivs_timer_

NewTimer& eval_vals_derivs_timer_
private

Total timer for H evaluation.

Definition at line 458 of file QMCHamiltonian.h.

Referenced by QMCHamiltonian::evaluateValueAndDerivatives().

◆ gen_sample

Array<TraceInt, 1>* gen_sample
private

◆ H

◆ ham_timer_

NewTimer& ham_timer_
private

Total timer for H evaluation.

Definition at line 456 of file QMCHamiltonian.h.

Referenced by QMCHamiltonian::evaluate(), QMCHamiltonian::evaluateDeterministic(), and QMCHamiltonian::evaluateWithToperator().

◆ id_sample

Array<TraceInt, 1>* id_sample
private

◆ KineticEnergy

◆ l2_ptr

◆ LocalEnergy

◆ mult_sample

◆ mw_res_handle_

◆ my_timers_

std::vector<std::reference_wrapper<NewTimer> > my_timers_
private

◆ myIndex

◆ myName

const std::string myName
private

getName is in the way

Definition at line 446 of file QMCHamiltonian.h.

Referenced by QMCHamiltonian::getName(), and QMCHamiltonian::makeClone().

◆ NewLocalEnergy

FullPrecRealType NewLocalEnergy
private

Current Local Energy for the proposed move.

Definition at line 444 of file QMCHamiltonian.h.

◆ nlpp_ptr

◆ numCollectables

int numCollectables
private

◆ Observables

◆ operator_types

std::map<std::string, std::string> operator_types
private

types of component operators

Definition at line 464 of file QMCHamiltonian.h.

Referenced by QMCHamiltonian::addOperatorType(), and QMCHamiltonian::getOperatorType().

◆ pid_sample

Array<TraceInt, 1>* pid_sample
private

◆ position_sample

◆ request

◆ step_sample

Array<TraceInt, 1>* step_sample
private

◆ streaming_position

bool streaming_position
private

◆ weight_sample


The documentation for this class was generated from the following files: