3 * This source code is part of
7 * GROningen MAchine for Chemical Simulations
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.
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.
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.
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.
29 * For more info, check our website at http://www.gromacs.org
32 * \brief API for neighborhood searching.
34 * The API is documented in more detail on a separate page:
37 * The functions within this file can be used independently of the other parts
39 * The library also uses the functions internally.
41 * \author Teemu Murtola <teemu.murtola@cbr.su.se>
42 * \ingroup module_selection
44 #ifndef GMX_SELECTION_NBSEARCH_H
45 #define GMX_SELECTION_NBSEARCH_H
47 #include "../legacyheaders/typedefs.h"
49 #include "indexutil.h"
53 /** Data structure for neighborhood searches. */
54 typedef struct gmx_ana_nbsearch_t gmx_ana_nbsearch_t;
56 /** Create a new neighborhood search data structure. */
58 gmx_ana_nbsearch_create(real cutoff, int maxn);
59 /** Free memory allocated for neighborhood search. */
61 gmx_ana_nbsearch_free(gmx_ana_nbsearch_t *d);
63 /** Initializes neighborhood search for a new frame. */
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. */
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. */
72 gmx_ana_nbsearch_set_excl(gmx_ana_nbsearch_t *d, int nexcl, int excl[]);
73 /** Check whether a point is within a neighborhood. */
75 gmx_ana_nbsearch_is_within(gmx_ana_nbsearch_t *d, const rvec x);
76 /** Check whether a position is within a neighborhood. */
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. */
82 gmx_ana_nbsearch_mindist(gmx_ana_nbsearch_t *d, const rvec x);
83 /** Calculates the minimun distance from the reference points. */
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. */
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. */
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. */
96 gmx_ana_nbsearch_next_within(gmx_ana_nbsearch_t *d, int *jp);
102 * C++ wrapper for neighborhood searching.
105 class NeighborhoodSearch
108 NeighborhoodSearch(real cutoff, int maxn)
109 : d_(gmx_ana_nbsearch_create(cutoff, maxn))
112 ~NeighborhoodSearch() { gmx_ana_nbsearch_free(d_); }
114 void init(t_pbc *pbc, int n, const rvec x[])
115 { gmx_ana_nbsearch_init(d_, pbc, n, x); }
117 void init(t_pbc *pbc, const gmx_ana_pos_t *p)
118 { gmx_ana_nbsearch_pos_init(d_, pbc, p); }
120 void setExclusions(int nexcl, atom_id *excl)
121 { gmx_ana_nbsearch_set_excl(d_, nexcl, excl); }
124 bool isWithin(const rvec x)
125 { return gmx_ana_nbsearch_is_within(d_, x); }
127 bool isWithin(const gmx_ana_pos_t *p, int i)
128 { return gmx_ana_nbsearch_pos_is_within(d_, p, i); }
130 real minimumDistance(const rvec x)
131 { return gmx_ana_nbsearch_mindist(d_, x); }
133 real minimumDistance(const gmx_ana_pos_t *p, int i)
134 { return gmx_ana_nbsearch_pos_mindist(d_, p, i); }
136 bool firstWithin(const rvec x, int *jp)
137 { return gmx_ana_nbsearch_first_within(d_, x, jp); }
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); }
142 bool nextWithin(int *jp)
143 { return gmx_ana_nbsearch_next_within(d_, jp); }
146 gmx_ana_nbsearch_t *d_;