Xyst test code coverage report
Current view: top level - Inciter/AMR - master_element_store.hpp (source / functions) Hit Total Coverage
Commit: e489e3468f2b950872163df1285c13fa7a355e8c Lines: 9 10 90.0 %
Date: 2024-11-20 18:16:45 Functions: 1 1 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 14 44 31.8 %

           Branch data     Line data    Source code
       1                 :            : #ifndef AMR_master_element_store_h
       2                 :            : #define AMR_master_element_store_h
       3                 :            : 
       4                 :            : #include <map>
       5                 :            : #include <algorithm>
       6                 :            : #include <cassert>
       7                 :            : 
       8                 :            : #include "Refinement_State.hpp"
       9                 :            : #include "AMR/Loggers.hpp"                   // for trace_out
      10                 :            : 
      11                 :            : namespace AMR {
      12                 :            : 
      13                 :            :     class master_element_store_t {
      14                 :            :         private:
      15                 :            :             std::map<size_t, Refinement_State> master_elements;
      16                 :            :         public:
      17                 :            :             //! Non-const-ref access to state
      18                 :            :             std::map<size_t, Refinement_State>& data() {
      19                 :      15664 :               return master_elements;
      20                 :            :             }
      21                 :            : 
      22                 :            :             /**
      23                 :            :              * @brief Add an element to the master element list.
      24                 :            :              *
      25                 :            :              * @param element_number The element number to add (currently
      26                 :            :              * somewhat redundant?)
      27                 :            :              * @param refinement_case The refinement_case which gave rise to
      28                 :            :              * this element
      29                 :            :              * @param refinement_level The level of refinement
      30                 :            :              * @param parent_id The id of the parent element
      31                 :            :              * @param has_parent True if element has a parent, default is true
      32                 :            :              *
      33                 :            :              * @return The id of the added element
      34                 :            :             */
      35                 :            :             // TODO: These add methods could probably be much tidier. The
      36                 :            :             // current none reliance on default input values is nice, as it
      37                 :            :             // means that we don't have to do any checks on if a valid value
      38                 :            :             // was passed for the base case..
      39                 :    1037478 :             size_t add(
      40                 :            :                  size_t element_number,
      41                 :            :                  Refinement_Case refinement_case,
      42                 :            :                  size_t refinement_level,
      43                 :            :                  size_t parent_id,
      44                 :            :                  bool has_parent=true
      45                 :            :             )
      46                 :            :             {
      47                 :            :                 Refinement_State d = Refinement_State(
      48                 :            :                         element_number,
      49                 :            :                         refinement_case,
      50                 :            :                         refinement_level,
      51                 :            :                         parent_id,
      52                 :            :                         has_parent
      53                 :    1037478 :                 );
      54                 :            : 
      55 [ +  - ][ +  - ]:    2074956 :                 master_elements.insert( std::pair<size_t, Refinement_State>(element_number, d));
         [ +  - ][ -  - ]
      56                 :            : 
      57                 :    1037478 :                 return element_number;
      58                 :            :             }
      59                 :            : 
      60                 :            :             /**
      61                 :            :              * @brief Accessor method to retrieve master element by element id
      62                 :            :              *
      63                 :            :              * @param id The element_id of the master_element to fetch
      64                 :            :              *
      65                 :            :              * @return The master_element which represents the corresponding tet
      66                 :            :              */
      67                 :            :             Refinement_State& get(size_t id)
      68                 :            :             {
      69                 :            :                 // cppcheck-suppress assertWithSideEffect
      70                 :            :                 assert( exists(id) );
      71 [ +  - ][ +  - ]:     653629 :                 return master_elements.at(id);
         [ +  - ][ -  - ]
         [ -  - ][ -  - ]
         [ -  - ][ -  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
      72                 :            :             }
      73                 :            : 
      74                 :            :             const Refinement_State& get(size_t id) const
      75                 :            :             {
      76                 :            :                 assert( exists(id) );
      77 [ +  - ][ +  - ]:     548532 :                 return master_elements.at(id);
         [ +  - ][ +  - ]
      78                 :            :             }
      79                 :            : 
      80                 :            :             /**
      81                 :            :              * @brief Function to check if master element entry exists. Useful
      82                 :            :              * for debugging access to invalid elements, or trying to re-create
      83                 :            :              * an element which already exists
      84                 :            :              *
      85                 :            :              * @param id Id to check
      86                 :            :              *
      87                 :            :              * @return Bool stating if the element already exists
      88                 :            :              */
      89                 :            :             bool exists(size_t id) const
      90                 :            :             {
      91                 :            :                 auto f = master_elements.find(id);
      92                 :            :                 if (f != master_elements.end())
      93                 :            :                 {
      94                 :            :                     //trace_out << "master_elements " << id << " exists." << std::endl;
      95                 :            :                     return true;
      96                 :            :                 }
      97                 :            :                 return false;
      98                 :            :             }
      99                 :            : 
     100                 :            :             /**
     101                 :            :              * @brief Getting function to access parent of a given ID
     102                 :            :              *
     103                 :            :              * @param id ID to find parent of
     104                 :            :              *
     105                 :            :              * @return ID of parent
     106                 :            :              */
     107                 :            :             size_t get_parent(size_t id) const
     108                 :            :             {
     109 [ -  - ][ -  - ]:          0 :                 return get(id).parent_id;
     110                 :            :             }
     111                 :            : 
     112                 :            :             /**
     113                 :            :              * @brief Getting function to find child id for a given parent
     114                 :            :              *
     115                 :            :              * @param parent_id ID of parent
     116                 :            :              * @param offset Offset into child list (i.e child number)
     117                 :            :              *
     118                 :            :              * @return ID of the child
     119                 :            :              */
     120                 :            :             size_t get_child_id(size_t parent_id, size_t offset) const
     121                 :            :             {
     122                 :            :                 // cppcheck-suppress assertWithSideEffect
     123                 :            :                 assert(offset < get(parent_id).children.size());
     124                 :     136844 :                 return get(parent_id).children[offset];
     125                 :            :             }
     126                 :            : 
     127                 :            :             /**
     128                 :            :              * @brief Wrapper function to calculate number of master elements
     129                 :            :              *
     130                 :            :              * @return total number of master elements
     131                 :            :              */
     132                 :            :             size_t size() {
     133                 :            :                 return master_elements.size();
     134                 :            :             }
     135                 :            : 
     136                 :            :             /**
     137                 :            :              * @brief Add child to a given node, to track the relationship and
     138                 :            :              * allow graph traversal
     139                 :            :              *
     140                 :            :              * @param parent_id ID of the parent
     141                 :            :              * @param child_id ID of the child
     142                 :            :              */
     143                 :            :             void add_child(size_t parent_id, size_t child_id)
     144                 :            :             {
     145                 :     112028 :                 get(parent_id).children.push_back(child_id);
     146                 :            : 
     147                 :            :                 // cppcheck-suppress assertWithSideEffect
     148                 :            :                 assert( get(parent_id).children.size() <= 8);
     149                 :            :             }
     150                 :            : 
     151                 :            :             /**
     152                 :            :              * @brief  Remove id from master_element (relevant for
     153                 :            :              * de-refinement)
     154                 :            :              *
     155                 :            :              * @param id ID of element to remove
     156                 :            :              */
     157                 :            :             void erase(size_t id) {
     158                 :            :                 master_elements.erase(id);
     159                 :            :             }
     160                 :            : 
     161                 :            : 
     162                 :            :     };
     163                 :            : }
     164                 :            : 
     165                 :            : #endif // guard

Generated by: LCOV version 1.16