Improve docs and naming for MdModulesNotifiers
[alexxy/gromacs.git] / src / gromacs / applied_forces / densityfitting / densityfittingforceprovider.h
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
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.
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 /*! \internal \file
36  * \brief
37  * Declares force provider for density fitting
38  *
39  * \author Christian Blau <blau@kth.se>
40  * \ingroup module_applied_forces
41  */
42 #ifndef GMX_APPLIED_FORCES_DENSITYFITTINGFORCEPROVIDER_H
43 #define GMX_APPLIED_FORCES_DENSITYFITTINGFORCEPROVIDER_H
44
45 #include <memory>
46
47 #include "gromacs/fileio/checkpoint.h"
48 #include "gromacs/math/exponentialmovingaverage.h"
49 #include "gromacs/mdspan/extensions.h"
50 #include "gromacs/mdtypes/iforceprovider.h"
51
52 enum class PbcType : int;
53
54 namespace gmx
55 {
56
57 class LocalAtomSet;
58 class TranslateAndScale;
59 struct DensityFittingParameters;
60
61 /*! \internal
62  * \brief Parameters defining the internal density fitting force provider state.
63  */
64 struct DensityFittingForceProviderState
65 {
66     /*! \brief The steps since the last force calculation.
67      *  Used if density fitting is to be calculated every N steps.
68      */
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.
72      */
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.
78      */
79     static const std::string exponentialMovingAverageStateName_;
80
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.
85      */
86     static const std::string adaptiveForceConstantScaleName_;
87
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"
91      *
92      * \param[in] kvtBuilder enables writing to the Key-Value-Tree
93      *                              the state is written to
94      *
95      * \param[in] identifier denotes the module that is checkpointing the data
96      */
97     void writeState(KeyValueTreeObjectBuilder kvtBuilder, const std::string& identifier) const;
98
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
102      */
103     void readState(const KeyValueTreeObject& kvtData, const std::string& identifier);
104
105     /*! \brief Broadcast the internal parameters.
106      *
107      * \param[in] communicator to broadcast the state information
108      * \param[in] isParallelRun to determine if anything has to be broadcast at all
109      *
110      */
111     void broadcastState(MPI_Comm communicator, bool isParallelRun);
112 };
113
114 /*! \internal \brief
115  * Implements IForceProvider for density-fitting forces.
116  */
117 class DensityFittingForceProvider final : public IForceProvider
118 {
119 public:
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,
125                                 PbcType                  pbcType,
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
132      */
133     void calculateForces(const ForceProviderInput& forceProviderInput,
134                          ForceProviderOutput*      forceProviderOutput) override;
135
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
139      *                              information
140      * \param[in] moduleName names the module that is checkpointing this force-provider
141      *
142      * \note The provided state to checkpoint has to change if checkpointing
143      *       is moved before the force provider call in the MD-loop.
144      */
145     void writeCheckpointData(MDModulesWriteCheckpointData checkpointWriting, const std::string& moduleName);
146
147 private:
148     class Impl;
149     std::unique_ptr<Impl> impl_;
150 };
151
152 } // namespace gmx
153
154 #endif // GMX_APPLIED_FORCES_DENSITYFITTINGFORCEPROVIDER_H