LCOV - code coverage report
Current view: top level - coupling/interface - MDSimulationFactory.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 66.7 % 24 16
Test Date: 2026-08-21 15:14:06 Functions: 100.0 % 3 3

            Line data    Source code
       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              : 
      45              : /** interface for different MD solvers.
      46              :  *  @author Philipp Neumann
      47              :  */
      48              : namespace coupling {
      49              : namespace interface {
      50              : 
      51              : /** factory to produced md simulation, md solver interface (for mamico) and the
      52              :  *coupling cell service using singleton pattern.
      53              :  *      @brief factory to produced md simulation, md solver interface (for
      54              :  *mamico) and the coupling cell service
      55              :  *  @author Philipp Neumann
      56              :  */
      57              : class SimulationAndInterfaceFactory {
      58              : public:
      59              :   /** @returns the SimulationAndInterfaceFactory object
      60              :    *    @note singleton pattern
      61              :    */
      62           24 :   static SimulationAndInterfaceFactory& getInstance() {
      63          436 :     static SimulationAndInterfaceFactory singleton;
      64           24 :     return singleton;
      65              :   }
      66              : 
      67              :   /** returns a pointer to the md simulation.
      68              :    *  @param configuration
      69              :    *  @param mamicoConfiguration
      70              :    *  @param localComm
      71              :    *    @remark This will create a new simulation which needs to be deleted at
      72              :    *the end
      73              :    */
      74           12 :   coupling::interface::MDSimulation* getMDSimulation(const simplemd::configurations::MolecularDynamicsConfiguration& configuration,
      75              :                                                      const coupling::configurations::MaMiCoConfiguration<MDSIMULATIONFACTORY_DIMENSION>& mamicoConfiguration
      76              : #if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
      77              :                                                      ,
      78              :                                                      MPI_Comm localComm
      79              : #endif
      80              :   ) {
      81              : #if defined(SIMPLE_MD)
      82           12 :     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              : 
     113              :   /** returns the MD solver interface. This method should be called AFTER
     114              :    * initialising the MD simulation AND AFTER the equilibration of MD. We thus
     115              :    * expect that getMDSimulationInterface() and switchOnCoupling() of the
     116              :    * MDSimulationInterface() have been called before.
     117              :    *  @param configuration
     118              :    *  @param mamicoConfiguration
     119              :    *  @param mdSimulation
     120              :    */
     121              :   coupling::interface::MDSolverInterface<MY_LINKEDCELL, MDSIMULATIONFACTORY_DIMENSION>*
     122           12 :   getMDSolverInterface(const simplemd::configurations::MolecularDynamicsConfiguration& configuration,
     123              :                        const coupling::configurations::MaMiCoConfiguration<MDSIMULATIONFACTORY_DIMENSION>& mamicoConfiguration,
     124              :                        coupling::interface::MDSimulation* mdSimulation) {
     125           12 :     coupling::interface::MDSolverInterface<MY_LINKEDCELL, MDSIMULATIONFACTORY_DIMENSION>* mdSolverInterface = NULL;
     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           12 :     coupling::interface::SimpleMDSimulation* simpleMDSimulation = (coupling::interface::SimpleMDSimulation*)mdSimulation;
     131           12 :     if (simpleMDSimulation == NULL) {
     132            0 :       std::cout << "ERROR MDSimulationFactory::getMDSolverInterface(): Could "
     133            0 :                    "not cast to SimpleMDSimulation!"
     134            0 :                 << std::endl;
     135            0 :       exit(EXIT_FAILURE);
     136              :     }
     137           24 :     mdSolverInterface = new coupling::interface::SimpleMDSolverInterface(
     138              :         simpleMDSimulation->getBoundaryTreatment(), simpleMDSimulation->getParallelTopologyService(), simpleMDSimulation->getMoleculeService(),
     139           12 :         simpleMDSimulation->getMolecularPropertiesService(), (simpleMDSimulation->getParallelTopologyService()).getLocalBoundaryInformation(),
     140           12 :         configuration.getSimulationConfiguration().getDt());
     141           12 :     coupling::interface::MamicoInterfaceProvider<MY_LINKEDCELL, MDSIMULATIONFACTORY_DIMENSION>::getInstance().setMDSolverInterface(mdSolverInterface);
     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
     146              :     mdSolverInterface = coupling::interface::MamicoInterfaceProvider<MY_LINKEDCELL, MDSIMULATIONFACTORY_DIMENSION>::getInstance().getMDSolverInterface();
     147              : #elif defined(LAMMPS_DPD)
     148              :     mdSolverInterface = coupling::interface::MamicoInterfaceProvider<MY_LINKEDCELL, MDSIMULATIONFACTORY_DIMENSION>::getInstance().getMDSolverInterface();
     149              : #elif defined(LS1_MARDYN)
     150              :     mdSolverInterface = new coupling::interface::LS1MDSolverInterface(mamicoConfiguration.getCouplingCellConfiguration().getCouplingCellSize(),
     151              :                                                                       mamicoConfiguration.getCouplingCellConfiguration().getNumberLinkedCellsPerCouplingCell());
     152              :     coupling::interface::MamicoInterfaceProvider<MY_LINKEDCELL, MDSIMULATIONFACTORY_DIMENSION>::getInstance().setMDSolverInterface(mdSolverInterface);
     153              : #endif
     154              : 
     155           12 :     if (mdSolverInterface == NULL) {
     156            0 :       std::cout << "ERROR MDSimulationFactory::getMDSolverInterface(): "
     157            0 :                    "mdSolverInterface==NULL!"
     158            0 :                 << std::endl;
     159            0 :       exit(EXIT_FAILURE);
     160              :     }
     161           12 :     return mdSolverInterface;
     162              :   }
     163              : 
     164              :   /** shuts down the MD solver interfaces and deletes the interface if required
     165              :      (depending on the respective MD simulation) */
     166              :   void shutdownMDSolverInterface() {
     167              : #if defined(SIMPLE_MD)
     168              :     coupling::interface::MDSolverInterface<MY_LINKEDCELL, MDSIMULATIONFACTORY_DIMENSION>* interface =
     169              :         coupling::interface::MamicoInterfaceProvider<MY_LINKEDCELL, MDSIMULATIONFACTORY_DIMENSION>::getInstance().getMDSolverInterface();
     170              :     if (interface != NULL) {
     171              :       delete interface;
     172              :     }
     173              :     coupling::interface::MamicoInterfaceProvider<MY_LINKEDCELL, MDSIMULATIONFACTORY_DIMENSION>::getInstance().setMDSolverInterface(NULL);
     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)
     179              :     coupling::interface::MDSolverInterface<MY_LINKEDCELL, MDSIMULATIONFACTORY_DIMENSION>* interface =
     180              :         coupling::interface::MamicoInterfaceProvider<MY_LINKEDCELL, MDSIMULATIONFACTORY_DIMENSION>::getInstance().getMDSolverInterface();
     181              :     if (interface != NULL) {
     182              :       delete interface;
     183              :     }
     184              :     coupling::interface::MamicoInterfaceProvider<MY_LINKEDCELL, MDSIMULATIONFACTORY_DIMENSION>::getInstance().setMDSolverInterface(NULL);
     185              : #endif
     186              :   }
     187              : 
     188              : private:
     189              :   /** Private constructor
     190              :    *  @note singelton pattern
     191              :    */
     192            4 :   SimulationAndInterfaceFactory() {}
     193              :   /** Private destructor
     194              :    *  @note singelton pattern
     195              :    */
     196              :   ~SimulationAndInterfaceFactory() {}
     197              : };
     198              : 
     199              : } // namespace interface
     200              : } // namespace coupling
     201              : #endif // _MDSIMULATIONFACTORY_H_
        

Generated by: LCOV version 2.0-1