Line data Source code
1 : #ifndef AMR_types_h
2 : #define AMR_types_h
3 :
4 : #include <array>
5 : #include <vector>
6 : #include <map>
7 :
8 : #include "../Base/Types.hpp"
9 : #include "edge.hpp"
10 : #include "UnsMesh.hpp"
11 :
12 : // TODO: Do we need to merge this with Base/Types.h?
13 :
14 : namespace AMR {
15 :
16 : const int DIMENSION = 3;
17 : const size_t NUM_TET_NODES = 4;
18 : const size_t NUM_FACE_NODES = 3;
19 : const size_t NUM_TET_EDGES = 6;
20 : const size_t NUM_TET_FACES = 4;
21 : const size_t ID_SHIFT = 3;
22 : const size_t MAX_CHILDREN = 8;
23 : const char KEY_DELIM = '-';
24 :
25 : using real_t = tk::real;
26 : using coordinate_t = std::array<real_t, DIMENSION>;
27 : using tet_t = std::array<size_t, NUM_TET_NODES>;
28 :
29 : using node_pair_t = std::array<std::size_t, 2>;
30 :
31 : using face_ids_t = std::array<std::size_t, NUM_FACE_NODES>;
32 : using face_list_t = std::array< face_ids_t, NUM_TET_FACES>;
33 :
34 : //using child_id_list_t = std::array<size_t, MAX_CHILDREN>;
35 : using child_id_list_t = std::vector<size_t>;
36 :
37 : using tet_list_t = std::map<size_t, tet_t>;
38 :
39 : using inpoel_t = std::vector< std::size_t >; //!< Tetrahedron connectivity
40 : using node_list_t = std::vector<real_t>;
41 :
42 : enum Edge_Lock_Case {unlocked = 0, locked, intermediate, temporary};
43 :
44 : // TODO: Make these class enums? (breaks printing)
45 : struct Edge_Refinement {
46 : size_t A;
47 : size_t B;
48 : int needs_refining; // value of 1= refinement; 2= deref-ref (as in for 8:4)
49 : bool needs_derefining; // TODO: Marge this with needs_refining
50 : Edge_Lock_Case lock_case; // TODO: Refactor this to match _ style?
51 :
52 : // Explicit Empty Constructor
53 1496515 : Edge_Refinement() :
54 1496515 : A(0),
55 1496515 : B(0),
56 1496515 : needs_refining(0),
57 1496515 : needs_derefining(false),
58 1496515 : lock_case(Edge_Lock_Case::unlocked)
59 : {
60 : // Empty
61 1496515 : }
62 :
63 : // bool operator==( const Edge_Refinement& r ) const {
64 : // return A == r.A &&
65 : // B == r.B &&
66 : // //std::abs(refinement_criteria-r.refinement_criteria) < 1.0e-12 &&
67 : // needs_refining == r.needs_refining &&
68 : // needs_derefining == r.needs_derefining &&
69 : // is_dead == r.is_dead &&
70 : // lock_case == r.lock_case;
71 : // }
72 :
73 : // This abstraction is hardly any better than using an explicit initialisation
74 : // list but it makes it easier if we decide to add/remove a parameter
75 6895572 : Edge_Refinement(
76 : size_t A_in,
77 : size_t B_in,
78 : int needs_refining_in,
79 : bool needs_derefining_in,
80 : Edge_Lock_Case lock_case_in
81 6895572 : ) :
82 6895572 : A(A_in),
83 6895572 : B(B_in),
84 6895572 : needs_refining(needs_refining_in),
85 6895572 : needs_derefining(needs_derefining_in),
86 6895572 : lock_case(lock_case_in)
87 : {
88 : // Empty, all implicit.
89 : // Could add logic here to reconcile needs_refining and needs_derefining
90 6895572 : }
91 : };
92 :
93 : // Complex types
94 : struct Edge_Refinement; // forward declare
95 : using edges_t = std::map<edge_t, Edge_Refinement>;
96 : using edge_list_t = std::array<edge_t, NUM_TET_EDGES>;
97 : using edge_list_ids_t = std::array<std::size_t, NUM_TET_EDGES>;
98 :
99 : using coord_type = std::vector< tk::real >;
100 :
101 : //! \brief Needs refinement and edge lock case associated to an edge given by global
102 : //! parent IDs
103 : using EdgeData =
104 : std::unordered_map< tk::UnsMesh::Edge,
105 : std::tuple< int, int, Edge_Lock_Case >,
106 : tk::UnsMesh::Hash<2>,
107 : tk::UnsMesh::Eq<2> >;
108 :
109 : //! Enum used to tag an edge for refinement or derefinement
110 : enum class edge_tag : uint8_t { REFINE, DEREFINE };
111 :
112 : } // AMR::
113 :
114 : #endif
|