]> https://gitweb.dealii.org/ - dealii.git/blob - include/deal.II/grid/tria_objects_orientations.h
b6bd8e3bef0d2637292d9f5726846ac0c1bc232b
[dealii.git] / include / deal.II / grid / tria_objects_orientations.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2022 - 2023 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_tria_objects_orientations_h
17 #define dealii_tria_objects_orientations_h
18
19 #include <deal.II/base/config.h>
20
21 #include <deal.II/base/exceptions.h>
22 #include <deal.II/base/memory_consumption.h>
23 #include <deal.II/base/utilities.h>
24
25 #include <deal.II/grid/reference_cell.h>
26
27 #include <vector>
28
29 DEAL_II_NAMESPACE_OPEN
30
31 namespace internal
32 {
33   namespace TriangulationImplementation
34   {
35     /**
36      * Class storing orientation information for various objects in a
37      * Triangulation.
38      *
39      * @ingroup reordering
40      */
41     class TriaObjectsOrientations
42     {
43     public:
44       /**
45        * Constructor.
46        */
47       TriaObjectsOrientations();
48
49       /**
50        * Constructor. Sets up objects in the default orientation (orientation
51        * = `true`).
52        */
53       TriaObjectsOrientations(const unsigned int n_objects);
54
55       /**
56        * Return number of geometric objects stored by this class.
57        */
58       unsigned int
59       n_objects() const;
60
61       /**
62        * Reset the object to a default state.
63        */
64       void
65       reinit(const unsigned int n_objects);
66
67       /**
68        * Change the number of stored objects. New objects are constructed in
69        * the default orientation (true, false, false).
70        */
71       void
72       resize(const unsigned int n_objects);
73
74       /**
75        * Return the size of objects of this kind.
76        */
77       std::size_t
78       memory_consumption() const;
79
80       /**
81        * Get the combined orientation of the object, as described in the class
82        * documentation.
83        */
84       unsigned char
85       get_combined_orientation(const unsigned int object) const;
86
87       /**
88        * Get the orientation bit of the object.
89        */
90       bool
91       get_orientation(const unsigned int object) const;
92
93       /**
94        * Get the rotation bit of the object.
95        */
96       bool
97       get_rotation(const unsigned int object) const;
98
99       /**
100        * Get the flip bit of the object.
101        */
102       bool
103       get_flip(const unsigned int object) const;
104
105       /**
106        * Set the combined orientation of the object, as described in the class
107        * documentation.
108        */
109       void
110       set_combined_orientation(const unsigned int  object,
111                                const unsigned char value);
112
113       /**
114        * Set the orientation bit of the object.
115        */
116       void
117       set_orientation(const unsigned int object, const bool value);
118
119       /**
120        * Set the rotate bit of the object.
121        */
122       void
123       set_rotation(const unsigned int object, const bool value);
124
125       /**
126        * Set the flip bit of the object.
127        */
128       void
129       set_flip(const unsigned int object, const bool value);
130
131       /**
132        * Read or write the data of this object to or from a stream for the
133        * purpose of serialization using the [BOOST serialization
134        * library](https://www.boost.org/doc/libs/1_74_0/libs/serialization/doc/index.html).
135        */
136       template <class Archive>
137       void
138       serialize(Archive &ar, const unsigned int version);
139
140     private:
141       /**
142        * Number of objects.
143        */
144       unsigned int n_stored_objects;
145
146       /**
147        * Flags.
148        */
149       std::vector<unsigned char> flags;
150     };
151
152     //----------------------------------------------------------------------//
153
154     inline TriaObjectsOrientations::TriaObjectsOrientations()
155     {
156       reinit(0);
157     }
158
159
160
161     inline TriaObjectsOrientations::TriaObjectsOrientations(
162       const unsigned int n_objects)
163     {
164       reinit(n_objects);
165     }
166
167
168
169     inline void
170     TriaObjectsOrientations::reinit(const unsigned int n_objects)
171     {
172       n_stored_objects = n_objects;
173       // Assign to the default orientation
174       flags.assign(n_objects,
175                    ReferenceCell::default_combined_face_orientation());
176     }
177
178
179
180     inline void
181     TriaObjectsOrientations::resize(const unsigned int n_objects)
182     {
183       flags.resize(n_objects,
184                    ReferenceCell::default_combined_face_orientation());
185       n_stored_objects = n_objects;
186     }
187
188
189
190     inline std::size_t
191     TriaObjectsOrientations::memory_consumption() const
192     {
193       return MemoryConsumption::memory_consumption(n_stored_objects) +
194              MemoryConsumption::memory_consumption(flags);
195     }
196
197
198
199     inline unsigned int
200     TriaObjectsOrientations::n_objects() const
201     {
202       return n_stored_objects;
203     }
204
205
206
207     inline unsigned char
208     TriaObjectsOrientations::get_combined_orientation(
209       const unsigned int object) const
210     {
211       AssertIndexRange(object, n_stored_objects);
212       return flags[object];
213     }
214
215
216
217     inline bool
218     TriaObjectsOrientations::get_orientation(const unsigned int object) const
219     {
220       AssertIndexRange(object, n_stored_objects);
221       return Utilities::get_bit(flags[object], 0);
222     }
223
224
225
226     inline bool
227     TriaObjectsOrientations::get_rotation(const unsigned int object) const
228     {
229       AssertIndexRange(object, n_stored_objects);
230       return Utilities::get_bit(flags[object], 1);
231     }
232
233
234
235     inline bool
236     TriaObjectsOrientations::get_flip(const unsigned int object) const
237     {
238       AssertIndexRange(object, n_stored_objects);
239       return Utilities::get_bit(flags[object], 2);
240     }
241
242
243
244     inline void
245     TriaObjectsOrientations::set_combined_orientation(const unsigned int object,
246                                                       const unsigned char value)
247     {
248       AssertIndexRange(object, n_stored_objects);
249       flags[object] = value;
250     }
251
252
253
254     inline void
255     TriaObjectsOrientations::set_orientation(const unsigned int object,
256                                              const bool         value)
257     {
258       AssertIndexRange(object, n_stored_objects);
259       Utilities::set_bit(flags[object], 0, value);
260     }
261
262
263
264     inline void
265     TriaObjectsOrientations::set_rotation(const unsigned int object,
266                                           const bool         value)
267     {
268       AssertIndexRange(object, n_stored_objects);
269       Utilities::set_bit(flags[object], 1, value);
270     }
271
272
273
274     inline void
275     TriaObjectsOrientations::set_flip(const unsigned int object,
276                                       const bool         value)
277     {
278       AssertIndexRange(object, n_stored_objects);
279       Utilities::set_bit(flags[object], 2, value);
280     }
281
282
283
284     template <class Archive>
285     void
286     TriaObjectsOrientations::serialize(Archive &ar, const unsigned int)
287     {
288       ar &n_stored_objects &flags;
289     }
290   } // namespace TriangulationImplementation
291 } // namespace internal
292
293 DEAL_II_NAMESPACE_CLOSE
294
295 #endif

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.