Loading [MathJax]/extensions/tex2jax.js
Mesh Oriented datABase  (version 5.5.1)
An array-based unstructured mesh library
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
CN.hpp
Go to the documentation of this file.
1 /** 2  * MOAB, a Mesh-Oriented datABase, is a software component for creating, 3  * storing and accessing finite element mesh data. 4  * 5  * Copyright 2004 Sandia Corporation. Under the terms of Contract 6  * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government 7  * retains certain rights in this software. 8  * 9  * This library is free software; you can redistribute it and/or 10  * modify it under the terms of the GNU Lesser General Public 11  * License as published by the Free Software Foundation; either 12  * version 2.1 of the License, or (at your option) any later version. 13  * 14  */ 15  16 /** 17  * \class moab::CN 18  * \author Tim Tautges 19  * \date April 2004 20  * 21  * \brief Canonical numbering data and functions 22  * This class represents canonical ordering of finite-element meshes. 23  * Elements in the finite element "zoo" are represented. Canonical numbering 24  * denotes the vertex, edge, and face numbers making up each kind of element, 25  * and the vertex numbers defining those entities. Functions for evaluating 26  * adjacencies and other things based on vertex numbering are also provided. 27  * By default, this class defines a zero-based numbering system. 28  * For a complete description of this class, see the document "MOAB Canonical 29  * Numbering Conventions", Timothy J. Tautges, Sandia National Laboratories 30  * Report #SAND2004-xxxx. 31  */ 32 #ifndef MOAB_CN_HPP 33 #define MOAB_CN_HPP 34  35 #include <vector> 36 #include <algorithm> 37 #include <cassert> 38  39 #include "moab/EntityType.hpp" 40  41 #include "moab/win32_config.h" 42  43 namespace moab 44 { 45  46 enum 47 { 48  //! the maximum number n-1 dimension adjacencies a element may have 49  MAX_SUB_ENTITIES = 12, 50  //! the maximum number of nodes an n-1 dimensional element may have 51  MAX_SUB_ENTITY_VERTICES = 9 52 }; 53  54 typedef std::pair< EntityType, EntityType > DimensionPair; 55  56 class CN 57 { 58  private: 59  //! entity names 60  static MOAB_EXPORT const char* entityTypeNames[]; 61  62  //! declare private constructor, since we don't want to create any of these 63  CN(); 64  65  //! the basis of the numbering system (normally 0 or 1, 0 by default) 66  static MOAB_EXPORT short int numberBasis; 67  68  //! switch the basis 69  static void SwitchBasis( const int old_basis, const int new_basis ); 70  71  static MOAB_EXPORT short increasingInts[]; 72  73  public: 74  enum 75  { 76  MAX_NODES_PER_ELEMENT = 27 77  }; 78  enum 79  { 80  MID_EDGE_BIT = 1 << 1, 81  MID_FACE_BIT = 1 << 2, 82  MID_REGION_BIT = 1 << 3 83  }; 84  85  //! enum used to specify operation type 86  enum 87  { 88  INTERSECT = 0, 89  UNION 90  }; 91  92  // each entity type has two ConnMap objects, holding information about the bounding 93  // edges and faces for each entity; see comment for mConnectivityMap 94  // (this struct not documented with Doxygen) 95  struct ConnMap 96  { 97  // Topological dimension of this entry 98  short int topo_dimension; 99  100  // Number of sub-elements of this dimension 101  short int num_sub_elements; 102  103  // Number of nodes in each sub-element of this dimension 104  short int num_corners_per_sub_element[MAX_SUB_ENTITIES]; 105  106  // Type of each sub-element 107  EntityType target_type[MAX_SUB_ENTITIES]; 108  109  // Connectivity of each of the sub-elements 110  short int conn[MAX_SUB_ENTITIES][MAX_SUB_ENTITY_VERTICES]; 111  }; 112  113  // mConnectivityMap[i=entity type][j=0,1,2]: 114  // num_sub_elements = # bounding edges(j=0) or faces(j=1) for entity type i, or self (j=2) 115  // num_corners_per_sub_element[k] (k=0..num_sub_elements-1) = number of nodes in sub-facet k 116  // (can vary over sub-facets, e.g. faces bounding a pyramid) or self (j=2) 117  // target_type[k] = entity type of sub-facet k (e.g. MBTRI or MBQUAD bounding a pyramid) or 118  // self (j=2) conn[k][l] (l=0..CN::VerticesPerEntity[target_type[k]]) = vertex connectivity of 119  // sub-facet k, 120  // with respect to entity i's canonical vertex ordering, or self (j=2) 121  // (not documented with Doxygen) 122  static MOAB_EXPORT const ConnMap mConnectivityMap[MBMAXTYPE][3]; 123  124  // structure used to define reverse canonical ordering information 125  // (not documented with Doxygen) 126  struct UpConnMap 127  { 128  // Number of higher-dimensional entities using each sub-entity 129  short int num_targets_per_source_element[MAX_SUB_ENTITIES]; 130  131  // Higher-dimensional entities using each sub-entity 132  short int targets_per_source_element[MAX_SUB_ENTITIES][MAX_SUB_ENTITIES]; 133  }; 134  135  // Reverse canonical numbering, duplicates data in mConnectivityMap, but 136  // connectivity data in this table must be in ascending order (used for 137  // efficient sorting) 138  // (not documented with Doxygen) 139  static const UpConnMap mUpConnMap[MBMAXTYPE][4][4]; 140  141  // Mid-node bits indexed by number of nodes in element 142  static MOAB_EXPORT const unsigned char midNodesPerType[MBMAXTYPE][MAX_NODES_PER_ELEMENT + 1]; 143  144  //! Permutation and reverse permutation vectors 145  static short int permuteVec[MBMAXTYPE][3][MAX_SUB_ENTITIES + 1]; 146  static short int revPermuteVec[MBMAXTYPE][3][MAX_SUB_ENTITIES + 1]; 147  148  //! this const vector defines the starting and ending EntityType for 149  //! each dimension, e.g. TypeDimensionMap[2] returns a pair of EntityTypes 150  //! bounding dimension 2. 151  static MOAB_EXPORT const DimensionPair TypeDimensionMap[]; 152  153  /// Get the dimension pair corresponding to a dimension 154  static DimensionPair getDimPair( int entity_type ); 155  156  //! get the basis of the numbering system 157  static short int GetBasis(); 158  159  //! set the basis of the numbering system 160  static void SetBasis( const int in_basis ); 161  162  //! return the string type name for this type 163  static const char* EntityTypeName( const EntityType this_type ); 164  165  //! given a name, find the corresponding entity type 166  static EntityType EntityTypeFromName( const char* name ); 167  168  //! return the topological entity dimension 169  static short int Dimension( const EntityType t ); 170  171  //! return the number of (corner) vertices contained in the specified type. 172  static short int VerticesPerEntity( const EntityType t ); 173  174  //! return the number of sub-entities bounding the entity. 175  static short int NumSubEntities( const EntityType t, const int d ); 176  177  //! return the type of a particular sub-entity. 178  //! \param this_type Type of entity for which sub-entity type is being queried 179  //! \param sub_dimension Topological dimension of sub-entity whose type is being queried 180  //! \param index Index of sub-entity whose type is being queried 181  //! \return type Entity type of sub-entity with specified dimension and index 182  static EntityType SubEntityType( const EntityType this_type, const int sub_dimension, const int index ); 183  184  //! return the vertex indices of the specified sub-entity. 185  //! \param this_type Type of entity for which sub-entity connectivity is being queried 186  //! \param sub_dimension Dimension of sub-entity 187  //! \param sub_index Index of sub-entity 188  //! \param sub_entity_conn Connectivity of sub-entity (returned to calling function) 189  static void inline SubEntityVertexIndices( const EntityType this_type, 190  const int sub_dimension, 191  const int sub_index, 192  int sub_entity_conn[] ); 193  194  //! return the vertex indices of the specified sub-entity. 195  //! \param this_type Type of entity for which sub-entity connectivity is being queried 196  //! \param sub_dimension Dimension of sub-entity 197  //! \param sub_index Index of sub-entity 198  //! \param num_sub_ent_vertices the number of vertices in the sub-entity 199  static const short* SubEntityVertexIndices( const EntityType this_type, 200  const int sub_dimension, 201  const int sub_index, 202  EntityType& sub_type, 203  int& num_sub_ent_vertices ); 204  205  //! return the node indices of the specified sub-entity. 206  //! \param this_topo The topology of the queried element type 207  //! \param num_nodes The number of nodes in the queried element type. 208  //! \param sub_dimension Dimension of sub-entity 209  //! \param sub_index Index of sub-entity 210  //! \param sub_entity_topo (Output) Topology of requested sub-entity. 211  //! \param num_sub_entity_nodes (Output) Number of nodes in the requested sub-entity. 212  //! \param sub_entity_conn (Output) Connectivity of sub-entity 213  static void SubEntityNodeIndices( const EntityType this_topo, 214  const int num_nodes, 215  const int sub_dimension, 216  const int sub_index, 217  EntityType& sub_entity_topo, 218  int& num_sub_entity_nodes, 219  int sub_entity_conn[] ); 220  221  //! return the vertices of the specified sub entity 222  //! \param parent_conn Connectivity of parent entity 223  //! \param parent_type Entity type of parent entity 224  //! \param sub_dimension Dimension of sub-entity being queried 225  //! \param sub_index Index of sub-entity being queried 226  //! \param sub_entity_conn Connectivity of sub-entity, based on parent_conn and canonical 227  //! ordering for parent_type 228  //! \param num_sub_vertices Number of vertices in sub-entity 229  static void SubEntityConn( const void* parent_conn, 230  const EntityType parent_type, 231  const int sub_dimension, 232  const int sub_index, 233  void* sub_entity_conn, 234  int& num_sub_vertices ); 235  236  //! For a specified set of sides of given dimension, return the intersection 237  //! or union of all sides of specified target dimension adjacent to those sides. 238  //! \param this_type Type of entity for which sub-entity connectivity is being queried 239  //! \param source_indices Indices of sides being queried 240  //! \param num_source_indices Number of entries in <em>source_indices</em> 241  //! \param source_dim Dimension of source entity 242  //! \param target_dim Dimension of target entity 243  //! \param index_list Indices of target entities (returned) 244  //! \param operation_type Specify either CN::INTERSECT or CN::UNION to get intersection 245  //! or union of target entity lists over source entities 246  static short int AdjacentSubEntities( const EntityType this_type, 247  const int* source_indices, 248  const int num_source_indices, 249  const int source_dim, 250  const int target_dim, 251  std::vector< int >& index_list, 252  const int operation_type = CN::INTERSECT ); 253  254  //! return the side index represented in the input sub-entity connectivity in the input 255  //! parent entity connectivity array. 256  //! \param parent_conn Connectivity of parent entity being queried 257  //! \param parent_type Entity type of parent entity 258  //! \param child_conn Connectivity of child whose index is being queried 259  //! \param child_num_verts Number of vertices in <em>child_conn</em> 260  //! \param child_dim Dimension of child entity being queried 261  //! \param side_number Side number of child entity (returned) 262  //! \param sense Sense of child entity with respect to order in <em>child_conn</em> (returned) 263  //! \param offset Offset of <em>child_conn</em> with respect to canonical ordering data 264  //! (returned) \return status Returns zero if successful, -1 if not 265  static short int SideNumber( const EntityType parent_type, 266  const int* parent_conn, 267  const int* child_conn, 268  const int child_num_verts, 269  const int child_dim, 270  int& side_number, 271  int& sense, 272  int& offset ); 273  static short int SideNumber( const EntityType parent_type, 274  const unsigned int* parent_conn, 275  const unsigned int* child_conn, 276  const int child_num_verts, 277  const int child_dim, 278  int& side_number, 279  int& sense, 280  int& offset ); 281  static short int SideNumber( const EntityType parent_type, 282  const long* parent_conn, 283  const long* child_conn, 284  const int child_num_verts, 285  const int child_dim, 286  int& side_number, 287  int& sense, 288  int& offset ); 289  static short int SideNumber( const EntityType parent_type, 290  const unsigned long* parent_conn, 291  const unsigned long* child_conn, 292  const int child_num_verts, 293  const int child_dim, 294  int& side_number, 295  int& sense, 296  int& offset ); 297  static short int SideNumber( const EntityType parent_type, 298  const unsigned long long* parent_conn, 299  const unsigned long long* child_conn, 300  const int child_num_verts, 301  const int child_dim, 302  int& side_number, 303  int& sense, 304  int& offset ); 305  static short int SideNumber( const EntityType parent_type, 306  void* const* parent_conn, 307  void* const* child_conn, 308  const int child_num_verts, 309  const int child_dim, 310  int& side_number, 311  int& sense, 312  int& offset ); 313  314  //! return the side index represented in the input sub-entity connectivity 315  //! \param parent_type Entity type of parent entity 316  //! \param child_conn_indices Child connectivity to query, specified as indices 317  //! into the connectivity list of the parent. 318  //! \param child_num_verts Number of values in <em>child_conn_indices</em> 319  //! \param child_dim Dimension of child entity being queried 320  //! \param side_number Side number of child entity (returned) 321  //! \param sense Sense of child entity with respect to order in <em>child_conn</em> (returned) 322  //! \param offset Offset of <em>child_conn</em> with respect to canonical ordering data 323  //! (returned) \return status Returns zero if successful, -1 if not 324  static short int SideNumber( const EntityType parent_type, 325  const int* child_conn_indices, 326  const int child_num_verts, 327  const int child_dim, 328  int& side_number, 329  int& sense, 330  int& offset ); 331  332  //! return the dimension and index of the opposite side, given parent entity type and child 333  //! dimension and index. This function is only defined for certain types of parent/child types: 334  //! (Parent, Child dim->Opposite dim): 335  //! (Tri, 1->0), (Tri, 0->1), (Quad, 1->1), (Quad, 0->0), 336  //! (Tet, 2->0), (Tet, 1->1), (Tet, 0->2), 337  //! (Hex, 2->2), (Hex, 1->1)(diagonally across element), (Hex, 0->0) (diagonally across 338  //! element) 339  //! All other parent types and child dimensions return an error. 340  //! 341  //! \param parent_type The type of parent element 342  //! \param child_type The type of child element 343  //! \param child_index The index of the child element 344  //! \param opposite_index The index of the opposite element 345  //! \return status Returns 0 if successful, -1 if not 346  static short int OppositeSide( const EntityType parent_type, 347  const int child_index, 348  const int child_dim, 349  int& opposite_index, 350  int& opposite_dim ); 351  352  //! given two connectivity arrays, determine whether or not they represent the same entity. 353  //! \param conn1 Connectivity array of first entity 354  //! \param conn2 Connectivity array of second entity 355  //! \param num_vertices Number of entries in <em>conn1</em> and <em>conn2</em> 356  //! \param direct If positive, entities have the same sense (returned) 357  //! \param offset Offset of <em>conn2</em>'s first vertex in <em>conn1</em> 358  //! \return bool Returns true if <em>conn1</em> and <em>conn2</em> match 359  static bool ConnectivityMatch( const int* conn1, 360  const int* conn2, 361  const int num_vertices, 362  int& direct, 363  int& offset ); 364  static bool ConnectivityMatch( const unsigned int* conn1, 365  const unsigned int* conn2, 366  const int num_vertices, 367  int& direct, 368  int& offset ); 369  static bool ConnectivityMatch( const long* conn1, 370  const long* conn2, 371  const int num_vertices, 372  int& direct, 373  int& offset ); 374  static bool ConnectivityMatch( const unsigned long* conn1, 375  const unsigned long* conn2, 376  const int num_vertices, 377  int& direct, 378  int& offset ); 379  static bool ConnectivityMatch( const unsigned long long* conn1, 380  const unsigned long long* conn2, 381  const int num_vertices, 382  int& direct, 383  int& offset ); 384  static bool ConnectivityMatch( void* const* conn1, 385  void* const* conn2, 386  const int num_vertices, 387  int& direct, 388  int& offset ); 389  390  //! Set permutation or reverse permutation vector 391  //! Forward permutation is from CN's numbering into application's ordering; 392  //! that is, if i is CN's index, pvec[i] is application's index. This 393  //! function stores the permutation vector for this type and facet dimension, 394  //! which then is used in calls to permuteThis or revPermuteThis. 395  //! \param t EntityType for which to set permutation 396  //! \param dim Dimension of facets whose permutation array is being set 397  //! \param pvec Permutation array 398  //! \param num_entries Number of indicies in permutation array 399  //! \param is_reverse Array is reverse permutation 400  static inline void setPermutation( const EntityType t, 401  const int dim, 402  short int* pvec, 403  const int num_entries, 404  const bool is_reverse = false ); 405  406  //! Reset permutation or reverse permutation vector 407  //! \param t EntityType whose permutation vector is being reset 408  //! \param dim Dimension of facets being reset; if -1 is input, all dimensions are reset 409  static inline void resetPermutation( const EntityType t, const int dim ); 410  411  //! Permute a handle array according to permutation vector set with setPermute; 412  //! permutation is done in-place 413  //! \param t EntityType of handles in pvec 414  //! \param dim Dimension of handles in pvec 415  //! \param pvec Handle array being permuted 416  //! \param indices_per_ent Number of indices per entity 417  //! \param num_entries Number of entities in pvec 418  static int permuteThis( const EntityType t, 419  const int dim, 420  int* pvec, 421  const int indices_per_ent, 422  const int num_entries ); 423  static int permuteThis( const EntityType t, 424  const int dim, 425  unsigned int* pvec, 426  const int indices_per_ent, 427  const int num_entries ); 428  static int permuteThis( const EntityType t, 429  const int dim, 430  long* pvec, 431  const int indices_per_ent, 432  const int num_entries ); 433  static int permuteThis( const EntityType t, 434  const int dim, 435  void** pvec, 436  const int indices_per_ent, 437  const int num_entries ); 438  439  //! Reverse permute a handle array according to reverse permutation vector set with setPermute; 440  //! reverse permutation is done in-place 441  //! \param t EntityType of handles in pvec 442  //! \param dim Dimension of handles in pvec 443  //! \param pvec Handle array being reverse permuted 444  //! \param indices_per_ent Number of indices per entity 445  //! \param num_entries Number of entities in pvec 446  static int revPermuteThis( const EntityType t, 447  const int dim, 448  int* pvec, 449  const int indices_per_ent, 450  const int num_entries ); 451  static int revPermuteThis( const EntityType t, 452  const int dim, 453  unsigned int* pvec, 454  const int indices_per_ent, 455  const int num_entries ); 456  static int revPermuteThis( const EntityType t, 457  const int dim, 458  long* pvec, 459  const int indices_per_ent, 460  const int num_entries ); 461  static int revPermuteThis( const EntityType t, 462  const int dim, 463  void** pvec, 464  const int indices_per_ent, 465  const int num_entries ); 466  467  //! true if entities of a given type and number of nodes indicates mid edge nodes are present. 468  //! \param this_type Type of entity for which sub-entity connectivity is being queried 469  //! \param num_verts Number of nodes defining entity 470  //! \return bool Returns true if <em>this_type</em> combined with <em>num_nodes</em> indicates 471  //! mid-edge nodes are likely 472  static inline bool HasMidEdgeNodes( const EntityType this_type, const int num_verts ); 473  474  //! true if entities of a given type and number of nodes indicates mid face nodes are present. 475  //! \param this_type Type of entity for which sub-entity connectivity is being queried 476  //! \param num_verts Number of nodes defining entity 477  //! \return bool Returns true if <em>this_type</em> combined with <em>num_nodes</em> indicates 478  //! mid-face nodes are likely 479  static inline bool HasMidFaceNodes( const EntityType this_type, const int num_verts ); 480  481  //! true if entities of a given type and number of nodes indicates mid region nodes are present. 482  //! \param this_type Type of entity for which sub-entity connectivity is being queried 483  //! \param num_verts Number of nodes defining entity 484  //! \return bool Returns true if <em>this_type</em> combined with <em>num_nodes</em> indicates 485  //! mid-region nodes are likely 486  static inline bool HasMidRegionNodes( const EntityType this_type, const int num_verts ); 487  488  //! true if entities of a given type and number of nodes indicates mid edge/face/region nodes 489  //! are present. 490  //! \param this_type Type of entity for which sub-entity connectivity is being queried 491  //! \param num_verts Number of nodes defining entity 492  //! \param mid_nodes If <em>mid_nodes[i], i=1..2</em> is non-zero, indicates that mid-edge 493  //! (i=1), mid-face (i=2), and/or mid-region (i=3) nodes are likely 494  static inline void HasMidNodes( const EntityType this_type, const int num_verts, int mid_nodes[4] ); 495  496  //! Same as above, except returns a single integer with the bits, from 497  //! least significant to most significant set to one if the corresponding 498  //! mid nodes on sub entities of the least dimension (0) to the highest 499  //! dimension (3) are present in the elment type. 500  static inline int HasMidNodes( const EntityType this_type, const int num_verts ); 501  502  //! given data about an element and a vertex in that element, return the dimension 503  //! and index of the sub-entity that the vertex resolves. If it does not resolve a 504  //! sub-entity, either because it's a corner node or it's not in the element, -1 is 505  //! returned in both return values. 506  //! \param elem_type Type of entity being queried 507  //! \param num_nodes The number of nodes in the element connectivity 508  //! \param ho_node_index The position of the HO node in the connectivity list (zero based) 509  //! \param parent_dim Dimension of sub-entity high-order node resolves (returned) 510  //! \param parent_index Index of sub-entity high-order node resolves (returned) 511  static void HONodeParent( EntityType elem_type, 512  int num_nodes, 513  int ho_node_index, 514  int& parent_dim, 515  int& parent_index ); 516  517  //! for an entity of this type with num_verts vertices, and a specified subfacet 518  //! (dimension and index), return the index of the higher order node for that entity 519  //! in this entity's connectivity array 520  //! \param this_type Type of entity being queried 521  //! \param num_verts Number of vertices for the entity being queried 522  //! \param subfacet_dim Dimension of sub-entity being queried 523  //! \param subfacet_index Index of sub-entity being queried 524  //! \return index Index of sub-entity's higher-order node 525  static short int HONodeIndex( const EntityType this_type, 526  const int num_verts, 527  const int subfacet_dim, 528  const int subfacet_index ); 529 }; 530  531 //! get the basis of the numbering system 532 inline short int CN::GetBasis() 533 { 534  return numberBasis; 535 } 536  537 //! return the connectivity of the specified sub-entity. 538 inline void CN::SubEntityVertexIndices( const EntityType this_type, 539  const int sub_dimension, 540  const int index, 541  int sub_entity_conn[] ) 542 { 543  EntityType type; 544  int n; 545  const short* indices = SubEntityVertexIndices( this_type, sub_dimension, index, type, n ); 546  std::copy( indices, indices + n, sub_entity_conn ); 547 } 548  549 inline bool CN::HasMidEdgeNodes( const EntityType this_type, const int num_nodes ) 550 { 551  const int bits = HasMidNodes( this_type, num_nodes ); 552  return static_cast< bool >( ( bits & ( 1 << 1 ) ) >> 1 ); 553 } 554  555 inline bool CN::HasMidFaceNodes( const EntityType this_type, const int num_nodes ) 556 { 557  const int bits = HasMidNodes( this_type, num_nodes ); 558  return static_cast< bool >( ( bits & ( 1 << 2 ) ) >> 2 ); 559 } 560  561 inline bool CN::HasMidRegionNodes( const EntityType this_type, const int num_nodes ) 562 { 563  const int bits = HasMidNodes( this_type, num_nodes ); 564  return static_cast< bool >( ( bits & ( 1 << 3 ) ) >> 3 ); 565 } 566  567 inline int CN::HasMidNodes( const EntityType this_type, const int num_nodes ) 568 { 569  assert( (unsigned)num_nodes <= (unsigned)MAX_NODES_PER_ELEMENT ); 570  return midNodesPerType[this_type][num_nodes]; 571 } 572  573 inline void CN::HasMidNodes( const EntityType this_type, const int num_nodes, int mid_nodes[4] ) 574 { 575  const int bits = HasMidNodes( this_type, num_nodes ); 576  mid_nodes[0] = 0; 577  mid_nodes[1] = ( bits & ( 1 << 1 ) ) >> 1; 578  mid_nodes[2] = ( bits & ( 1 << 2 ) ) >> 2; 579  mid_nodes[3] = ( bits & ( 1 << 3 ) ) >> 3; 580 } 581  582 //! Set permutation or reverse permutation vector 583 inline void CN::setPermutation( const EntityType t, 584  const int dim, 585  short int* pvec, 586  const int num_entries, 587  const bool is_reverse ) 588 { 589  short int *this_vec = permuteVec[t][dim], *that_vec = revPermuteVec[t][dim]; 590  if( is_reverse ) 591  { 592  this_vec = revPermuteVec[t][dim]; 593  that_vec = permuteVec[t][dim]; 594  } 595  596  for( short int i = 0; i < num_entries; i++ ) 597  { 598  this_vec[i] = pvec[i]; 599  that_vec[pvec[i]] = i; 600  } 601  602  this_vec[MAX_SUB_ENTITIES] = that_vec[MAX_SUB_ENTITIES] = (short)num_entries; 603 } 604  605 //! Reset permutation or reverse permutation vector 606 inline void CN::resetPermutation( const EntityType t, const int dim ) 607 { 608  if( -1 == dim ) 609  { 610  for( unsigned int i = 0; i < 3; i++ ) 611  resetPermutation( t, i ); 612  return; 613  } 614  615  for( short unsigned int i = 0; i < MAX_SUB_ENTITIES; i++ ) 616  { 617  revPermuteVec[t][dim][i] = permuteVec[t][dim][i] = i; 618  } 619  620  revPermuteVec[t][dim][MAX_SUB_ENTITIES] = permuteVec[t][dim][MAX_SUB_ENTITIES] = MAX_SUB_ENTITIES + 1; 621 } 622  623 } // namespace moab 624  625 #endif