Merge branch 'release-4-6', adds the nbnxn functionality
[alexxy/gromacs.git] / src / gromacs / selection / nbsearch.h
1 /*
2  *
3  *                This source code is part of
4  *
5  *                 G   R   O   M   A   C   S
6  *
7  *          GROningen MAchine for Chemical Simulations
8  *
9  * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
10  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
11  * Copyright (c) 2001-2009, The GROMACS development team,
12  * check out http://www.gromacs.org for more information.
13
14  * This program is free software; you can redistribute it and/or
15  * modify it under the terms of the GNU General Public License
16  * as published by the Free Software Foundation; either version 2
17  * of the License, or (at your option) any later version.
18  *
19  * If you want to redistribute modifications, please consider that
20  * scientific software is very special. Version control is crucial -
21  * bugs must be traceable. We will be happy to consider code for
22  * inclusion in the official distribution, but derived work must not
23  * be called official GROMACS. Details are found in the README & COPYING
24  * files - if they are missing, get the official version at www.gromacs.org.
25  *
26  * To help us fund GROMACS development, we humbly ask that you cite
27  * the papers on the package - you can find them in the top README file.
28  *
29  * For more info, check our website at http://www.gromacs.org
30  */
31 /*! \file
32  * \brief API for neighborhood searching.
33  *
34  * The API is documented in more detail on a separate page:
35  * \ref nbsearch
36  *
37  * The functions within this file can be used independently of the other parts
38  * of the library.
39  * The library also uses the functions internally.
40  *
41  * \author Teemu Murtola <teemu.murtola@cbr.su.se>
42  * \ingroup module_selection
43  */
44 #ifndef GMX_SELECTION_NBSEARCH_H
45 #define GMX_SELECTION_NBSEARCH_H
46
47 #include "../legacyheaders/typedefs.h"
48
49 #include "indexutil.h"
50
51 struct gmx_ana_pos_t;
52
53 /** Data structure for neighborhood searches. */
54 typedef struct gmx_ana_nbsearch_t gmx_ana_nbsearch_t;
55
56 /** Create a new neighborhood search data structure. */
57 gmx_ana_nbsearch_t *
58 gmx_ana_nbsearch_create(real cutoff, int maxn);
59 /** Free memory allocated for neighborhood search. */
60 void
61 gmx_ana_nbsearch_free(gmx_ana_nbsearch_t *d);
62
63 /** Initializes neighborhood search for a new frame. */
64 void
65 gmx_ana_nbsearch_init(gmx_ana_nbsearch_t *d, t_pbc *pbc, int n, const rvec x[]);
66 /** Initializes neighborhood search for a frame using \c gmx_ana_pos_t.  */
67 void
68 gmx_ana_nbsearch_pos_init(gmx_ana_nbsearch_t *d, t_pbc *pbc,
69                           const struct gmx_ana_pos_t *p);
70 /** Sets the exclusions for the next neighborhood search. */
71 void
72 gmx_ana_nbsearch_set_excl(gmx_ana_nbsearch_t *d, int nexcl, int excl[]);
73 /** Check whether a point is within a neighborhood. */
74 bool
75 gmx_ana_nbsearch_is_within(gmx_ana_nbsearch_t *d, const rvec x);
76 /** Check whether a position is within a neighborhood. */
77 bool
78 gmx_ana_nbsearch_pos_is_within(gmx_ana_nbsearch_t *d,
79                                const struct gmx_ana_pos_t *p, int i);
80 /** Calculates the minimun distance from the reference points. */
81 real
82 gmx_ana_nbsearch_mindist(gmx_ana_nbsearch_t *d, const rvec x);
83 /** Calculates the minimun distance from the reference points. */
84 real
85 gmx_ana_nbsearch_pos_mindist(gmx_ana_nbsearch_t *d,
86                              const struct gmx_ana_pos_t *p, int i);
87 /** Finds the first reference position within the cutoff. */
88 bool
89 gmx_ana_nbsearch_first_within(gmx_ana_nbsearch_t *d, const rvec x, int *jp);
90 /** Finds the first reference position within the cutoff. */
91 bool
92 gmx_ana_nbsearch_pos_first_within(gmx_ana_nbsearch_t *d,
93                                   const struct gmx_ana_pos_t *p, int i, int *jp);
94 /** Finds the next reference position within the cutoff. */
95 bool
96 gmx_ana_nbsearch_next_within(gmx_ana_nbsearch_t *d, int *jp);
97
98 namespace gmx
99 {
100
101 /*
102  * C++ wrapper for neighborhood searching.
103  *
104  */
105 class NeighborhoodSearch
106 {
107     public:
108         NeighborhoodSearch(real cutoff, int maxn)
109             : d_(gmx_ana_nbsearch_create(cutoff, maxn))
110         {
111         }
112         ~NeighborhoodSearch() { gmx_ana_nbsearch_free(d_); }
113
114         void init(t_pbc *pbc, int n, const rvec x[])
115         { gmx_ana_nbsearch_init(d_, pbc, n, x); }
116
117         void init(t_pbc *pbc, const gmx_ana_pos_t *p)
118         { gmx_ana_nbsearch_pos_init(d_, pbc, p); }
119
120         void setExclusions(int nexcl, atom_id *excl)
121         { gmx_ana_nbsearch_set_excl(d_, nexcl, excl); }
122
123
124         bool isWithin(const rvec x)
125         { return gmx_ana_nbsearch_is_within(d_, x); }
126
127         bool isWithin(const gmx_ana_pos_t *p, int i)
128         { return gmx_ana_nbsearch_pos_is_within(d_, p, i); }
129
130         real minimumDistance(const rvec x)
131         { return gmx_ana_nbsearch_mindist(d_, x); }
132
133         real minimumDistance(const gmx_ana_pos_t *p, int i)
134         { return gmx_ana_nbsearch_pos_mindist(d_, p, i); }
135
136         bool firstWithin(const rvec x, int *jp)
137         { return gmx_ana_nbsearch_first_within(d_, x, jp); }
138
139         bool firstWithin(const gmx_ana_pos_t *p, int i, int *jp)
140         { return gmx_ana_nbsearch_pos_first_within(d_, p, i, jp); }
141
142         bool nextWithin(int *jp)
143         { return gmx_ana_nbsearch_next_within(d_, jp); }
144
145     private:
146         gmx_ana_nbsearch_t  *d_;
147 };
148
149 } // namespace gmx
150
151 #endif