Branch data Line data Source code
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 SCD_VERTEX_DATA_HPP
17 : : #define SCD_VERTEX_DATA_HPP
18 : :
19 : : //
20 : : // Class: ScdVertexData
21 : : //
22 : : // Purpose: represent a rectangular vertex block of mesh
23 : : //
24 : : // A ScdVertex represents a rectangular vertex block of mesh, including both vertices and
25 : : // the parametric space used to address those vertices.
26 : :
27 : : #include "SequenceData.hpp"
28 : : #include "moab/HomXform.hpp"
29 : :
30 : : namespace moab
31 : : {
32 : :
33 : : class ScdVertexData : public SequenceData
34 : : {
35 : :
36 : : private:
37 : : //! parameter min/max, in homogeneous coords ijkh (extra row for stride eventually)
38 : : HomCoord vertexParams[3];
39 : :
40 : : //! difference between max and min params plus one (i.e. # VERTICES in
41 : : //! each parametric direction)
42 : : int dIJK[3];
43 : :
44 : : //! difference between max and min params (i.e. # VERTEXS in
45 : : //! each parametric direction)
46 : : int dIJKm1[3];
47 : :
48 : : public:
49 : : //! constructor
50 : : ScdVertexData( const EntityHandle start_vertex, const int imin, const int jmin, const int kmin, const int imax,
51 : : const int jmax, const int kmax );
52 : :
53 [ - + ]: 124 : virtual ~ScdVertexData() {}
54 : :
55 : : //! get handle of vertex at i, j, k
56 : : EntityHandle get_vertex( const int i, const int j, const int k ) const;
57 : :
58 : : //! get handle of vertex at homogeneous coordinates
59 : : EntityHandle get_vertex( const HomCoord& coords ) const;
60 : :
61 : : //! get the parameters of a given handle; return MB_FAILURE if vhandle not in this
62 : : //! sequence
63 : : ErrorCode get_params( const EntityHandle vhandle, int& i, int& j, int& k ) const;
64 : :
65 : : //! get min params for this vertex
66 : : void min_params( int& i, int& j, int& k ) const;
67 : :
68 : : //! get max params for this vertex
69 : : void max_params( int& i, int& j, int& k ) const;
70 : :
71 : : //! get the min params
72 : : const HomCoord& min_params() const;
73 : :
74 : : //! get the max params
75 : : const HomCoord& max_params() const;
76 : :
77 : : //! get the number of vertices in each direction, inclusive
78 : : void param_extents( int& di, int& dj, int& dk ) const;
79 : :
80 : : //! convenience functions for parameter extents
81 : 1425425 : int i_min() const
82 : : {
83 : 1425425 : return vertexParams[0].hom_coord()[0];
84 : : }
85 : 1425425 : int j_min() const
86 : : {
87 : 1425425 : return vertexParams[0].hom_coord()[1];
88 : : }
89 : 1425425 : int k_min() const
90 : : {
91 : 1425425 : return vertexParams[0].hom_coord()[2];
92 : : }
93 : 9723 : int i_max() const
94 : : {
95 : 9723 : return vertexParams[1].hom_coord()[0];
96 : : }
97 : 9723 : int j_max() const
98 : : {
99 : 9723 : return vertexParams[1].hom_coord()[1];
100 : : }
101 : 9723 : int k_max() const
102 : : {
103 : 9723 : return vertexParams[1].hom_coord()[2];
104 : : }
105 : :
106 : : //! return whether this vseq's parameter space contains these parameters
107 : : bool contains( const HomCoord& coords ) const;
108 : : bool contains( const int i, const int j, const int k ) const;
109 : :
110 : : SequenceData* subset( EntityHandle start, EntityHandle end, const int* sequence_data_sizes,
111 : : const int* tag_data_sizes ) const;
112 : : };
113 : :
114 : 1415702 : inline EntityHandle ScdVertexData::get_vertex( const int i, const int j, const int k ) const
115 : : {
116 : 1415702 : return start_handle() + ( i - i_min() ) + ( j - j_min() ) * dIJK[0] + ( k - k_min() ) * dIJK[0] * dIJK[1];
117 : : }
118 : :
119 : 1415702 : inline EntityHandle ScdVertexData::get_vertex( const HomCoord& coords ) const
120 : : {
121 : 1415702 : return get_vertex( coords.hom_coord()[0], coords.hom_coord()[1], coords.hom_coord()[2] );
122 : : }
123 : :
124 : 9723 : inline ErrorCode ScdVertexData::get_params( const EntityHandle vhandle, int& i, int& j, int& k ) const
125 : : {
126 [ - + ]: 9723 : if( TYPE_FROM_HANDLE( vhandle ) != MBVERTEX ) return MB_FAILURE;
127 : :
128 : 9723 : int hdiff = vhandle - start_handle();
129 : :
130 : 9723 : k = hdiff / ( dIJK[0] * dIJK[1] );
131 : 9723 : j = ( hdiff - ( k * dIJK[0] * dIJK[1] ) ) / dIJK[0];
132 : 9723 : i = hdiff % dIJK[0];
133 : :
134 : 9723 : k += vertexParams[0].k();
135 : 9723 : j += vertexParams[0].j();
136 : 9723 : i += vertexParams[0].i();
137 : :
138 [ + - ][ + - ]: 29169 : return ( vhandle >= start_handle() && i >= i_min() && i <= i_max() && j >= j_min() && j <= j_max() &&
[ + - ]
[ + - + - ]
139 [ + - ]: 19446 : k >= k_min() && k <= k_max() )
140 : : ? MB_SUCCESS
141 [ + - ]: 19446 : : MB_FAILURE;
142 : : }
143 : :
144 : : //! get min params for this vertex
145 : : inline void ScdVertexData::min_params( int& i, int& j, int& k ) const
146 : : {
147 : : i = i_min();
148 : : j = j_min();
149 : : k = k_min();
150 : : }
151 : :
152 : : //! get max params for this vertex
153 : : inline void ScdVertexData::max_params( int& i, int& j, int& k ) const
154 : : {
155 : : i = i_max();
156 : : j = j_max();
157 : : k = k_max();
158 : : }
159 : :
160 : 121 : inline const HomCoord& ScdVertexData::min_params() const
161 : : {
162 : 121 : return vertexParams[0];
163 : : }
164 : :
165 : 121 : inline const HomCoord& ScdVertexData::max_params() const
166 : : {
167 : 121 : return vertexParams[1];
168 : : }
169 : :
170 : : //! get the number of vertices in each direction, inclusive
171 : : inline void ScdVertexData::param_extents( int& di, int& dj, int& dk ) const
172 : : {
173 : : di = dIJK[0];
174 : : dj = dIJK[1];
175 : : dk = dIJK[2];
176 : : }
177 : :
178 : 1415702 : inline bool ScdVertexData::contains( const HomCoord& coords ) const
179 : : {
180 [ + - ][ + - ]: 1415702 : return ( coords >= vertexParams[0] && coords <= vertexParams[1] ) ? true : false;
181 : : }
182 : :
183 : : inline bool ScdVertexData::contains( const int i, const int j, const int k ) const
184 : : {
185 : : return contains( HomCoord( i, j, k ) );
186 : : }
187 : :
188 : : } // namespace moab
189 : :
190 : : #endif
|