1 /* 2 * This file is part of the GROMACS molecular simulation package. 3 * 4 * Copyright (c) 2013,2014,2015,2016,2017 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 #ifndef GMX_MDLIB_MDOUTF_H 37 #define GMX_MDLIB_MDOUTF_H 38 39 #include <stdio.h> 40 41 #include "gromacs/fileio/enxio.h" 42 #include "gromacs/math/vectypes.h" 43 #include "gromacs/timing/wallcycle.h" 44 #include "gromacs/utility/arrayref.h" 45 #include "gromacs/utility/basedefinitions.h" 46 47 class energyhistory_t; 48 struct gmx_mtop_t; 49 struct gmx_multisim_t; 50 struct gmx_output_env_t; 51 struct ObservablesHistory; 52 struct t_commrec; 53 struct t_filenm; 54 struct t_inputrec; 55 56 namespace gmx 57 { 58 enum class StartingBehavior; 59 class IMDOutputProvider; 60 struct MdModulesNotifier; 61 struct MdrunOptions; 62 class WriteCheckpointDataHolder; 63 } // namespace gmx 64 65 typedef struct gmx_mdoutf* gmx_mdoutf_t; 66 67 /*! \brief Allocate and initialize object to manager trajectory writing output 68 * 69 * Returns a pointer to a data structure with all output file pointers 70 * and names required by mdrun. 71 */ 72 gmx_mdoutf_t init_mdoutf(FILE* fplog, 73 int nfile, 74 const t_filenm fnm[], 75 const gmx::MdrunOptions& mdrunOptions, 76 const t_commrec* cr, 77 gmx::IMDOutputProvider* outputProvider, 78 const gmx::MdModulesNotifier& mdModulesNotifier, 79 const t_inputrec* ir, 80 const gmx_mtop_t* mtop, 81 const gmx_output_env_t* oenv, 82 gmx_wallcycle_t wcycle, 83 gmx::StartingBehavior startingBehavior, 84 bool simulationsShareState, 85 const gmx_multisim_t* ms); 86 87 /*! \brief Getter for file pointer */ 88 ener_file_t mdoutf_get_fp_ene(gmx_mdoutf_t of); 89 90 /*! \brief Getter for file pointer */ 91 FILE* mdoutf_get_fp_dhdl(gmx_mdoutf_t of); 92 93 /*! \brief Getter for wallcycle timer */ 94 gmx_wallcycle_t mdoutf_get_wcycle(gmx_mdoutf_t of); 95 96 /*! \brief Close TNG files if they are open. 97 * 98 * This also measures the time it takes to close the TNG 99 * files. 100 */ 101 void mdoutf_tng_close(gmx_mdoutf_t of); 102 103 /*! \brief Close all open output files and free the of pointer */ 104 void done_mdoutf(gmx_mdoutf_t of); 105 106 /*! \brief Routine that writes trajectory-like frames. 107 * 108 * Writes data to trn, xtc and/or checkpoint. What is written is 109 * determined by the mdof_flags defined below. Data is collected to 110 * the master node only when necessary. Without domain decomposition 111 * only data from state_local is used and state_global is ignored. 112 * 113 * Note that the mdoutf_write_checkpoint function below allows to 114 * write only the checkpoint file, and does no data gathering. 115 * Except for the modular simulator checkpointing, the 116 * mdoutf_write_to_trajectory_files function is used for 117 * _all trajectory / checkpoint writing_. 118 * 119 * \param[in] fplog File handler to log file. 120 * \param[in] cr Communication record. 121 * \param[in] of File handler to trajectory file. 122 * \param[in] mdof_flags Flags indicating what data is written. 123 * \param[in] natoms The total number of atoms in the system. 124 * \param[in] step The current time step. 125 * \param[in] t The current time. 126 * \param[in] state_local Pointer to the local state object. 127 * \param[in] state_global Pointer to the global state object. 128 * \param[in] observablesHistory Pointer to the ObservableHistory object. 129 * \param[in] f_local The local forces. 130 * \param[in] modularSimulatorCheckpointData CheckpointData object used by modular simulator. 131 */ 132 void mdoutf_write_to_trajectory_files(FILE* fplog, 133 const t_commrec* cr, 134 gmx_mdoutf_t of, 135 int mdof_flags, 136 int natoms, 137 int64_t step, 138 double t, 139 t_state* state_local, 140 t_state* state_global, 141 ObservablesHistory* observablesHistory, 142 gmx::ArrayRef<const gmx::RVec> f_local, 143 gmx::WriteCheckpointDataHolder* modularSimulatorCheckpointData); 144 145 /*! \brief Routine allowing to write checkpoint files directly. 146 * 147 * Unlike mdoutf_write_to_trajectory_files, this will only write a checkpoint file, 148 * and it will not gather the state over the different ranks. 149 * 150 * This should only be called if no other trajectory file writing is needed, and 151 * the global state has all required information. Currently, this is only used by 152 * the modular checkpointing facility. 153 * 154 * \param[in] of File handler to trajectory file. 155 * \param[in] fplog File handler to log file. 156 * \param[in] cr Communication record. 157 * \param[in] step The current time step. 158 * \param[in] t The current time. 159 * \param[in] state_global Pointer to the global state object. 160 * \param[in] observablesHistory Pointer to the ObservableHistory object. 161 * \param[in] modularSimulatorCheckpointData CheckpointData object used by modular simulator. 162 */ 163 void mdoutf_write_checkpoint(gmx_mdoutf_t of, 164 FILE* fplog, 165 const t_commrec* cr, 166 int64_t step, 167 double t, 168 t_state* state_global, 169 ObservablesHistory* observablesHistory, 170 gmx::WriteCheckpointDataHolder* modularSimulatorCheckpointData); 171 172 /*! \brief Get the output interval of box size of uncompressed TNG output. 173 * Returns 0 if no uncompressed TNG file is open. 174 */ 175 int mdoutf_get_tng_box_output_interval(gmx_mdoutf_t of); 176 177 /*! \brief Get the output interval of lambda of uncompressed TNG output. 178 * Returns 0 if no uncompressed TNG file is open. 179 */ 180 int mdoutf_get_tng_lambda_output_interval(gmx_mdoutf_t of); 181 182 /*! \brief Get the output interval of box size of compressed TNG output. 183 * Returns 0 if no compressed TNG file is open. 184 */ 185 int mdoutf_get_tng_compressed_box_output_interval(gmx_mdoutf_t of); 186 187 /*! \brief Get the output interval of lambda of compressed TNG output. 188 * Returns 0 if no compressed TNG file is open. 189 */ 190 int mdoutf_get_tng_compressed_lambda_output_interval(gmx_mdoutf_t of); 191 192 #define MDOF_X (1u << 0u) 193 #define MDOF_V (1u << 1u) 194 #define MDOF_F (1u << 2u) 195 #define MDOF_X_COMPRESSED (1u << 3u) 196 #define MDOF_CPT (1u << 4u) 197 #define MDOF_IMD (1u << 5u) 198 #define MDOF_BOX (1u << 6u) 199 #define MDOF_LAMBDA (1u << 7u) 200 #define MDOF_BOX_COMPRESSED (1u << 8u) 201 #define MDOF_LAMBDA_COMPRESSED (1u << 9u) 202 203 #endif 204