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) 2021 QMCPACK developers.
6 //
7 // File developed by: Ye Luo, yeluo@anl.gov, Argonne National Laboratory
8 //
9 // File created by: Ye Luo, yeluo@anl.gov, Argonne National Laboratory
10 //////////////////////////////////////////////////////////////////////////////////////
11
12
13 #include "Hdispatcher.h"
14 #include <cassert>
15 #include "QMCHamiltonian.h"
16
17 namespace qmcplusplus
18 {
Hdispatcher(bool use_batch)19 Hdispatcher::Hdispatcher(bool use_batch) : use_batch_(use_batch) {}
20
21
flex_evaluate(const RefVectorWithLeader<QMCHamiltonian> & ham_list,const RefVectorWithLeader<ParticleSet> & p_list) const22 std::vector<QMCHamiltonian::FullPrecRealType> Hdispatcher::flex_evaluate(
23 const RefVectorWithLeader<QMCHamiltonian>& ham_list,
24 const RefVectorWithLeader<ParticleSet>& p_list) const
25 {
26 assert(ham_list.size() == p_list.size());
27 if (use_batch_)
28 return QMCHamiltonian::mw_evaluate(ham_list, p_list);
29 else
30 {
31 std::vector<FullPrecRealType> local_energies(ham_list.size());
32 for (size_t iw = 0; iw < ham_list.size(); iw++)
33 local_energies[iw] = ham_list[iw].evaluate(p_list[iw]);
34 return local_energies;
35 }
36 }
37
flex_evaluateWithToperator(const RefVectorWithLeader<QMCHamiltonian> & ham_list,const RefVectorWithLeader<ParticleSet> & p_list) const38 std::vector<QMCHamiltonian::FullPrecRealType> Hdispatcher::flex_evaluateWithToperator(
39 const RefVectorWithLeader<QMCHamiltonian>& ham_list,
40 const RefVectorWithLeader<ParticleSet>& p_list) const
41 {
42 assert(ham_list.size() == p_list.size());
43 if (use_batch_)
44 return QMCHamiltonian::mw_evaluateWithToperator(ham_list, p_list);
45 else
46 {
47 std::vector<FullPrecRealType> local_energies(ham_list.size());
48 for (size_t iw = 0; iw < ham_list.size(); iw++)
49 local_energies[iw] = ham_list[iw].evaluateWithToperator(p_list[iw]);
50 return local_energies;
51 }
52 }
53
flex_makeNonLocalMoves(const RefVectorWithLeader<QMCHamiltonian> & ham_list,const RefVectorWithLeader<ParticleSet> & p_list) const54 std::vector<int> Hdispatcher::flex_makeNonLocalMoves(const RefVectorWithLeader<QMCHamiltonian>& ham_list,
55 const RefVectorWithLeader<ParticleSet>& p_list) const
56 {
57 assert(ham_list.size() == p_list.size());
58 if (use_batch_)
59 return QMCHamiltonian::mw_makeNonLocalMoves(ham_list, p_list);
60 else
61 {
62 std::vector<int> num_accepts(ham_list.size());
63 for (size_t iw = 0; iw < ham_list.size(); iw++)
64 num_accepts[iw] = ham_list[iw].makeNonLocalMoves(p_list[iw]);
65 return num_accepts;
66 }
67 }
68
69 } // namespace qmcplusplus
70