Mesh Oriented datABase  (version 5.5.1)
An array-based unstructured mesh library
ReorderTool.hpp
Go to the documentation of this file.
1 /** \file ReorderTool.hpp
2  * \author Jason Kraftcheck
3  * \date 2011-05-23
4  */
5 
6 #ifndef moab_REORDER_TOOL_HPP
7 #define moab_REORDER_TOOL_HPP
8 
9 #include "moab/Types.hpp"
10 #include <vector>
11 
12 namespace moab
13 {
14 
15 class Core;
16 class Range;
17 
19 {
20  public:
22 
23  /**\brief Calculate new handle order by tag value.
24  *
25  * Given a tag containing integer values, calculate new order for entities
26  * in the database (except entity sets) such that all entities
27  * with tag value A occur before all entities with tag value B
28  * in the handle space where A < B. Ordering will be stable for
29  * entities with the same tag value.
30  *
31  *\param ordering_tag Sinlge integer tag, where value on each entity
32  * determines the new position in the handle ordering.
33  * Entities may have duplicate values.
34  *\param ordering_tag_skip_value Do not reorder entities with this tag
35  * value. This is typically the default value of
36  * ordering_tag. Specifying this limits the re-ordering
37  * to only those entities for which ordering_tag has
38  * been set.
39  *\param new_handle_tag_out Passed back new tag handle containing the
40  * entity mapping. The returned tag will be anonymous.
41  * The caller is responsible for releasing the tag.
42  * The value of this tag on each handle is the new
43  * handle that the entity will will be moved to. The
44  * tag value will be zero for entities that were not
45  * re-ordered.
46  */
47  ErrorCode handle_order_from_int_tag( Tag ordering_tag, int ordering_tag_skip_value, Tag& new_handle_tag_out );
48 
49  /**\brief Calculate new handle order by tag value.
50  *
51  * Given a tag containing integer values, calculate new order for entities
52  * in the database (except entity sets) such that all entities
53  * with tag value A occur before all entities with tag value B
54  * in the handle space where A < B. Ordering will be stable for
55  * entities with the same tag value.
56  *
57  *\param type Entity type for which to calculate re-ordering.
58  *\param vals_per_ent Zero for vertices. Connectivity length for elements.
59  *\param ordering_tag Sinlge integer tag, where value on each entity
60  * determines the new position in the handle ordering.
61  * Entities may have duplicate values.
62  *\param ordering_tag_skip_value Do not reorder entities with this tag
63  * value. This is typically the default value of
64  * ordering_tag. Specifying this limits the re-ordering
65  * to only those entities for which ordering_tag has
66  * been set.
67  *\param new_handle_tag Tag into which to store new handle for each
68  * entity. Tag must be defined to store a single
69  * entity handle and must have a default value of
70  * zero.
71  */
72  ErrorCode handle_order_from_int_tag( EntityType type,
73  int vals_per_ent,
74  Tag ordering_tag,
75  int ordering_tag_skip_value,
76  Tag new_handle_tag );
77 
78  /**\brief Calculate new handle order by set containment
79  *
80  * Given a list of sets, re-order entities such that handles are
81  * grouped contiguously by set. Will also group all adjacent mesh
82  * entities, such that entities that are are adjacent to members of
83  * two or more of the input sets will ge grouped by the combined
84  * list of sets (e.g. if the input sets contain elements then all
85  * vertices that are adjacent to only elements in the first two sets
86  * will be grouped together).
87  *
88  *\param sets Entity sets by which to group entities.
89  *\param new_handle_tag_out Passed back new tag handle containing the
90  * entity mapping. The returned tag will be anonymous.
91  * The caller is responsible for releasing the tag.
92  * The value of this tag on each handle is the new
93  * handle that the entity will will be moved to. The
94  * tag value will be zero for entities that were not
95  * re-ordered.
96  */
97  ErrorCode handle_order_from_sets_and_adj( const Range& sets, Tag& new_handle_tag_out );
98 
99  /**\brief Do the re-ordering indicated by the passed handle tag.
100  *
101  * The specified re-ordering must be a permutation. Each existing
102  * entity must be moved to a new, existing handle such that no
103  * two entities are moved to the same new handle.
104  *
105  * Given a tag storing handles that define a permution, apply the
106  * described re-ordering. The passed tag must contain one entity
107  * handle per entity. The value of the tag must be zero for all
108  * entities that are not to be re-ordered. For entities to be
109  * re-ordered, the tag must contain the new handle that the entity
110  * is to be moved to. No two entities may have the same value for
111  * this tag (other than a value of zero.)
112  *
113  *\param new_handle_tag Tag containing new handles for entities to
114  * reorder. Typically the output of
115  * handle_order_from_int_tag or similar.
116  */
117  ErrorCode reorder_entities( Tag new_handle_tag );
118 
119  private:
120  /**\brief helper function for reorder_entities
121  *
122  * Reorder tag data for all entities of specified type.
123  *
124  * Also updates tag values for MB_TYPE_HANDLE tags.
125  *\param type Entity type to reorder
126  *\param new_handles Tag containing old->new handle mapping
127  *\param reorder_tag The tag data to reorder
128  */
129  ErrorCode reorder_tag_data( EntityType type, Tag new_handles, Tag reorder_tag );
130 
131  /**\brief helper function for reorder_entities
132  *
133  * Update set contents for changed handles.
134  *\param new_handles Tag containing old->new handle mapping
135  */
136  ErrorCode update_set_contents( Tag new_handles );
137 
138  /**\brief Get all entities of specified type and size
139  *\param t the type of entity to retreive
140  *\param vals_per_ent entity size (connectivity length for elements,
141  * dimension for vertices)
142  */
143  void get_entities( EntityType t, int vals_per_ent, Range& result );
144 
145  /**\brief Get new handles corresponding to old handles
146  *\param tag Tag containing old->new mapping
147  */
148  ErrorCode get_reordered_handles( Tag tag, const Range& old_handles, std::vector< EntityHandle >& new_handles );
149 
150  /**\brief Get new handles corresponding to old handles
151  *\param tag Tag containing old->new mapping
152  */
154  const std::vector< EntityHandle >& old_handles,
155  std::vector< EntityHandle >& new_handles );
156 
157  /**\brief Get new handles corresponding to old handles
158  *\param tag Tag containing old->new mapping
159  */
161  const EntityHandle* old_handles,
162  EntityHandle* new_handles,
163  size_t num_handles );
164 
165  /**\brief Remove any non-ordered handles and return new handles for remaining
166  *\param tag Tag containing old->new mapping
167  */
168  ErrorCode get_new_handles( Tag tag, Range& old_handles, std::vector< EntityHandle >& newhandles );
169 
170  /**\brief convert from input for \c handle_order_from_sets_and_adj to
171  * \c input for handle_order_from_int_tag
172  */
174  Tag order_tag,
175  int skip_val,
176  std::vector< std::vector< EntityHandle >* >& data );
177 
179 };
180 
181 } // namespace moab
182 
183 #endif // moab_REORDER_TOOL_HPP