1 /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2    Copyright (c) 2011-2021 The plumed team
3    (see the PEOPLE file at the root of the distribution for a list of names)
4 
5    See http://www.plumed.org for more information.
6 
7    This file is part of plumed, version 2.
8 
9    plumed is free software: you can redistribute it and/or modify
10    it under the terms of the GNU Lesser General Public License as published by
11    the Free Software Foundation, either version 3 of the License, or
12    (at your option) any later version.
13 
14    plumed is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU Lesser General Public License for more details.
18 
19    You should have received a copy of the GNU Lesser General Public License
20    along with plumed.  If not, see <http://www.gnu.org/licenses/>.
21 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
22 #ifndef __PLUMED_tools_NeighborList_h
23 #define __PLUMED_tools_NeighborList_h
24 
25 #include "Vector.h"
26 #include "AtomNumber.h"
27 
28 #include <vector>
29 
30 namespace PLMD {
31 
32 class Pbc;
33 class Communicator;
34 
35 /// \ingroup TOOLBOX
36 /// A class that implements neighbor lists from two lists or a single list of atoms
37 class NeighborList
38 {
39   bool reduced;
40   bool serial_;
41   bool do_pair_,do_pbc_,twolists_;
42   const PLMD::Pbc* pbc_;
43   Communicator& comm;
44   std::vector<PLMD::AtomNumber> fullatomlist_,requestlist_;
45   std::vector<std::pair<unsigned,unsigned> > neighbors_;
46   double distance_;
47   unsigned stride_,nlist0_,nlist1_,nallpairs_,lastupdate_;
48 /// Initialize the neighbor list with all possible pairs
49   void initialize();
50 /// Return the pair of indexes in the positions array
51 /// of the two atoms forming the i-th pair among all possible pairs
52   std::pair<unsigned,unsigned> getIndexPair(unsigned i);
53 /// Extract the list of atoms from the current list of close pairs
54   void setRequestList();
55 public:
56   NeighborList(const std::vector<PLMD::AtomNumber>& list0,
57                const std::vector<PLMD::AtomNumber>& list1,
58                const bool& serial,
59                const bool& do_pair, const bool& do_pbc, const PLMD::Pbc& pbc, Communicator &cm,
60                const double& distance=1.0e+30, const unsigned& stride=0);
61   NeighborList(const std::vector<PLMD::AtomNumber>& list0,
62                const bool& serial,
63                const bool& do_pbc,
64                const PLMD::Pbc& pbc, Communicator &cm, const double& distance=1.0e+30,
65                const unsigned& stride=0);
66 /// Return the list of all atoms. These are needed to rebuild the neighbor list.
67   std::vector<PLMD::AtomNumber>& getFullAtomList();
68 /// Update the indexes in the neighbor list to match the
69 /// ordering in the new positions array
70 /// and return the new list of atoms that must be requested to the main code
71   std::vector<PLMD::AtomNumber>& getReducedAtomList();
72 /// Update the neighbor list and prepare the new
73 /// list of atoms that will be requested to the main code
74   void update(const std::vector<PLMD::Vector>& positions);
75 /// Get the update stride of the neighbor list
76   unsigned getStride() const;
77 /// Get the last step in which the neighbor list was updated
78   unsigned getLastUpdate() const;
79 /// Set the step of the last update
80   void setLastUpdate(unsigned step);
81 /// Get the size of the neighbor list
82   unsigned size() const;
83 /// Get the i-th pair of the neighbor list
84   std::pair<unsigned,unsigned> getClosePair(unsigned i) const;
85 /// Get the list of neighbors of the i-th atom
86   std::vector<unsigned> getNeighbors(unsigned i);
~NeighborList()87   ~NeighborList() {}
88 /// Get the i-th pair of AtomNumbers from the neighbor list
89   std::pair<AtomNumber,AtomNumber> getClosePairAtomNumber(unsigned i) const;
90 };
91 
92 }
93 
94 #endif
95