1 /* 2 * This file is part of the GROMACS molecular simulation package. 3 * 4 * Copyright (c) 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 /*! \file 36 * \brief 37 * Declares gmx:SetVelocities. 38 * 39 * \author Paul Bauer <paul.bauer.q@gmail.com> 40 * \inpublicapi 41 * \ingroup module_coordinateio 42 */ 43 #ifndef GMX_COORDINATEIO_SETVELOCITIES_H 44 #define GMX_COORDINATEIO_SETVELOCITIES_H 45 46 #include <memory> 47 48 #include "gromacs/coordinateio/ioutputadapter.h" 49 50 namespace gmx 51 { 52 53 /*!\brief 54 * SetVelocities class allows changing writing of velocities to file. 55 * 56 * This class allows the user to define if velocities should be written 57 * to the output coordinate file, and checks if they are available from the 58 * currently processed data. 59 * 60 * \inpublicapi 61 * \ingroup module_coordinateio 62 * 63 */ 64 class SetVelocities : public IOutputAdapter 65 { 66 public: 67 /*! \brief 68 * Construct SetVelocities object with choice for boolean value. 69 * 70 * Can be used to initialize SetVelocities from outside of trajectoryanalysis 71 * with the user specified option to write coordinate velocities or not. 72 */ SetVelocities(ChangeSettingType velocity)73 explicit SetVelocities(ChangeSettingType velocity) : velocity_(velocity) 74 { 75 if (velocity_ == ChangeSettingType::Never) 76 { 77 moduleRequirements_ = CoordinateFileFlags::Base; 78 } 79 else 80 { 81 moduleRequirements_ = CoordinateFileFlags::RequireVelocityOutput; 82 } 83 } 84 /*! \brief 85 * Move constructor for SetVelocities. 86 */ 87 SetVelocities(SetVelocities&& old) noexcept = default; 88 ~SetVelocities()89 ~SetVelocities() override {} 90 91 /*! \brief 92 * Change coordinate frame information for output. 93 * 94 * In this case, the correct flag for writing the velocities is applied 95 * to the output frame, depending on user selection and availability 96 * in the input data. 97 * 98 * \param[in] input Coordinate frame to be modified later. 99 */ 100 void processFrame(int /*framenumber*/, t_trxframe* input) override; 101 102 void checkAbilityDependencies(unsigned long abilities) const override; 103 104 private: 105 //! Flag to specify if velocities should be written. 106 ChangeSettingType velocity_; 107 //! Local requirements determined from user input. 108 CoordinateFileFlags moduleRequirements_; 109 }; 110 111 //! Smart pointer to manage the object. 112 using SetVelocitiesPointer = std::unique_ptr<SetVelocities>; 113 114 } // namespace gmx 115 116 #endif 117