MaMiCo 1.2
Loading...
Searching...
No Matches
MDSimulationFactory.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 _MDSIMULATIONFACTORY_H_
6#define _MDSIMULATIONFACTORY_H_
7
8#include <ctime>
9#include <math.h>
10#include <string>
11
12// hacked: "currently, only 3D is supported!" (Defined before including headers in ./MDSimulationFactory/ using it)
13#define MDSIMULATIONFACTORY_DIMENSION 3
14
15#include "coupling/CouplingMDDefinitions.h"
16#include "coupling/configurations/MaMiCoConfiguration.h"
17#include "coupling/interface/MDSimulation.h"
18#include "coupling/interface/MamicoInterfaceProvider.h"
19#include "simplemd/configurations/MolecularDynamicsConfiguration.h"
20#include "tarch/la/ScalarOperations.h"
21#include "tarch/utils/MultiMDService.h"
22
23#if defined(SIMPLE_MD)
24#include "coupling/interface/impl/SimpleMD/SimpleMDSolverInterface.h"
25#include "coupling/interface/impl/SimpleMD/SimpleMDLinkedCellWrapper.h"
26#define MY_LINKEDCELL coupling::interface::SimpleMDLinkedCellWrapper
27#include "coupling/interface/impl/SimpleMD/SimpleMDSimulation.h"
28#elif defined(LAMMPS_MD) || defined(LAMMPS_DPD)
29#if defined(LAMMPS_MD)
30#include "coupling/interface/impl/LAMMPS/LammpsMDSimulation.h"
31#else // LAMMPS_DPD
32#include "coupling/interface/impl/LAMMPS/LammpsDPDSimulation.h"
33#endif
34#define MY_LINKEDCELL LAMMPS_NS::MamicoCell
35#elif defined(LS1_MARDYN)
36#include "coupling/interface/impl/ls1/LS1MDSimulation.h"
37#include "coupling/interface/impl/ls1/LS1MDSolverInterface.h"
38#include "coupling/interface/impl/ls1/LS1RegionWrapper.h"
39#include "coupling/interface/impl/ls1/LS1StaticCommData.h"
40#define MY_LINKEDCELL ls1::LS1RegionWrapper
41#else
42#error "No MD solver defined!"
43#endif
44
48namespace coupling {
49namespace interface {
50
58public:
63 static SimulationAndInterfaceFactory singleton;
64 return singleton;
65 }
66
74 coupling::interface::MDSimulation* getMDSimulation(const simplemd::configurations::MolecularDynamicsConfiguration& configuration,
76#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
77 ,
78 MPI_Comm localComm
79#endif
80 ) {
81#if defined(SIMPLE_MD)
82 return new coupling::interface::SimpleMDSimulation(configuration);
83#elif defined(LAMMPS_MD)
84 return new coupling::interface::LammpsMDSimulation(configuration, mamicoConfiguration
85#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
86 ,
87 localComm
88#endif
89 );
90#elif defined(LAMMPS_DPD)
91 return new coupling::interface::LammpsDPDSimulation(configuration, mamicoConfiguration
92#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
93 ,
94 localComm
95#endif
96 );
97#elif defined(LS1_MARDYN)
98 return new coupling::interface::LS1MDSimulation(configuration
99#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
100 ,
101 localComm
102#endif
103 );
104#else
105 std::cout << "ERROR MDSimulationFactory::getMDSimulation(): Unknown MD "
106 "simulation!"
107 << std::endl;
108 exit(EXIT_FAILURE);
109 return NULL;
110#endif
111 }
112
122 getMDSolverInterface(const simplemd::configurations::MolecularDynamicsConfiguration& configuration,
124 coupling::interface::MDSimulation* mdSimulation) {
126#if defined(SIMPLE_MD)
127 // for the simple MD code, we create a new md solver interface and also add
128 // it to the mamico interface provider (the latter is not really required,
129 // but makes the simulation state more consistent in the overall simulation)
130 coupling::interface::SimpleMDSimulation* simpleMDSimulation = (coupling::interface::SimpleMDSimulation*)mdSimulation;
131 if (simpleMDSimulation == NULL) {
132 std::cout << "ERROR MDSimulationFactory::getMDSolverInterface(): Could "
133 "not cast to SimpleMDSimulation!"
134 << std::endl;
135 exit(EXIT_FAILURE);
136 }
137 mdSolverInterface = new coupling::interface::SimpleMDSolverInterface(
138 simpleMDSimulation->getBoundaryTreatment(), simpleMDSimulation->getParallelTopologyService(), simpleMDSimulation->getMoleculeService(),
139 simpleMDSimulation->getMolecularPropertiesService(), (simpleMDSimulation->getParallelTopologyService()).getLocalBoundaryInformation(),
140 configuration.getSimulationConfiguration().getDt());
142#elif defined(LAMMPS_MD)
143 // as switchOnCoupling() should have been called before this method, the
144 // fix-mamico should be already initialised. hence the MDSolverInterface of
145 // the mamico interface provider should be initialised at this stage
147#elif defined(LAMMPS_DPD)
149#elif defined(LS1_MARDYN)
150 mdSolverInterface = new coupling::interface::LS1MDSolverInterface(mamicoConfiguration.getCouplingCellConfiguration().getCouplingCellSize(),
151 mamicoConfiguration.getCouplingCellConfiguration().getNumberLinkedCellsPerCouplingCell());
153#endif
154
155 if (mdSolverInterface == NULL) {
156 std::cout << "ERROR MDSimulationFactory::getMDSolverInterface(): "
157 "mdSolverInterface==NULL!"
158 << std::endl;
159 exit(EXIT_FAILURE);
160 }
161 return mdSolverInterface;
162 }
163
167#if defined(SIMPLE_MD)
169 coupling::interface::MamicoInterfaceProvider<MY_LINKEDCELL, MDSIMULATIONFACTORY_DIMENSION>::getInstance().getMDSolverInterface();
170 if (interface != NULL) {
171 delete interface;
172 }
174#elif defined(LAMMPS_MD)
175// nop, since the fix-mamico takes care of deleting the MD solver interface
176#elif defined(LAMMPS_DPD)
177// nop
178#elif defined(LS1_MARDYN)
180 coupling::interface::MamicoInterfaceProvider<MY_LINKEDCELL, MDSIMULATIONFACTORY_DIMENSION>::getInstance().getMDSolverInterface();
181 if (interface != NULL) {
182 delete interface;
183 }
185#endif
186 }
187
188private:
197};
198
199} // namespace interface
200} // namespace coupling
201#endif // _MDSIMULATIONFACTORY_H_
parses all sub-tags for MaMiCo configuration.
Definition MaMiCoConfiguration.h:31
const coupling::configurations::CouplingCellConfiguration< dim > & getCouplingCellConfiguration() const
Definition MaMiCoConfiguration.h:68
generic interface class for different microscopic (MD) solvers.
Definition MDSimulation.h:11
interface to the MD simulation
Definition MDSolverInterface.h:25
a singleton which returns and stores the interface implementations.
Definition MamicoInterfaceProvider.h:24
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
~SimulationAndInterfaceFactory()
Definition MDSimulationFactory.h:196
static SimulationAndInterfaceFactory & getInstance()
Definition MDSimulationFactory.h:62
SimulationAndInterfaceFactory()
Definition MDSimulationFactory.h:192
void shutdownMDSolverInterface()
Definition MDSimulationFactory.h:166
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
everything necessary for coupling operations, is defined in here
Definition AdditiveMomentumInsertion.h:15