![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /**
00002 * MOAB, a Mesh-Oriented datABase, is a software component for creating,
00003 * storing and accessing finite element mesh data.
00004 *
00005 * Copyright 2004 Sandia Corporation. Under the terms of Contract
00006 * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
00007 * retains certain rights in this software.
00008 *
00009 * This library is free software; you can redistribute it and/or
00010 * modify it under the terms of the GNU Lesser General Public
00011 * License as published by the Free Software Foundation; either
00012 * version 2.1 of the License, or (at your option) any later version.
00013 *
00014 */
00015
00016 /**
00017 * \class moab::CN
00018 * \author Tim Tautges
00019 * \date April 2004
00020 *
00021 * \brief Canonical numbering data and functions
00022 * This class represents canonical ordering of finite-element meshes.
00023 * Elements in the finite element "zoo" are represented. Canonical numbering
00024 * denotes the vertex, edge, and face numbers making up each kind of element,
00025 * and the vertex numbers defining those entities. Functions for evaluating
00026 * adjacencies and other things based on vertex numbering are also provided.
00027 * By default, this class defines a zero-based numbering system.
00028 * For a complete description of this class, see the document "MOAB Canonical
00029 * Numbering Conventions", Timothy J. Tautges, Sandia National Laboratories
00030 * Report #SAND2004-xxxx.
00031 */
00032 #ifndef MOAB_CN_HPP
00033 #define MOAB_CN_HPP
00034
00035 #include
00036 #include
00037 #include
00038
00039 #include "moab/EntityType.hpp"
00040
00041 #include "moab/win32_config.h"
00042
00043 namespace moab
00044 {
00045
00046 enum
00047 {
00048 //! the maximum number n-1 dimension adjacencies a element may have
00049 MAX_SUB_ENTITIES = 12,
00050 //! the maximum number of nodes an n-1 dimensional element may have
00051 MAX_SUB_ENTITY_VERTICES = 9
00052 };
00053
00054 typedef std::pair< EntityType, EntityType > DimensionPair;
00055
00056 class CN
00057 {
00058 private:
00059 //! entity names
00060 static MOAB_EXPORT const char* entityTypeNames[];
00061
00062 //! declare private constructor, since we don't want to create any of these
00063 CN();
00064
00065 //! the basis of the numbering system (normally 0 or 1, 0 by default)
00066 static MOAB_EXPORT short int numberBasis;
00067
00068 //! switch the basis
00069 static void SwitchBasis( const int old_basis, const int new_basis );
00070
00071 static MOAB_EXPORT short increasingInts[];
00072
00073 public:
00074 enum
00075 {
00076 MAX_NODES_PER_ELEMENT = 27
00077 };
00078 enum
00079 {
00080 MID_EDGE_BIT = 1 << 1,
00081 MID_FACE_BIT = 1 << 2,
00082 MID_REGION_BIT = 1 << 3
00083 };
00084
00085 //! enum used to specify operation type
00086 enum
00087 {
00088 INTERSECT = 0,
00089 UNION
00090 };
00091
00092 // each entity type has two ConnMap objects, holding information about the bounding
00093 // edges and faces for each entity; see comment for mConnectivityMap
00094 // (this struct not documented with Doxygen)
00095 struct ConnMap
00096 {
00097 // Topological dimension of this entry
00098 short int topo_dimension;
00099
00100 // Number of sub-elements of this dimension
00101 short int num_sub_elements;
00102
00103 // Number of nodes in each sub-element of this dimension
00104 short int num_corners_per_sub_element[MAX_SUB_ENTITIES];
00105
00106 // Type of each sub-element
00107 EntityType target_type[MAX_SUB_ENTITIES];
00108
00109 // Connectivity of each of the sub-elements
00110 short int conn[MAX_SUB_ENTITIES][MAX_SUB_ENTITY_VERTICES];
00111 };
00112
00113 // mConnectivityMap[i=entity type][j=0,1,2]:
00114 // num_sub_elements = # bounding edges(j=0) or faces(j=1) for entity type i, or self (j=2)
00115 // num_corners_per_sub_element[k] (k=0..num_sub_elements-1) = number of nodes in sub-facet k
00116 // (can vary over sub-facets, e.g. faces bounding a pyramid) or self (j=2)
00117 // target_type[k] = entity type of sub-facet k (e.g. MBTRI or MBQUAD bounding a pyramid) or
00118 // self (j=2) conn[k][l] (l=0..CN::VerticesPerEntity[target_type[k]]) = vertex connectivity of
00119 // sub-facet k,
00120 // with respect to entity i's canonical vertex ordering, or self (j=2)
00121 // (not documented with Doxygen)
00122 static MOAB_EXPORT const ConnMap mConnectivityMap[MBMAXTYPE][3];
00123
00124 // structure used to define reverse canonical ordering information
00125 // (not documented with Doxygen)
00126 struct UpConnMap
00127 {
00128 // Number of higher-dimensional entities using each sub-entity
00129 short int num_targets_per_source_element[MAX_SUB_ENTITIES];
00130
00131 // Higher-dimensional entities using each sub-entity
00132 short int targets_per_source_element[MAX_SUB_ENTITIES][MAX_SUB_ENTITIES];
00133 };
00134
00135 // Reverse canonical numbering, duplicates data in mConnectivityMap, but
00136 // connectivity data in this table must be in ascending order (used for
00137 // efficient sorting)
00138 // (not documented with Doxygen)
00139 static const UpConnMap mUpConnMap[MBMAXTYPE][4][4];
00140
00141 // Mid-node bits indexed by number of nodes in element
00142 static MOAB_EXPORT const unsigned char midNodesPerType[MBMAXTYPE][MAX_NODES_PER_ELEMENT + 1];
00143
00144 //! Permutation and reverse permutation vectors
00145 static short int permuteVec[MBMAXTYPE][3][MAX_SUB_ENTITIES + 1];
00146 static short int revPermuteVec[MBMAXTYPE][3][MAX_SUB_ENTITIES + 1];
00147
00148 //! this const vector defines the starting and ending EntityType for
00149 //! each dimension, e.g. TypeDimensionMap[2] returns a pair of EntityTypes
00150 //! bounding dimension 2.
00151 static MOAB_EXPORT const DimensionPair TypeDimensionMap[];
00152
00153 /// Get the dimension pair corresponding to a dimension
00154 static DimensionPair getDimPair( int entity_type );
00155
00156 //! get the basis of the numbering system
00157 static short int GetBasis();
00158
00159 //! set the basis of the numbering system
00160 static void SetBasis( const int in_basis );
00161
00162 //! return the string type name for this type
00163 static const char* EntityTypeName( const EntityType this_type );
00164
00165 //! given a name, find the corresponding entity type
00166 static EntityType EntityTypeFromName( const char* name );
00167
00168 //! return the topological entity dimension
00169 static short int Dimension( const EntityType t );
00170
00171 //! return the number of (corner) vertices contained in the specified type.
00172 static short int VerticesPerEntity( const EntityType t );
00173
00174 //! return the number of sub-entities bounding the entity.
00175 static short int NumSubEntities( const EntityType t, const int d );
00176
00177 //! return the type of a particular sub-entity.
00178 //! \param this_type Type of entity for which sub-entity type is being queried
00179 //! \param sub_dimension Topological dimension of sub-entity whose type is being queried
00180 //! \param index Index of sub-entity whose type is being queried
00181 //! \return type Entity type of sub-entity with specified dimension and index
00182 static EntityType SubEntityType( const EntityType this_type, const int sub_dimension, const int index );
00183
00184 //! return the vertex indices of the specified sub-entity.
00185 //! \param this_type Type of entity for which sub-entity connectivity is being queried
00186 //! \param sub_dimension Dimension of sub-entity
00187 //! \param sub_index Index of sub-entity
00188 //! \param sub_entity_conn Connectivity of sub-entity (returned to calling function)
00189 static void inline SubEntityVertexIndices( const EntityType this_type,
00190 const int sub_dimension,
00191 const int sub_index,
00192 int sub_entity_conn[] );
00193
00194 //! return the vertex indices of the specified sub-entity.
00195 //! \param this_type Type of entity for which sub-entity connectivity is being queried
00196 //! \param sub_dimension Dimension of sub-entity
00197 //! \param sub_index Index of sub-entity
00198 //! \param num_sub_ent_vertices the number of vertices in the sub-entity
00199 static const short* SubEntityVertexIndices( const EntityType this_type,
00200 const int sub_dimension,
00201 const int sub_index,
00202 EntityType& sub_type,
00203 int& num_sub_ent_vertices );
00204
00205 //! return the node indices of the specified sub-entity.
00206 //! \param this_topo The topology of the queried element type
00207 //! \param num_nodes The number of nodes in the queried element type.
00208 //! \param sub_dimension Dimension of sub-entity
00209 //! \param sub_index Index of sub-entity
00210 //! \param sub_entity_topo (Output) Topology of requested sub-entity.
00211 //! \param num_sub_entity_nodes (Output) Number of nodes in the requested sub-entity.
00212 //! \param sub_entity_conn (Output) Connectivity of sub-entity
00213 static void SubEntityNodeIndices( const EntityType this_topo,
00214 const int num_nodes,
00215 const int sub_dimension,
00216 const int sub_index,
00217 EntityType& sub_entity_topo,
00218 int& num_sub_entity_nodes,
00219 int sub_entity_conn[] );
00220
00221 //! return the vertices of the specified sub entity
00222 //! \param parent_conn Connectivity of parent entity
00223 //! \param parent_type Entity type of parent entity
00224 //! \param sub_dimension Dimension of sub-entity being queried
00225 //! \param sub_index Index of sub-entity being queried
00226 //! \param sub_entity_conn Connectivity of sub-entity, based on parent_conn and canonical
00227 //! ordering for parent_type
00228 //! \param num_sub_vertices Number of vertices in sub-entity
00229 static void SubEntityConn( const void* parent_conn,
00230 const EntityType parent_type,
00231 const int sub_dimension,
00232 const int sub_index,
00233 void* sub_entity_conn,
00234 int& num_sub_vertices );
00235
00236 //! For a specified set of sides of given dimension, return the intersection
00237 //! or union of all sides of specified target dimension adjacent to those sides.
00238 //! \param this_type Type of entity for which sub-entity connectivity is being queried
00239 //! \param source_indices Indices of sides being queried
00240 //! \param num_source_indices Number of entries in source_indices
00241 //! \param source_dim Dimension of source entity
00242 //! \param target_dim Dimension of target entity
00243 //! \param index_list Indices of target entities (returned)
00244 //! \param operation_type Specify either CN::INTERSECT or CN::UNION to get intersection
00245 //! or union of target entity lists over source entities
00246 static short int AdjacentSubEntities( const EntityType this_type,
00247 const int* source_indices,
00248 const int num_source_indices,
00249 const int source_dim,
00250 const int target_dim,
00251 std::vector< int >& index_list,
00252 const int operation_type = CN::INTERSECT );
00253
00254 //! return the side index represented in the input sub-entity connectivity in the input
00255 //! parent entity connectivity array.
00256 //! \param parent_conn Connectivity of parent entity being queried
00257 //! \param parent_type Entity type of parent entity
00258 //! \param child_conn Connectivity of child whose index is being queried
00259 //! \param child_num_verts Number of vertices in child_conn
00260 //! \param child_dim Dimension of child entity being queried
00261 //! \param side_number Side number of child entity (returned)
00262 //! \param sense Sense of child entity with respect to order in child_conn (returned)
00263 //! \param offset Offset of child_conn with respect to canonical ordering data
00264 //! (returned) \return status Returns zero if successful, -1 if not
00265 static short int SideNumber( const EntityType parent_type,
00266 const int* parent_conn,
00267 const int* child_conn,
00268 const int child_num_verts,
00269 const int child_dim,
00270 int& side_number,
00271 int& sense,
00272 int& offset );
00273 static short int SideNumber( const EntityType parent_type,
00274 const unsigned int* parent_conn,
00275 const unsigned int* child_conn,
00276 const int child_num_verts,
00277 const int child_dim,
00278 int& side_number,
00279 int& sense,
00280 int& offset );
00281 static short int SideNumber( const EntityType parent_type,
00282 const long* parent_conn,
00283 const long* child_conn,
00284 const int child_num_verts,
00285 const int child_dim,
00286 int& side_number,
00287 int& sense,
00288 int& offset );
00289 static short int SideNumber( const EntityType parent_type,
00290 const unsigned long* parent_conn,
00291 const unsigned long* child_conn,
00292 const int child_num_verts,
00293 const int child_dim,
00294 int& side_number,
00295 int& sense,
00296 int& offset );
00297 static short int SideNumber( const EntityType parent_type,
00298 const unsigned long long* parent_conn,
00299 const unsigned long long* child_conn,
00300 const int child_num_verts,
00301 const int child_dim,
00302 int& side_number,
00303 int& sense,
00304 int& offset );
00305 static short int SideNumber( const EntityType parent_type,
00306 void* const* parent_conn,
00307 void* const* child_conn,
00308 const int child_num_verts,
00309 const int child_dim,
00310 int& side_number,
00311 int& sense,
00312 int& offset );
00313
00314 //! return the side index represented in the input sub-entity connectivity
00315 //! \param parent_type Entity type of parent entity
00316 //! \param child_conn_indices Child connectivity to query, specified as indices
00317 //! into the connectivity list of the parent.
00318 //! \param child_num_verts Number of values in child_conn_indices
00319 //! \param child_dim Dimension of child entity being queried
00320 //! \param side_number Side number of child entity (returned)
00321 //! \param sense Sense of child entity with respect to order in child_conn (returned)
00322 //! \param offset Offset of child_conn with respect to canonical ordering data
00323 //! (returned) \return status Returns zero if successful, -1 if not
00324 static short int SideNumber( const EntityType parent_type,
00325 const int* child_conn_indices,
00326 const int child_num_verts,
00327 const int child_dim,
00328 int& side_number,
00329 int& sense,
00330 int& offset );
00331
00332 //! return the dimension and index of the opposite side, given parent entity type and child
00333 //! dimension and index. This function is only defined for certain types of parent/child types:
00334 //! (Parent, Child dim->Opposite dim):
00335 //! (Tri, 1->0), (Tri, 0->1), (Quad, 1->1), (Quad, 0->0),
00336 //! (Tet, 2->0), (Tet, 1->1), (Tet, 0->2),
00337 //! (Hex, 2->2), (Hex, 1->1)(diagonally across element), (Hex, 0->0) (diagonally across
00338 //! element)
00339 //! All other parent types and child dimensions return an error.
00340 //!
00341 //! \param parent_type The type of parent element
00342 //! \param child_type The type of child element
00343 //! \param child_index The index of the child element
00344 //! \param opposite_index The index of the opposite element
00345 //! \return status Returns 0 if successful, -1 if not
00346 static short int OppositeSide( const EntityType parent_type,
00347 const int child_index,
00348 const int child_dim,
00349 int& opposite_index,
00350 int& opposite_dim );
00351
00352 //! given two connectivity arrays, determine whether or not they represent the same entity.
00353 //! \param conn1 Connectivity array of first entity
00354 //! \param conn2 Connectivity array of second entity
00355 //! \param num_vertices Number of entries in conn1 and conn2
00356 //! \param direct If positive, entities have the same sense (returned)
00357 //! \param offset Offset of conn2's first vertex in conn1
00358 //! \return bool Returns true if conn1 and conn2 match
00359 static bool ConnectivityMatch( const int* conn1,
00360 const int* conn2,
00361 const int num_vertices,
00362 int& direct,
00363 int& offset );
00364 static bool ConnectivityMatch( const unsigned int* conn1,
00365 const unsigned int* conn2,
00366 const int num_vertices,
00367 int& direct,
00368 int& offset );
00369 static bool ConnectivityMatch( const long* conn1,
00370 const long* conn2,
00371 const int num_vertices,
00372 int& direct,
00373 int& offset );
00374 static bool ConnectivityMatch( const unsigned long* conn1,
00375 const unsigned long* conn2,
00376 const int num_vertices,
00377 int& direct,
00378 int& offset );
00379 static bool ConnectivityMatch( const unsigned long long* conn1,
00380 const unsigned long long* conn2,
00381 const int num_vertices,
00382 int& direct,
00383 int& offset );
00384 static bool ConnectivityMatch( void* const* conn1,
00385 void* const* conn2,
00386 const int num_vertices,
00387 int& direct,
00388 int& offset );
00389
00390 //! Set permutation or reverse permutation vector
00391 //! Forward permutation is from CN's numbering into application's ordering;
00392 //! that is, if i is CN's index, pvec[i] is application's index. This
00393 //! function stores the permutation vector for this type and facet dimension,
00394 //! which then is used in calls to permuteThis or revPermuteThis.
00395 //! \param t EntityType for which to set permutation
00396 //! \param dim Dimension of facets whose permutation array is being set
00397 //! \param pvec Permutation array
00398 //! \param num_entries Number of indicies in permutation array
00399 //! \param is_reverse Array is reverse permutation
00400 static inline void setPermutation( const EntityType t,
00401 const int dim,
00402 short int* pvec,
00403 const int num_entries,
00404 const bool is_reverse = false );
00405
00406 //! Reset permutation or reverse permutation vector
00407 //! \param t EntityType whose permutation vector is being reset
00408 //! \param dim Dimension of facets being reset; if -1 is input, all dimensions are reset
00409 static inline void resetPermutation( const EntityType t, const int dim );
00410
00411 //! Permute a handle array according to permutation vector set with setPermute;
00412 //! permutation is done in-place
00413 //! \param t EntityType of handles in pvec
00414 //! \param dim Dimension of handles in pvec
00415 //! \param pvec Handle array being permuted
00416 //! \param indices_per_ent Number of indices per entity
00417 //! \param num_entries Number of entities in pvec
00418 static int permuteThis( const EntityType t,
00419 const int dim,
00420 int* pvec,
00421 const int indices_per_ent,
00422 const int num_entries );
00423 static int permuteThis( const EntityType t,
00424 const int dim,
00425 unsigned int* pvec,
00426 const int indices_per_ent,
00427 const int num_entries );
00428 static int permuteThis( const EntityType t,
00429 const int dim,
00430 long* pvec,
00431 const int indices_per_ent,
00432 const int num_entries );
00433 static int permuteThis( const EntityType t,
00434 const int dim,
00435 void** pvec,
00436 const int indices_per_ent,
00437 const int num_entries );
00438
00439 //! Reverse permute a handle array according to reverse permutation vector set with setPermute;
00440 //! reverse permutation is done in-place
00441 //! \param t EntityType of handles in pvec
00442 //! \param dim Dimension of handles in pvec
00443 //! \param pvec Handle array being reverse permuted
00444 //! \param indices_per_ent Number of indices per entity
00445 //! \param num_entries Number of entities in pvec
00446 static int revPermuteThis( const EntityType t,
00447 const int dim,
00448 int* pvec,
00449 const int indices_per_ent,
00450 const int num_entries );
00451 static int revPermuteThis( const EntityType t,
00452 const int dim,
00453 unsigned int* pvec,
00454 const int indices_per_ent,
00455 const int num_entries );
00456 static int revPermuteThis( const EntityType t,
00457 const int dim,
00458 long* pvec,
00459 const int indices_per_ent,
00460 const int num_entries );
00461 static int revPermuteThis( const EntityType t,
00462 const int dim,
00463 void** pvec,
00464 const int indices_per_ent,
00465 const int num_entries );
00466
00467 //! true if entities of a given type and number of nodes indicates mid edge nodes are present.
00468 //! \param this_type Type of entity for which sub-entity connectivity is being queried
00469 //! \param num_verts Number of nodes defining entity
00470 //! \return bool Returns true if this_type combined with num_nodes indicates
00471 //! mid-edge nodes are likely
00472 static inline bool HasMidEdgeNodes( const EntityType this_type, const int num_verts );
00473
00474 //! true if entities of a given type and number of nodes indicates mid face nodes are present.
00475 //! \param this_type Type of entity for which sub-entity connectivity is being queried
00476 //! \param num_verts Number of nodes defining entity
00477 //! \return bool Returns true if this_type combined with num_nodes indicates
00478 //! mid-face nodes are likely
00479 static inline bool HasMidFaceNodes( const EntityType this_type, const int num_verts );
00480
00481 //! true if entities of a given type and number of nodes indicates mid region nodes are present.
00482 //! \param this_type Type of entity for which sub-entity connectivity is being queried
00483 //! \param num_verts Number of nodes defining entity
00484 //! \return bool Returns true if this_type combined with num_nodes indicates
00485 //! mid-region nodes are likely
00486 static inline bool HasMidRegionNodes( const EntityType this_type, const int num_verts );
00487
00488 //! true if entities of a given type and number of nodes indicates mid edge/face/region nodes
00489 //! are present.
00490 //! \param this_type Type of entity for which sub-entity connectivity is being queried
00491 //! \param num_verts Number of nodes defining entity
00492 //! \param mid_nodes If mid_nodes[i], i=1..2 is non-zero, indicates that mid-edge
00493 //! (i=1), mid-face (i=2), and/or mid-region (i=3) nodes are likely
00494 static inline void HasMidNodes( const EntityType this_type, const int num_verts, int mid_nodes[4] );
00495
00496 //! Same as above, except returns a single integer with the bits, from
00497 //! least significant to most significant set to one if the corresponding
00498 //! mid nodes on sub entities of the least dimension (0) to the highest
00499 //! dimension (3) are present in the elment type.
00500 static inline int HasMidNodes( const EntityType this_type, const int num_verts );
00501
00502 //! given data about an element and a vertex in that element, return the dimension
00503 //! and index of the sub-entity that the vertex resolves. If it does not resolve a
00504 //! sub-entity, either because it's a corner node or it's not in the element, -1 is
00505 //! returned in both return values.
00506 //! \param elem_type Type of entity being queried
00507 //! \param num_nodes The number of nodes in the element connectivity
00508 //! \param ho_node_index The position of the HO node in the connectivity list (zero based)
00509 //! \param parent_dim Dimension of sub-entity high-order node resolves (returned)
00510 //! \param parent_index Index of sub-entity high-order node resolves (returned)
00511 static void HONodeParent( EntityType elem_type,
00512 int num_nodes,
00513 int ho_node_index,
00514 int& parent_dim,
00515 int& parent_index );
00516
00517 //! for an entity of this type with num_verts vertices, and a specified subfacet
00518 //! (dimension and index), return the index of the higher order node for that entity
00519 //! in this entity's connectivity array
00520 //! \param this_type Type of entity being queried
00521 //! \param num_verts Number of vertices for the entity being queried
00522 //! \param subfacet_dim Dimension of sub-entity being queried
00523 //! \param subfacet_index Index of sub-entity being queried
00524 //! \return index Index of sub-entity's higher-order node
00525 static short int HONodeIndex( const EntityType this_type,
00526 const int num_verts,
00527 const int subfacet_dim,
00528 const int subfacet_index );
00529 };
00530
00531 //! get the basis of the numbering system
00532 inline short int CN::GetBasis()
00533 {
00534 return numberBasis;
00535 }
00536
00537 //! return the connectivity of the specified sub-entity.
00538 inline void CN::SubEntityVertexIndices( const EntityType this_type,
00539 const int sub_dimension,
00540 const int index,
00541 int sub_entity_conn[] )
00542 {
00543 EntityType type;
00544 int n;
00545 const short* indices = SubEntityVertexIndices( this_type, sub_dimension, index, type, n );
00546 std::copy( indices, indices + n, sub_entity_conn );
00547 }
00548
00549 inline bool CN::HasMidEdgeNodes( const EntityType this_type, const int num_nodes )
00550 {
00551 const int bits = HasMidNodes( this_type, num_nodes );
00552 return static_cast< bool >( ( bits & ( 1 << 1 ) ) >> 1 );
00553 }
00554
00555 inline bool CN::HasMidFaceNodes( const EntityType this_type, const int num_nodes )
00556 {
00557 const int bits = HasMidNodes( this_type, num_nodes );
00558 return static_cast< bool >( ( bits & ( 1 << 2 ) ) >> 2 );
00559 }
00560
00561 inline bool CN::HasMidRegionNodes( const EntityType this_type, const int num_nodes )
00562 {
00563 const int bits = HasMidNodes( this_type, num_nodes );
00564 return static_cast< bool >( ( bits & ( 1 << 3 ) ) >> 3 );
00565 }
00566
00567 inline int CN::HasMidNodes( const EntityType this_type, const int num_nodes )
00568 {
00569 assert( (unsigned)num_nodes <= (unsigned)MAX_NODES_PER_ELEMENT );
00570 return midNodesPerType[this_type][num_nodes];
00571 }
00572
00573 inline void CN::HasMidNodes( const EntityType this_type, const int num_nodes, int mid_nodes[4] )
00574 {
00575 const int bits = HasMidNodes( this_type, num_nodes );
00576 mid_nodes[0] = 0;
00577 mid_nodes[1] = ( bits & ( 1 << 1 ) ) >> 1;
00578 mid_nodes[2] = ( bits & ( 1 << 2 ) ) >> 2;
00579 mid_nodes[3] = ( bits & ( 1 << 3 ) ) >> 3;
00580 }
00581
00582 //! Set permutation or reverse permutation vector
00583 inline void CN::setPermutation( const EntityType t,
00584 const int dim,
00585 short int* pvec,
00586 const int num_entries,
00587 const bool is_reverse )
00588 {
00589 short int *this_vec = permuteVec[t][dim], *that_vec = revPermuteVec[t][dim];
00590 if( is_reverse )
00591 {
00592 this_vec = revPermuteVec[t][dim];
00593 that_vec = permuteVec[t][dim];
00594 }
00595
00596 for( short int i = 0; i < num_entries; i++ )
00597 {
00598 this_vec[i] = pvec[i];
00599 that_vec[pvec[i]] = i;
00600 }
00601
00602 this_vec[MAX_SUB_ENTITIES] = that_vec[MAX_SUB_ENTITIES] = (short)num_entries;
00603 }
00604
00605 //! Reset permutation or reverse permutation vector
00606 inline void CN::resetPermutation( const EntityType t, const int dim )
00607 {
00608 if( -1 == dim )
00609 {
00610 for( unsigned int i = 0; i < 3; i++ )
00611 resetPermutation( t, i );
00612 return;
00613 }
00614
00615 for( short unsigned int i = 0; i < MAX_SUB_ENTITIES; i++ )
00616 {
00617 revPermuteVec[t][dim][i] = permuteVec[t][dim][i] = i;
00618 }
00619
00620 revPermuteVec[t][dim][MAX_SUB_ENTITIES] = permuteVec[t][dim][MAX_SUB_ENTITIES] = MAX_SUB_ENTITIES + 1;
00621 }
00622
00623 } // namespace moab
00624
00625 #endif