Apply clang-format to source tree
[alexxy/gromacs.git] / src / gromacs / math / vecdump.cpp
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5  * Copyright (c) 2001-2004, The GROMACS development team.
6  * Copyright (c) 2013,2014,2015,2016,2017,2019, by the GROMACS development team, led by
7  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8  * and including many others, as listed in the AUTHORS file in the
9  * top-level source directory and at http://www.gromacs.org.
10  *
11  * GROMACS is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public License
13  * as published by the Free Software Foundation; either version 2.1
14  * of the License, or (at your option) any later version.
15  *
16  * GROMACS is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public
22  * License along with GROMACS; if not, see
23  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
25  *
26  * If you want to redistribute modifications to GROMACS, please
27  * consider that scientific software is very special. Version
28  * control is crucial - bugs must be traceable. We will be happy to
29  * consider code for inclusion in the official distribution, but
30  * derived work must not be called official GROMACS. Details are found
31  * in the README & COPYING files - if they are missing, get the
32  * official version at http://www.gromacs.org.
33  *
34  * To help us fund GROMACS development, we humbly ask that you cite
35  * the research papers on the package. Check out http://www.gromacs.org.
36  */
37 #include "gmxpre.h"
38
39 #include "vecdump.h"
40
41 #include <cstdio>
42 #include <cstdlib>
43
44 #include "gromacs/math/vec.h"
45 #include "gromacs/utility/strconvert.h"
46 #include "gromacs/utility/txtdump.h"
47
48 void pr_ivec(FILE* fp, int indent, const char* title, const int vec[], int n, gmx_bool bShowNumbers)
49 {
50     int i;
51
52     if (available(fp, vec, indent, title))
53     {
54         indent = pr_title_n(fp, indent, title, n);
55         for (i = 0; i < n; i++)
56         {
57             pr_indent(fp, indent);
58             fprintf(fp, "%s[%d]=%d\n", title, bShowNumbers ? i : -1, vec[i]);
59         }
60     }
61 }
62
63 void pr_ivec_block(FILE* fp, int indent, const char* title, const int vec[], int n, gmx_bool bShowNumbers)
64 {
65     int i, j;
66
67     if (available(fp, vec, indent, title))
68     {
69         indent = pr_title_n(fp, indent, title, n);
70         i      = 0;
71         while (i < n)
72         {
73             j = i + 1;
74             while (j < n && vec[j] == vec[j - 1] + 1)
75             {
76                 j++;
77             }
78             /* Print consecutive groups of 3 or more as blocks */
79             if (j - i < 3)
80             {
81                 while (i < j)
82                 {
83                     pr_indent(fp, indent);
84                     fprintf(fp, "%s[%d]=%d\n", title, bShowNumbers ? i : -1, vec[i]);
85                     i++;
86                 }
87             }
88             else
89             {
90                 pr_indent(fp, indent);
91                 fprintf(fp, "%s[%d,...,%d] = {%d,...,%d}\n", title, bShowNumbers ? i : -1,
92                         bShowNumbers ? j - 1 : -1, vec[i], vec[j - 1]);
93                 i = j;
94             }
95         }
96     }
97 }
98
99 void pr_bvec(FILE* fp, int indent, const char* title, const gmx_bool vec[], int n, gmx_bool bShowNumbers)
100 {
101     int i;
102
103     if (available(fp, vec, indent, title))
104     {
105         indent = pr_title_n(fp, indent, title, n);
106         for (i = 0; i < n; i++)
107         {
108             pr_indent(fp, indent);
109             fprintf(fp, "%s[%d]=%s\n", title, bShowNumbers ? i : -1, gmx::boolToString(vec[i]));
110         }
111     }
112 }
113
114 void pr_ivecs(FILE* fp, int indent, const char* title, const ivec vec[], int n, gmx_bool bShowNumbers)
115 {
116     int i, j;
117
118     if (available(fp, vec, indent, title))
119     {
120         indent = pr_title_nxn(fp, indent, title, n, DIM);
121         for (i = 0; i < n; i++)
122         {
123             pr_indent(fp, indent);
124             fprintf(fp, "%s[%d]={", title, bShowNumbers ? i : -1);
125             for (j = 0; j < DIM; j++)
126             {
127                 if (j != 0)
128                 {
129                     fprintf(fp, ", ");
130                 }
131                 fprintf(fp, "%d", vec[i][j]);
132             }
133             fprintf(fp, "}\n");
134         }
135     }
136 }
137
138 template<typename T>
139 static void printRealVector(FILE* fp, int indent, const char* title, const T vec[], int n, gmx_bool bShowNumbers)
140 {
141     if (available(fp, vec, indent, title))
142     {
143         indent = pr_title_n(fp, indent, title, n);
144         for (int i = 0; i < n; i++)
145         {
146             pr_indent(fp, indent);
147             fprintf(fp, "%s[%d]=%12.5e\n", title, bShowNumbers ? i : -1, vec[i]);
148         }
149     }
150 }
151
152 void pr_rvec(FILE* fp, int indent, const char* title, const real vec[], int n, gmx_bool bShowNumbers)
153 {
154     printRealVector<real>(fp, indent, title, vec, n, bShowNumbers);
155 }
156
157 void pr_fvec(FILE* fp, int indent, const char* title, const float vec[], int n, gmx_bool bShowNumbers)
158 {
159     printRealVector<float>(fp, indent, title, vec, n, bShowNumbers);
160 }
161
162 void pr_dvec(FILE* fp, int indent, const char* title, const double vec[], int n, gmx_bool bShowNumbers)
163 {
164     printRealVector<double>(fp, indent, title, vec, n, bShowNumbers);
165 }
166
167
168 void pr_rvecs_len(FILE* fp, int indent, const char* title, const rvec vec[], int n)
169 {
170     int i, j;
171
172     if (available(fp, vec, indent, title))
173     {
174         indent = pr_title_nxn(fp, indent, title, n, DIM);
175         for (i = 0; i < n; i++)
176         {
177             pr_indent(fp, indent);
178             fprintf(fp, "%s[%5d]={", title, i);
179             for (j = 0; j < DIM; j++)
180             {
181                 if (j != 0)
182                 {
183                     fprintf(fp, ", ");
184                 }
185                 fprintf(fp, "%12.5e", vec[i][j]);
186             }
187             fprintf(fp, "} len=%12.5e\n", norm(vec[i]));
188         }
189     }
190 }
191
192 void pr_rvecs(FILE* fp, int indent, const char* title, const rvec vec[], int n)
193 {
194     const char* fshort = "%12.5e";
195     const char* flong  = "%15.8e";
196     const char* format;
197     int         i, j;
198
199     if (getenv("GMX_PRINT_LONGFORMAT") != nullptr)
200     {
201         format = flong;
202     }
203     else
204     {
205         format = fshort;
206     }
207
208     if (available(fp, vec, indent, title))
209     {
210         indent = pr_title_nxn(fp, indent, title, n, DIM);
211         for (i = 0; i < n; i++)
212         {
213             pr_indent(fp, indent);
214             fprintf(fp, "%s[%5d]={", title, i);
215             for (j = 0; j < DIM; j++)
216             {
217                 if (j != 0)
218                 {
219                     fprintf(fp, ", ");
220                 }
221                 fprintf(fp, format, vec[i][j]);
222             }
223             fprintf(fp, "}\n");
224         }
225     }
226 }
227
228
229 void pr_rvecs_of_dim(FILE* fp, int indent, const char* title, const rvec vec[], int n, int dim)
230 {
231     const char* fshort = "%12.5e";
232     const char* flong  = "%15.8e";
233     const char* format;
234     int         i, j;
235
236     if (getenv("GMX_PRINT_LONGFORMAT") != nullptr)
237     {
238         format = flong;
239     }
240     else
241     {
242         format = fshort;
243     }
244
245     if (available(fp, vec, indent, title))
246     {
247         indent = pr_title_nxn(fp, indent, title, n, dim);
248         for (i = 0; i < n; i++)
249         {
250             pr_indent(fp, indent);
251             fprintf(fp, "%s[%5d]={", title, i);
252             for (j = 0; j < dim; j++)
253             {
254                 if (j != 0)
255                 {
256                     fprintf(fp, ", ");
257                 }
258                 fprintf(fp, format, vec[i][j]);
259             }
260             fprintf(fp, "}\n");
261         }
262     }
263 }