6881111e60613897049147da154d70721519a11c
[alexxy/gromacs.git] / src / gromacs / math / units.cpp
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2010,2011,2014,2015,2017 by the GROMACS development team.
5  * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by
6  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
7  * and including many others, as listed in the AUTHORS file in the
8  * top-level source directory and at http://www.gromacs.org.
9  *
10  * GROMACS is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public License
12  * as published by the Free Software Foundation; either version 2.1
13  * of the License, or (at your option) any later version.
14  *
15  * GROMACS is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with GROMACS; if not, see
22  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
23  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
24  *
25  * If you want to redistribute modifications to GROMACS, please
26  * consider that scientific software is very special. Version
27  * control is crucial - bugs must be traceable. We will be happy to
28  * consider code for inclusion in the official distribution, but
29  * derived work must not be called official GROMACS. Details are found
30  * in the README & COPYING files - if they are missing, get the
31  * official version at http://www.gromacs.org.
32  *
33  * To help us fund GROMACS development, we humbly ask that you cite
34  * the research papers on the package. Check out http://www.gromacs.org.
35  */
36 #include "gmxpre.h"
37
38 #include "units.h"
39
40 #include <cstdio>
41
42 #include "gromacs/utility/cstringutil.h"
43
44 double convert2gmx(double x, int unit)
45 {
46     switch (unit)
47     {
48         case eg2cAngstrom: return x * A2NM;
49         case eg2cNm: return x;
50         case eg2cBohr: return x * BOHR2NM;
51         case eg2cKcal_Mole: return x / CAL2JOULE;
52         case eg2cHartree: return x * ONE_4PI_EPS0 / BOHR2NM; // NOLINT bugprone-branch-clone
53         case eg2cHartree_e: return x * ONE_4PI_EPS0 / BOHR2NM;
54         case eg2cAngstrom3: return x * A2NM * A2NM * A2NM;
55         case eg2cCoulomb: return x / E_CHARGE;
56         case eg2cDebye: return x * DEBYE2ENM;
57         case eg2cElectron: return x;
58         case eg2cBuckingham: return x * A2NM * DEBYE2ENM;
59         default: fprintf(stderr, "Unknown unit %d, not converting.\n", unit);
60     }
61     return x;
62 }
63
64 double gmx2convert(double x, int unit)
65 {
66     switch (unit)
67     {
68         case eg2cAngstrom: return x / A2NM;
69         case eg2cNm: return x;
70         case eg2cBohr: return x / BOHR2NM;
71         case eg2cKcal_Mole: return x * CAL2JOULE;
72         case eg2cHartree: return x / (ONE_4PI_EPS0 / BOHR2NM); // NOLINT bugprone-branch-clone
73         case eg2cHartree_e: return x / (ONE_4PI_EPS0 / BOHR2NM);
74         case eg2cAngstrom3: return x / (A2NM * A2NM * A2NM);
75         case eg2cCoulomb: return x * E_CHARGE;
76         case eg2cDebye: return x / DEBYE2ENM;
77         case eg2cElectron: return x;
78         case eg2cBuckingham: return x / (A2NM * DEBYE2ENM);
79         default: fprintf(stderr, "Unknown unit %d, not converting.\n", unit);
80     }
81     return x;
82 }
83
84 /* This has to have the same order as the enums. */
85 static const char* eg2c_names[eg2cNR] = { "Angstrom", "Nm",        "Bohr",      "Kcal_Mole",
86                                           "Hartree",  "Hartree_e", "Angstrom3", "Coulomb",
87                                           "Debye",    "Electron",  "Buckingham" };
88
89 int string2unit(char* string)
90 {
91     int i;
92
93     for (i = 0; (i < eg2cNR); i++)
94     {
95         if (gmx_strcasecmp(string, eg2c_names[i]) == 0)
96         {
97             return i;
98         }
99     }
100     return -1;
101 }
102
103 const char* unit2string(int unit)
104 {
105     if ((unit >= 0) && (unit < eg2cNR))
106     {
107         return eg2c_names[unit];
108     }
109
110     return nullptr;
111 }