1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 1998 - 2019 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE.md at
12 // the top level directory of deal.II.
13 //
14 // ---------------------------------------------------------------------
15 
16 #ifndef dealii_dof_iterators_h
17 #define dealii_dof_iterators_h
18 
19 #include <deal.II/base/config.h>
20 
21 
22 DEAL_II_NAMESPACE_OPEN
23 
24 // Forward declarations
25 #ifndef DOXYGEN
26 template <int, int, int>
27 class DoFInvalidAccessor;
28 
29 template <int structdim, int dim, int spacedim, bool lda>
30 class DoFAccessor;
31 template <int dim, int spacedim, bool lda>
32 class DoFCellAccessor;
33 
34 template <int dim, int spacedim>
35 class DoFHandler;
36 
37 template <typename Accessor>
38 class TriaRawIterator;
39 template <typename Accessor>
40 class TriaIterator;
41 template <typename Accessor>
42 class TriaActiveIterator;
43 #endif
44 
45 namespace internal
46 {
47   namespace DoFHandlerImplementation
48   {
49     template <int dim, int spacedim, bool lda = false>
50     struct Iterators;
51 
52 
53     /**
54      * Define some types for DoF handling in one dimension.
55      *
56      * The types have the same meaning as those declared in
57      * internal::TriangulationImplementation::Iterators<1,spacedim>, only the
58      * treatment of templates is a little more complicated. See the
59      * @ref Iterators
60      * module for more information.
61      */
62     template <int spacedim, bool lda>
63     struct Iterators<1, spacedim, lda>
64     {
65       using CellAccessor = dealii::DoFCellAccessor<1, spacedim, lda>;
66       using FaceAccessor = dealii::DoFAccessor<0, 1, spacedim, lda>;
67 
68       using raw_line_iterator    = TriaRawIterator<CellAccessor>;
69       using line_iterator        = TriaIterator<CellAccessor>;
70       using active_line_iterator = TriaActiveIterator<CellAccessor>;
71 
72       using raw_quad_iterator =
73         TriaRawIterator<DoFInvalidAccessor<2, 1, spacedim>>;
74       using quad_iterator = TriaIterator<DoFInvalidAccessor<2, 1, spacedim>>;
75       using active_quad_iterator =
76         TriaActiveIterator<DoFInvalidAccessor<2, 1, spacedim>>;
77 
78       using raw_hex_iterator =
79         TriaRawIterator<DoFInvalidAccessor<3, 1, spacedim>>;
80       using hex_iterator = TriaIterator<DoFInvalidAccessor<3, 1, spacedim>>;
81       using active_hex_iterator =
82         TriaActiveIterator<DoFInvalidAccessor<3, 1, spacedim>>;
83 
84       using raw_cell_iterator    = raw_line_iterator;
85       using cell_iterator        = line_iterator;
86       using active_cell_iterator = active_line_iterator;
87 
88       using raw_face_iterator    = TriaRawIterator<FaceAccessor>;
89       using face_iterator        = TriaIterator<FaceAccessor>;
90       using active_face_iterator = TriaActiveIterator<FaceAccessor>;
91     };
92 
93 
94 
95     /**
96      * Define some types for DoF handling in two dimensions.
97      *
98      * The types have the same meaning as those declared in
99      * internal::TriangulationImplementation::Iterators<2,spacedim>, only the
100      * treatment of templates is a little more complicated. See the
101      * @ref Iterators
102      * module for more information.
103      */
104     template <int spacedim, bool lda>
105     struct Iterators<2, spacedim, lda>
106     {
107       using CellAccessor = dealii::DoFCellAccessor<2, spacedim, lda>;
108       using FaceAccessor = dealii::DoFAccessor<1, 2, spacedim, lda>;
109 
110       using raw_line_iterator    = TriaRawIterator<FaceAccessor>;
111       using line_iterator        = TriaIterator<FaceAccessor>;
112       using active_line_iterator = TriaActiveIterator<FaceAccessor>;
113 
114       using raw_quad_iterator    = TriaRawIterator<CellAccessor>;
115       using quad_iterator        = TriaIterator<CellAccessor>;
116       using active_quad_iterator = TriaActiveIterator<CellAccessor>;
117 
118       using raw_hex_iterator =
119         TriaRawIterator<DoFInvalidAccessor<3, 2, spacedim>>;
120       using hex_iterator = TriaIterator<DoFInvalidAccessor<3, 2, spacedim>>;
121       using active_hex_iterator =
122         TriaActiveIterator<DoFInvalidAccessor<3, 2, spacedim>>;
123 
124       using raw_cell_iterator    = raw_quad_iterator;
125       using cell_iterator        = quad_iterator;
126       using active_cell_iterator = active_quad_iterator;
127 
128       using raw_face_iterator    = raw_line_iterator;
129       using face_iterator        = line_iterator;
130       using active_face_iterator = active_line_iterator;
131     };
132 
133 
134 
135     /**
136      * Define some types for DoF handling in three dimensions.
137      *
138      * The types have the same meaning as those declared in
139      * internal::TriangulationImplementation::Iterators<3,spacedim>, only the
140      * treatment of templates is a little more complicated. See the
141      * @ref Iterators
142      * module for more information.
143      */
144     template <int spacedim, bool lda>
145     struct Iterators<3, spacedim, lda>
146     {
147       using CellAccessor = dealii::DoFCellAccessor<3, spacedim, lda>;
148       using FaceAccessor = dealii::DoFAccessor<2, 3, spacedim, lda>;
149 
150       using raw_line_iterator =
151         TriaRawIterator<dealii::DoFAccessor<1, 3, spacedim, lda>>;
152       using line_iterator =
153         TriaIterator<dealii::DoFAccessor<1, 3, spacedim, lda>>;
154       using active_line_iterator =
155         TriaActiveIterator<dealii::DoFAccessor<1, 3, spacedim, lda>>;
156 
157       using raw_quad_iterator    = TriaRawIterator<FaceAccessor>;
158       using quad_iterator        = TriaIterator<FaceAccessor>;
159       using active_quad_iterator = TriaActiveIterator<FaceAccessor>;
160 
161       using raw_hex_iterator    = TriaRawIterator<CellAccessor>;
162       using hex_iterator        = TriaIterator<CellAccessor>;
163       using active_hex_iterator = TriaActiveIterator<CellAccessor>;
164 
165       using raw_cell_iterator    = raw_hex_iterator;
166       using cell_iterator        = hex_iterator;
167       using active_cell_iterator = active_hex_iterator;
168 
169       using raw_face_iterator    = raw_quad_iterator;
170       using face_iterator        = quad_iterator;
171       using active_face_iterator = active_quad_iterator;
172     };
173   } // namespace DoFHandlerImplementation
174 } // namespace internal
175 
176 DEAL_II_NAMESPACE_CLOSE
177 
178 #endif // dealii_dof_iterator_selector_h
179