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