Apply clang-format to source tree
[alexxy/gromacs.git] / src / gromacs / awh / grid.h
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2015,2016,2017,2019, by the GROMACS development team, led by
5  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6  * and including many others, as listed in the AUTHORS file in the
7  * top-level source directory and at http://www.gromacs.org.
8  *
9  * GROMACS is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * as published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * GROMACS 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 GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with GROMACS; if not, see
21  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
23  *
24  * If you want to redistribute modifications to GROMACS, please
25  * consider that scientific software is very special. Version
26  * control is crucial - bugs must be traceable. We will be happy to
27  * consider code for inclusion in the official distribution, but
28  * derived work must not be called official GROMACS. Details are found
29  * in the README & COPYING files - if they are missing, get the
30  * official version at http://www.gromacs.org.
31  *
32  * To help us fund GROMACS development, we humbly ask that you cite
33  * the research papers on the package. Check out http://www.gromacs.org.
34  */
35
36 /*! \internal \file
37  *
38  * \brief
39  * This file contains datatypes and function declarations necessary
40  * for AWH to interface with the grid code.
41  *
42  * The grid organizes spatial properties of the AWH coordinate points.
43  * This includes traversing points in a specific order, locating
44  * neighboring points and calculating distances. Multiple dimensions
45  * as well as periodic dimensions are supported.
46  *
47  * \todo: Replace this by a more generic grid class once that is available.
48  *
49  * \author Viveca Lindahl
50  * \author Berk Hess <hess@kth.se>
51  * \ingroup module_awh
52  */
53
54 #ifndef GMX_AWH_GRID_H
55 #define GMX_AWH_GRID_H
56
57 #include <memory>
58 #include <string>
59
60 #include "dimparams.h" /* This is needed for awh_dvec */
61
62 namespace gmx
63 {
64
65 struct AwhDimParams;
66
67 /*! \internal
68  * \brief An axis, i.e. dimension, of the grid.
69  */
70 class GridAxis
71 {
72 public:
73     /*! \brief Constructor.
74      *
75      * The spacing and number of points are set such that we have
76      * at least the requested point density.
77      * Requesting 0 point density results in the minimum number
78      * of points (2).
79      *
80      * \param[in] origin           Starting value.
81      * \param[in] end              End value.
82      * \param[in] period           Period, pass 0 if not periodic.
83      * \param[in] pointDensity     Requested number of point per unit of axis length.
84      */
85     GridAxis(double origin, double end, double period, double pointDensity);
86
87     /*! \brief Constructor.
88      *
89      * \param[in] origin           Starting value.
90      * \param[in] end              End value.
91      * \param[in] period           Period, pass 0 if not periodic.
92      * \param[in] numPoints        The number of points.
93      */
94     GridAxis(double origin, double end, double period, int numPoints);
95
96     /*! \brief Returns if the axis has periodic boundaries.
97      */
98     bool isPeriodic() const { return period_ > 0; }
99
100     /*! \brief Returns the period of the grid along the axis.
101      */
102     double period() const { return period_; }
103
104     /*! \brief Returns the grid origin along the axis.
105      */
106     double origin() const { return origin_; }
107
108     /*! \brief Returns the grid point spacing along the axis.
109      */
110     double spacing() const { return spacing_; }
111
112     /*! \brief Returns the number of grid points along the axis.
113      */
114     int numPoints() const { return numPoints_; }
115
116     /*! \brief Returns the period of the grid in points along the axis.
117      *
118      * Returns 0 if the axis is not periodic.
119      */
120     int numPointsInPeriod() const { return numPointsInPeriod_; }
121
122     /*! \brief Returns the length of the interval.
123      *
124      * This returns the distance obtained by connecting the origin point to
125      * the end point in the positive direction. Note that this is generally
126      * not the shortest distance. For period > 0, both origin and
127      * end are expected to take values in the same periodic interval.
128      */
129     double length() const { return length_; }
130
131     /*! \brief Map a value to the nearest point index along an axis.
132      *
133      * \param[in] value  Value along the axis.
134      * \returns the index nearest to the value.
135      */
136     int nearestIndex(double value) const;
137
138 private:
139     double origin_;            /**< Interval start value */
140     double length_;            /**< Interval length */
141     double period_;            /**< The period, 0 if not periodic */
142     double spacing_;           /**< Point spacing */
143     int    numPoints_;         /**< Number of points in the interval */
144     int    numPointsInPeriod_; /**< Number of points in a period (0 if no periodicity) */
145 };
146
147 /*! \internal
148  * \brief A point in the grid.
149  *
150  * A grid point has a coordinate value and a coordinate index of the same dimensionality as the
151  * grid. It knows the linear indices of its neighboring point (which are useful only when handed up
152  * to the grid).
153  */
154 struct GridPoint
155 {
156     awh_dvec         coordValue; /**< Multidimensional coordinate value of this point */
157     awh_ivec         index;      /**< Multidimensional point indices */
158     std::vector<int> neighbor;   /**< Linear point indices of the neighboring points */
159 };
160
161 /*! \internal
162  * \brief The grid, generally multidimensional and periodic.
163  *
164  * The grid discretizes a multidimensional space with some given resolution.
165  * Each dimension is represented by an axis which sets the spatial extent,
166  * point spacing and periodicity of the grid in that direction.
167  */
168 class Grid
169 {
170 private:
171     /*! \brief Initializes the grid points.
172      */
173     void initPoints();
174
175 public:
176     /*! \brief
177      * The point density per sigma of the Gaussian distribution in an umbrella.
178      *
179      * This value should be at least 1 to uniformly cover the reaction coordinate
180      * range with density and having it larger than 1 does not add information.
181      */
182     static constexpr double c_numPointsPerSigma = 1.0;
183
184     //! Cut-off in sigma for considering points, neglects 4e-8 of the density.
185     static constexpr double c_scopeCutoff = 5.5;
186
187     /*! \brief Construct a grid using AWH input parameters.
188      *
189      * \param[in] dimParams     Dimension parameters including the expected inverse variance of the coordinate living on the grid (determines the grid spacing).
190      * \param[in] awhDimParams  Dimension params from inputrec.
191      */
192     Grid(const std::vector<DimParams>& dimParams, const AwhDimParams* awhDimParams);
193
194     /*! \brief Returns the number of points in the grid.
195      *
196      * \returns the number of points in the grid.
197      */
198     size_t numPoints() const { return point_.size(); }
199
200     /*! \brief Returns a reference to a point on the grid.
201      *
202      * \returns a constant reference to a point on the grid.
203      */
204     const GridPoint& point(size_t pointIndex) const { return point_[pointIndex]; }
205
206     /*! \brief Returns the dimensionality of the grid.
207      *
208      * \returns the dimensionality of the grid.
209      */
210     int numDimensions() const { return axis_.size(); }
211
212     /*! \brief Returns the grid axes.
213      *
214      * \returns a constant reference to the grid axes.
215      */
216     const std::vector<GridAxis>& axis() const { return axis_; }
217
218     /*! \brief Returns a grid axis.
219      *
220      * param[in] dim  Dimension to return the grid axis for.
221      * \returns a constant reference to the grid axis.
222      */
223     const GridAxis& axis(int dim) const { return axis_[dim]; }
224
225     /*! \brief Find the grid point with value nearest to the given value.
226      *
227      * \param[in] value  Value vector.
228      * \returns the grid point index.
229      */
230     int nearestIndex(const awh_dvec value) const;
231
232     /*! \brief Query if the value is in the grid.
233      *
234      * \param[in] value  Value vector.
235      * \returns true if the value is in the grid.
236      * \note It is assumed that any periodicity of value has already been taken care of.
237      */
238     bool covers(const awh_dvec value) const;
239
240 private:
241     std::vector<GridPoint> point_; /**< Points on the grid */
242     std::vector<GridAxis>  axis_;  /**< Axes, one for each dimension. */
243 };
244
245 /*! \endcond */
246
247 /*! \brief Convert a multidimensional grid point index to a linear one.
248  *
249  * \param[in] grid        The grid.
250  * \param[in] indexMulti  Multidimensional grid point index to convert to a linear one.
251  * \returns the linear index.
252  */
253 int multiDimGridIndexToLinear(const Grid& grid, const awh_ivec indexMulti);
254
255 /*! \brief Convert multidimensional array index to a linear one.
256  *
257  * \param[in] indexMulti    Multidimensional index to convert to a linear one.
258  * \param[in] numDim        Number of dimensions of the array.
259  * \param[in] numPointsDim  Number of points of the array.
260  * \returns the linear index.
261  * \note This function can be used without having an initialized grid.
262  */
263 int multiDimArrayIndexToLinear(const awh_ivec indexMulti, int numDim, const awh_ivec numPointsDim);
264
265 /*! \brief Convert a linear grid point index to a multidimensional one.
266  *
267  * \param[in]  grid         The grid.
268  * \param[in]  indexLinear  Linear grid point index to convert to a multidimensional one.
269  * \param[out] indexMulti   The multidimensional index.
270  */
271 void linearGridindexToMultiDim(const Grid& grid, int indexLinear, awh_ivec indexMulti);
272
273 /*! \brief Convert a linear array index to a multidimensional one.
274  *
275  * \param[in]  indexLinear   Linear array index
276  * \param[in]  ndim          Number of dimensions of the array.
277  * \param[in]  numPointsDim  Number of points for each dimension.
278  * \param[out] indexMulti    The multidimensional index.
279  */
280 void linearArrayIndexToMultiDim(int indexLinear, int ndim, const awh_ivec numPointsDim, awh_ivec indexMulti);
281
282 /*! \brief
283  * Find the next grid point in the sub-part of the grid given a starting point.
284  *
285  * The given grid point index is updated to the next valid grid point index
286  * by traversing the sub-part of the grid, here termed the subgrid.
287  * Since the subgrid range might extend beyond the actual size of the grid,
288  * the subgrid is traversed until a point both in the subgrid and grid is
289  * found. If no point is found, the function returns false and the index is
290  * not modified. The starting point needs to be inside of the subgrid. However,
291  * if this index is not given, meaning < 0, then the search is initialized at
292  * the subgrid origin, i.e. in this case the "next" grid point index is
293  * defined to be the first common grid/subgrid point.
294  *
295  * \param[in]     grid            The grid.
296  * \param[in]     subgridOrigin   Vector locating the subgrid origin relative to the grid origin.
297  * \param[in]     subgridNpoints  Number of points along each subgrid dimension.
298  * \param[in,out] gridPointIndex  Pointer to the starting/next grid point index.
299  * \returns true if the grid point was updated.
300  */
301 bool advancePointInSubgrid(const Grid&    grid,
302                            const awh_ivec subgridOrigin,
303                            const awh_ivec subgridNpoints,
304                            int*           gridPointIndex);
305
306 /*! \brief Maps each point in the grid to a point in the data grid.
307  *
308  * This functions maps an AWH bias grid to a user provided input data grid.
309  * The value of data grid point i along dimension d is given by data[d][i].
310  * The number of dimensions of the data should equal that of the grid.
311  * A fatal error is thrown if extracting the data fails or the data does not cover the whole grid.
312  *
313  * \param[out] gridpointToDatapoint  Array mapping each grid point to a data point index.
314  * \param[in]  data                  2D array in format ndim x ndatapoints with data grid point values.
315  * \param[in]  numDataPoints         Number of data points.
316  * \param[in]  dataFilename          The data filename.
317  * \param[in]  grid                  The grid.
318  * \param[in]  correctFormatMessage  String to include in error message if extracting the data fails.
319  */
320 void mapGridToDataGrid(std::vector<int>*    gridpointToDatapoint,
321                        const double* const* data,
322                        int                  numDataPoints,
323                        const std::string&   dataFilename,
324                        const Grid&          grid,
325                        const std::string&   correctFormatMessage);
326
327 /*! \brief
328  * Get the deviation along one dimension from the given value to a point in the grid.
329  *
330  * \param[in] grid        The grid.
331  * \param[in] dimIndex    Dimensional index in [0, ndim -1].
332  * \param[in] pointIndex  Grid point index.
333  * \param[in] value       Value along the given dimension.
334  * \returns the deviation of the given value to the given point.
335  */
336 double getDeviationFromPointAlongGridAxis(const Grid& grid, int dimIndex, int pointIndex, double value);
337
338 } // namespace gmx
339
340 #endif