LCOV - code coverage report
Current view: top level - coupling/services - CouplingCellTraversalWrappers.cpph (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 115 0.0 %
Date: 2025-06-25 11:26:37 Functions: 0 39 0.0 %

          Line data    Source code
       1             : // Copyright (C) 2015 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 _MOLECULARDYNAMICS_COUPLING_COUPLINGCELLTRAVERSALWRAPPERS_H_
       6             : #define _MOLECULARDYNAMICS_COUPLING_COUPLINGCELLTRAVERSALWRAPPERS_H_
       7             : 
       8             : /** the following wrappers and smaller functional classes are included in the
       9             :  * CouplingCellServiceImpl for internal use in this class only. They are used
      10             :  * together with the applyTo...() methods of CellContainer to bring
      11             :  *  functionality which is defined cellwise onto the grid of coupling cells.
      12             :  *  @author Philipp Neumann
      13             :  */
      14             : 
      15             : /** wrapper to carry out functionality on a single coupling cell. This
      16             :  * function can be called on several coupling cells using the callback
      17             :  * patterns of CellContainer. In the following, several wrappers are provided
      18             :  * for the TransferStrategy as well as some further functional stuff which is
      19             :  * required from the CouplingCellServiceImpl.
      20             :  */
      21             : class Wrapper {
      22             : public:
      23           0 :   Wrapper(coupling::services::CouplingCellServiceImpl<LinkedCell, dim>* thisPtr) : _thisPtr(thisPtr) {}
      24           0 :   virtual ~Wrapper() {}
      25             :   virtual void beginCellIteration() = 0;
      26             :   virtual void endCellIteration() = 0;
      27             :   virtual void apply(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, const I02& index) = 0;
      28             : 
      29             : protected:
      30             :   coupling::services::CouplingCellServiceImpl<LinkedCell, dim>* _thisPtr;
      31             : };
      32             : 
      33             : /** wrapper for method
      34             :  * processInnerCouplingCellBeforeReceivingMacroscopicSolverData of
      35             :  * TransferStrategy */
      36           0 : class Wrapper4ProcessInnerCouplingCellBeforeReceivingMacroscopicSolverData : public Wrapper {
      37             : public:
      38           0 :   Wrapper4ProcessInnerCouplingCellBeforeReceivingMacroscopicSolverData(coupling::services::CouplingCellServiceImpl<LinkedCell, dim>* thisPtr)
      39           0 :       : Wrapper(thisPtr) {}
      40             : 
      41           0 :   void beginCellIteration() override { Wrapper::_thisPtr->_transferStrategy->beginProcessInnerCouplingCellsBeforeReceivingMacroscopicSolverData(); }
      42           0 :   void endCellIteration() override { Wrapper::_thisPtr->_transferStrategy->endProcessInnerCouplingCellsBeforeReceivingMacroscopicSolverData(); }
      43           0 :   void apply(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, const I02& index) override {
      44           0 :     Wrapper::_thisPtr->_transferStrategy->processInnerCouplingCellBeforeReceivingMacroscopicSolverData(cell, index);
      45           0 :   }
      46             : };
      47             : 
      48             : /** wrapper for method
      49             :  * processOuterCouplingCellBeforeReceivingMacroscopicSolverData of
      50             :  * TransferStrategy */
      51           0 : class Wrapper4ProcessOuterCouplingCellBeforeReceivingMacroscopicSolverData : public Wrapper {
      52             : public:
      53           0 :   Wrapper4ProcessOuterCouplingCellBeforeReceivingMacroscopicSolverData(coupling::services::CouplingCellServiceImpl<LinkedCell, dim>* thisPtr)
      54           0 :       : Wrapper(thisPtr) {}
      55             : 
      56           0 :   void beginCellIteration() override { Wrapper::_thisPtr->_transferStrategy->beginProcessOuterCouplingCellsBeforeReceivingMacroscopicSolverData(); }
      57           0 :   void endCellIteration() override { Wrapper::_thisPtr->_transferStrategy->endProcessOuterCouplingCellsBeforeReceivingMacroscopicSolverData(); }
      58             : 
      59           0 :   void apply(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, const I02& index) override {
      60           0 :     Wrapper::_thisPtr->_transferStrategy->processOuterCouplingCellBeforeReceivingMacroscopicSolverData(cell, index);
      61           0 :   }
      62             : };
      63             : 
      64             : /** wrapper for method
      65             :  * processInnerCouplingCellAfterReceivingMacroscopicSolverData of
      66             :  * TransferStrategy */
      67           0 : class Wrapper4ProcessInnerCouplingCellAfterReceivingMacroscopicSolverData : public Wrapper {
      68             : public:
      69           0 :   Wrapper4ProcessInnerCouplingCellAfterReceivingMacroscopicSolverData(coupling::services::CouplingCellServiceImpl<LinkedCell, dim>* thisPtr)
      70           0 :       : Wrapper(thisPtr) {}
      71             : 
      72           0 :   void beginCellIteration() override { Wrapper::_thisPtr->_transferStrategy->beginProcessInnerCouplingCellsAfterReceivingMacroscopicSolverData(); }
      73           0 :   void endCellIteration() override { Wrapper::_thisPtr->_transferStrategy->endProcessInnerCouplingCellsAfterReceivingMacroscopicSolverData(); }
      74           0 :   void apply(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, const I02& index) override {
      75           0 :     Wrapper::_thisPtr->_transferStrategy->processInnerCouplingCellAfterReceivingMacroscopicSolverData(cell, index);
      76           0 :   }
      77             : };
      78             : 
      79             : /** wrapper for method
      80             :  * processOuterCouplingCellAfterReceivingMacroscopicSolverData of
      81             :  * TransferStrategy */
      82           0 : class Wrapper4ProcessOuterCouplingCellAfterReceivingMacroscopicSolverData : public Wrapper {
      83             : public:
      84           0 :   Wrapper4ProcessOuterCouplingCellAfterReceivingMacroscopicSolverData(coupling::services::CouplingCellServiceImpl<LinkedCell, dim>* thisPtr)
      85           0 :       : Wrapper(thisPtr) {}
      86             : 
      87           0 :   void beginCellIteration() override { Wrapper::_thisPtr->_transferStrategy->beginProcessOuterCouplingCellsAfterReceivingMacroscopicSolverData(); }
      88           0 :   void endCellIteration() override { Wrapper::_thisPtr->_transferStrategy->endProcessOuterCouplingCellsAfterReceivingMacroscopicSolverData(); }
      89           0 :   void apply(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, const I02& index) override {
      90           0 :     Wrapper::_thisPtr->_transferStrategy->processOuterCouplingCellAfterReceivingMacroscopicSolverData(cell, index);
      91           0 :   }
      92             : };
      93             : 
      94             : /** wrapper for method processInnerCouplingCellBeforeSendingMDSolverData of
      95             :  * TransferStrategy */
      96           0 : class Wrapper4ProcessInnerCouplingCellBeforeSendingMDSolverData : public Wrapper {
      97             : public:
      98           0 :   Wrapper4ProcessInnerCouplingCellBeforeSendingMDSolverData(coupling::services::CouplingCellServiceImpl<LinkedCell, dim>* thisPtr) : Wrapper(thisPtr) {}
      99             : 
     100           0 :   void beginCellIteration() override { Wrapper::_thisPtr->_transferStrategy->beginProcessInnerCouplingCellsBeforeSendingMDSolverData(); }
     101           0 :   void endCellIteration() override { Wrapper::_thisPtr->_transferStrategy->endProcessInnerCouplingCellsBeforeSendingMDSolverData(); }
     102           0 :   void apply(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, const I02& index) override {
     103           0 :     Wrapper::_thisPtr->_transferStrategy->processInnerCouplingCellBeforeSendingMDSolverData(cell, index);
     104           0 :   }
     105             : };
     106             : 
     107             : /** wrapper for method processOuterCouplingCellBeforeSendingMDSolverData of
     108             :  * TransferStrategy */
     109           0 : class Wrapper4ProcessOuterCouplingCellBeforeSendingMDSolverData : public Wrapper {
     110             : public:
     111           0 :   Wrapper4ProcessOuterCouplingCellBeforeSendingMDSolverData(coupling::services::CouplingCellServiceImpl<LinkedCell, dim>* thisPtr) : Wrapper(thisPtr) {}
     112             : 
     113           0 :   void beginCellIteration() override { Wrapper::_thisPtr->_transferStrategy->beginProcessOuterCouplingCellsBeforeSendingMDSolverData(); }
     114           0 :   void endCellIteration() override { Wrapper::_thisPtr->_transferStrategy->endProcessOuterCouplingCellsBeforeSendingMDSolverData(); }
     115           0 :   void apply(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, const I02& index) override {
     116           0 :     Wrapper::_thisPtr->_transferStrategy->processOuterCouplingCellBeforeSendingMDSolverData(cell, index);
     117           0 :   }
     118             : };
     119             : 
     120             : /** wrapper for method processInnerCouplingCellAfterMDTimestep of
     121             :  * TransferStrategy */
     122           0 : class Wrapper4ProcessInnerCouplingCellAfterMDTimestep : public Wrapper {
     123             : public:
     124           0 :   Wrapper4ProcessInnerCouplingCellAfterMDTimestep(coupling::services::CouplingCellServiceImpl<LinkedCell, dim>* thisPtr) : Wrapper(thisPtr) {}
     125             : 
     126           0 :   void beginCellIteration() override { Wrapper::_thisPtr->_transferStrategy->beginProcessInnerCouplingCellsAfterMDTimestep(); }
     127           0 :   void endCellIteration() override { Wrapper::_thisPtr->_transferStrategy->endProcessInnerCouplingCellsAfterMDTimestep(); }
     128           0 :   void apply(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, const I02& index) override {
     129           0 :     Wrapper::_thisPtr->_transferStrategy->processInnerCouplingCellAfterMDTimestep(cell, index);
     130           0 :   }
     131             : };
     132             : 
     133             : /** computes and stores the current velocity in each non-ghost coupling cell.
     134             :  */
     135           0 : class Wrapper4ComputeAndSetCurrentVelocity : public Wrapper {
     136             : public:
     137           0 :   Wrapper4ComputeAndSetCurrentVelocity(coupling::services::CouplingCellServiceImpl<LinkedCell, dim>* thisPtr) : Wrapper(thisPtr) {}
     138             : 
     139           0 :   void beginCellIteration() override {}
     140           0 :   void endCellIteration() override {}
     141           0 :   void apply(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, const I02& index) override {
     142           0 :     coupling::cellmappings::ComputeMomentumMapping<LinkedCell, dim> computeMomentumMapping(Wrapper::_thisPtr->_mdSolverInterface);
     143           0 :     cell.iterateConstCells(computeMomentumMapping);
     144           0 :     const tarch::la::Vector<dim, double> velocity = computeMomentumMapping.getMeanVelocity();
     145           0 :     cell.setCurrentVelocity(velocity);
     146           0 :   }
     147             : };
     148             : 
     149             : /** calls the MomentumInsertion-mechanisms on each non-ghost coupling cell,
     150             :  * including the energy controller */
     151           0 : class Wrapper4DistributeMomentum : public Wrapper {
     152             : public:
     153           0 :   Wrapper4DistributeMomentum(coupling::services::CouplingCellServiceImpl<LinkedCell, dim>* thisPtr, unsigned int t) : Wrapper(thisPtr) {}
     154             : 
     155           0 :   void beginCellIteration() override {}
     156           0 :   void endCellIteration() override {}
     157           0 :   void apply(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, const I02& index) override {
     158           0 :     const double temperature = Wrapper::_thisPtr->_kineticEnergyController.computeTemperature(cell);
     159           0 :     Wrapper::_thisPtr->_momentumInsertion->insertMomentum(cell, index);
     160           0 :     Wrapper::_thisPtr->_kineticEnergyController.setTemperature(cell, temperature);
     161           0 :   }
     162             : };
     163             : 
     164             : /** computes and stores the temperature value in all non-ghost cells. If the
     165             :  * temperature parameter is set to -1.0, the current temperature of the
     166             :  * molecules in this cell is stored. Otherwise, the temperature variable is used
     167             :  * and applied to the molecules using the thermostat of the
     168             :  * KineticEnergyController.
     169             :  */
     170           0 : class Wrapper4ComputeAndStoreTemperature : public Wrapper {
     171             : public:
     172           0 :   Wrapper4ComputeAndStoreTemperature(coupling::services::CouplingCellServiceImpl<LinkedCell, dim>* thisPtr, double temperature)
     173           0 :       : Wrapper(thisPtr), _temperature(temperature) {}
     174             : 
     175           0 :   void beginCellIteration() override {}
     176           0 :   void endCellIteration() override {}
     177           0 :   void apply(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, const I02& index) override {
     178             :     // if this value is -1.0, we just set the temperature in the cell according
     179             :     // to current temperature...
     180           0 :     if (_temperature == -1.0) {
     181           0 :       const double myTemperature = Wrapper::_thisPtr->_kineticEnergyController.computeTemperature(cell);
     182           0 :       cell.setTemperature(myTemperature);
     183             :       // otherwise we use the temperature value of _setTemperature
     184             :     } else {
     185           0 :       cell.setTemperature(_temperature);
     186           0 :       Wrapper::_thisPtr->_kineticEnergyController.setTemperature(cell, _temperature);
     187             :     }
     188           0 :   }
     189             : 
     190             : private:
     191             :   const double _temperature;
     192             : };
     193             : 
     194           0 : class Wrapper4PerturbateVelocity : public Wrapper {
     195             : public:
     196           0 :   Wrapper4PerturbateVelocity(coupling::services::CouplingCellServiceImpl<LinkedCell, dim>* thisPtr) : Wrapper(thisPtr) {}
     197             : 
     198           0 :   void beginCellIteration() override {}
     199           0 :   void endCellIteration() override {}
     200           0 :   void apply(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, const I02& index) override {
     201           0 :     coupling::cellmappings::ComputeMomentumMapping<LinkedCell, dim> computeMomentumMapping(Wrapper::_thisPtr->_mdSolverInterface);
     202           0 :     cell.iterateConstCells(computeMomentumMapping);
     203             : 
     204           0 :     coupling::cellmappings::ComputeTemperatureMapping<LinkedCell, dim> computeTemperatureMapping(computeMomentumMapping.getMeanVelocity(),
     205           0 :                                                                                                  Wrapper::_thisPtr->_mdSolverInterface);
     206           0 :     cell.iterateConstCells(computeTemperatureMapping);
     207             : 
     208           0 :     coupling::cellmappings::PerturbateVelocityMapping<LinkedCell, dim> perturbateVelocity(
     209           0 :         Wrapper::_thisPtr->_mdSolverInterface, computeMomentumMapping.getMeanVelocity(), computeTemperatureMapping.getTemperature());
     210             : 
     211           0 :     cell.iterateCells(perturbateVelocity);
     212           0 :   }
     213             : };
     214             : 
     215             : /** applies the thermostat in all non-ghost cells */
     216           0 : class Wrapper4ApplyTemperature : public Wrapper {
     217             : public:
     218           0 :   Wrapper4ApplyTemperature(coupling::services::CouplingCellServiceImpl<LinkedCell, dim>* thisPtr) : Wrapper(thisPtr) {}
     219             : 
     220           0 :   void beginCellIteration() override {}
     221           0 :   void endCellIteration() override {}
     222           0 :   void apply(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, const I02& index) override {
     223           0 :     const double temperature = cell.getTemperature();
     224           0 :     Wrapper::_thisPtr->_kineticEnergyController.setTemperature(cell, temperature);
     225           0 :   }
     226             : };
     227             : 
     228             : /** applies the boundary force in all non-ghost cells which are close to an open
     229             :  * boundary */
     230           0 : class Wrapper4ApplyBoundaryForce : public Wrapper {
     231             : public:
     232           0 :   Wrapper4ApplyBoundaryForce(coupling::services::CouplingCellServiceImpl<LinkedCell, dim>* thisPtr) : Wrapper(thisPtr) {}
     233             : 
     234           0 :   void beginCellIteration() override {}
     235           0 :   void endCellIteration() override {}
     236           0 :   void apply(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, const I02& index) override {
     237           0 :     Wrapper::_thisPtr->_boundaryForceController->applyBoundaryForce(cell);
     238           0 :   }
     239             : };
     240             : #endif // _MOLECULARDYNAMICS_COUPLING_COUPLINGCELLTRAVERSALWRAPPERS_H_

Generated by: LCOV version 1.14