Quinoa regression test code coverage report
Current view: top level - Inciter - DistFCT.hpp (source / functions) Hit Total Coverage
Commit: Quinoa_v0.3-957-gb4f0efae0 Lines: 21 21 100.0 %
Date: 2021-11-09 13:40:20 Functions: 2 2 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 1 2 50.0 %

           Branch data     Line data    Source code
       1                 :            : // *****************************************************************************
       2                 :            : /*!
       3                 :            :   \file      src/Inciter/DistFCT.hpp
       4                 :            :   \copyright 2012-2015 J. Bakosi,
       5                 :            :              2016-2018 Los Alamos National Security, LLC.,
       6                 :            :              2019-2021 Triad National Security, LLC.
       7                 :            :              All rights reserved. See the LICENSE file for details.
       8                 :            :   \brief     Charm++ chare array for distributed flux-corrected transport
       9                 :            :   \details   Charm++ chare array for asynchronous distributed
      10                 :            :     flux-corrected transport (FCT).
      11                 :            : 
      12                 :            :     There are a potentially large number of DistFCT Charm++ chares created by
      13                 :            :     Transporter. Each DistFCT gets a chunk of the full load (part of the mesh)
      14                 :            :     and performs flux-corrected transport.
      15                 :            : 
      16                 :            :     The implementation uses the Charm++ runtime system and is fully
      17                 :            :     asynchronous, overlapping computation and communication. The algorithm
      18                 :            :     utilizes the structured dagger (SDAG) Charm++ functionality. The high-level
      19                 :            :     overview of the algorithm structure and how it interfaces with Charm++ is
      20                 :            :     discussed in the Charm++ interface file src/Inciter/distfct.ci.
      21                 :            : */
      22                 :            : // *****************************************************************************
      23                 :            : #ifndef DistFCT_h
      24                 :            : #define DistFCT_h
      25                 :            : 
      26                 :            : #include <cstddef>
      27                 :            : #include <iosfwd>
      28                 :            : #include <utility>
      29                 :            : #include <vector>
      30                 :            : #include <cstring>
      31                 :            : #include <cmath>
      32                 :            : #include <unordered_map>
      33                 :            : #include <unordered_set>
      34                 :            : #include <set>
      35                 :            : 
      36                 :            : #include "Types.hpp"
      37                 :            : #include "Fields.hpp"
      38                 :            : #include "DerivedData.hpp"
      39                 :            : #include "FluxCorrector.hpp"
      40                 :            : #include "Discretization.hpp"
      41                 :            : #include "DiagCG.hpp"
      42                 :            : #include "Inciter/InputDeck/InputDeck.hpp"
      43                 :            : 
      44                 :            : #include "NoWarning/distfct.decl.h"
      45                 :            : 
      46                 :            : namespace inciter {
      47                 :            : 
      48                 :            : //! DistFCT Charm++ chare array used to advance PDEs in time with DiagCG+LW+FCT
      49                 :            : class DistFCT : public CBase_DistFCT {
      50                 :            : 
      51                 :            :   public:
      52                 :            :     #if defined(__clang__)
      53                 :            :       #pragma clang diagnostic push
      54                 :            :       #pragma clang diagnostic ignored "-Wunused-parameter"
      55                 :            :       #pragma clang diagnostic ignored "-Wdeprecated-declarations"
      56                 :            :     #elif defined(STRICT_GNUC)
      57                 :            :       #pragma GCC diagnostic push
      58                 :            :       #pragma GCC diagnostic ignored "-Wunused-parameter"
      59                 :            :       #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
      60                 :            :     #elif defined(__INTEL_COMPILER)
      61                 :            :       #pragma warning( push )
      62                 :            :       #pragma warning( disable: 1478 )
      63                 :            :     #endif
      64                 :            :     // Include Charm++ SDAG code. See http://charm.cs.illinois.edu/manuals/html/
      65                 :            :     // charm++/manual.html, Sec. "Structured Control Flow: Structured Dagger".
      66                 :            :     DistFCT_SDAG_CODE
      67                 :            :     #if defined(__clang__)
      68                 :            :       #pragma clang diagnostic pop
      69                 :            :     #elif defined(STRICT_GNUC)
      70                 :            :       #pragma GCC diagnostic pop
      71                 :            :     #elif defined(__INTEL_COMPILER)
      72                 :            :       #pragma warning( pop )
      73                 :            :     #endif
      74                 :            : 
      75                 :            :     //! Constructor
      76                 :            :     explicit
      77                 :            :     DistFCT( int nchare,
      78                 :            :              std::size_t nu,
      79                 :            :              std::size_t np,
      80                 :            :              const tk::NodeCommMap& nodeCommMap,
      81                 :            :              const std::unordered_map< std::size_t, std::size_t >& bid,
      82                 :            :              const std::unordered_map< std::size_t, std::size_t >& lid,
      83                 :            :              const std::vector< std::size_t >& inpoel );
      84                 :            : 
      85                 :            :     #if defined(__clang__)
      86                 :            :       #pragma clang diagnostic push
      87                 :            :       #pragma clang diagnostic ignored "-Wundefined-func-template"
      88                 :            :     #endif
      89                 :            :     //! Migrate constructor
      90                 :            :     // cppcheck-suppress uninitMemberVar
      91         [ +  - ]:       1926 :     explicit DistFCT( CkMigrateMessage* ) {}
      92                 :            :     #if defined(__clang__)
      93                 :            :       #pragma clang diagnostic pop
      94                 :            :     #endif
      95                 :            : 
      96                 :            :     //! \brief Compute mass diffusion rhs contribution required for the low
      97                 :            :     //!   order solution
      98                 :            :     tk::Fields diff( const Discretization& d, const tk::Fields& Un );
      99                 :            : 
     100                 :            :     //! Prepare for next time step stage
     101                 :            :     void next();
     102                 :            : 
     103                 :            :     //! Receive sums of antidiffusive element contributions on chare-boundaries
     104                 :            :     void comaec( const std::vector< std::size_t >& gid,
     105                 :            :                  const std::vector< std::vector< tk::real > >& P );
     106                 :            : 
     107                 :            :     //! \brief Receive contributions to the maxima and minima of unknowns of all
     108                 :            :     //!   elements surrounding mesh nodes on chare-boundaries
     109                 :            :     void comalw( const std::vector< std::size_t >& gid,
     110                 :            :                  const std::vector< std::vector< tk::real > >& Q );
     111                 :            : 
     112                 :            :     //! \brief Receive contributions of limited antidiffusive element
     113                 :            :     //!   contributions on chare-boundaries
     114                 :            :     void comlim( const std::vector< std::size_t >& gid,
     115                 :            :                  const std::vector< std::vector< tk::real > >& A );
     116                 :            : 
     117                 :            :     //! Compute and sum antidiffusive element contributions (AEC) to mesh nodes
     118                 :            :     void aec(
     119                 :            :       const Discretization& d,
     120                 :            :       const tk::Fields& dUh,
     121                 :            :       const tk::Fields& Un,
     122                 :            :       const std::unordered_map< std::size_t,
     123                 :            :               std::vector< std::pair< bool, tk::real > > >& bcdir,
     124                 :            :       const std::unordered_map< int,
     125                 :            :               std::unordered_set< std::size_t > >& symbcnodemap,
     126                 :            :       const std::unordered_map< int,
     127                 :            :         std::unordered_map< std::size_t, std::array< tk::real, 4 > > >& bnorm );
     128                 :            : 
     129                 :            :     //! \brief Compute the maximum and minimum unknowns of all elements
     130                 :            :     //!   surrounding nodes
     131                 :            :     void alw( const tk::Fields& Un,
     132                 :            :               const tk::Fields& Ul,
     133                 :            :               tk::Fields&& dUl,
     134                 :            :               const CProxy_DiagCG& host );
     135                 :            : 
     136                 :            :     //! Remap local ids after a mesh node reorder
     137                 :            :     void remap( const Discretization& d );
     138                 :            : 
     139                 :            :     //! Resize FCT data structures (e.g., after mesh refinement)
     140                 :            :     void resize( std::size_t nu,
     141                 :            :                  const tk::NodeCommMap& nodeCommMap,
     142                 :            :                  const std::unordered_map< std::size_t, std::size_t >& bid,
     143                 :            :                  const std::unordered_map< std::size_t, std::size_t >& lid,
     144                 :            :                  const std::vector< std::size_t >& inpoel );
     145                 :            : 
     146                 :            :     //! Collect mesh output fields from FCT
     147                 :            :     std::tuple< std::vector< std::string >,
     148                 :            :             std::vector< std::vector< tk::real > >,
     149                 :            :             std::vector< std::string >,
     150                 :            :             std::vector< std::vector< tk::real > > >
     151                 :            :     fields() const;
     152                 :            : 
     153                 :            :     /** @name Pack/unpack (Charm++ serialization) routines */
     154                 :            :     ///@{
     155                 :            :     //! \brief Pack/Unpack serialize member function
     156                 :            :     //! \param[in,out] p Charm++'s PUP::er serializer object reference
     157                 :       5778 :     void pup( PUP::er &p ) override {
     158                 :       5778 :       p | m_naec;
     159                 :       5778 :       p | m_nalw;
     160                 :       5778 :       p | m_nlim;
     161                 :       5778 :       p | m_nchare;
     162                 :       5778 :       p | m_nodeCommMap;
     163                 :       5778 :       p | m_bid;
     164                 :       5778 :       p | m_lid;
     165                 :       5778 :       p | m_inpoel;
     166                 :      11556 :       p | m_fluxcorrector;
     167                 :       5778 :       p | m_p;
     168                 :       5778 :       p | m_q;
     169                 :       5778 :       p | m_a;
     170                 :       5778 :       p | m_pc;
     171                 :       5778 :       p | m_qc;
     172                 :       5778 :       p | m_ac;
     173                 :       5778 :       p | m_ul;
     174                 :       5778 :       p | m_dul;
     175                 :       5778 :       p | m_du;
     176                 :            :       p | m_host;
     177                 :       5778 :     }
     178                 :            :     //! \brief Pack/Unpack serialize operator|
     179                 :            :     //! \param[in,out] p Charm++'s PUP::er serializer object reference
     180                 :            :     //! \param[in,out] i DistFCT object reference
     181                 :            :     friend void operator|( PUP::er& p, DistFCT& i ) { i.pup(p); }
     182                 :            :     ///@}
     183                 :            : 
     184                 :            :   private:
     185                 :            :     using ncomp_t = kw::ncomp::info::expect::type;
     186                 :            : 
     187                 :            :     //! \brief Number of chares from which we received antidiffusive element
     188                 :            :     //!   contributions on chare boundaries
     189                 :            :     std::size_t m_naec;
     190                 :            :     //! \brief Number of chares from which we received maximum and minimum
     191                 :            :     //!   unknowns of elements surrounding nodes on chare boundaries
     192                 :            :     std::size_t m_nalw;
     193                 :            :     //! \brief Number of chares from which we received limited antidiffusion
     194                 :            :     //!   element contributiones on chare boundaries
     195                 :            :     std::size_t m_nlim;
     196                 :            :     //! Total number of worker chares
     197                 :            :     std::size_t m_nchare;
     198                 :            :     //! \brief Global mesh node IDs bordering the mesh chunk held by fellow
     199                 :            :     //!   chares associated to their chare IDs
     200                 :            :     //! \note This is a copy. Original in (bound) Discretization
     201                 :            :     tk::NodeCommMap m_nodeCommMap;
     202                 :            :     //! \brief Local chare-boundary mesh node IDs at which we receive
     203                 :            :     //!   contributions associated to global mesh node IDs of mesh elements we
     204                 :            :     //!   contribute to
     205                 :            :     //! \note This is a copy. Original in (bound) Discretization
     206                 :            :     std::unordered_map< std::size_t, std::size_t > m_bid;
     207                 :            :     //! Local mesh node ids associated to the global ones of owned elements
     208                 :            :     //! \note This is a copy. Original in (bound) Discretization
     209                 :            :     std::unordered_map< std::size_t, std::size_t > m_lid;
     210                 :            :     //! Mesh connectivity of our chunk of the mesh
     211                 :            :     //! \note This is a copy. Original in (bound) Discretization
     212                 :            :     std::vector< std::size_t > m_inpoel;
     213                 :            :     //! Flux corrector performing FCT
     214                 :            :     FluxCorrector m_fluxcorrector;
     215                 :            :     //! Flux-corrected transport data structures
     216                 :            :     tk::Fields m_p, m_q, m_a;
     217                 :            :     //! Receive buffers for FCT
     218                 :            :     std::vector< std::vector< tk::real > > m_pc, m_qc, m_ac;
     219                 :            :     //! Pointer to low order solution vector and increment
     220                 :            :     //! \note These are copies. Original in (bound) Discretization
     221                 :            :     tk::Fields m_ul, m_dul, m_du;
     222                 :            :     //! Host proxy (DiagCG) we interoperate with
     223                 :            :     CProxy_DiagCG m_host;
     224                 :            : 
     225                 :            :     //! Size FCT communication buffers
     226                 :            :     void resizeComm();
     227                 :            : 
     228                 :            :     //! Compute the limited antidiffusive element contributions
     229                 :            :     void lim( const std::unordered_map< std::size_t,
     230                 :            :                 std::vector< std::pair< bool, tk::real > > >& bcdir );
     231                 :            : 
     232                 :            :     //! Apply limited antidiffusive element contributions
     233                 :            :     void apply();
     234                 :            : };
     235                 :            : 
     236                 :            : } // inciter::
     237                 :            : 
     238                 :            : #endif // DistFCT_h

Generated by: LCOV version 1.14