LCOV - code coverage report
Current view: top level - coupling/indexing - Operations.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 28 28 100.0 %
Date: 2025-06-25 11:26:37 Functions: 24 25 96.0 %

          Line data    Source code
       1             : #pragma once
       2             : 
       3             : #if (COUPLING_MD_ERROR == COUPLING_MD_YES)
       4             : #include <sstream>
       5             : #endif
       6             : 
       7             : namespace coupling {
       8             : namespace indexing {
       9             : 
      10             : /**
      11             :  * Conversion function to convert from vector to scalar representation of
      12             :  * CellIndex spcialisations.
      13             :  *
      14             :  * @tparam dim number of dimensions of the coupled simulation.
      15             :  * @tparam idx_T index type parametrisation used by index.
      16             :  * @param index index that shall be converted
      17             :  * @return int representation of index
      18             :  *
      19             :  * @author Felix Maurer and Piet Jarmatz
      20             :  */
      21     1320552 : template <unsigned int dim, IndexTrait... traits> unsigned int convertToScalar(const CellIndex<dim, traits...>& index) {
      22             :   if constexpr (std::is_same_v<unsigned int, typename CellIndex<dim, traits...>::value_T>) {
      23         800 :     return index.get();
      24             :   } else {
      25             :     // copied from deprecated coupling::IndexConversion::getCellIndex())
      26             : 
      27             : #if (COUPLING_MD_ERROR == COUPLING_MD_YES)
      28     1319752 :     if (!IndexingService<dim>::getInstance().isInitialized()) {
      29           8 :       throw std::runtime_error(std::string("coupling::indexing::convertToScalar: IndexingService not initialized! "));
      30             :     }
      31     5278800 :     for (unsigned d = 0; d < dim; d++)
      32     7918200 :       if (index.get()[d] < 0 || index.get()[d] > ((int)CellIndex<dim, traits...>::numberCellsInDomain[d]) - 1) {
      33          64 :         std::stringstream ss;
      34          64 :         ss << "ERROR: Indexing: Cannot convert this vector index to scalar." << std::endl;
      35         128 :         ss << "Faulty Index = " << index.get() << std::endl;
      36          64 :         ss << "My rank = " << IndexingService<dim>::getInstance().getRank() << std::endl;
      37          64 :         ss << "Index type = " << index.TNAME << std::endl;
      38         128 :         throw std::runtime_error(ss.str());
      39          64 :       }
      40             : #endif
      41             : 
      42     1319684 :     unsigned int i{static_cast<unsigned int>(index.get()[dim - 1])};
      43     3959052 :     for (int d = dim - 2; d > -1; d--) {
      44     5278736 :       i = (CellIndex<dim, traits...>::numberCellsInDomain[d]) * i + static_cast<unsigned int>(index.get()[d]);
      45             :     }
      46             : 
      47     1319684 :     return i;
      48             :   }
      49             : }
      50             : 
      51             : /**
      52             :  * Conversion function to convert from scalar to vector representation of
      53             :  * CellIndex spcialisations.
      54             :  *
      55             :  * @tparam dim number of dimensions of the coupled simulation.
      56             :  * @tparam idx_T index type parametrisation used by index.
      57             :  * @param index index that shall be converted
      58             :  * @returns vector representation of index
      59             :  *
      60             :  * @author Felix Maurer
      61             :  */
      62     5439336 : template <unsigned int dim, IndexTrait... traits> tarch::la::Vector<dim, int> convertToVector(const CellIndex<dim, traits...>& index) {
      63             :   if constexpr (std::is_same_v<tarch::la::Vector<dim, int>, typename CellIndex<dim, traits...>::value_T>) {
      64             :     // trivial case: convert vector to vector
      65     2082052 :     return index.get();
      66             :   } else {
      67             :     // copied from coupling::getVectorCellIndex()
      68             : 
      69             : #if (COUPLING_MD_ERROR == COUPLING_MD_YES)
      70     3357284 :     if (!IndexingService<dim>::getInstance().isInitialized()) {
      71           8 :       throw std::runtime_error(std::string("coupling::indexing::convertToVector: IndexingService not initialized! "));
      72             :     }
      73             : #endif
      74             : 
      75     6714560 :     tarch::la::Vector<dim, int> i{0};
      76     3357280 :     unsigned int i_sca{index.get()};
      77    10071840 :     for (int d = dim - 1; d > 0; d--) {
      78     6714560 :       i[d] = static_cast<int>(i_sca / CellIndex<dim, traits...>::divisionFactor[d]);
      79     6714560 :       i_sca -= static_cast<unsigned int>(i[d]) * CellIndex<dim, traits...>::divisionFactor[d];
      80             :     }
      81     3357280 :     i[0] = i_sca;
      82             : 
      83     3357280 :     return i;
      84             :   }
      85             : }
      86             : 
      87             : } // namespace indexing
      88             : } // namespace coupling

Generated by: LCOV version 1.14