2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 2019,2020,2021, 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.
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.
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.
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.
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.
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.
37 * Declares force provider for density fitting
39 * \author Christian Blau <blau@kth.se>
40 * \ingroup module_applied_forces
42 #ifndef GMX_APPLIED_FORCES_DENSITYFITTINGFORCEPROVIDER_H
43 #define GMX_APPLIED_FORCES_DENSITYFITTINGFORCEPROVIDER_H
47 #include "gromacs/fileio/checkpoint.h"
48 #include "gromacs/math/exponentialmovingaverage.h"
49 #include "gromacs/mdspan/extensions.h"
50 #include "gromacs/mdtypes/iforceprovider.h"
52 enum class PbcType : int;
58 class TranslateAndScale;
59 struct DensityFittingParameters;
62 * \brief Parameters defining the internal density fitting force provider state.
64 struct DensityFittingForceProviderState
66 /*! \brief The steps since the last force calculation.
67 * Used if density fitting is to be calculated every N steps.
69 std::int64_t stepsSinceLastCalculation_ = 0;
70 /*! \brief String naming variable holding the steps since last calculation.
71 * \note Changing this name will break backwards compability for checkpoint file writing.
73 static const std::string stepsSinceLastCalculationName_;
74 //! The state of the exponential moving average of the similarity measure
75 ExponentialMovingAverageState exponentialMovingAverageState_ = {};
76 /*! \brief String naming variable holding the exponential moving average.
77 * \note Changing this name will break backwards compability for checkpoint file writing.
79 static const std::string exponentialMovingAverageStateName_;
81 //! An additional factor scaling the force for adaptive force scaling
82 real adaptiveForceConstantScale_ = 1.0_real;
83 /*! \brief String naming variable holding the adaptive force constant scale.
84 * \note Changing this name will break backwards compability for checkpoint file writing.
86 static const std::string adaptiveForceConstantScaleName_;
88 /*! \brief Write internal density fitting data into a key value tree.
89 * The entries to the kvt are identified with identifier, so that a variable
90 * is indentified with the key "identifier-variablename"
92 * \param[in] kvtBuilder enables writing to the Key-Value-Tree
93 * the state is written to
95 * \param[in] identifier denotes the module that is checkpointing the data
97 void writeState(KeyValueTreeObjectBuilder kvtBuilder, const std::string& identifier) const;
99 /*! \brief Read the internal parameters from the checkpoint file on master
100 * \param[in] kvtData holding the checkpoint information
101 * \param[in] identifier identifies the data in a key-value-tree
103 void readState(const KeyValueTreeObject& kvtData, const std::string& identifier);
105 /*! \brief Broadcast the internal parameters.
107 * \param[in] communicator to broadcast the state information
108 * \param[in] isParallelRun to determine if anything has to be broadcast at all
111 void broadcastState(MPI_Comm communicator, bool isParallelRun);
115 * Implements IForceProvider for density-fitting forces.
117 class DensityFittingForceProvider final : public IForceProvider
120 //! Construct force provider for density fitting from its parameters
121 DensityFittingForceProvider(const DensityFittingParameters& parameters,
122 basic_mdspan<const float, dynamicExtents3D> referenceDensity,
123 const TranslateAndScale& transformationToDensityLattice,
124 const LocalAtomSet& localAtomSet,
126 double simulationTimeStep,
127 const DensityFittingForceProviderState& state);
128 ~DensityFittingForceProvider();
129 /*!\brief Calculate forces that maximise goodness-of-fit with a reference density map.
130 * \param[in] forceProviderInput input for force provider
131 * \param[out] forceProviderOutput output for force provider
133 void calculateForces(const ForceProviderInput& forceProviderInput,
134 ForceProviderOutput* forceProviderOutput) override;
136 /*! \brief Write internal density fitting data to checkpoint file.
137 * \param[in] checkpointWriting enables writing to the Key-Value-Tree
138 * that is used for storing the checkpoint
140 * \param[in] moduleName names the module that is checkpointing this force-provider
142 * \note The provided state to checkpoint has to change if checkpointing
143 * is moved before the force provider call in the MD-loop.
145 void writeCheckpointData(MDModulesWriteCheckpointData checkpointWriting, const std::string& moduleName);
149 std::unique_ptr<Impl> impl_;
154 #endif // GMX_APPLIED_FORCES_DENSITYFITTINGFORCEPROVIDER_H