Xyst test code coverage report
Current view: top level - Transfer - Transfer.cpp (source / functions) Hit Total Coverage
Commit: 7512f2d92be539d3e2bf801c81cb357720d8ffd7 Lines: 6 56 10.7 %
Date: 2025-04-27 09:44:37 Functions: 1 11 9.1 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 5 50 10.0 %

           Branch data     Line data    Source code
       1                 :            : // *****************************************************************************
       2                 :            : /*!
       3                 :            :   \file      src/Transfer/Transfer.cpp
       4                 :            :   \copyright 2020-2021 Charmworks, Inc.,
       5                 :            :              2022-2025 J. Bakosi
       6                 :            :              All rights reserved. See the LICENSE file for details.
       7                 :            :   \brief     Definitions pertaining to transfer between 3D meshes
       8                 :            : */
       9                 :            : // *****************************************************************************
      10                 :            : 
      11                 :            : #include <cassert>
      12                 :            : #include <iostream>     // NOT NEEDED
      13                 :            : 
      14                 :            : #include "Transfer.hpp"
      15                 :            : #include "NodeSearch.hpp"
      16                 :            : #include "ContainerUtil.hpp"
      17                 :            : 
      18                 :            : namespace transfer {
      19                 :            : 
      20                 :            : #if defined(__clang__)
      21                 :            :   #pragma clang diagnostic push
      22                 :            :   #pragma clang diagnostic ignored "-Wmissing-variable-declarations"
      23                 :            : #endif
      24                 :            : 
      25                 :            : CProxy_Transfer g_transferProxy;
      26                 :            : CollideHandle g_collideHandle;
      27                 :            : 
      28                 :            : #if defined(__clang__)
      29                 :            :   #pragma clang diagnostic pop
      30                 :            : #endif
      31                 :            : 
      32                 :            : static void
      33                 :          0 : collisionHandler( [[maybe_unused]] void *param, int nColl, Collision *colls )
      34                 :            : // *****************************************************************************
      35                 :            : //! ...
      36                 :            : // *****************************************************************************
      37                 :            : {
      38                 :          0 :   g_transferProxy.ckLocalBranch()->distributeCollisions( nColl, colls );
      39                 :          0 : }
      40                 :            : 
      41                 :        259 : LibTransfer::LibTransfer( CkArgMsg* msg )
      42                 :            : // *****************************************************************************
      43                 :            : //  Constructor: initialize mesh-to-mesh transfer
      44                 :            : // *****************************************************************************
      45                 :            : {
      46         [ +  - ]:        259 :   delete msg;
      47                 :            : 
      48 [ +  - ][ +  - ]:        518 :   g_transferProxy = CProxy_Transfer::ckNew();
      49                 :            : 
      50                 :            :   // Need to make sure this is actually correct
      51                 :        259 :   CollideGrid3d gridMap( CkVector3d(0, 0, 0), CkVector3d(2, 100, 2) );
      52 [ +  - ][ +  - ]:        259 :   g_collideHandle = CollideCreate( gridMap,
      53                 :            :                       CollideSerialClient( collisionHandler, nullptr ) );
      54                 :        259 : }
      55                 :            : 
      56                 :            : void
      57                 :          0 : addMesh( CkArrayID p, int nchare, CkCallback cb )
      58                 :            : // *****************************************************************************
      59                 :            : //  API for registering a mesh to be part of mesh-to-mesh transfer
      60                 :            : //! \param[in] p Charm++ host proxy participating in mesh-to-mesh transfer
      61                 :            : //! \param[in] nchare Number of mesh partitions
      62                 :            : //! \param[in] cb Callback to continue with once finished
      63                 :            : // *****************************************************************************
      64                 :            : {
      65         [ -  - ]:          0 :   g_transferProxy[0].addMesh( p, nchare, cb );
      66                 :          0 : }
      67                 :            : 
      68                 :            : void
      69                 :          0 : setSourceTets( CkArrayID p,
      70                 :            :                int chare,
      71                 :            :                const std::vector< std::size_t >& inpoel,
      72                 :            :                const std::array< std::vector< double >, 3 >& coord,
      73                 :            :                const tk::Fields& u,
      74                 :            :                const std::vector< double >& flag,
      75                 :            :                bool dir,
      76                 :            :                CkCallback cb )
      77                 :            : // *****************************************************************************
      78                 :            : //  API for configuring source mesh
      79                 :            : //! \param[in] inpoel Source mesh connectivity
      80                 :            : //! \param[in] coord Source mesh node coordinates
      81                 :            : //! \param[in] u Source solution data
      82                 :            : //! \param[in] flag Transfer flags
      83                 :            : //! \param[in] dir Transfer direction: 0: bg to overset, 1: overset to bg
      84                 :            : //! \param[in] cb Callback to continue with once finished
      85                 :            : // *****************************************************************************
      86                 :            : {
      87                 :            :   g_transferProxy.ckLocalBranch()->
      88         [ -  - ]:          0 :     setSourceTets( p, chare, inpoel, coord, u, flag, dir, cb );
      89                 :          0 : }
      90                 :            : 
      91                 :            : 
      92                 :          0 : void setDestPoints( CkArrayID p,
      93                 :            :                     int chare,
      94                 :            :                     const std::array< std::vector< double >, 3 >& coord,
      95                 :            :                     tk::Fields& u,
      96                 :            :                     std::vector< double >& flag,
      97                 :            :                     bool trflag,
      98                 :            :                     bool dir,
      99                 :            :                     CkCallback cb )
     100                 :            : // *****************************************************************************
     101                 :            : //  API for configuring destination mesh
     102                 :            : //! \param[in] coord Destination mesh node coordinates
     103                 :            : //! \param[in,out] u Destination mesh solution data
     104                 :            : //! \param[in,out] flag Transfer flags
     105                 :            : //! \param[in] trflag Transfer flags if true
     106                 :            : //! \param[in] dir Transfer direction: 0: bg to overset, 1: overset to bg
     107                 :            : //! \param[in] cb Callback to continue with once finished
     108                 :            : // *****************************************************************************
     109                 :            : {
     110                 :            :   g_transferProxy.ckLocalBranch()->
     111         [ -  - ]:          0 :     setDestPoints( p, chare, coord, u, flag, trflag, dir, cb );
     112                 :          0 : }
     113                 :            : 
     114                 :            : void
     115                 :          0 : Transfer::addMesh( CkArrayID p, int nchare, CkCallback cb )
     116                 :            : // *****************************************************************************
     117                 :            : //  Register a mesh to be part of mesh-to-mesh transfer
     118                 :            : //! \param[in] p Charm++ host proxy participating in mesh-to-mesh transfer
     119                 :            : //! \param[in] nchare Number of mesh partitions
     120                 :            : //! \param[in] cb Callback to continue with once finished
     121                 :            : // *****************************************************************************
     122                 :            : {
     123                 :          0 :   auto id = static_cast<std::size_t>(CkGroupID(p).idx);
     124                 :            : //std::cout << "addMesh: " << nchare << ", id:" << id << '\n';
     125                 :            :   assert( m_proxyMap.count(id) == 0 );
     126                 :          0 :   CkArrayOptions opts;
     127         [ -  - ]:          0 :   opts.bindTo( p );
     128         [ -  - ]:          0 :   opts.setNumInitial( nchare );
     129                 :            :   MeshData mesh;
     130                 :          0 :   mesh.nchare = nchare;
     131                 :          0 :   mesh.firstchunk = m_current_chunk;
     132 [ -  - ][ -  - ]:          0 :   mesh.proxy = CProxy_NodeSearch::ckNew( p, mesh, cb, opts );
                 [ -  - ]
     133                 :            :   m_proxyMap[ id ] = mesh;
     134         [ -  - ]:          0 :   m_current_chunk += nchare;
     135                 :          0 : }
     136                 :            : 
     137                 :            : void
     138                 :          0 : Transfer::setMesh( CkArrayID p, const MeshData& mesh )
     139                 :            : // *****************************************************************************
     140                 :            : //! \param[in] p Charm++ host proxy participating in mesh-to-mesh transfer
     141                 :            : // *****************************************************************************
     142                 :            : {
     143                 :          0 :   m_proxyMap[static_cast<std::size_t>(CkGroupID(p).idx)] = mesh;
     144                 :            : //std::cout << "setMesh: pe:" << CkMyPe() << ": "; for (const auto& [i,m] : m_proxyMap) std::cout << " groupid:" << i << " firstchunk:" << m.firstchunk << " nchare:" << m.nchare << ' '; std::cout << '\n';
     145                 :          0 : }
     146                 :            : 
     147                 :            : void
     148                 :          0 : Transfer::setSourceTets( CkArrayID p,
     149                 :            :                          int chare,
     150                 :            :                          const std::vector< std::size_t >& inpoel,
     151                 :            :                          const std::array< std::vector< double >, 3 >& coord,
     152                 :            :                          const tk::Fields& u,
     153                 :            :                          const std::vector< double >& flag,
     154                 :            :                          bool dir,
     155                 :            :                          CkCallback cb )
     156                 :            : // *****************************************************************************
     157                 :            : //  Configure source mesh
     158                 :            : //! \param[in] inpoel Source mesh connectivity
     159                 :            : //! \param[in] coord Source mesh node coordinates
     160                 :            : //! \param[in] u Source solution data
     161                 :            : //! \param[in] flag Transfer flags
     162                 :            : //! \param[in] dir Transfer direction: 0: bg to overset, 1: overset to bg
     163                 :            : //! \param[in] cb Callback to continue with once finished
     164                 :            : // *****************************************************************************
     165                 :            : {
     166                 :          0 :   m_src = static_cast< std::size_t >( CkGroupID(p).idx );
     167                 :            :   assert( m_proxyMap.count(m_src) );
     168                 :          0 :   NodeSearch* w = tk::cref_find( m_proxyMap, m_src ).proxy[ chare ].ckLocal();
     169                 :            :   assert( w );
     170         [ -  - ]:          0 :   w->setSourceTets( inpoel, coord, u, flag, dir, cb );
     171                 :          0 : }
     172                 :            : 
     173                 :            : void
     174                 :          0 : Transfer::setDestPoints( CkArrayID p,
     175                 :            :                          int chare,
     176                 :            :                          const std::array< std::vector< double >, 3 >& coord,
     177                 :            :                          tk::Fields& u,
     178                 :            :                          std::vector< double >& flag,
     179                 :            :                          bool trflag,
     180                 :            :                          bool dir,
     181                 :            :                          CkCallback cb )
     182                 :            : // *****************************************************************************
     183                 :            : //  Configure destination mesh
     184                 :            : //! \param[in] coord Pointer to the coordinate data for the destination mesh
     185                 :            : //! \param[in,out] u Pointer to the solution data for the destination mesh
     186                 :            : //! \param[in,out] flag Transfer flags
     187                 :            : //! \param[in] trflag Transfer flags if true
     188                 :            : //! \param[in] dir Transfer direction: 0: bg to overset, 1: overset to bg
     189                 :            : //! \param[in] cb Callback to continue with once finished
     190                 :            : // *****************************************************************************
     191                 :            : {
     192                 :          0 :   m_dst = static_cast< std::size_t >( CkGroupID(p).idx );
     193                 :            :   assert( m_proxyMap.count(m_dst) );
     194                 :          0 :   NodeSearch* w = tk::cref_find( m_proxyMap, m_dst ).proxy[ chare ].ckLocal();
     195                 :            :   assert( w );
     196         [ -  - ]:          0 :   w->setDestPoints( coord, u, flag, trflag, dir, cb );
     197                 :          0 : }
     198                 :            : 
     199                 :            : void
     200                 :          0 : Transfer::distributeCollisions( int nColl, Collision* colls )
     201                 :            : // *****************************************************************************
     202                 :            : //  Called when all potential collisions have been found, and now need to be
     203                 :            : //  destributed to the chares in the destination mesh to determine actual
     204                 :            : //  collisions.
     205                 :            : //! \param[in] nColl Number of potential collisions found
     206                 :            : //! \param[in] colls The list of potential collisions
     207                 :            : // *****************************************************************************
     208                 :            : {
     209                 :            :   //CkPrintf("Collisions found: %i\n", nColl);
     210                 :          0 :   const auto& dst = tk::cref_find( m_proxyMap, m_dst );
     211                 :          0 :   auto first = static_cast< std::size_t >( dst.firstchunk );
     212                 :          0 :   auto nchare = static_cast< std::size_t >( dst.nchare );
     213                 :          0 :   std::vector< std::vector< Collision > > separated( nchare );
     214                 :            : 
     215                 :            :   // Separate collisions based on the destination mesh chare they belong to
     216         [ -  - ]:          0 :   for (std::size_t i=0; i<static_cast<std::size_t>(nColl); ++i) {
     217                 :          0 :     auto achunk = static_cast< std::size_t >( colls[i].A.chunk );
     218                 :          0 :     auto bchunk = static_cast< std::size_t >( colls[i].B.chunk );
     219 [ -  - ][ -  - ]:          0 :     if (achunk >= first && achunk < first + nchare) {
     220         [ -  - ]:          0 :       separated[ achunk - first ].push_back(colls[i]);
     221                 :            :     } else {
     222         [ -  - ]:          0 :       separated[ bchunk - first ].push_back(colls[i]);
     223                 :            :     }
     224                 :            :   }
     225                 :            : 
     226                 :            :   // Send out each list to the destination chares for further processing
     227         [ -  - ]:          0 :   for (std::size_t i=0; i<nchare; ++i) {
     228                 :            :     //CkPrintf("Dest mesh chunk %i has %lu\n", i, separated[i].size());
     229         [ -  - ]:          0 :     const auto& src = tk::cref_find( m_proxyMap, m_src );
     230 [ -  - ][ -  - ]:          0 :     dst.proxy[ static_cast<int>(i) ].processCollisions( src,
     231                 :            :       static_cast< int >( separated[ i ].size() ),
     232                 :            :       separated[ i ].data() );
     233                 :            :   }
     234                 :          0 : }
     235                 :            : 
     236                 :            : } // transfer::
     237                 :            : 
     238                 :            : #include "NoWarning/transfer.def.h"

Generated by: LCOV version 1.16