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 "simplemd/LinkedCell.h"
26#define MY_LINKEDCELL simplemd::LinkedCell
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#endif
42
46namespace coupling {
47namespace interface {
48
56public:
61 static SimulationAndInterfaceFactory singleton;
62 return singleton;
63 }
64
72 coupling::interface::MDSimulation* getMDSimulation(const simplemd::configurations::MolecularDynamicsConfiguration& configuration,
74#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
75 ,
76 MPI_Comm localComm
77#endif
78 ) {
79#if defined(SIMPLE_MD)
80 return new coupling::interface::SimpleMDSimulation(configuration);
81#elif defined(LAMMPS_MD)
82 return new coupling::interface::LammpsMDSimulation(configuration, mamicoConfiguration
83#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
84 ,
85 localComm
86#endif
87 );
88#elif defined(LAMMPS_DPD)
89 return new coupling::interface::LammpsDPDSimulation(configuration, mamicoConfiguration
90#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
91 ,
92 localComm
93#endif
94 );
95#elif defined(LS1_MARDYN)
96 return new coupling::interface::LS1MDSimulation(configuration
97#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
98 ,
99 localComm
100#endif
101 );
102#else
103 std::cout << "ERROR MDSimulationFactory::getMDSimulation(): Unknown MD "
104 "simulation!"
105 << std::endl;
106 exit(EXIT_FAILURE);
107 return NULL;
108#endif
109 }
110
120 getMDSolverInterface(const simplemd::configurations::MolecularDynamicsConfiguration& configuration,
122 coupling::interface::MDSimulation* mdSimulation) {
124#if defined(SIMPLE_MD)
125 // for the simple MD code, we create a new md solver interface and also add
126 // it to the mamico interface provider (the latter is not really required,
127 // but makes the simulation state more consistent in the overall simulation)
128 coupling::interface::SimpleMDSimulation* simpleMDSimulation = (coupling::interface::SimpleMDSimulation*)mdSimulation;
129 if (simpleMDSimulation == NULL) {
130 std::cout << "ERROR MDSimulationFactory::getMDSolverInterface(): Could "
131 "not cast to SimpleMDSimulation!"
132 << std::endl;
133 exit(EXIT_FAILURE);
134 }
135 mdSolverInterface = new coupling::interface::SimpleMDSolverInterface(
136 simpleMDSimulation->getBoundaryTreatment(),
137 simpleMDSimulation->getParallelTopologyService(), simpleMDSimulation->getMoleculeService(), simpleMDSimulation->getLinkedCellService(),
138 simpleMDSimulation->getMolecularPropertiesService(), (simpleMDSimulation->getParallelTopologyService()).getLocalBoundaryInformation(),
139 configuration.getSimulationConfiguration().getDt());
141#elif defined(LAMMPS_MD)
142 // as switchOnCoupling() should have been called before this method, the
143 // fix-mamico should be already initialised. hence the MDSolverInterface of
144 // the mamico interface provider should be initialised at this stage
146#elif defined(LAMMPS_DPD)
148#elif defined(LS1_MARDYN)
149 mdSolverInterface = new coupling::interface::LS1MDSolverInterface(mamicoConfiguration.getCouplingCellConfiguration().getCouplingCellSize(),
150 mamicoConfiguration.getCouplingCellConfiguration().getNumberLinkedCellsPerCouplingCell());
152#endif
153
154 if (mdSolverInterface == NULL) {
155 std::cout << "ERROR MDSimulationFactory::getMDSolverInterface(): "
156 "mdSolverInterface==NULL!"
157 << std::endl;
158 exit(EXIT_FAILURE);
159 }
160 return mdSolverInterface;
161 }
162
166#if defined(SIMPLE_MD)
168 coupling::interface::MamicoInterfaceProvider<MY_LINKEDCELL, MDSIMULATIONFACTORY_DIMENSION>::getInstance().getMDSolverInterface();
169 if (interface != NULL) {
170 delete interface;
171 }
173#elif defined(LAMMPS_MD)
174// nop, since the fix-mamico takes care of deleting the MD solver interface
175#elif defined(LAMMPS_DPD)
176// nop
177#elif defined(LS1_MARDYN)
179 coupling::interface::MamicoInterfaceProvider<MY_LINKEDCELL, MDSIMULATIONFACTORY_DIMENSION>::getInstance().getMDSolverInterface();
180 if (interface != NULL) {
181 delete interface;
182 }
184#endif
185 }
186
187private:
196};
197
198} // namespace interface
199} // namespace coupling
200#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:195
static SimulationAndInterfaceFactory & getInstance()
Definition MDSimulationFactory.h:60
SimulationAndInterfaceFactory()
Definition MDSimulationFactory.h:191
void shutdownMDSolverInterface()
Definition MDSimulationFactory.h:165
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
everything necessary for coupling operations, is defined in here
Definition AdditiveMomentumInsertion.h:15