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