MaMiCo 1.2
Loading...
Searching...
No Matches
InstanceHandling.h
1// Copyright (C) 2016 Technische Universitaet Muenchen
2// This file is part of the Mamico project. For conditions of distribution
3// and use, please see the copyright notice in Mamico's main folder, or at
4// www5.in.tum.de/mamico
5#ifndef _INSTANCE_HANDLING_H_
6#define _INSTANCE_HANDLING_H_
7
8#include "coupling/interface/MDSimulationFactory.h"
9#include "coupling/services/MultiMDCellService.h"
10#include "tarch/utils/MultiMDService.h"
11
12namespace coupling {
13template <class LinkedCell, unsigned int dim> class InstanceHandling;
14}
15class InstanceHandlingTest;
16
36template <class LinkedCell, unsigned int dim> class coupling::InstanceHandling {
37
38public:
44 InstanceHandling(simplemd::configurations::MolecularDynamicsConfiguration& mdConfig, coupling::configurations::MaMiCoConfiguration<dim>& mamicoConfig,
46 : _mdSimulations(), _mdSolverInterface(), _mdConfig(mdConfig), _mamicoConfig(mamicoConfig), _multiMDService(multiMDService) {
47 for (unsigned int i = 0; i < multiMDService.getLocalNumberOfMDSimulations(); i++) {
48 _mdSimulations.push_back(coupling::interface::SimulationAndInterfaceFactory::getInstance().getMDSimulation(_mdConfig, _mamicoConfig
49#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
50 ,
51 _multiMDService.getLocalCommunicator()
52#endif
53 ));
54
55 if (_mdSimulations[i] == nullptr) {
56 std::cout << "ERROR InstanceHandling : _mdSimulations [" << i << "] == NULL!" << std::endl;
57 std::exit(EXIT_FAILURE);
58 }
59
60 _mdSimulations[i]->init(_multiMDService, _multiMDService.getGlobalNumberOfLocalMDSimulation(i));
61 }
62 }
63
66 ~InstanceHandling() { shutdown(); }
67
74 void equilibrate(const unsigned int& t, const unsigned int& T) {
75 for (auto& md : _mdSimulations) {
76 md->switchOffCoupling();
77 md->simulateTimesteps(t, T);
78 }
79 }
80
84 auto& getSimpleMD() const { return _mdSimulations; }
85
90
91 for (unsigned int i = 0; i < _mdSimulations.size(); ++i) {
92 _mdSolverInterface.push_back(
94 if (_mdSolverInterface[i] == NULL) {
95 std::cout << "ERROR InstanceHandling: mdSolverInterface[" << i << "] == NULL!" << std::endl;
96 exit(EXIT_FAILURE);
97 }
98 }
99 }
100
104 auto& getMDSolverInterface() const { return _mdSolverInterface; }
105
111 for (auto& simpleMD : _mdSimulations) {
112 simpleMD->switchOnCoupling();
113 }
114 }
115
121 void switchOnCoupling(const unsigned int& i) { _mdSimulations[i]->switchOnCoupling(); }
122
127 for (auto& simpleMD : _mdSimulations) {
128 simpleMD->switchOffCoupling();
129 }
130 }
131
136 void switchOffCoupling(const unsigned int& i) { _mdSimulations[i]->switchOffCoupling(); }
137
142 void simulateTimesteps(const unsigned int& t, unsigned int& T) {
143 for (auto& simpleMD : _mdSimulations) {
144 simpleMD->simulateTimesteps(t, T);
145 }
146 }
147
153 void writeCheckpoint(const std::string& filestem, const unsigned int& T) const {
154 if (_mdSimulations.size() > 0 && _mdSimulations[0] != nullptr) {
155 _mdSimulations[0]->writeCheckpoint(filestem, T);
156 }
157 }
158
165 void simulateTimesteps(const unsigned int& t, unsigned int& T, coupling::services::MultiMDCellService<LinkedCell, dim>& multiMDCellService) {
166 for (unsigned int i = 0; i < _mdSimulations.size(); ++i) {
169
170 if (_mdSimulations[i] != nullptr) {
171 _mdSimulations[i]->simulateTimesteps(t, T);
172 }
173 }
174 }
175
182 void simulateTimesteps(const unsigned int& t, unsigned int& T, const unsigned int& i) { _mdSimulations[i]->simulateTimesteps(t, T); }
183
188 _mdSimulations.push_back(nullptr);
189 _mdSolverInterface.push_back(nullptr);
190 }
191
196 _mdSimulations.pop_back();
197 _mdSolverInterface.pop_back();
198 }
199
210#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
211 ,
212 _multiMDService.getLocalCommunicator()
213#endif
214 );
215 if (mdSim == NULL) {
216 std::cout << "ERROR! coupling::InstanceHandling::addMDSimulation(): "
217 "mdSim == NULL!"
218 << std::endl;
219 std::exit(EXIT_FAILURE);
220 }
221 // NB: ls1 coupling will break if getMDSolverInterface does not happen immediately after init()
222 // since the solver interface relies on the global simulation instance set by ls1 in init()
223
224 mdSim->init(_multiMDService, slot);
225
226 _mdSimulations[localIndex] = mdSim;
227
228 _mdSolverInterface[localIndex] =
229 coupling::interface::SimulationAndInterfaceFactory::getInstance().getMDSolverInterface(_mdConfig, _mamicoConfig, _mdSimulations[localIndex]);
230
231 return _mdSolverInterface[localIndex];
232 }
233
238 void rmMDSimulation(const unsigned int& index) {
239 if (_mdSimulations[index] != nullptr) {
240 _mdSimulations[index]->shutdown();
241 delete _mdSimulations[index];
242 _mdSimulations[index] = nullptr;
243 } else {
244 std::cout << "WARNING coupling::InstanceHandling::rmMDSimulation() : "
245 "_mdSimulations at index "
246 << index << " == null!" << std::endl;
247 }
248 //_mdSimulations.erase(_mdSimulations.begin()+index);
249
250 if (_mdSolverInterface[index] != nullptr) {
251 delete _mdSolverInterface[index];
252 _mdSolverInterface[index] = nullptr;
253 } else {
254 std::cout << "WARNING coupling::InstanceHandling::rmMDSimulation() : "
255 "_mdSolverInterface at index "
256 << index << " == null!" << std::endl;
257 }
258 //_mdSolverInterface.erase(_mdSolverInterface.begin()+index);
259 }
260
266 for (unsigned int i = 0; i < _mdSimulations.size(); ++i) {
267 _mdSimulations[i]->setCouplingCellService(&(multiMDCellService.getCouplingCellService(i)));
268 }
269 }
270
271private:
272 void shutdown() {
273 for (unsigned int i = 0; i < _mdSimulations.size(); ++i) {
275 if (_mdSimulations[i] != nullptr) {
276 _mdSimulations[i]->shutdown();
277 delete _mdSimulations[i];
278 _mdSimulations[i] = nullptr;
279 }
281 }
282 _mdSimulations.clear();
283 for (auto& solverInterface : _mdSolverInterface) {
284 if (solverInterface != nullptr) {
285 delete solverInterface;
286 solverInterface = nullptr;
287 }
288 }
289 _mdSolverInterface.clear();
290 }
291
292 std::vector<coupling::interface::MDSimulation*> _mdSimulations;
293 std::vector<coupling::interface::MDSolverInterface<LinkedCell, dim>*> _mdSolverInterface;
294
295 simplemd::configurations::MolecularDynamicsConfiguration& _mdConfig;
296 coupling::configurations::MaMiCoConfiguration<dim>& _mamicoConfig;
297
298 const tarch::utils::MultiMDService<dim>& _multiMDService;
299 friend InstanceHandlingTest;
300};
301
302#endif //_INSTANCE_HANDLING_H_
Simulation slots are managed (i.e., added/removed) via this class. Works and interacts with the class...
Definition InstanceHandling.h:36
InstanceHandling(simplemd::configurations::MolecularDynamicsConfiguration &mdConfig, coupling::configurations::MaMiCoConfiguration< dim > &mamicoConfig, tarch::utils::MultiMDService< dim > &multiMDService)
Definition InstanceHandling.h:44
auto & getMDSolverInterface() const
Definition InstanceHandling.h:104
void setMDSolverInterface()
Definition InstanceHandling.h:89
void simulateTimesteps(const unsigned int &t, unsigned int &T, const unsigned int &i)
Definition InstanceHandling.h:182
auto & getSimpleMD() const
Definition InstanceHandling.h:84
void simulateTimesteps(const unsigned int &t, unsigned int &T, coupling::services::MultiMDCellService< LinkedCell, dim > &multiMDCellService)
Definition InstanceHandling.h:165
void switchOnCoupling(const unsigned int &i)
Definition InstanceHandling.h:121
void writeCheckpoint(const std::string &filestem, const unsigned int &T) const
Definition InstanceHandling.h:153
void switchOffCoupling(const unsigned int &i)
Definition InstanceHandling.h:136
void switchOffCoupling()
Definition InstanceHandling.h:126
void equilibrate(const unsigned int &t, const unsigned int &T)
Definition InstanceHandling.h:74
void rmMDSimulation(const unsigned int &index)
Definition InstanceHandling.h:238
void rmSimulationBlock()
Definition InstanceHandling.h:195
void setCouplingCellServices(coupling::services::MultiMDCellService< LinkedCell, dim > &multiMDCellService)
Definition InstanceHandling.h:265
void switchOnCoupling()
Definition InstanceHandling.h:110
void addSimulationBlock()
Definition InstanceHandling.h:187
coupling::interface::MDSolverInterface< LinkedCell, dim > * addMDSimulation(unsigned int slot, unsigned int localIndex)
Definition InstanceHandling.h:208
void simulateTimesteps(const unsigned int &t, unsigned int &T)
Definition InstanceHandling.h:142
~InstanceHandling()
Definition InstanceHandling.h:66
parses all sub-tags for MaMiCo configuration.
Definition MaMiCoConfiguration.h:31
interface to the MD simulation
Definition MDSolverInterface.h:25
void setMDSolverInterface(coupling::interface::MDSolverInterface< LinkedCell, dim > *mdSolverInterface)
Definition MamicoInterfaceProvider.h:48
coupling::interface::MDSolverInterface< LinkedCell, dim > * getMDSolverInterface()
Definition MamicoInterfaceProvider.h:53
static MamicoInterfaceProvider & getInstance()
Definition MamicoInterfaceProvider.h:28
void setCouplingCellService(coupling::services::CouplingCellService< dim > *couplingCellService)
Definition MamicoInterfaceProvider.h:58
static SimulationAndInterfaceFactory & getInstance()
Definition MDSimulationFactory.h:62
coupling::interface::MDSolverInterface< MY_LINKEDCELL, MDSIMULATIONFACTORY_DIMENSION > * getMDSolverInterface(const simplemd::configurations::MolecularDynamicsConfiguration &configuration, const coupling::configurations::MaMiCoConfiguration< MDSIMULATIONFACTORY_DIMENSION > &mamicoConfiguration, coupling::interface::MDSimulation *mdSimulation)
Definition MDSimulationFactory.h:122
coupling::interface::MDSimulation * getMDSimulation(const simplemd::configurations::MolecularDynamicsConfiguration &configuration, const coupling::configurations::MaMiCoConfiguration< MDSIMULATIONFACTORY_DIMENSION > &mamicoConfiguration, MPI_Comm localComm)
Definition MDSimulationFactory.h:74
Definition MultiMDCellService.h:29
coupling::services::CouplingCellService< dim > & getCouplingCellService(unsigned int localIndex)
Definition MultiMDCellService.h:157
Definition MultiMDService.h:30
everything necessary for coupling operations, is defined in here
Definition AdditiveMomentumInsertion.h:15