LCOV - code coverage report
Current view: top level - ext/amrex/3d-coverage-g++-24.08/include - AMReX_BCRec.H (source / functions) Hit Total Coverage
Test: coverage_merged.info Lines: 5 5 100.0 %
Date: 2024-11-18 05:28:54 Functions: 2 2 100.0 %

          Line data    Source code
       1             : 
       2             : #ifndef AMREX_BCREC_H_
       3             : #define AMREX_BCREC_H_
       4             : #include <AMReX_Config.H>
       5             : 
       6             : #include <AMReX_Box.H>
       7             : #include <AMReX_BC_TYPES.H>
       8             : 
       9             : namespace amrex {
      10             : /**
      11             : * \brief Boundary Condition Records.
      12             : * Necessary information and functions for computing boundary conditions.
      13             : *
      14             : * This class has standard layout.  And we should keep it so!
      15             : */
      16             : class BCRec
      17             : {
      18             : public:
      19             :     /**
      20             :     * \brief The default constructor, which does NOT set valid boundary types.
      21             :     */
      22             :     AMREX_GPU_HOST_DEVICE
      23          66 :     BCRec () noexcept
      24             : 
      25             :         = default;
      26             :     /**
      27             :     * \brief The constructor.
      28             :     */
      29             :     AMREX_GPU_HOST_DEVICE
      30             :     BCRec (AMREX_D_DECL(int loX, int loY, int loZ),
      31             :            AMREX_D_DECL(int hiX, int hiY, int hiZ)) noexcept
      32             :         : bc {AMREX_D_DECL(loX,loY,loZ),
      33             :               AMREX_D_DECL(hiX,hiY,hiZ)}
      34             :         {}
      35             :     /**
      36             :     * \brief Another constructor.
      37             :     */
      38             :     AMREX_GPU_HOST_DEVICE
      39          66 :     BCRec (const int* a_lo, const int* a_hi) noexcept
      40          66 :         : bc {AMREX_D_DECL(a_lo[0],a_lo[1],a_lo[2]),
      41          66 :               AMREX_D_DECL(a_hi[0],a_hi[1],a_hi[2])}
      42          66 :         {}
      43             :     /*
      44             :     * \brief Yet another constructor.  Inherits bndry types from bc_domain
      45             :     * when bx lies on edge of domain otherwise gets interior Dirichlet.
      46             :     */
      47             :     AMREX_GPU_HOST_DEVICE
      48             :     BCRec (const Box&   bx,
      49             :            const Box&   domain,
      50             :            const BCRec& bc_domain) noexcept
      51             :     {
      52             :         const int* bxlo = bx.loVect();
      53             :         const int* bxhi = bx.hiVect();
      54             :         const int* dlo  = domain.loVect();
      55             :         const int* dhi  = domain.hiVect();
      56             :         for (int dir = 0; dir < AMREX_SPACEDIM; dir++)
      57             :         {
      58             :             int ilo = dir;
      59             :             int ihi = dir+AMREX_SPACEDIM;
      60             :             bc[ilo] = ( bxlo[dir]<=dlo[dir] ? bc_domain.bc[ilo] : BCType::int_dir );
      61             :             bc[ihi] = ( bxhi[dir]>=dhi[dir] ? bc_domain.bc[ihi] : BCType::int_dir );
      62             :         }
      63             :     }
      64             :     /*
      65             :     * \brief Explicitly set lo bndry value.
      66             :     */
      67             :     AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
      68             :     void setLo (int dir, int bc_val) noexcept { bc[dir] = bc_val; }
      69             :     /**
      70             :     * \brief Explicitly set hi bndry value.
      71             :     */
      72             :     AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
      73             :     void setHi (int dir, int bc_val) noexcept { bc[AMREX_SPACEDIM+dir] = bc_val; }
      74             :     /**
      75             :     * \brief Explicitly set bndry value for given face.
      76             :     */
      77             :     AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
      78             :     void set (Orientation face, int bc_val) noexcept {
      79             :         if (face.isLow()) {
      80             :             setLo(face.coordDir(), bc_val);
      81             :         } else {
      82             :             setHi(face.coordDir(), bc_val);
      83             :         }
      84             :     }
      85             :     /**
      86             :     * \brief  Return bndry values (used in calls to FORTRAN).
      87             :     */
      88             :     [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
      89             :     const int* vect () const& noexcept{ return bc; }
      90             :     const int* vect () && = delete;
      91             : 
      92             :     [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
      93             :     const int* data () const& noexcept { return bc; }
      94             :     const int* data () && = delete;
      95             : 
      96             :     /**
      97             :     * \brief Return low-end boundary data.
      98             :     */
      99             :     [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
     100             :     const int* lo () const& noexcept { return bc; }
     101             :     const int* lo () && = delete;
     102             :     /**
     103             :     * \brief Return high-end boundary data.
     104             :     */
     105             :     [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
     106             :     const int* hi () const& noexcept { return bc+AMREX_SPACEDIM; }
     107             :     const int* hi () && = delete;
     108             :     /**
     109             :     * \brief Return low-end boundary data in direction \<dir\>.
     110             :     */
     111             :     [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
     112             :     int lo (int dir) const noexcept { return bc[dir]; }
     113             :     /**
     114             :     * \brief Return high-end boundary data in direction \<dir\>.
     115             :     */
     116             :     [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
     117             :     int hi (int dir) const noexcept { return bc[AMREX_SPACEDIM+dir]; }
     118             :     /**
     119             :     * \brief Equal test.
     120             :     */
     121             :     [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
     122             :     bool operator== (const BCRec& rhs) const noexcept {
     123             :         bool retval = true;
     124             :         for (int i = 0; i < 2*AMREX_SPACEDIM && retval; i++)
     125             :         {
     126             :             retval &= bc[i] == rhs.bc[i];
     127             :         }
     128             :         return retval;
     129             :     }
     130             :     /**
     131             :     * \brief Not equal test.
     132             :     */
     133             :     [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
     134             :     bool operator!= (const BCRec& rhs) const noexcept { return !(*this == rhs); }
     135             :     /**
     136             :     * \brief ASCII write to ostream.
     137             :     */
     138             :     friend std::ostream& operator << (std::ostream&, const BCRec&);
     139             : 
     140             : private:
     141             :     /**
     142             :     * \brief Array of integer values describing boundary conditions.
     143             :     */
     144             :     int bc[2*AMREX_SPACEDIM]{AMREX_D_DECL(BCType::bogus,BCType::bogus,BCType::bogus),
     145             :               AMREX_D_DECL(BCType::bogus,BCType::bogus,BCType::bogus)};
     146             : };
     147             : 
     148             : /**
     149             :  * \brief Function for setting a BC.
     150             :  */
     151             : AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
     152             : void
     153             : setBC (const Box& bx, const Box& domain, const BCRec& bc_dom, BCRec& bcr) noexcept
     154             : {
     155             :     const int* bxlo = bx.loVect();
     156             :     const int* bxhi = bx.hiVect();
     157             :     const int* dlo  = domain.loVect();
     158             :     const int* dhi  = domain.hiVect();
     159             :     for (int dir = 0; dir < AMREX_SPACEDIM; dir++)
     160             :     {
     161             :         bcr.setLo(dir, ( bxlo[dir]<=dlo[dir] ? bc_dom.lo(dir) : BCType::int_dir ));
     162             :         bcr.setHi(dir, ( bxhi[dir]>=dhi[dir] ? bc_dom.hi(dir) : BCType::int_dir ));
     163             :     }
     164             : }
     165             : 
     166             : /**
     167             :  * \brief Function for setting array of BCs.
     168             :  */
     169             : void
     170             : setBC (const Box&           bx,
     171             :        const Box&           domain,
     172             :        int                  src_comp,
     173             :        int                  dest_comp,
     174             :        int                  ncomp,
     175             :        const Vector<BCRec>& bc_dom,
     176             :        Vector<BCRec>&       bcr) noexcept;
     177             : }
     178             : 
     179             : #endif /*_BCREC_H_*/

Generated by: LCOV version 1.14