Branch data Line data Source code
1 : : /*
2 : : * VerdictWrapper.cpp
3 : : *
4 : : * Created on: Nov 18, 2014
5 : : *
6 : : */
7 : :
8 : : #include "moab/Interface.hpp"
9 : : #include "moab/verdict/VerdictWrapper.hpp"
10 : : #include "Internals.hpp"
11 : : #include "moab/verdict.h"
12 : :
13 : : namespace moab
14 : : {
15 : 2 : VerdictWrapper::VerdictWrapper( Interface* mb ) : mbImpl( mb )
16 : : {
17 : : // TODO Auto-generated constructor stub
18 : 2 : }
19 : :
20 : 5 : VerdictWrapper::~VerdictWrapper()
21 : : {
22 : : // TODO Auto-generated destructor stub
23 [ - + ]: 3 : }
24 : :
25 : : static int possibleQuality[MBMAXTYPE][MB_QUALITY_COUNT] = {
26 : : /*
27 : : MB_EDGE_RATIO = 0, // 0
28 : : | MB_MAX_EDGE_RATIO , // 1
29 : : | | MB_SKEW, // 2
30 : : | | | MB_TAPER, // 3
31 : : | | | | MB_VOLUME, // 4
32 : : | | | | | MB_STRETCH, // 5
33 : : | | | | | | MB_DIAGONAL, // 6
34 : : | | | | | | | MB_DIMENSION, // 7
35 : : | | | | | | | | MB_ODDY, // 8
36 : : | | | | | | | | | MB_MED_ASPECT_FROBENIUS,// 9
37 : : | | | | | | | | | | MB_MAX_ASPECT_FROBENIUS, // 10
38 : : | | | | | | | | | | | MB_CONDITION, // 11
39 : : | | | | | | | | | | | | MB_JACOBIAN, // 12
40 : : | | | | | | | | | | | | | MB_SCALED_JACOBIAN, // 13
41 : : | | | | | | | | | | | | | | MB_SHEAR, // 14
42 : : | | | | | | | | | | | | | | | MB_SHAPE, // 15
43 : : | | | | | | | | | | | | | | | | MB_RELATIVE_SIZE_SQUARED, // 16
44 : : | | | | | | | | | | | | | | | | | MB_SHAPE_AND_SIZE, // 17
45 : : | | | | | | | | | | | | | | | | | | MB_SHEAR_AND_SIZE, // 18
46 : : | | | | | | | | | | | | | | | | | | | MB_DISTORTION, // 19
47 : : | | | | | | | | | | | | | | | | | | | | MB_LENGTH, // 20
48 : : only for edge | | | | | | | | | | | | | | | | | | | | | MB_RADIUS_RATIO
49 : : // 21 tet | | | | | | | | | | | | | | | | | | | | | | MB_ASPECT_BETA //
50 : : 22 tet (very similar to 21) | | | | | | | | | | | | | | | | | | | | | |
51 : : | MB_ASPECT_RATIO // 23 tet | | | | | | | | | | | | | | | | | | | | |
52 : : | | | MB_ASPECT_GAMMA // 24 tet | | | | | | | | | | | | | | | | | | | |
53 : : | | | | | MB_MINIMUM_ANGLE // 25 tet | | | | | | | | | | | | | | | | | |
54 : : | | | | | | | | MB_COLLAPSE_RATIO // 26 tet | | | | | | | | | | | | | |
55 : : | | | | | | | | | | | | | MB_WARPAGE // 27 quad | | | | | | | | | |
56 : : | | | | | | | | | | | | | | | | | | MB_AREA // 28 quad | | | | | |
57 : : | | | | | | | | | | | | | | | | | | | | | | | MB_MAXIMUM_ANGLE // 29
58 : : quad | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
59 : : | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
60 : : */
61 : : /*0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29*/
62 : : { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // MBVERTEX
63 : : { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // MBEDGE
64 : : { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1 }, // MBTRI
65 : : { 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1 }, // MBQUAD
66 : : { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // MBPOLYGON
67 : : { 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, // MBTET
68 : : { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // MBPYRAMID
69 : : { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // MBPRISM
70 : : { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // MBKNIFE
71 : : { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // MBHEX
72 : : { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // MBPOLYHEDRON
73 : : { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // MBENTITYSET
74 : : };
75 : :
76 : : static int numQualities[MBMAXTYPE] = {
77 : : 0, // "MBVERTEX"
78 : : 1, // "MBEDGE", /**< Mesh Edge */
79 : : 13, // "MBTRI", /**< Triangular element (including shells) */
80 : : 22, // "MBQUAD", /**< Quadrilateral element (including shells) */
81 : : 0, // "MBPOLYGON", /**< Polygon */
82 : : 14, // "MBTET", /**< Tetrahedral element */
83 : : 0, //"MBPYRAMID", /**< Pyramid element (where are the face ids for this defined?) */
84 : : 1, // "MBPRISM", /**< Wedge element (Exodus has one, Cubit doesn't. Does Mesh need it?) */
85 : : 1, // "MBKNIFE", /**< Knife element */
86 : : 20, // "MBHEX", /**< Hexahedral element */
87 : : 0, //"MBPOLYHEDRON", /**< Polyhedron */
88 : : 0, // "MBENTITYSET", /**< MeshSet */
89 : : };
90 : : static char const* nameQuality[MB_QUALITY_COUNT] = {
91 : : " edge ratio", // MB_EDGE_RATIO = 0, // 0
92 : : " maximum edge ratio", // MB_MAX_EDGE_RATIO , // 1
93 : : " skew", // MB_SKEW, // 2
94 : : " taper", // MB_TAPER, // 3
95 : : " volume", // MB_VOLUME, // 4
96 : : " stretch", // MB_STRETCH, // 5
97 : : " diagonal", // MB_DIAGONAL, // 6
98 : : " characteristic length", // MB_DIMENSION, // 7
99 : : " oddy", // MB_ODDY, // 8
100 : : " average Frobenius aspect", // MB_MED_ASPECT_FROBENIUS,// 9
101 : : " maximum Frobenius aspect", // MB_MAX_ASPECT_FROBENIUS, // 10
102 : : " condition number", // MB_CONDITION, // 11
103 : : " jacobian", // MB_JACOBIAN, // 12
104 : : " scaled jacobian", // MB_SCALED_JACOBIAN, // 13
105 : : " shear", // MB_SHEAR, // 14
106 : : " shape", // MB_SHAPE, // 15
107 : : " relative size squared", // MB_RELATIVE_SIZE_SQUARED, // 16
108 : : " shape and size", // MB_SHAPE_AND_SIZE, // 17
109 : : " shear and size", // MB_SHEAR_AND_SIZE, // 18
110 : : " distortion", // MB_DISTORTION, // 19
111 : : // next are QuadMetricVals that are not in hex metrics
112 : : // length for edge:
113 : : " length", // MB_LENGTH, // 20 only for edge
114 : : " radius ratio", // MB_RADIUS_RATIO // 21 tet
115 : : " aspect beta", // MB_ASPECT_BETA // 22 tet
116 : : " aspect ratio", // MB_ASPECT_RATIO, // 23 MBTET
117 : : " aspect gamma", // MB_ASPECT_GAMMA // 24 tet
118 : : " minimum angle", // MB_MINIMUM_ANGLE, // 25 MBTET
119 : : " collapse ratio", // MB_COLLAPSE_RATIO, // 26 MBTET
120 : : " warpage", // MB_WARPAGE // 27 MBQUAD
121 : : " area", // MB_AREA // 28 MBQAD
122 : : " maximum angle" // MB_MAXIMUM_ANGLE // 29 MBQUAD
123 : : };
124 : :
125 : : static const char* nameType[MBMAXTYPE] = {
126 : : "MBVERTEX", /**< Mesh Vertex AKA node */
127 : : "MBEDGE", /**< Mesh Edge */
128 : : "MBTRI", /**< Triangular element (including shells) */
129 : : "MBQUAD", /**< Quadrilateral element (including shells) */
130 : : "MBPOLYGON", /**< Polygon */
131 : : "MBTET", /**< Tetrahedral element */
132 : : "MBPYRAMID", /**< Pyramid element (where are the face ids for this defined?) */
133 : : "MBPRISM", /**< Wedge element (Exodus has one, Cubit doesn't. Does Mesh need it?) */
134 : : "MBKNIFE", /**< Knife element */
135 : : "MBHEX", /**< Hexahedral element */
136 : : "MBPOLYHEDRON", /**< Polyhedron */
137 : : "MBENTITYSET", /**< MeshSet */
138 : : };
139 : :
140 : 2093 : ErrorCode VerdictWrapper::quality_measure( EntityHandle eh, QualityType q, double& quality, int num_nodes,
141 : : EntityType etype, double* coords )
142 : : {
143 : : double coordinates[27][3]; // at most 27 nodes per element
144 : :
145 [ + + ][ + - ]: 2093 : if( 0 == num_nodes && NULL == coords )
146 : : {
147 [ + - ]: 2040 : etype = TYPE_FROM_HANDLE( eh );
148 [ + + ]: 2040 : if( possibleQuality[etype][q] == 0 ) return MB_NOT_IMPLEMENTED;
149 : :
150 : : // get coordinates of points, if not passed already
151 : 890 : const EntityHandle* conn = NULL;
152 : : // int num_nodes;
153 [ + - ]: 890 : ErrorCode rval = mbImpl->get_connectivity( eh, conn, num_nodes );
154 [ - + ]: 890 : if( rval != MB_SUCCESS ) return rval;
155 [ + - ]: 890 : if( etype != MBPOLYHEDRON )
156 : : {
157 [ + - ]: 890 : rval = mbImpl->get_coords( conn, num_nodes, &( coordinates[0][0] ) );
158 [ - + ]: 890 : if( rval != MB_SUCCESS ) return rval;
159 : 890 : }
160 : : }
161 : : else
162 : : {
163 [ - + ]: 53 : if( num_nodes > 27 ) return MB_FAILURE;
164 [ + + ]: 314 : for( int i = 0; i < num_nodes; i++ )
165 : : {
166 [ + + ]: 1044 : for( int j = 0; j < 3; j++ )
167 : 783 : coordinates[i][j] = coords[3 * i + j];
168 : : }
169 : : }
170 : 943 : VerdictFunction func = 0;
171 : :
172 [ + + + + : 943 : switch( etype )
- + + - ]
173 : : {
174 : : case MBHEX: {
175 : 175 : num_nodes = 8;
176 [ + + + + : 175 : switch( q )
+ + + + +
+ + + + +
+ + + + +
+ - ]
177 : : {
178 : : case MB_EDGE_RATIO:
179 : 8 : func = v_hex_edge_ratio;
180 : 8 : break; // 0
181 : : case MB_MAX_EDGE_RATIO:
182 : 8 : func = v_hex_max_edge_ratio;
183 : 8 : break; // 1
184 : : case MB_SKEW:
185 : 9 : func = v_hex_skew;
186 : 9 : break; // 2
187 : : case MB_TAPER:
188 : 9 : func = v_hex_taper;
189 : 9 : break; // 3
190 : : case MB_VOLUME:
191 : 9 : func = v_hex_volume;
192 : 9 : break; // 4
193 : : case MB_STRETCH:
194 : 9 : func = v_hex_stretch;
195 : 9 : break; // 5
196 : : case MB_DIAGONAL:
197 : 9 : func = v_hex_diagonal;
198 : 9 : break; // 6
199 : : case MB_DIMENSION:
200 : 9 : func = v_hex_dimension;
201 : 9 : break; // 7
202 : : case MB_ODDY:
203 : 8 : func = v_hex_oddy;
204 : 8 : break; // 8
205 : : case MB_MED_ASPECT_FROBENIUS:
206 : 8 : func = v_hex_med_aspect_frobenius;
207 : 8 : break; // 9
208 : : case MB_MAX_ASPECT_FROBENIUS:
209 : 8 : func = v_hex_max_aspect_frobenius;
210 : 8 : break; // 10
211 : : case MB_CONDITION:
212 : 9 : func = v_hex_condition;
213 : 9 : break; // 11
214 : : case MB_JACOBIAN:
215 : 9 : func = v_hex_jacobian;
216 : 9 : break; // 12
217 : : case MB_SCALED_JACOBIAN:
218 : 9 : func = v_hex_scaled_jacobian;
219 : 9 : break; // 13
220 : : case MB_SHEAR:
221 : 9 : func = v_hex_shear;
222 : 9 : break; // 14
223 : : case MB_SHAPE:
224 : 9 : func = v_hex_shape;
225 : 9 : break; // 15
226 : : case MB_RELATIVE_SIZE_SQUARED:
227 : 9 : func = v_hex_relative_size_squared;
228 : 9 : break; // 16
229 : : case MB_SHAPE_AND_SIZE:
230 : 9 : func = v_hex_shape_and_size;
231 : 9 : break; // 17
232 : : case MB_SHEAR_AND_SIZE:
233 : 9 : func = v_hex_shear_and_size;
234 : 9 : break; // 18
235 : : case MB_DISTORTION:
236 : 9 : func = v_hex_distortion;
237 : 9 : break; // 19
238 : : default:
239 : 0 : return MB_FAILURE;
240 : : }
241 : 175 : break;
242 : : }
243 : : case MBEDGE: {
244 : 15 : num_nodes = 2;
245 [ + - ]: 15 : switch( q )
246 : : {
247 : : case MB_LENGTH:
248 : 15 : func = v_edge_length;
249 : 15 : break; // 20
250 : : default:
251 : 0 : return MB_FAILURE;
252 : : }
253 : 15 : break;
254 : : }
255 : : case MBTET: {
256 : 315 : num_nodes = 4;
257 [ + + + + : 315 : switch( q )
+ + + + +
+ + + + +
+ + - ]
258 : : {
259 : : case MB_EDGE_RATIO:
260 : 22 : func = v_tet_edge_ratio;
261 : 22 : break; // 0 //! Calculates tet edge ratio metric.
262 : : case MB_RADIUS_RATIO:
263 : 22 : func = v_tet_radius_ratio;
264 : 22 : break; // 21
265 : : case MB_ASPECT_BETA:
266 : 22 : func = v_tet_aspect_beta;
267 : 22 : break; // 22
268 : : case MB_ASPECT_RATIO:
269 : 22 : func = v_tet_aspect_ratio;
270 : 22 : break; // 23
271 : : case MB_ASPECT_GAMMA:
272 : 22 : func = v_tet_aspect_gamma;
273 : 22 : break; // 24
274 : : case MB_MAX_ASPECT_FROBENIUS:
275 : 22 : func = v_tet_aspect_frobenius;
276 : 22 : break; // 10
277 : : case MB_MINIMUM_ANGLE:
278 : 22 : func = v_tet_minimum_angle;
279 : 22 : break; // 25
280 : : case MB_COLLAPSE_RATIO:
281 : 22 : func = v_tet_collapse_ratio;
282 : 22 : break; // 26
283 : : case MB_VOLUME:
284 : 23 : func = v_tet_volume;
285 : 23 : break; // 4
286 : : case MB_CONDITION:
287 : 23 : func = v_tet_condition;
288 : 23 : break; // 11
289 : : case MB_JACOBIAN:
290 : 23 : func = v_tet_jacobian;
291 : 23 : break; // 12
292 : : case MB_SCALED_JACOBIAN:
293 : 22 : func = v_tet_scaled_jacobian;
294 : 22 : break; // 13
295 : : case MB_SHAPE:
296 : 23 : func = v_tet_shape;
297 : 23 : break; // 15
298 : : case MB_RELATIVE_SIZE_SQUARED:
299 : 23 : func = v_tet_relative_size_squared;
300 : 23 : break; // 16
301 : : case MB_SHAPE_AND_SIZE:
302 : 1 : func = v_tet_shape_and_size;
303 : 1 : break; // 17
304 : : case MB_DISTORTION:
305 : 1 : func = v_tet_distortion;
306 : 1 : break; // 19
307 : : default:
308 : 0 : return MB_FAILURE;
309 : : }
310 : 315 : break;
311 : : }
312 : : case MBPRISM: {
313 : 2 : num_nodes = 6;
314 [ + - ]: 2 : switch( q )
315 : : {
316 : : case MB_VOLUME:
317 : 2 : func = v_wedge_volume;
318 : 2 : break; // 4
319 : : default:
320 : 0 : return MB_FAILURE;
321 : : }
322 : 2 : break;
323 : : }
324 : : case MBKNIFE: {
325 : 0 : num_nodes = 7;
326 [ # # ]: 0 : switch( q )
327 : : {
328 : : case MB_VOLUME:
329 : 0 : func = v_knife_volume;
330 : 0 : break; // 4
331 : : default:
332 : 0 : return MB_FAILURE;
333 : : }
334 : 0 : break;
335 : : }
336 : : case MBQUAD: {
337 : 193 : num_nodes = 4;
338 [ + + + + : 193 : switch( q )
+ + + + +
+ + + + +
+ + + + +
+ + + +
- ]
339 : : {
340 : : case MB_EDGE_RATIO:
341 : 8 : func = v_quad_edge_ratio;
342 : 8 : break; // 0
343 : : case MB_MAX_EDGE_RATIO:
344 : 8 : func = v_quad_max_edge_ratio;
345 : 8 : break; // 1
346 : : case MB_ASPECT_RATIO:
347 : 9 : func = v_quad_aspect_ratio;
348 : 9 : break; // 23
349 : : case MB_RADIUS_RATIO:
350 : 8 : func = v_quad_radius_ratio;
351 : 8 : break; // 21
352 : : case MB_MED_ASPECT_FROBENIUS:
353 : 8 : func = v_quad_med_aspect_frobenius;
354 : 8 : break; // 9
355 : : case MB_MAX_ASPECT_FROBENIUS:
356 : 8 : func = v_quad_max_aspect_frobenius;
357 : 8 : break; // 10
358 : : case MB_SKEW:
359 : 9 : func = v_quad_skew;
360 : 9 : break; // 2
361 : : case MB_TAPER:
362 : 9 : func = v_quad_taper;
363 : 9 : break; // 3
364 : : case MB_WARPAGE:
365 : 9 : func = v_quad_warpage;
366 : 9 : break; // 27
367 : : case MB_AREA:
368 : 9 : func = v_quad_area;
369 : 9 : break; // 28
370 : : case MB_STRETCH:
371 : 9 : func = v_quad_stretch;
372 : 9 : break; // 5
373 : : case MB_MINIMUM_ANGLE:
374 : 1 : func = v_quad_minimum_angle;
375 : 1 : break; // 25
376 : : case MB_MAXIMUM_ANGLE:
377 : 9 : func = v_quad_maximum_angle;
378 : 9 : break; // 29
379 : : case MB_ODDY:
380 : 8 : func = v_quad_oddy;
381 : 8 : break; // 8
382 : : case MB_CONDITION:
383 : 9 : func = v_quad_condition;
384 : 9 : break; // 11
385 : : case MB_JACOBIAN:
386 : 9 : func = v_quad_jacobian;
387 : 9 : break; // 12
388 : : case MB_SCALED_JACOBIAN:
389 : 9 : func = v_quad_scaled_jacobian;
390 : 9 : break; // 13
391 : : case MB_SHEAR:
392 : 9 : func = v_quad_shear;
393 : 9 : break; // 14
394 : : case MB_SHAPE:
395 : 9 : func = v_quad_shape;
396 : 9 : break; // 15
397 : : case MB_RELATIVE_SIZE_SQUARED:
398 : 9 : func = v_quad_relative_size_squared;
399 : 9 : break; // 16
400 : : case MB_SHAPE_AND_SIZE:
401 : 9 : func = v_quad_shape_and_size;
402 : 9 : break; // 17
403 : : case MB_SHEAR_AND_SIZE:
404 : 9 : func = v_quad_shear_and_size;
405 : 9 : break; // 18
406 : : case MB_DISTORTION:
407 : 9 : func = v_quad_distortion;
408 : 9 : break; // 19
409 : : default:
410 : 0 : return MB_FAILURE;
411 : : }
412 : 193 : break;
413 : : }
414 : :
415 : : case MBTRI: {
416 : 243 : num_nodes = 3;
417 [ + + + + : 243 : switch( q )
+ + + + +
+ + + +
- ]
418 : : {
419 : : case MB_EDGE_RATIO:
420 : 18 : func = v_tri_edge_ratio;
421 : 18 : break; // 0
422 : : case MB_ASPECT_RATIO:
423 : 18 : func = v_tri_aspect_ratio;
424 : 18 : break; // 23
425 : : case MB_RADIUS_RATIO:
426 : 18 : func = v_tri_radius_ratio;
427 : 18 : break; // 21
428 : : case MB_MAX_ASPECT_FROBENIUS:
429 : 18 : func = v_tri_aspect_frobenius;
430 : 18 : break; // 10
431 : : case MB_AREA:
432 : 19 : func = v_tri_area;
433 : 19 : break; // 28
434 : : case MB_MINIMUM_ANGLE:
435 : 19 : func = v_tri_minimum_angle;
436 : 19 : break; // 25
437 : : case MB_MAXIMUM_ANGLE:
438 : 19 : func = v_tri_maximum_angle;
439 : 19 : break; // 29
440 : : case MB_CONDITION:
441 : 19 : func = v_tri_condition;
442 : 19 : break; // 11
443 : : case MB_SCALED_JACOBIAN:
444 : 19 : func = v_tri_scaled_jacobian;
445 : 19 : break; // 13
446 : : // does not exist, even though it was defined in verdict.h; remove it from there too
447 : : // case MB_SHEAR: func = v_tri_shear; break; // 14
448 : : case MB_RELATIVE_SIZE_SQUARED:
449 : 19 : func = v_tri_relative_size_squared;
450 : 19 : break; // 16
451 : : case MB_SHAPE:
452 : 19 : func = v_tri_shape;
453 : 19 : break; // 15
454 : : case MB_SHAPE_AND_SIZE:
455 : 19 : func = v_tri_shape_and_size;
456 : 19 : break; // 17
457 : : case MB_DISTORTION:
458 : 19 : func = v_tri_distortion;
459 : 19 : break; // 19
460 : : default:
461 : 0 : return MB_FAILURE;
462 : : }
463 : 243 : break;
464 : : }
465 : : default:
466 : 0 : break; // some have no measures
467 : : }
468 : :
469 [ - + ]: 943 : if( !func ) return MB_NOT_IMPLEMENTED;
470 : : // actual computation happens here
471 [ + - ]: 943 : quality = ( *func )( num_nodes, coordinates );
472 : :
473 : 2093 : return MB_SUCCESS;
474 : : }
475 : 1832 : const char* VerdictWrapper::quality_name( QualityType q )
476 : : {
477 : 1832 : return nameQuality[q];
478 : : }
479 : 0 : const char* VerdictWrapper::entity_type_name( EntityType etype )
480 : : {
481 : 0 : return nameType[etype];
482 : : }
483 : 0 : int VerdictWrapper::num_qualities( EntityType etype )
484 : : {
485 : 0 : return numQualities[etype];
486 : : }
487 : 0 : int VerdictWrapper::possible_quality( EntityType et, QualityType q )
488 : : {
489 : 0 : return possibleQuality[et][q];
490 : : }
491 : : // relative size needs a base size, that is set at global level, one for each major type (hex, tet,
492 : : // quad, tri)
493 : 1 : ErrorCode VerdictWrapper::set_size( double size )
494 : : {
495 : : // set the sizes for all of them; maybe we can set by type, this should be enough for simplicity
496 : 1 : v_set_hex_size( size );
497 : 1 : v_set_tet_size( size );
498 : 1 : v_set_quad_size( size );
499 : 1 : v_set_tri_size( size );
500 : 1 : return MB_SUCCESS;
501 : : }
502 : :
503 : 68 : ErrorCode VerdictWrapper::all_quality_measures( EntityHandle eh, std::map< QualityType, double >& qualities )
504 : : {
505 [ + - ]: 68 : EntityType etype = TYPE_FROM_HANDLE( eh );
506 [ + - ][ + - ]: 68 : if( etype == MBPOLYHEDRON || etype == MBVERTEX || etype == MBENTITYSET )
[ - + ]
507 : 0 : return MB_SUCCESS; // no quality for polyhedron or vertex or set
508 : :
509 : : double coordinates[27][3]; // at most 27 nodes per element
510 : : // get coordinates of points, if not passed already
511 : 68 : const EntityHandle* conn = NULL;
512 : : int num_nodes;
513 [ + - ]: 68 : ErrorCode rval = mbImpl->get_connectivity( eh, conn, num_nodes );
514 [ - + ]: 68 : if( rval != MB_SUCCESS ) return rval;
515 [ + - ]: 68 : rval = mbImpl->get_coords( conn, num_nodes, &( coordinates[0][0] ) );
516 [ - + ]: 68 : if( rval != MB_SUCCESS ) return rval;
517 : :
518 [ + + + - : 68 : switch( etype )
- + + - ]
519 : : {
520 : : case MBEDGE: {
521 [ + - ]: 12 : double leng = v_edge_length( 2, coordinates );
522 [ + - ]: 12 : qualities[MB_LENGTH] = leng;
523 : 12 : break;
524 : : }
525 : : case MBHEX: {
526 : 8 : num_nodes = 8;
527 : : HexMetricVals hexMetric;
528 [ + - ]: 8 : v_hex_quality( num_nodes, coordinates, V_HEX_ALL, &hexMetric );
529 [ + - ]: 8 : qualities[MB_EDGE_RATIO] = hexMetric.edge_ratio;
530 [ + - ]: 8 : qualities[MB_MAX_EDGE_RATIO] = hexMetric.max_edge_ratio;
531 [ + - ]: 8 : qualities[MB_SKEW] = hexMetric.skew;
532 [ + - ]: 8 : qualities[MB_TAPER] = hexMetric.taper;
533 [ + - ]: 8 : qualities[MB_VOLUME] = hexMetric.volume;
534 [ + - ]: 8 : qualities[MB_STRETCH] = hexMetric.stretch;
535 [ + - ]: 8 : qualities[MB_DIAGONAL] = hexMetric.diagonal;
536 [ + - ]: 8 : qualities[MB_DIMENSION] = hexMetric.dimension;
537 [ + - ]: 8 : qualities[MB_ODDY] = hexMetric.oddy;
538 [ + - ]: 8 : qualities[MB_MED_ASPECT_FROBENIUS] = hexMetric.med_aspect_frobenius;
539 : : // MB_CONDITION is the same as MB_MAX_ASPECT_FROBENIUS
540 [ + - ]: 8 : qualities[MB_MAX_ASPECT_FROBENIUS] = hexMetric.condition;
541 [ + - ]: 8 : qualities[MB_CONDITION] = hexMetric.condition;
542 [ + - ]: 8 : qualities[MB_JACOBIAN] = hexMetric.jacobian;
543 [ + - ]: 8 : qualities[MB_SCALED_JACOBIAN] = hexMetric.scaled_jacobian;
544 [ + - ]: 8 : qualities[MB_SHEAR] = hexMetric.shear;
545 [ + - ]: 8 : qualities[MB_SHAPE] = hexMetric.shape;
546 [ + - ]: 8 : qualities[MB_RELATIVE_SIZE_SQUARED] = hexMetric.relative_size_squared;
547 [ + - ]: 8 : qualities[MB_SHAPE_AND_SIZE] = hexMetric.shape_and_size;
548 [ + - ]: 8 : qualities[MB_SHEAR_AND_SIZE] = hexMetric.shear_and_size;
549 [ + - ]: 8 : qualities[MB_DISTORTION] = hexMetric.distortion;
550 : 8 : break;
551 : : }
552 : :
553 : : case MBTET: {
554 : 22 : num_nodes = 4;
555 : : TetMetricVals tetMetrics;
556 [ + - ]: 22 : v_tet_quality( num_nodes, coordinates, V_TET_ALL, &tetMetrics );
557 [ + - ]: 22 : qualities[MB_EDGE_RATIO] = tetMetrics.edge_ratio;
558 [ + - ]: 22 : qualities[MB_RADIUS_RATIO] = tetMetrics.radius_ratio;
559 [ + - ]: 22 : qualities[MB_ASPECT_BETA] = tetMetrics.aspect_beta;
560 [ + - ]: 22 : qualities[MB_ASPECT_RATIO] = tetMetrics.aspect_ratio;
561 [ + - ]: 22 : qualities[MB_ASPECT_GAMMA] = tetMetrics.aspect_gamma;
562 [ + - ]: 22 : qualities[MB_MAX_ASPECT_FROBENIUS] = tetMetrics.aspect_frobenius;
563 [ + - ]: 22 : qualities[MB_MINIMUM_ANGLE] = tetMetrics.minimum_angle;
564 [ + - ]: 22 : qualities[MB_COLLAPSE_RATIO] = tetMetrics.collapse_ratio;
565 [ + - ]: 22 : qualities[MB_VOLUME] = tetMetrics.volume;
566 [ + - ]: 22 : qualities[MB_CONDITION] = tetMetrics.condition;
567 [ + - ]: 22 : qualities[MB_JACOBIAN] = tetMetrics.jacobian;
568 [ + - ]: 22 : qualities[MB_SCALED_JACOBIAN] = tetMetrics.scaled_jacobian;
569 [ + - ]: 22 : qualities[MB_SHAPE] = tetMetrics.shape;
570 [ + - ]: 22 : qualities[MB_RELATIVE_SIZE_SQUARED] = tetMetrics.relative_size_squared;
571 [ + - ]: 22 : qualities[MB_SHAPE_AND_SIZE] = tetMetrics.shape_and_size;
572 [ + - ]: 22 : qualities[MB_DISTORTION] = tetMetrics.distortion;
573 : 22 : break;
574 : : }
575 : : case MBPRISM: {
576 : 0 : num_nodes = 6;
577 [ # # ]: 0 : double volu = v_wedge_volume( num_nodes, coordinates );
578 [ # # ]: 0 : qualities[MB_VOLUME] = volu;
579 : 0 : break;
580 : : }
581 : : case MBKNIFE: {
582 : 0 : num_nodes = 7;
583 [ # # ]: 0 : double volu = v_knife_volume( num_nodes, coordinates );
584 [ # # ]: 0 : qualities[MB_VOLUME] = volu;
585 : 0 : break;
586 : : }
587 : : case MBQUAD: {
588 : 8 : num_nodes = 4;
589 : : QuadMetricVals quadMetrics;
590 [ + - ]: 8 : v_quad_quality( num_nodes, coordinates, V_QUAD_ALL, &quadMetrics );
591 [ + - ]: 8 : qualities[MB_EDGE_RATIO] = quadMetrics.edge_ratio;
592 [ + - ]: 8 : qualities[MB_MAX_EDGE_RATIO] = quadMetrics.max_edge_ratio;
593 [ + - ]: 8 : qualities[MB_ASPECT_RATIO] = quadMetrics.aspect_ratio; // 23
594 [ + - ]: 8 : qualities[MB_RADIUS_RATIO] = quadMetrics.radius_ratio; // 21
595 [ + - ]: 8 : qualities[MB_MED_ASPECT_FROBENIUS] = quadMetrics.med_aspect_frobenius; // 9
596 [ + - ]: 8 : qualities[MB_MAX_ASPECT_FROBENIUS] = quadMetrics.max_aspect_frobenius; // 10
597 [ + - ]: 8 : qualities[MB_SKEW] = quadMetrics.skew; // 2
598 [ + - ]: 8 : qualities[MB_TAPER] = quadMetrics.taper; // 3
599 [ + - ]: 8 : qualities[MB_WARPAGE] = quadMetrics.warpage; // 27
600 [ + - ]: 8 : qualities[MB_AREA] = quadMetrics.area; // 28
601 [ + - ]: 8 : qualities[MB_STRETCH] = quadMetrics.stretch; // 5
602 [ + - ]: 8 : qualities[MB_MINIMUM_ANGLE] = quadMetrics.minimum_angle; // 25
603 [ + - ]: 8 : qualities[MB_MAXIMUM_ANGLE] = quadMetrics.maximum_angle; // 29
604 [ + - ]: 8 : qualities[MB_ODDY] = quadMetrics.oddy; // 8
605 [ + - ]: 8 : qualities[MB_CONDITION] = quadMetrics.condition; // 11
606 [ + - ]: 8 : qualities[MB_JACOBIAN] = quadMetrics.jacobian; // 12
607 [ + - ]: 8 : qualities[MB_SCALED_JACOBIAN] = quadMetrics.scaled_jacobian; // 13
608 [ + - ]: 8 : qualities[MB_SHEAR] = quadMetrics.shear; // 14
609 [ + - ]: 8 : qualities[MB_SHAPE] = quadMetrics.shape; // 15
610 [ + - ]: 8 : qualities[MB_RELATIVE_SIZE_SQUARED] = quadMetrics.relative_size_squared; // 16
611 [ + - ]: 8 : qualities[MB_SHAPE_AND_SIZE] = quadMetrics.shape_and_size; // 17
612 [ + - ]: 8 : qualities[MB_SHEAR_AND_SIZE] = quadMetrics.shear_and_size; // 18
613 [ + - ]: 8 : qualities[MB_DISTORTION] = quadMetrics.distortion; // 19
614 : 8 : break;
615 : : }
616 : :
617 : : case MBTRI: {
618 : 18 : num_nodes = 3;
619 : : TriMetricVals triMetrics;
620 [ + - ]: 18 : v_tri_quality( num_nodes, coordinates, V_TRI_ALL, &triMetrics );
621 [ + - ]: 18 : qualities[MB_EDGE_RATIO] = triMetrics.edge_ratio; // 0
622 [ + - ]: 18 : qualities[MB_ASPECT_RATIO] = triMetrics.aspect_ratio; // 23
623 [ + - ]: 18 : qualities[MB_RADIUS_RATIO] = triMetrics.radius_ratio; // 21
624 [ + - ]: 18 : qualities[MB_MAX_ASPECT_FROBENIUS] = triMetrics.aspect_frobenius; // 10
625 [ + - ]: 18 : qualities[MB_AREA] = triMetrics.area; // 28
626 [ + - ]: 18 : qualities[MB_MINIMUM_ANGLE] = triMetrics.minimum_angle; // 25
627 [ + - ]: 18 : qualities[MB_MAXIMUM_ANGLE] = triMetrics.maximum_angle; // 29
628 [ + - ]: 18 : qualities[MB_CONDITION] = triMetrics.condition; // 11
629 [ + - ]: 18 : qualities[MB_SCALED_JACOBIAN] = triMetrics.scaled_jacobian; // 13
630 : : // does not exist, even though it was defined in verdict.h; remove it from there too
631 : : // case MB_SHEAR: func = v_tri_shear; break; // 14
632 [ + - ]: 18 : qualities[MB_RELATIVE_SIZE_SQUARED] = triMetrics.relative_size_squared; // 16
633 [ + - ]: 18 : qualities[MB_SHAPE] = triMetrics.shape; // 15
634 [ + - ]: 18 : qualities[MB_SHAPE_AND_SIZE] = triMetrics.shape_and_size; // 17
635 [ + - ]: 18 : qualities[MB_DISTORTION] = triMetrics.distortion; // 19
636 : 18 : break;
637 : : }
638 : : default:
639 : 0 : return MB_NOT_IMPLEMENTED;
640 : : }
641 : 68 : return MB_SUCCESS;
642 : : }
643 : :
644 [ + - ][ + - ]: 4 : } // namespace moab
|