Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/Transfer/NodeSearch.hpp
4 : : \copyright 2020-2021 Charmworks, Inc.,
5 : : 2022-2025 J. Bakosi
6 : : All rights reserved. See the LICENSE file for details.
7 : : \brief Declarations pertaining to node search between 3d meshes
8 : : */
9 : : // *****************************************************************************
10 : : #pragma once
11 : :
12 : : #include "Fields.hpp"
13 : : #include "NoWarning/nodesearch.decl.h"
14 : :
15 : : namespace transfer {
16 : :
17 : : //! ...
18 : 0 : class PotentialCollision {
19 : : public:
20 : : std::size_t src, dst;
21 : : CkVector3d point;
22 : 0 : void pup( PUP::er& p ) {
23 : 0 : p | src;
24 : 0 : p | dst;
25 : 0 : p | point;
26 : 0 : }
27 : : };
28 : :
29 : : //! Solution data interpolated from src to dst mesh
30 [ - - ]: 0 : class SolutionData {
31 : : public:
32 : : std::size_t dst;
33 : : std::vector< double > sol;
34 : 0 : void pup( PUP::er& p ) {
35 : 0 : p | dst;
36 : 0 : p | sol;
37 : 0 : }
38 : : };
39 : :
40 : : //! NodeSearch chare array holding part of a mesh
41 : : class NodeSearch : public CBase_NodeSearch {
42 : :
43 : : public:
44 : : //! Constructor
45 : : explicit NodeSearch( CkArrayID p, MeshData mesh, CkCallback cb );
46 : :
47 : : #if defined(__clang__)
48 : : #pragma clang diagnostic push
49 : : #pragma clang diagnostic ignored "-Wundefined-func-template"
50 : : #endif
51 : : //! Migrate constructor
52 : 0 : explicit NodeSearch( CkMigrateMessage* m ) : CBase_NodeSearch( m ) {}
53 : : #if defined(__clang__)
54 : : #pragma clang diagnostic pop
55 : : #endif
56 : :
57 : : //! Set the source mesh data
58 : : void setSourceTets( const std::vector< std::size_t >& inpoel,
59 : : const std::array< std::vector< double >, 3 >& coord,
60 : : const tk::Fields& u,
61 : : const std::vector< double >& flag,
62 : : bool dir,
63 : : CkCallback cb );
64 : :
65 : : //! Set the destination mesh data
66 : : void setDestPoints( const std::array< std::vector< double >, 3 >& coord,
67 : : tk::Fields& u,
68 : : std::vector< double >& flag,
69 : : bool trflag,
70 : : bool dir,
71 : : CkCallback cb );
72 : :
73 : : //! Process potential collisions in the destination mesh
74 : : void processCollisions( const MeshData& src,
75 : : int nColls,
76 : : Collision* colls );
77 : :
78 : : //! Identify actual collisions in the source mesh
79 : : void determineActualCollisions( CProxy_NodeSearch proxy,
80 : : int index,
81 : : int nColls,
82 : : PotentialCollision* colls );
83 : :
84 : : //! Transfer the interpolated solution data to destination mesh
85 : : void transferSolution( const std::vector< SolutionData >& sol );
86 : :
87 : : /** @name Charm++ pack/unpack serializer member functions */
88 : : ///@{
89 : : //! \brief Pack/Unpack serialize member function
90 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference
91 : 0 : void pup( PUP::er &p ) override {
92 : 0 : p | m_firstchunk;
93 : 0 : }
94 : : //! \brief Pack/Unpack serialize operator|
95 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference
96 : : //! \param[in,out] i NodeSearch object reference
97 : : friend void operator|( PUP::er& p, NodeSearch& i ) { i.pup(p); }
98 : : //@}
99 : :
100 : : private:
101 : : //! The ID of my first chunk (used for collision detection library)
102 : : int m_firstchunk;
103 : : //! Pointer to element connectivity
104 : : std::vector< std::size_t >* m_inpoel;
105 : : //! Pointer to point coordinates
106 : : std::array< std::vector< double >, 3 >* m_coord;
107 : : //! Pointer to solution in mesh nodes
108 : : tk::Fields* m_u;
109 : : //! Pointer to transfer flags
110 : : std::vector< double >* m_flag;
111 : : //! Transfer flags if true
112 : : bool m_trflag;
113 : : //! Transfer direction: 0: background to overset, 1: overset to background
114 : : bool m_dir;
115 : : //! The number of messages sent by the dest mesh
116 : : int m_numsent;
117 : : //! The number of messages received by the dest mesh
118 : : int m_numreceived;
119 : : //! Set to nonzero once source mesh is notified that source side is done
120 : : int m_srcnotified = 0;
121 : : //! Callback to call when transfer is done
122 : : CkCallback m_done;
123 : :
124 : : //! Initialize dest mesh solution with background data
125 : : void background();
126 : :
127 : : //! Contribute vertex information to the collsion detection library
128 : : void collideVertices();
129 : :
130 : : //! Contribute tet information to the collision detection library
131 : : void collideTets() const;
132 : : };
133 : :
134 : : } // transfer::
|