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.
36 * \brief Declares the force element for the modular simulator
38 * This element calculates the forces, with or without shells or
39 * flexible constraints.
41 * \author Pascal Merz <pascal.merz@me.com>
42 * \ingroup module_modularsimulator
44 * This header is only used within the modular simulator module
47 #ifndef GMX_MODULARSIMULATOR_FORCEELEMENT_H
48 #define GMX_MODULARSIMULATOR_FORCEELEMENT_H
52 #include "gromacs/domdec/dlbtiming.h"
53 #include "gromacs/mdtypes/md_enums.h"
54 #include "gromacs/utility/enumerationhelpers.h"
55 #include "gromacs/utility/real.h"
57 #include "modularsimulatorinterfaces.h"
58 #include "topologyholder.h"
70 class FreeEnergyPerturbationData;
71 class GlobalCommunicationHelper;
73 class LegacySimulatorData;
75 class MdrunScheduleWorkload;
76 class ModularSimulatorAlgorithmBuilderHelper;
77 class StatePropagatorData;
78 class VirtualSitesHandler;
81 * \ingroup module_modularsimulator
82 * \brief Force element
84 * The force element manages the call to either
85 * do_force(...) or relax_shell_flexcon(...)
87 class ForceElement final :
88 public ISimulatorElement,
89 public ITopologyHolderClient,
90 public INeighborSearchSignallerClient,
91 public IEnergySignallerClient
95 ForceElement(StatePropagatorData* statePropagatorData,
96 EnergyData* energyData,
97 FreeEnergyPerturbationData* freeEnergyPerturbationData,
102 const t_inputrec* inputrec,
103 const MDAtoms* mdAtoms,
106 gmx_wallcycle* wcycle,
107 MdrunScheduleWorkload* runScheduleWork,
108 VirtualSitesHandler* vsite,
109 ImdSession* imdSession,
112 const gmx_mtop_t* globalTopology,
113 gmx_enfrot* enforcedRotation);
115 /*! \brief Register force calculation for step / time
117 * \param step The step number
118 * \param time The time
119 * \param registerRunFunction Function allowing to register a run function
121 void scheduleTask(Step step, Time time, const RegisterRunFunction& registerRunFunction) override;
123 //! Check that we got the local topology
124 void elementSetup() override;
125 //! Print some final output
126 void elementTeardown() override;
128 /*! \brief Factory method implementation
130 * \param legacySimulatorData Pointer allowing access to simulator level data
131 * \param builderHelper ModularSimulatorAlgorithmBuilder helper object
132 * \param statePropagatorData Pointer to the \c StatePropagatorData object
133 * \param energyData Pointer to the \c EnergyData object
134 * \param freeEnergyPerturbationData Pointer to the \c FreeEnergyPerturbationData object
135 * \param globalCommunicationHelper Pointer to the \c GlobalCommunicationHelper object
137 * \return Pointer to the element to be added. Element needs to have been stored using \c storeElement
139 static ISimulatorElement* getElementPointerImpl(LegacySimulatorData* legacySimulatorData,
140 ModularSimulatorAlgorithmBuilderHelper* builderHelper,
141 StatePropagatorData* statePropagatorData,
142 EnergyData* energyData,
143 FreeEnergyPerturbationData* freeEnergyPerturbationData,
144 GlobalCommunicationHelper* globalCommunicationHelper);
147 //! ITopologyHolderClient implementation
148 void setTopology(const gmx_localtop_t* top) override;
149 //! INeighborSearchSignallerClient implementation
150 std::optional<SignallerCallback> registerNSCallback() override;
151 //! IEnergySignallerClient implementation
152 std::optional<SignallerCallback> registerEnergyCallback(EnergySignallerEvent event) override;
153 //! The actual do_force call
154 template<bool doShellFC>
155 void run(Step step, Time time, unsigned int flags);
157 //! The shell / FC helper struct
158 gmx_shellfc_t* shellfc_;
159 //! Whether shells or flexible constraints are present
160 const bool doShellFC_;
164 //! The next energy calculation step
165 Step nextEnergyCalculationStep_;
166 //! The next energy calculation step
167 Step nextVirialCalculationStep_;
168 //! The next free energy calculation step
169 Step nextFreeEnergyCalculationStep_;
171 // TODO: Clarify relationship to data objects and find a more robust alternative to raw pointers (#3583)
172 //! Pointer to the micro state
173 StatePropagatorData* statePropagatorData_;
174 //! Pointer to the energy data
175 EnergyData* energyData_;
176 //! Pointer to the free energy perturbation data
177 FreeEnergyPerturbationData* freeEnergyPerturbationData_;
179 //! The local topology - updated by Topology via Client system
180 const gmx_localtop_t* localTopology_;
182 //! Whether we're having a dynamic box
183 const bool isDynamicBox_;
184 //! Whether we're being verbose
185 const bool isVerbose_;
186 //! The number of shell relaxation steps we did
187 Step nShellRelaxationSteps_;
189 //! DD / DLB helper object
190 const DDBalanceRegionHandler ddBalanceRegionHandler_;
192 /* \brief The FEP lambda vector
194 * Used if FEP is off, since do_force
195 * requires lambda to be allocated anyway
197 gmx::EnumerationArray<FreeEnergyPerturbationType, real> lambda_;
199 // Access to ISimulator data
202 //! Handles communication.
203 const t_commrec* cr_;
204 //! Contains user input mdp options.
205 const t_inputrec* inputrec_;
206 //! Atom parameters for this domain.
207 const MDAtoms* mdAtoms_;
208 //! Manages flop accounting.
210 //! Manages wall cycle accounting.
211 gmx_wallcycle* wcycle_;
212 //! Parameters for force calculations.
214 //! Handles virtual sites.
215 VirtualSitesHandler* vsite_;
216 //! The Interactive Molecular Dynamics session.
217 ImdSession* imdSession_;
218 //! The pull work object.
220 //! Schedule of work for each MD step for this task.
221 MdrunScheduleWorkload* runScheduleWork_;
222 //! Handles constraints.
223 Constraints* constr_;
224 //! Handles enforced rotation.
225 gmx_enfrot* enforcedRotation_;
230 #endif // GMX_MODULARSIMULATOR_FORCEELEMENT_H