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
StructuredElementSeq.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 #ifndef STRUCTURED_ELEMENT_SEQUENCE 17 #define STRUCTURED_ELEMENT_SEQUENCE 18  19 // 20 // Class: StructuredElementSeq 21 // 22 // Purpose: represent a rectangular element of mesh 23 // 24 // A ScdElement represents a rectangular element of mesh, including both vertices and 25 // elements, and the parametric space used to address that element. Vertex data, 26 // i.e. coordinates, may not be stored directly in the element, but the element returns 27 // information about the vertex handles of vertices in the element. Vertex and element 28 // handles associated with the element are each contiguous. 29  30 #include "ElementSequence.hpp" 31 #include "ScdElementData.hpp" 32  33 namespace moab 34 { 35  36 class StructuredElementSeq : public ElementSequence 37 { 38  public: 39  //! constructor 40  StructuredElementSeq( EntityHandle start_handle, 41  const int imin, 42  const int jmin, 43  const int kmin, 44  const int imax, 45  const int jmax, 46  const int kmax, 47  int* is_periodic = NULL ); 48  49  virtual ~StructuredElementSeq(); 50  51  ScdElementData* sdata() 52  { 53  return reinterpret_cast< ScdElementData* >( data() ); 54  } 55  ScdElementData const* sdata() const 56  { 57  return reinterpret_cast< const ScdElementData* >( data() ); 58  } 59  60  //! get handle of vertex at i, j, k 61  EntityHandle get_vertex( const int i, const int j, const int k ) const 62  { 63  return get_vertex( HomCoord( i, j, k ) ); 64  } 65  66  //! get handle of vertex at homogeneous coords 67  inline EntityHandle get_vertex( const HomCoord& coords ) const 68  { 69  return sdata()->get_vertex( coords ); 70  } 71  72  //! get handle of element at i, j, k 73  EntityHandle get_element( const int i, const int j, const int k ) const 74  { 75  return sdata()->get_element( i, j, k ); 76  } 77  78  //! get handle of element at homogeneous coords 79  EntityHandle get_element( const HomCoord& coords ) const 80  { 81  return sdata()->get_element( coords.i(), coords.j(), coords.k() ); 82  } 83  84  //! get min params for this element 85  const HomCoord& min_params() const 86  { 87  return sdata()->min_params(); 88  } 89  void min_params( HomCoord& coords ) const 90  { 91  coords = min_params(); 92  } 93  void min_params( int& i, int& j, int& k ) const 94  { 95  i = min_params().i(); 96  j = min_params().j(); 97  k = min_params().k(); 98  } 99  100  //! get max params for this element 101  const HomCoord& max_params() const 102  { 103  return sdata()->max_params(); 104  } 105  void max_params( HomCoord& coords ) const 106  { 107  coords = max_params(); 108  } 109  void max_params( int& i, int& j, int& k ) const 110  { 111  i = max_params().i(); 112  j = max_params().j(); 113  k = max_params().k(); 114  } 115  116  //! get the number of vertices in each direction, inclusive 117  void param_extents( int& di, int& dj, int& dk ) const 118  { 119  sdata()->param_extents( di, dj, dk ); 120  } 121  122  //! given a handle, get the corresponding parameters 123  ErrorCode get_params( const EntityHandle ehandle, int& i, int& j, int& k ) const 124  { 125  return sdata()->get_params( ehandle, i, j, k ); 126  } 127  128  //! convenience functions for parameter extents 129  int i_min() const 130  { 131  return min_params().i(); 132  } 133  int j_min() const 134  { 135  return min_params().j(); 136  } 137  int k_min() const 138  { 139  return min_params().k(); 140  } 141  int i_max() const 142  { 143  return max_params().i(); 144  } 145  int j_max() const 146  { 147  return max_params().j(); 148  } 149  int k_max() const 150  { 151  return max_params().k(); 152  } 153  154  //! test the bounding vertex sequences and determine whether they fully 155  //! define the vertices covering this element block's parameter space 156  inline bool boundary_complete() const 157  { 158  return sdata()->boundary_complete(); 159  } 160  161  //! test whether this sequence contains these parameters 162  bool contains( const int i, const int j, const int k ) const 163  { 164  return sdata()->contains( HomCoord( i, j, k ) ); 165  } 166  inline bool contains( const HomCoord& coords ) const 167  { 168  return sdata()->contains( coords ); 169  } 170  171  //! get connectivity of an entity given entity's parameters 172  ErrorCode get_params_connectivity( const int i, 173  const int j, 174  const int k, 175  std::vector< EntityHandle >& connectivity ) const 176  { 177  return sdata()->get_params_connectivity( i, j, k, connectivity ); 178  } 179  180  //! Return whether box is periodic in i 181  /** Return whether box is periodic in i 182  * \return True if box is periodic in i direction 183  */ 184  int is_periodic_i() const 185  { 186  return sdata()->is_periodic_i(); 187  }; 188  189  //! Return whether box is periodic in j 190  /** Return whether box is periodic in j 191  * \return True if box is periodic in j direction 192  */ 193  int is_periodic_j() const 194  { 195  return sdata()->is_periodic_j(); 196  }; 197  198  //! Return whether box is periodic in i and j 199  /** Return whether box is periodic in i and j 200  * \param is_periodic_ij Non-zero if periodic in i [0] or j [1] 201  */ 202  void is_periodic( int is_periodic_ij[2] ) const 203  { 204  sdata()->is_periodic( is_periodic_ij ); 205  }; 206  207  /***************** Methods from ElementSequence *****************/ 208  209  virtual ErrorCode get_connectivity( EntityHandle handle, 210  std::vector< EntityHandle >& connect, 211  bool topological = false ) const; 212  213  virtual ErrorCode get_connectivity( EntityHandle handle, 214  EntityHandle const*& connect, 215  int& connect_length, 216  bool topological = false, 217  std::vector< EntityHandle >* storage = 0 ) const; 218  219  virtual ErrorCode set_connectivity( EntityHandle handle, EntityHandle const* connect, int connect_length ); 220  221  virtual EntityHandle* get_connectivity_array(); 222  223  /***************** Methods from EntitySequence *****************/ 224  225  /* Replace the ElementSequence implementation of this method with 226  * one that always returns zero, because we cannot re-use handles 227  * that are within a ScdElementData 228  */ 229  virtual int values_per_entity() const; 230  231  virtual EntitySequence* split( EntityHandle here ); 232  233  virtual SequenceData* create_data_subset( EntityHandle start_handle, EntityHandle end_handle ) const; 234  235  virtual void get_const_memory_use( unsigned long& bytes_per_entity, unsigned long& size_of_sequence ) const; 236  237  protected: 238  StructuredElementSeq( StructuredElementSeq& split_from, EntityHandle here ) : ElementSequence( split_from, here ) {} 239 }; 240  241 } // namespace moab 242  243 #endif