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 #ifndef SCD_VERTEX_DATA_HPP 00017 #define SCD_VERTEX_DATA_HPP 00018 00019 // 00020 // Class: ScdVertexData 00021 // 00022 // Purpose: represent a rectangular vertex block of mesh 00023 // 00024 // A ScdVertex represents a rectangular vertex block of mesh, including both vertices and 00025 // the parametric space used to address those vertices. 00026 00027 #include "SequenceData.hpp" 00028 #include "moab/HomXform.hpp" 00029 00030 namespace moab 00031 { 00032 00033 class ScdVertexData : public SequenceData 00034 { 00035 00036 private: 00037 //! parameter min/max, in homogeneous coords ijkh (extra row for stride eventually) 00038 HomCoord vertexParams[3]; 00039 00040 //! difference between max and min params plus one (i.e. # VERTICES in 00041 //! each parametric direction) 00042 int dIJK[3]; 00043 00044 //! difference between max and min params (i.e. # VERTEXS in 00045 //! each parametric direction) 00046 int dIJKm1[3]; 00047 00048 public: 00049 //! constructor 00050 ScdVertexData( const EntityHandle start_vertex, 00051 const int imin, 00052 const int jmin, 00053 const int kmin, 00054 const int imax, 00055 const int jmax, 00056 const int kmax ); 00057 00058 virtual ~ScdVertexData() {} 00059 00060 //! get handle of vertex at i, j, k 00061 EntityHandle get_vertex( const int i, const int j, const int k ) const; 00062 00063 //! get handle of vertex at homogeneous coordinates 00064 EntityHandle get_vertex( const HomCoord& coords ) const; 00065 00066 //! get the parameters of a given handle; return MB_FAILURE if vhandle not in this 00067 //! sequence 00068 ErrorCode get_params( const EntityHandle vhandle, int& i, int& j, int& k ) const; 00069 00070 //! get min params for this vertex 00071 void min_params( int& i, int& j, int& k ) const; 00072 00073 //! get max params for this vertex 00074 void max_params( int& i, int& j, int& k ) const; 00075 00076 //! get the min params 00077 const HomCoord& min_params() const; 00078 00079 //! get the max params 00080 const HomCoord& max_params() const; 00081 00082 //! get the number of vertices in each direction, inclusive 00083 void param_extents( int& di, int& dj, int& dk ) const; 00084 00085 //! convenience functions for parameter extents 00086 int i_min() const 00087 { 00088 return vertexParams[0].hom_coord()[0]; 00089 } 00090 int j_min() const 00091 { 00092 return vertexParams[0].hom_coord()[1]; 00093 } 00094 int k_min() const 00095 { 00096 return vertexParams[0].hom_coord()[2]; 00097 } 00098 int i_max() const 00099 { 00100 return vertexParams[1].hom_coord()[0]; 00101 } 00102 int j_max() const 00103 { 00104 return vertexParams[1].hom_coord()[1]; 00105 } 00106 int k_max() const 00107 { 00108 return vertexParams[1].hom_coord()[2]; 00109 } 00110 00111 //! return whether this vseq's parameter space contains these parameters 00112 bool contains( const HomCoord& coords ) const; 00113 bool contains( const int i, const int j, const int k ) const; 00114 00115 SequenceData* subset( EntityHandle start, 00116 EntityHandle end, 00117 const int* sequence_data_sizes, 00118 const int* tag_data_sizes ) const; 00119 }; 00120 00121 inline EntityHandle ScdVertexData::get_vertex( const int i, const int j, const int k ) const 00122 { 00123 return start_handle() + ( i - i_min() ) + ( j - j_min() ) * dIJK[0] + ( k - k_min() ) * dIJK[0] * dIJK[1]; 00124 } 00125 00126 inline EntityHandle ScdVertexData::get_vertex( const HomCoord& coords ) const 00127 { 00128 return get_vertex( coords.hom_coord()[0], coords.hom_coord()[1], coords.hom_coord()[2] ); 00129 } 00130 00131 inline ErrorCode ScdVertexData::get_params( const EntityHandle vhandle, int& i, int& j, int& k ) const 00132 { 00133 if( TYPE_FROM_HANDLE( vhandle ) != MBVERTEX ) return MB_FAILURE; 00134 00135 int hdiff = vhandle - start_handle(); 00136 00137 k = hdiff / ( dIJK[0] * dIJK[1] ); 00138 j = ( hdiff - ( k * dIJK[0] * dIJK[1] ) ) / dIJK[0]; 00139 i = hdiff % dIJK[0]; 00140 00141 k += vertexParams[0].k(); 00142 j += vertexParams[0].j(); 00143 i += vertexParams[0].i(); 00144 00145 return ( vhandle >= start_handle() && i >= i_min() && i <= i_max() && j >= j_min() && j <= j_max() && 00146 k >= k_min() && k <= k_max() ) 00147 ? MB_SUCCESS 00148 : MB_FAILURE; 00149 } 00150 00151 //! get min params for this vertex 00152 inline void ScdVertexData::min_params( int& i, int& j, int& k ) const 00153 { 00154 i = i_min(); 00155 j = j_min(); 00156 k = k_min(); 00157 } 00158 00159 //! get max params for this vertex 00160 inline void ScdVertexData::max_params( int& i, int& j, int& k ) const 00161 { 00162 i = i_max(); 00163 j = j_max(); 00164 k = k_max(); 00165 } 00166 00167 inline const HomCoord& ScdVertexData::min_params() const 00168 { 00169 return vertexParams[0]; 00170 } 00171 00172 inline const HomCoord& ScdVertexData::max_params() const 00173 { 00174 return vertexParams[1]; 00175 } 00176 00177 //! get the number of vertices in each direction, inclusive 00178 inline void ScdVertexData::param_extents( int& di, int& dj, int& dk ) const 00179 { 00180 di = dIJK[0]; 00181 dj = dIJK[1]; 00182 dk = dIJK[2]; 00183 } 00184 00185 inline bool ScdVertexData::contains( const HomCoord& coords ) const 00186 { 00187 return ( coords >= vertexParams[0] && coords <= vertexParams[1] ) ? true : false; 00188 } 00189 00190 inline bool ScdVertexData::contains( const int i, const int j, const int k ) const 00191 { 00192 return contains( HomCoord( i, j, k ) ); 00193 } 00194 00195 } // namespace moab 00196 00197 #endif