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 by the GROMACS development team. 7 * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by 8 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, 9 * and including many others, as listed in the AUTHORS file in the 10 * top-level source directory and at http://www.gromacs.org. 11 * 12 * GROMACS is free software; you can redistribute it and/or 13 * modify it under the terms of the GNU Lesser General Public License 14 * as published by the Free Software Foundation; either version 2.1 15 * of the License, or (at your option) any later version. 16 * 17 * GROMACS is distributed in the hope that it will be useful, 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20 * Lesser General Public License for more details. 21 * 22 * You should have received a copy of the GNU Lesser General Public 23 * License along with GROMACS; if not, see 24 * http://www.gnu.org/licenses, or write to the Free Software Foundation, 25 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 26 * 27 * If you want to redistribute modifications to GROMACS, please 28 * consider that scientific software is very special. Version 29 * control is crucial - bugs must be traceable. We will be happy to 30 * consider code for inclusion in the official distribution, but 31 * derived work must not be called official GROMACS. Details are found 32 * in the README & COPYING files - if they are missing, get the 33 * official version at http://www.gromacs.org. 34 * 35 * To help us fund GROMACS development, we humbly ask that you cite 36 * the research papers on the package. Check out http://www.gromacs.org. 37 */ 38 39 #ifndef GMX_GMXPREPROCESS_READIR_H 40 #define GMX_GMXPREPROCESS_READIR_H 41 42 #include <string> 43 44 #include "gromacs/fileio/readinp.h" 45 #include "gromacs/math/vectypes.h" 46 #include "gromacs/utility/arrayref.h" 47 #include "gromacs/utility/real.h" 48 49 namespace gmx 50 { 51 class MDModules; 52 struct MdModulesNotifier; 53 } // namespace gmx 54 55 struct gmx_mtop_t; 56 struct gmx_output_env_t; 57 struct pull_params_t; 58 struct pull_t; 59 struct t_blocka; 60 struct t_grpopts; 61 struct t_inpfile; 62 struct t_inputrec; 63 struct t_pull_group; 64 struct t_pull_coord; 65 struct t_rot; 66 struct warninp; 67 typedef warninp* warninp_t; 68 69 enum 70 { 71 eshNONE, 72 eshHBONDS, 73 eshALLBONDS, 74 eshHANGLES, 75 eshALLANGLES, 76 eshNR 77 }; 78 79 enum 80 { 81 ecouplamVDWQ, 82 ecouplamVDW, 83 ecouplamQ, 84 ecouplamNONE, 85 ecouplamNR 86 }; 87 88 struct t_gromppopts 89 { 90 int warnings = 0; 91 int nshake = 0; 92 char* include = nullptr; 93 char* define = nullptr; 94 bool bGenVel = false; 95 bool bGenPairs = false; 96 real tempi = 0; 97 int seed = 0; 98 int numMtsLevels = 0; 99 std::string mtsLevel2Forces; 100 bool bOrire = false; 101 bool bMorse = false; 102 char* wall_atomtype[2] = { nullptr, nullptr }; 103 char* couple_moltype = nullptr; 104 int couple_lam0 = 0; 105 int couple_lam1 = 0; 106 bool bCoupleIntra = false; 107 }; 108 109 /*! \brief Initialise object to hold strings parsed from an .mdp file */ 110 void init_inputrec_strings(); 111 112 /*! \brief Clean up object that holds strings parsed from an .mdp file */ 113 void done_inputrec_strings(); 114 115 void check_ir(const char* mdparin, 116 const gmx::MdModulesNotifier& mdModulesNotifier, 117 t_inputrec* ir, 118 t_gromppopts* opts, 119 warninp_t wi); 120 /* Validate inputrec data. 121 * Fatal errors will be added to nerror. 122 */ 123 int search_string(const char* s, int ng, char* gn[]); 124 /* Returns the index of string s in the index groups */ 125 126 void double_check(t_inputrec* ir, matrix box, bool bHasNormalConstraints, bool bHasAnyConstraints, warninp_t wi); 127 /* Do more checks */ 128 129 void triple_check(const char* mdparin, t_inputrec* ir, gmx_mtop_t* sys, warninp_t wi); 130 /* Do even more checks */ 131 132 void get_ir(const char* mdparin, 133 const char* mdparout, 134 gmx::MDModules* mdModules, 135 t_inputrec* ir, 136 t_gromppopts* opts, 137 WriteMdpHeader writeMdpHeader, 138 warninp_t wi); 139 /* Read the input file, and retrieve data for inputrec. 140 * More data are read, but the are only evaluated when the next 141 * function is called. Also prints the input file back to mdparout. 142 */ 143 144 void do_index(const char* mdparin, 145 const char* ndx, 146 gmx_mtop_t* mtop, 147 bool bVerbose, 148 const gmx::MdModulesNotifier& notifier, 149 t_inputrec* ir, 150 warninp_t wi); 151 /* Read the index file and assign grp numbers to atoms. 152 */ 153 154 /* Routines In readpull.c */ 155 156 std::vector<std::string> read_pullparams(std::vector<t_inpfile>* inp, pull_params_t* pull, warninp_t wi); 157 /* Reads the pull parameters, returns a list of the pull group names */ 158 void process_pull_groups(gmx::ArrayRef<t_pull_group> pullGroups, 159 gmx::ArrayRef<const std::string> pullGroupNames, 160 const t_blocka* grps, 161 char** gnames); 162 /* Process the pull group parameters after reading the index groups */ 163 164 void checkPullCoords(gmx::ArrayRef<const t_pull_group> pullGroups, 165 gmx::ArrayRef<const t_pull_coord> pullCoords); 166 /* Process the pull coordinates after reading the pull groups */ 167 168 pull_t* set_pull_init(t_inputrec* ir, const gmx_mtop_t* mtop, rvec* x, matrix box, real lambda, warninp_t wi); 169 /* Prints the initial pull group distances in x. 170 * If requested, adds the current distance to the initial reference location. 171 * Returns the pull_t pull work struct. This should be passed to finish_pull() 172 * after all modules have registered their external potentials, if present. 173 */ 174 175 std::vector<std::string> read_rotparams(std::vector<t_inpfile>* inp, t_rot* rot, warninp_t wi); 176 /* Reads enforced rotation parameters, returns a list of the rot group names */ 177 178 void make_rotation_groups(t_rot* rot, 179 gmx::ArrayRef<const std::string> rotateGroupNames, 180 t_blocka* grps, 181 char** gnames); 182 /* Process the rotation parameters after reading the index groups */ 183 184 void set_reference_positions(t_rot* rot, rvec* x, matrix box, const char* fn, bool bSet, warninp_t wi); 185 186 #endif 187