LCOV - code coverage report
Current view: top level - coupling/services - CouplingCellTraversalWrappers.cpph (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 115 0
Test Date: 2026-08-21 15:14:06 Functions: 0.0 % 39 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 2.0-1