5#ifndef _INSTANCE_HANDLING_H_
6#define _INSTANCE_HANDLING_H_
8#include "coupling/interface/MDSimulationFactory.h"
9#include "coupling/services/MultiMDCellService.h"
10#include "tarch/utils/MultiMDService.h"
45 : _mdSimulations(), _mdSolverInterface(), _mdConfig(mdConfig), _mamicoConfig(mamicoConfig), _multiMDService(multiMDService) {
46 for (
unsigned int i = 0; i < multiMDService.getLocalNumberOfMDSimulations(); i++) {
48#
if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
50 _multiMDService.getLocalCommunicator()
54 if (_mdSimulations[i] ==
nullptr) {
55 std::cout <<
"ERROR InstanceHandling : _mdSimulations [" << i <<
"] == NULL!" << std::endl;
56 std::exit(EXIT_FAILURE);
59 _mdSimulations[i]->init(_multiMDService, _multiMDService.getGlobalNumberOfLocalMDSimulation(i));
66 for (
unsigned int i = 0; i < _mdSimulations.size(); ++i) {
68 if (_mdSimulations[i] !=
nullptr) {
69 _mdSimulations[i]->shutdown();
70 delete _mdSimulations[i];
71 _mdSimulations[i] =
nullptr;
75 _mdSimulations.clear();
76 for (
auto& solverInterface : _mdSolverInterface) {
77 if (solverInterface !=
nullptr) {
78 delete solverInterface;
79 solverInterface =
nullptr;
82 _mdSolverInterface.clear();
91 void equilibrate(
const unsigned int& t,
const unsigned int& T) {
92 for (
auto& md : _mdSimulations) {
93 md->switchOffCoupling();
94 md->simulateTimesteps(t, T);
108 for (
unsigned int i = 0; i < _mdSimulations.size(); ++i) {
109 _mdSolverInterface.push_back(
111 if (_mdSolverInterface[i] == NULL) {
112 std::cout <<
"ERROR InstanceHandling: mdSolverInterface[" << i <<
"] == NULL!" << std::endl;
128 for (
auto& simpleMD : _mdSimulations) {
129 simpleMD->switchOnCoupling();
144 for (
auto& simpleMD : _mdSimulations) {
145 simpleMD->switchOffCoupling();
160 for (
auto& simpleMD : _mdSimulations) {
161 simpleMD->simulateTimesteps(t, T);
171 if (_mdSimulations.size() > 0 && _mdSimulations[0] !=
nullptr) {
172 _mdSimulations[0]->writeCheckpoint(filestem, T);
183 for (
unsigned int i = 0; i < _mdSimulations.size(); ++i) {
187 if (_mdSimulations[i] !=
nullptr) {
188 _mdSimulations[i]->simulateTimesteps(t, T);
199 void simulateTimesteps(
const unsigned int& t,
unsigned int& T,
const unsigned int& i) { _mdSimulations[i]->simulateTimesteps(t, T); }
205 _mdSimulations.push_back(
nullptr);
206 _mdSolverInterface.push_back(
nullptr);
213 _mdSimulations.pop_back();
214 _mdSolverInterface.pop_back();
227#
if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
229 _multiMDService.getLocalCommunicator()
233 std::cout <<
"ERROR! coupling::InstanceHandling::addMDSimulation(): "
236 std::exit(EXIT_FAILURE);
239 mdSim->
init(_multiMDService, slot);
241 _mdSimulations[localIndex] = mdSim;
243 _mdSolverInterface[localIndex] =
246 return _mdSolverInterface[localIndex];
254 if (_mdSimulations[index] !=
nullptr) {
255 _mdSimulations[index]->shutdown();
256 delete _mdSimulations[index];
257 _mdSimulations[index] =
nullptr;
259 std::cout <<
"WARNING coupling::InstanceHandling::rmMDSimulation() : "
260 "_mdSimulations at index "
261 << index <<
" == null!" << std::endl;
265 if (_mdSolverInterface[index] !=
nullptr) {
266 delete _mdSolverInterface[index];
267 _mdSolverInterface[index] =
nullptr;
269 std::cout <<
"WARNING coupling::InstanceHandling::rmMDSimulation() : "
270 "_mdSolverInterface at index "
271 << index <<
" == null!" << std::endl;
281 for (
unsigned int i = 0; i < _mdSimulations.size(); ++i) {
287 std::vector<coupling::interface::MDSimulation*> _mdSimulations;
288 std::vector<coupling::interface::MDSolverInterface<LinkedCell, dim>*> _mdSolverInterface;
290 simplemd::configurations::MolecularDynamicsConfiguration& _mdConfig;
Simulation slots are managed (i.e., added/removed) via this class. Works and interacts with the class...
Definition InstanceHandling.h:35
InstanceHandling(simplemd::configurations::MolecularDynamicsConfiguration &mdConfig, coupling::configurations::MaMiCoConfiguration< dim > &mamicoConfig, tarch::utils::MultiMDService< dim > &multiMDService)
Definition InstanceHandling.h:43
auto & getMDSolverInterface() const
Definition InstanceHandling.h:121
void setMDSolverInterface()
Definition InstanceHandling.h:106
void simulateTimesteps(const unsigned int &t, unsigned int &T, const unsigned int &i)
Definition InstanceHandling.h:199
auto & getSimpleMD() const
Definition InstanceHandling.h:101
void simulateTimesteps(const unsigned int &t, unsigned int &T, coupling::services::MultiMDCellService< LinkedCell, dim > &multiMDCellService)
Definition InstanceHandling.h:182
void switchOnCoupling(const unsigned int &i)
Definition InstanceHandling.h:138
void writeCheckpoint(const std::string &filestem, const unsigned int &T) const
Definition InstanceHandling.h:170
void switchOffCoupling(const unsigned int &i)
Definition InstanceHandling.h:153
void switchOffCoupling()
Definition InstanceHandling.h:143
void equilibrate(const unsigned int &t, const unsigned int &T)
Definition InstanceHandling.h:91
void rmMDSimulation(const unsigned int &index)
Definition InstanceHandling.h:253
void rmSimulationBlock()
Definition InstanceHandling.h:212
void setCouplingCellServices(coupling::services::MultiMDCellService< LinkedCell, dim > &multiMDCellService)
Definition InstanceHandling.h:280
void switchOnCoupling()
Definition InstanceHandling.h:127
void addSimulationBlock()
Definition InstanceHandling.h:204
coupling::interface::MDSolverInterface< LinkedCell, dim > * addMDSimulation(unsigned int slot, unsigned int localIndex)
Definition InstanceHandling.h:225
void simulateTimesteps(const unsigned int &t, unsigned int &T)
Definition InstanceHandling.h:159
~InstanceHandling()
Definition InstanceHandling.h:65
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:60
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:120
coupling::interface::MDSimulation * getMDSimulation(const simplemd::configurations::MolecularDynamicsConfiguration &configuration, const coupling::configurations::MaMiCoConfiguration< MDSIMULATIONFACTORY_DIMENSION > &mamicoConfiguration, MPI_Comm localComm)
Definition MDSimulationFactory.h:72
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