![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /** \file ReorderTool.hpp
00002 * \author Jason Kraftcheck
00003 * \date 2011-05-23
00004 */
00005
00006 #ifndef moab_REORDER_TOOL_HPP
00007 #define moab_REORDER_TOOL_HPP
00008
00009 #include "moab/Types.hpp"
00010 #include
00011
00012 namespace moab
00013 {
00014
00015 class Core;
00016 class Range;
00017
00018 class ReorderTool
00019 {
00020 public:
00021 ReorderTool( Core* moab ) : mMB( moab ) {}
00022
00023 /**\brief Calculate new handle order by tag value.
00024 *
00025 * Given a tag containing integer values, calculate new order for entities
00026 * in the database (except entity sets) such that all entities
00027 * with tag value A occur before all entities with tag value B
00028 * in the handle space where A < B. Ordering will be stable for
00029 * entities with the same tag value.
00030 *
00031 *\param ordering_tag Sinlge integer tag, where value on each entity
00032 * determines the new position in the handle ordering.
00033 * Entities may have duplicate values.
00034 *\param ordering_tag_skip_value Do not reorder entities with this tag
00035 * value. This is typically the default value of
00036 * ordering_tag. Specifying this limits the re-ordering
00037 * to only those entities for which ordering_tag has
00038 * been set.
00039 *\param new_handle_tag_out Passed back new tag handle containing the
00040 * entity mapping. The returned tag will be anonymous.
00041 * The caller is responsible for releasing the tag.
00042 * The value of this tag on each handle is the new
00043 * handle that the entity will will be moved to. The
00044 * tag value will be zero for entities that were not
00045 * re-ordered.
00046 */
00047 ErrorCode handle_order_from_int_tag( Tag ordering_tag, int ordering_tag_skip_value, Tag& new_handle_tag_out );
00048
00049 /**\brief Calculate new handle order by tag value.
00050 *
00051 * Given a tag containing integer values, calculate new order for entities
00052 * in the database (except entity sets) such that all entities
00053 * with tag value A occur before all entities with tag value B
00054 * in the handle space where A < B. Ordering will be stable for
00055 * entities with the same tag value.
00056 *
00057 *\param type Entity type for which to calculate re-ordering.
00058 *\param vals_per_ent Zero for vertices. Connectivity length for elements.
00059 *\param ordering_tag Sinlge integer tag, where value on each entity
00060 * determines the new position in the handle ordering.
00061 * Entities may have duplicate values.
00062 *\param ordering_tag_skip_value Do not reorder entities with this tag
00063 * value. This is typically the default value of
00064 * ordering_tag. Specifying this limits the re-ordering
00065 * to only those entities for which ordering_tag has
00066 * been set.
00067 *\param new_handle_tag Tag into which to store new handle for each
00068 * entity. Tag must be defined to store a single
00069 * entity handle and must have a default value of
00070 * zero.
00071 */
00072 ErrorCode handle_order_from_int_tag( EntityType type,
00073 int vals_per_ent,
00074 Tag ordering_tag,
00075 int ordering_tag_skip_value,
00076 Tag new_handle_tag );
00077
00078 /**\brief Calculate new handle order by set containment
00079 *
00080 * Given a list of sets, re-order entities such that handles are
00081 * grouped contiguously by set. Will also group all adjacent mesh
00082 * entities, such that entities that are are adjacent to members of
00083 * two or more of the input sets will ge grouped by the combined
00084 * list of sets (e.g. if the input sets contain elements then all
00085 * vertices that are adjacent to only elements in the first two sets
00086 * will be grouped together).
00087 *
00088 *\param sets Entity sets by which to group entities.
00089 *\param new_handle_tag_out Passed back new tag handle containing the
00090 * entity mapping. The returned tag will be anonymous.
00091 * The caller is responsible for releasing the tag.
00092 * The value of this tag on each handle is the new
00093 * handle that the entity will will be moved to. The
00094 * tag value will be zero for entities that were not
00095 * re-ordered.
00096 */
00097 ErrorCode handle_order_from_sets_and_adj( const Range& sets, Tag& new_handle_tag_out );
00098
00099 /**\brief Do the re-ordering indicated by the passed handle tag.
00100 *
00101 * The specified re-ordering must be a permutation. Each existing
00102 * entity must be moved to a new, existing handle such that no
00103 * two entities are moved to the same new handle.
00104 *
00105 * Given a tag storing handles that define a permution, apply the
00106 * described re-ordering. The passed tag must contain one entity
00107 * handle per entity. The value of the tag must be zero for all
00108 * entities that are not to be re-ordered. For entities to be
00109 * re-ordered, the tag must contain the new handle that the entity
00110 * is to be moved to. No two entities may have the same value for
00111 * this tag (other than a value of zero.)
00112 *
00113 *\param new_handle_tag Tag containing new handles for entities to
00114 * reorder. Typically the output of
00115 * handle_order_from_int_tag or similar.
00116 */
00117 ErrorCode reorder_entities( Tag new_handle_tag );
00118
00119 private:
00120 /**\brief helper function for reorder_entities
00121 *
00122 * Reorder tag data for all entities of specified type.
00123 *
00124 * Also updates tag values for MB_TYPE_HANDLE tags.
00125 *\param type Entity type to reorder
00126 *\param new_handles Tag containing old->new handle mapping
00127 *\param reorder_tag The tag data to reorder
00128 */
00129 ErrorCode reorder_tag_data( EntityType type, Tag new_handles, Tag reorder_tag );
00130
00131 /**\brief helper function for reorder_entities
00132 *
00133 * Update set contents for changed handles.
00134 *\param new_handles Tag containing old->new handle mapping
00135 */
00136 ErrorCode update_set_contents( Tag new_handles );
00137
00138 /**\brief Get all entities of specified type and size
00139 *\param t the type of entity to retreive
00140 *\param vals_per_ent entity size (connectivity length for elements,
00141 * dimension for vertices)
00142 */
00143 void get_entities( EntityType t, int vals_per_ent, Range& result );
00144
00145 /**\brief Get new handles corresponding to old handles
00146 *\param tag Tag containing old->new mapping
00147 */
00148 ErrorCode get_reordered_handles( Tag tag, const Range& old_handles, std::vector< EntityHandle >& new_handles );
00149
00150 /**\brief Get new handles corresponding to old handles
00151 *\param tag Tag containing old->new mapping
00152 */
00153 ErrorCode get_reordered_handles( Tag tag,
00154 const std::vector< EntityHandle >& old_handles,
00155 std::vector< EntityHandle >& new_handles );
00156
00157 /**\brief Get new handles corresponding to old handles
00158 *\param tag Tag containing old->new mapping
00159 */
00160 ErrorCode get_reordered_handles( Tag tag,
00161 const EntityHandle* old_handles,
00162 EntityHandle* new_handles,
00163 size_t num_handles );
00164
00165 /**\brief Remove any non-ordered handles and return new handles for remaining
00166 *\param tag Tag containing old->new mapping
00167 */
00168 ErrorCode get_new_handles( Tag tag, Range& old_handles, std::vector< EntityHandle >& newhandles );
00169
00170 /**\brief convert from input for \c handle_order_from_sets_and_adj to
00171 * \c input for handle_order_from_int_tag
00172 */
00173 ErrorCode int_order_from_sets_and_adj( const Range& sets,
00174 Tag order_tag,
00175 int skip_val,
00176 std::vector< std::vector< EntityHandle >* >& data );
00177
00178 Core* mMB;
00179 };
00180
00181 } // namespace moab
00182
00183 #endif // moab_REORDER_TOOL_HPP