![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /*
00002 * VerdictWrapper.cpp
00003 *
00004 * Created on: Nov 18, 2014
00005 *
00006 */
00007
00008 #include "moab/Interface.hpp"
00009 #include "moab/verdict/VerdictWrapper.hpp"
00010 #include "Internals.hpp"
00011 #include "moab/verdict.h"
00012
00013 namespace moab
00014 {
00015 VerdictWrapper::VerdictWrapper( Interface* mb ) : mbImpl( mb )
00016 {
00017 // TODO Auto-generated constructor stub
00018 }
00019
00020 VerdictWrapper::~VerdictWrapper()
00021 {
00022 // TODO Auto-generated destructor stub
00023 }
00024
00025 static int possibleQuality[MBMAXTYPE][MB_QUALITY_COUNT] = {
00026 /*
00027 MB_EDGE_RATIO = 0, // 0
00028 | MB_MAX_EDGE_RATIO , // 1
00029 | | MB_SKEW, // 2
00030 | | | MB_TAPER, // 3
00031 | | | | MB_VOLUME, // 4
00032 | | | | | MB_STRETCH, // 5
00033 | | | | | | MB_DIAGONAL, // 6
00034 | | | | | | | MB_DIMENSION, // 7
00035 | | | | | | | | MB_ODDY, // 8
00036 | | | | | | | | | MB_MED_ASPECT_FROBENIUS,// 9
00037 | | | | | | | | | | MB_MAX_ASPECT_FROBENIUS, // 10
00038 | | | | | | | | | | | MB_CONDITION, // 11
00039 | | | | | | | | | | | | MB_JACOBIAN, // 12
00040 | | | | | | | | | | | | | MB_SCALED_JACOBIAN, // 13
00041 | | | | | | | | | | | | | | MB_SHEAR, // 14
00042 | | | | | | | | | | | | | | | MB_SHAPE, // 15
00043 | | | | | | | | | | | | | | | | MB_RELATIVE_SIZE_SQUARED, // 16
00044 | | | | | | | | | | | | | | | | | MB_SHAPE_AND_SIZE, // 17
00045 | | | | | | | | | | | | | | | | | | MB_SHEAR_AND_SIZE, // 18
00046 | | | | | | | | | | | | | | | | | | | MB_DISTORTION, // 19
00047 | | | | | | | | | | | | | | | | | | | | MB_LENGTH, // 20
00048 only for edge | | | | | | | | | | | | | | | | | | | | | MB_RADIUS_RATIO
00049 // 21 tet | | | | | | | | | | | | | | | | | | | | | | MB_ASPECT_BETA //
00050 22 tet (very similar to 21) | | | | | | | | | | | | | | | | | | | | | |
00051 | MB_ASPECT_RATIO // 23 tet | | | | | | | | | | | | | | | | | | | | |
00052 | | | MB_ASPECT_GAMMA // 24 tet | | | | | | | | | | | | | | | | | | | |
00053 | | | | | MB_MINIMUM_ANGLE // 25 tet | | | | | | | | | | | | | | | | | |
00054 | | | | | | | | MB_COLLAPSE_RATIO // 26 tet | | | | | | | | | | | | | |
00055 | | | | | | | | | | | | | MB_WARPAGE // 27 quad | | | | | | | | | |
00056 | | | | | | | | | | | | | | | | | | MB_AREA // 28 quad | | | | | |
00057 | | | | | | | | | | | | | | | | | | | | | | | MB_MAXIMUM_ANGLE // 29
00058 quad | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
00059 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
00060 */
00061 /*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*/
00062 { 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
00063 { 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
00064 { 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
00065 { 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
00066 { 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
00067 { 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
00068 { 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
00069 { 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
00070 { 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
00071 { 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
00072 { 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
00073 { 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
00074 };
00075
00076 static int numQualities[MBMAXTYPE] = {
00077 0, // "MBVERTEX"
00078 1, // "MBEDGE", /**< Mesh Edge */
00079 13, // "MBTRI", /**< Triangular element (including shells) */
00080 22, // "MBQUAD", /**< Quadrilateral element (including shells) */
00081 0, // "MBPOLYGON", /**< Polygon */
00082 14, // "MBTET", /**< Tetrahedral element */
00083 0, //"MBPYRAMID", /**< Pyramid element (where are the face ids for this defined?) */
00084 1, // "MBPRISM", /**< Wedge element (Exodus has one, Cubit doesn't. Does Mesh need it?) */
00085 1, // "MBKNIFE", /**< Knife element */
00086 20, // "MBHEX", /**< Hexahedral element */
00087 0, //"MBPOLYHEDRON", /**< Polyhedron */
00088 0, // "MBENTITYSET", /**< MeshSet */
00089 };
00090 static char const* nameQuality[MB_QUALITY_COUNT] = {
00091 " edge ratio", // MB_EDGE_RATIO = 0, // 0
00092 " maximum edge ratio", // MB_MAX_EDGE_RATIO , // 1
00093 " skew", // MB_SKEW, // 2
00094 " taper", // MB_TAPER, // 3
00095 " volume", // MB_VOLUME, // 4
00096 " stretch", // MB_STRETCH, // 5
00097 " diagonal", // MB_DIAGONAL, // 6
00098 " characteristic length", // MB_DIMENSION, // 7
00099 " oddy", // MB_ODDY, // 8
00100 " average Frobenius aspect", // MB_MED_ASPECT_FROBENIUS,// 9
00101 " maximum Frobenius aspect", // MB_MAX_ASPECT_FROBENIUS, // 10
00102 " condition number", // MB_CONDITION, // 11
00103 " jacobian", // MB_JACOBIAN, // 12
00104 " scaled jacobian", // MB_SCALED_JACOBIAN, // 13
00105 " shear", // MB_SHEAR, // 14
00106 " shape", // MB_SHAPE, // 15
00107 " relative size squared", // MB_RELATIVE_SIZE_SQUARED, // 16
00108 " shape and size", // MB_SHAPE_AND_SIZE, // 17
00109 " shear and size", // MB_SHEAR_AND_SIZE, // 18
00110 " distortion", // MB_DISTORTION, // 19
00111 // next are QuadMetricVals that are not in hex metrics
00112 // length for edge:
00113 " length", // MB_LENGTH, // 20 only for edge
00114 " radius ratio", // MB_RADIUS_RATIO // 21 tet
00115 " aspect beta", // MB_ASPECT_BETA // 22 tet
00116 " aspect ratio", // MB_ASPECT_RATIO, // 23 MBTET
00117 " aspect gamma", // MB_ASPECT_GAMMA // 24 tet
00118 " minimum angle", // MB_MINIMUM_ANGLE, // 25 MBTET
00119 " collapse ratio", // MB_COLLAPSE_RATIO, // 26 MBTET
00120 " warpage", // MB_WARPAGE // 27 MBQUAD
00121 " area", // MB_AREA // 28 MBQAD
00122 " maximum angle" // MB_MAXIMUM_ANGLE // 29 MBQUAD
00123 };
00124
00125 static const char* nameType[MBMAXTYPE] = {
00126 "MBVERTEX", /**< Mesh Vertex AKA node */
00127 "MBEDGE", /**< Mesh Edge */
00128 "MBTRI", /**< Triangular element (including shells) */
00129 "MBQUAD", /**< Quadrilateral element (including shells) */
00130 "MBPOLYGON", /**< Polygon */
00131 "MBTET", /**< Tetrahedral element */
00132 "MBPYRAMID", /**< Pyramid element (where are the face ids for this defined?) */
00133 "MBPRISM", /**< Wedge element (Exodus has one, Cubit doesn't. Does Mesh need it?) */
00134 "MBKNIFE", /**< Knife element */
00135 "MBHEX", /**< Hexahedral element */
00136 "MBPOLYHEDRON", /**< Polyhedron */
00137 "MBENTITYSET", /**< MeshSet */
00138 };
00139
00140 ErrorCode VerdictWrapper::quality_measure( EntityHandle eh,
00141 QualityType q,
00142 double& quality,
00143 int num_nodes,
00144 EntityType etype,
00145 double* coords )
00146 {
00147 double coordinates[27][3]; // at most 27 nodes per element
00148
00149 if( 0 == num_nodes && NULL == coords )
00150 {
00151 etype = TYPE_FROM_HANDLE( eh );
00152 if( possibleQuality[etype][q] == 0 ) return MB_NOT_IMPLEMENTED;
00153
00154 // get coordinates of points, if not passed already
00155 const EntityHandle* conn = NULL;
00156 // int num_nodes;
00157 ErrorCode rval = mbImpl->get_connectivity( eh, conn, num_nodes );
00158 if( rval != MB_SUCCESS ) return rval;
00159 if( etype != MBPOLYHEDRON )
00160 {
00161 rval = mbImpl->get_coords( conn, num_nodes, &( coordinates[0][0] ) );
00162 if( rval != MB_SUCCESS ) return rval;
00163 }
00164 }
00165 else
00166 {
00167 if( num_nodes > 27 ) return MB_FAILURE;
00168 for( int i = 0; i < num_nodes; i++ )
00169 {
00170 for( int j = 0; j < 3; j++ )
00171 coordinates[i][j] = coords[3 * i + j];
00172 }
00173 }
00174 VerdictFunction func = 0;
00175
00176 switch( etype )
00177 {
00178 case MBHEX: {
00179 num_nodes = 8;
00180 switch( q )
00181 {
00182 case MB_EDGE_RATIO:
00183 func = v_hex_edge_ratio;
00184 break; // 0
00185 case MB_MAX_EDGE_RATIO:
00186 func = v_hex_max_edge_ratio;
00187 break; // 1
00188 case MB_SKEW:
00189 func = v_hex_skew;
00190 break; // 2
00191 case MB_TAPER:
00192 func = v_hex_taper;
00193 break; // 3
00194 case MB_VOLUME:
00195 func = v_hex_volume;
00196 break; // 4
00197 case MB_STRETCH:
00198 func = v_hex_stretch;
00199 break; // 5
00200 case MB_DIAGONAL:
00201 func = v_hex_diagonal;
00202 break; // 6
00203 case MB_DIMENSION:
00204 func = v_hex_dimension;
00205 break; // 7
00206 case MB_ODDY:
00207 func = v_hex_oddy;
00208 break; // 8
00209 case MB_MED_ASPECT_FROBENIUS:
00210 func = v_hex_med_aspect_frobenius;
00211 break; // 9
00212 case MB_MAX_ASPECT_FROBENIUS:
00213 func = v_hex_max_aspect_frobenius;
00214 break; // 10
00215 case MB_CONDITION:
00216 func = v_hex_condition;
00217 break; // 11
00218 case MB_JACOBIAN:
00219 func = v_hex_jacobian;
00220 break; // 12
00221 case MB_SCALED_JACOBIAN:
00222 func = v_hex_scaled_jacobian;
00223 break; // 13
00224 case MB_SHEAR:
00225 func = v_hex_shear;
00226 break; // 14
00227 case MB_SHAPE:
00228 func = v_hex_shape;
00229 break; // 15
00230 case MB_RELATIVE_SIZE_SQUARED:
00231 func = v_hex_relative_size_squared;
00232 break; // 16
00233 case MB_SHAPE_AND_SIZE:
00234 func = v_hex_shape_and_size;
00235 break; // 17
00236 case MB_SHEAR_AND_SIZE:
00237 func = v_hex_shear_and_size;
00238 break; // 18
00239 case MB_DISTORTION:
00240 func = v_hex_distortion;
00241 break; // 19
00242 default:
00243 return MB_FAILURE;
00244 }
00245 break;
00246 }
00247 case MBEDGE: {
00248 num_nodes = 2;
00249 switch( q )
00250 {
00251 case MB_LENGTH:
00252 func = v_edge_length;
00253 break; // 20
00254 default:
00255 return MB_FAILURE;
00256 }
00257 break;
00258 }
00259 case MBTET: {
00260 num_nodes = 4;
00261 switch( q )
00262 {
00263 case MB_EDGE_RATIO:
00264 func = v_tet_edge_ratio;
00265 break; // 0 //! Calculates tet edge ratio metric.
00266 case MB_RADIUS_RATIO:
00267 func = v_tet_radius_ratio;
00268 break; // 21
00269 case MB_ASPECT_BETA:
00270 func = v_tet_aspect_beta;
00271 break; // 22
00272 case MB_ASPECT_RATIO:
00273 func = v_tet_aspect_ratio;
00274 break; // 23
00275 case MB_ASPECT_GAMMA:
00276 func = v_tet_aspect_gamma;
00277 break; // 24
00278 case MB_MAX_ASPECT_FROBENIUS:
00279 func = v_tet_aspect_frobenius;
00280 break; // 10
00281 case MB_MINIMUM_ANGLE:
00282 func = v_tet_minimum_angle;
00283 break; // 25
00284 case MB_COLLAPSE_RATIO:
00285 func = v_tet_collapse_ratio;
00286 break; // 26
00287 case MB_VOLUME:
00288 func = v_tet_volume;
00289 break; // 4
00290 case MB_CONDITION:
00291 func = v_tet_condition;
00292 break; // 11
00293 case MB_JACOBIAN:
00294 func = v_tet_jacobian;
00295 break; // 12
00296 case MB_SCALED_JACOBIAN:
00297 func = v_tet_scaled_jacobian;
00298 break; // 13
00299 case MB_SHAPE:
00300 func = v_tet_shape;
00301 break; // 15
00302 case MB_RELATIVE_SIZE_SQUARED:
00303 func = v_tet_relative_size_squared;
00304 break; // 16
00305 case MB_SHAPE_AND_SIZE:
00306 func = v_tet_shape_and_size;
00307 break; // 17
00308 case MB_DISTORTION:
00309 func = v_tet_distortion;
00310 break; // 19
00311 default:
00312 return MB_FAILURE;
00313 }
00314 break;
00315 }
00316 case MBPRISM: {
00317 num_nodes = 6;
00318 switch( q )
00319 {
00320 case MB_VOLUME:
00321 func = v_wedge_volume;
00322 break; // 4
00323 default:
00324 return MB_FAILURE;
00325 }
00326 break;
00327 }
00328 case MBKNIFE: {
00329 num_nodes = 7;
00330 switch( q )
00331 {
00332 case MB_VOLUME:
00333 func = v_knife_volume;
00334 break; // 4
00335 default:
00336 return MB_FAILURE;
00337 }
00338 break;
00339 }
00340 case MBQUAD: {
00341 num_nodes = 4;
00342 switch( q )
00343 {
00344 case MB_EDGE_RATIO:
00345 func = v_quad_edge_ratio;
00346 break; // 0
00347 case MB_MAX_EDGE_RATIO:
00348 func = v_quad_max_edge_ratio;
00349 break; // 1
00350 case MB_ASPECT_RATIO:
00351 func = v_quad_aspect_ratio;
00352 break; // 23
00353 case MB_RADIUS_RATIO:
00354 func = v_quad_radius_ratio;
00355 break; // 21
00356 case MB_MED_ASPECT_FROBENIUS:
00357 func = v_quad_med_aspect_frobenius;
00358 break; // 9
00359 case MB_MAX_ASPECT_FROBENIUS:
00360 func = v_quad_max_aspect_frobenius;
00361 break; // 10
00362 case MB_SKEW:
00363 func = v_quad_skew;
00364 break; // 2
00365 case MB_TAPER:
00366 func = v_quad_taper;
00367 break; // 3
00368 case MB_WARPAGE:
00369 func = v_quad_warpage;
00370 break; // 27
00371 case MB_AREA:
00372 func = v_quad_area;
00373 break; // 28
00374 case MB_STRETCH:
00375 func = v_quad_stretch;
00376 break; // 5
00377 case MB_MINIMUM_ANGLE:
00378 func = v_quad_minimum_angle;
00379 break; // 25
00380 case MB_MAXIMUM_ANGLE:
00381 func = v_quad_maximum_angle;
00382 break; // 29
00383 case MB_ODDY:
00384 func = v_quad_oddy;
00385 break; // 8
00386 case MB_CONDITION:
00387 func = v_quad_condition;
00388 break; // 11
00389 case MB_JACOBIAN:
00390 func = v_quad_jacobian;
00391 break; // 12
00392 case MB_SCALED_JACOBIAN:
00393 func = v_quad_scaled_jacobian;
00394 break; // 13
00395 case MB_SHEAR:
00396 func = v_quad_shear;
00397 break; // 14
00398 case MB_SHAPE:
00399 func = v_quad_shape;
00400 break; // 15
00401 case MB_RELATIVE_SIZE_SQUARED:
00402 func = v_quad_relative_size_squared;
00403 break; // 16
00404 case MB_SHAPE_AND_SIZE:
00405 func = v_quad_shape_and_size;
00406 break; // 17
00407 case MB_SHEAR_AND_SIZE:
00408 func = v_quad_shear_and_size;
00409 break; // 18
00410 case MB_DISTORTION:
00411 func = v_quad_distortion;
00412 break; // 19
00413 default:
00414 return MB_FAILURE;
00415 }
00416 break;
00417 }
00418
00419 case MBTRI: {
00420 num_nodes = 3;
00421 switch( q )
00422 {
00423 case MB_EDGE_RATIO:
00424 func = v_tri_edge_ratio;
00425 break; // 0
00426 case MB_ASPECT_RATIO:
00427 func = v_tri_aspect_ratio;
00428 break; // 23
00429 case MB_RADIUS_RATIO:
00430 func = v_tri_radius_ratio;
00431 break; // 21
00432 case MB_MAX_ASPECT_FROBENIUS:
00433 func = v_tri_aspect_frobenius;
00434 break; // 10
00435 case MB_AREA:
00436 func = v_tri_area;
00437 break; // 28
00438 case MB_MINIMUM_ANGLE:
00439 func = v_tri_minimum_angle;
00440 break; // 25
00441 case MB_MAXIMUM_ANGLE:
00442 func = v_tri_maximum_angle;
00443 break; // 29
00444 case MB_CONDITION:
00445 func = v_tri_condition;
00446 break; // 11
00447 case MB_SCALED_JACOBIAN:
00448 func = v_tri_scaled_jacobian;
00449 break; // 13
00450 // does not exist, even though it was defined in verdict.h; remove it from there too
00451 // case MB_SHEAR: func = v_tri_shear; break; // 14
00452 case MB_RELATIVE_SIZE_SQUARED:
00453 func = v_tri_relative_size_squared;
00454 break; // 16
00455 case MB_SHAPE:
00456 func = v_tri_shape;
00457 break; // 15
00458 case MB_SHAPE_AND_SIZE:
00459 func = v_tri_shape_and_size;
00460 break; // 17
00461 case MB_DISTORTION:
00462 func = v_tri_distortion;
00463 break; // 19
00464 default:
00465 return MB_FAILURE;
00466 }
00467 break;
00468 }
00469 default:
00470 break; // some have no measures
00471 }
00472
00473 if( !func ) return MB_NOT_IMPLEMENTED;
00474 // actual computation happens here
00475 quality = ( *func )( num_nodes, coordinates );
00476
00477 return MB_SUCCESS;
00478 }
00479 const char* VerdictWrapper::quality_name( QualityType q )
00480 {
00481 return nameQuality[q];
00482 }
00483 const char* VerdictWrapper::entity_type_name( EntityType etype )
00484 {
00485 return nameType[etype];
00486 }
00487 int VerdictWrapper::num_qualities( EntityType etype )
00488 {
00489 return numQualities[etype];
00490 }
00491 int VerdictWrapper::possible_quality( EntityType et, QualityType q )
00492 {
00493 return possibleQuality[et][q];
00494 }
00495 // relative size needs a base size, that is set at global level, one for each major type (hex, tet,
00496 // quad, tri)
00497 ErrorCode VerdictWrapper::set_size( double size )
00498 {
00499 // set the sizes for all of them; maybe we can set by type, this should be enough for simplicity
00500 v_set_hex_size( size );
00501 v_set_tet_size( size );
00502 v_set_quad_size( size );
00503 v_set_tri_size( size );
00504 return MB_SUCCESS;
00505 }
00506
00507 ErrorCode VerdictWrapper::all_quality_measures( EntityHandle eh, std::map< QualityType, double >& qualities )
00508 {
00509 EntityType etype = TYPE_FROM_HANDLE( eh );
00510 if( etype == MBPOLYHEDRON || etype == MBVERTEX || etype == MBENTITYSET )
00511 return MB_SUCCESS; // no quality for polyhedron or vertex or set
00512
00513 double coordinates[27][3]; // at most 27 nodes per element
00514 // get coordinates of points, if not passed already
00515 const EntityHandle* conn = NULL;
00516 int num_nodes;
00517 ErrorCode rval = mbImpl->get_connectivity( eh, conn, num_nodes );
00518 if( rval != MB_SUCCESS ) return rval;
00519 rval = mbImpl->get_coords( conn, num_nodes, &( coordinates[0][0] ) );
00520 if( rval != MB_SUCCESS ) return rval;
00521
00522 switch( etype )
00523 {
00524 case MBEDGE: {
00525 double leng = v_edge_length( 2, coordinates );
00526 qualities[MB_LENGTH] = leng;
00527 break;
00528 }
00529 case MBHEX: {
00530 num_nodes = 8;
00531 HexMetricVals hexMetric;
00532 v_hex_quality( num_nodes, coordinates, V_HEX_ALL, &hexMetric );
00533 qualities[MB_EDGE_RATIO] = hexMetric.edge_ratio;
00534 qualities[MB_MAX_EDGE_RATIO] = hexMetric.max_edge_ratio;
00535 qualities[MB_SKEW] = hexMetric.skew;
00536 qualities[MB_TAPER] = hexMetric.taper;
00537 qualities[MB_VOLUME] = hexMetric.volume;
00538 qualities[MB_STRETCH] = hexMetric.stretch;
00539 qualities[MB_DIAGONAL] = hexMetric.diagonal;
00540 qualities[MB_DIMENSION] = hexMetric.dimension;
00541 qualities[MB_ODDY] = hexMetric.oddy;
00542 qualities[MB_MED_ASPECT_FROBENIUS] = hexMetric.med_aspect_frobenius;
00543 // MB_CONDITION is the same as MB_MAX_ASPECT_FROBENIUS
00544 qualities[MB_MAX_ASPECT_FROBENIUS] = hexMetric.condition;
00545 qualities[MB_CONDITION] = hexMetric.condition;
00546 qualities[MB_JACOBIAN] = hexMetric.jacobian;
00547 qualities[MB_SCALED_JACOBIAN] = hexMetric.scaled_jacobian;
00548 qualities[MB_SHEAR] = hexMetric.shear;
00549 qualities[MB_SHAPE] = hexMetric.shape;
00550 qualities[MB_RELATIVE_SIZE_SQUARED] = hexMetric.relative_size_squared;
00551 qualities[MB_SHAPE_AND_SIZE] = hexMetric.shape_and_size;
00552 qualities[MB_SHEAR_AND_SIZE] = hexMetric.shear_and_size;
00553 qualities[MB_DISTORTION] = hexMetric.distortion;
00554 break;
00555 }
00556
00557 case MBTET: {
00558 num_nodes = 4;
00559 TetMetricVals tetMetrics;
00560 v_tet_quality( num_nodes, coordinates, V_TET_ALL, &tetMetrics );
00561 qualities[MB_EDGE_RATIO] = tetMetrics.edge_ratio;
00562 qualities[MB_RADIUS_RATIO] = tetMetrics.radius_ratio;
00563 qualities[MB_ASPECT_BETA] = tetMetrics.aspect_beta;
00564 qualities[MB_ASPECT_RATIO] = tetMetrics.aspect_ratio;
00565 qualities[MB_ASPECT_GAMMA] = tetMetrics.aspect_gamma;
00566 qualities[MB_MAX_ASPECT_FROBENIUS] = tetMetrics.aspect_frobenius;
00567 qualities[MB_MINIMUM_ANGLE] = tetMetrics.minimum_angle;
00568 qualities[MB_COLLAPSE_RATIO] = tetMetrics.collapse_ratio;
00569 qualities[MB_VOLUME] = tetMetrics.volume;
00570 qualities[MB_CONDITION] = tetMetrics.condition;
00571 qualities[MB_JACOBIAN] = tetMetrics.jacobian;
00572 qualities[MB_SCALED_JACOBIAN] = tetMetrics.scaled_jacobian;
00573 qualities[MB_SHAPE] = tetMetrics.shape;
00574 qualities[MB_RELATIVE_SIZE_SQUARED] = tetMetrics.relative_size_squared;
00575 qualities[MB_SHAPE_AND_SIZE] = tetMetrics.shape_and_size;
00576 qualities[MB_DISTORTION] = tetMetrics.distortion;
00577 break;
00578 }
00579 case MBPRISM: {
00580 num_nodes = 6;
00581 double volu = v_wedge_volume( num_nodes, coordinates );
00582 qualities[MB_VOLUME] = volu;
00583 break;
00584 }
00585 case MBKNIFE: {
00586 num_nodes = 7;
00587 double volu = v_knife_volume( num_nodes, coordinates );
00588 qualities[MB_VOLUME] = volu;
00589 break;
00590 }
00591 case MBQUAD: {
00592 num_nodes = 4;
00593 QuadMetricVals quadMetrics;
00594 v_quad_quality( num_nodes, coordinates, V_QUAD_ALL, &quadMetrics );
00595 qualities[MB_EDGE_RATIO] = quadMetrics.edge_ratio;
00596 qualities[MB_MAX_EDGE_RATIO] = quadMetrics.max_edge_ratio;
00597 qualities[MB_ASPECT_RATIO] = quadMetrics.aspect_ratio; // 23
00598 qualities[MB_RADIUS_RATIO] = quadMetrics.radius_ratio; // 21
00599 qualities[MB_MED_ASPECT_FROBENIUS] = quadMetrics.med_aspect_frobenius; // 9
00600 qualities[MB_MAX_ASPECT_FROBENIUS] = quadMetrics.max_aspect_frobenius; // 10
00601 qualities[MB_SKEW] = quadMetrics.skew; // 2
00602 qualities[MB_TAPER] = quadMetrics.taper; // 3
00603 qualities[MB_WARPAGE] = quadMetrics.warpage; // 27
00604 qualities[MB_AREA] = quadMetrics.area; // 28
00605 qualities[MB_STRETCH] = quadMetrics.stretch; // 5
00606 qualities[MB_MINIMUM_ANGLE] = quadMetrics.minimum_angle; // 25
00607 qualities[MB_MAXIMUM_ANGLE] = quadMetrics.maximum_angle; // 29
00608 qualities[MB_ODDY] = quadMetrics.oddy; // 8
00609 qualities[MB_CONDITION] = quadMetrics.condition; // 11
00610 qualities[MB_JACOBIAN] = quadMetrics.jacobian; // 12
00611 qualities[MB_SCALED_JACOBIAN] = quadMetrics.scaled_jacobian; // 13
00612 qualities[MB_SHEAR] = quadMetrics.shear; // 14
00613 qualities[MB_SHAPE] = quadMetrics.shape; // 15
00614 qualities[MB_RELATIVE_SIZE_SQUARED] = quadMetrics.relative_size_squared; // 16
00615 qualities[MB_SHAPE_AND_SIZE] = quadMetrics.shape_and_size; // 17
00616 qualities[MB_SHEAR_AND_SIZE] = quadMetrics.shear_and_size; // 18
00617 qualities[MB_DISTORTION] = quadMetrics.distortion; // 19
00618 break;
00619 }
00620
00621 case MBTRI: {
00622 num_nodes = 3;
00623 TriMetricVals triMetrics;
00624 v_tri_quality( num_nodes, coordinates, V_TRI_ALL, &triMetrics );
00625 qualities[MB_EDGE_RATIO] = triMetrics.edge_ratio; // 0
00626 qualities[MB_ASPECT_RATIO] = triMetrics.aspect_ratio; // 23
00627 qualities[MB_RADIUS_RATIO] = triMetrics.radius_ratio; // 21
00628 qualities[MB_MAX_ASPECT_FROBENIUS] = triMetrics.aspect_frobenius; // 10
00629 qualities[MB_AREA] = triMetrics.area; // 28
00630 qualities[MB_MINIMUM_ANGLE] = triMetrics.minimum_angle; // 25
00631 qualities[MB_MAXIMUM_ANGLE] = triMetrics.maximum_angle; // 29
00632 qualities[MB_CONDITION] = triMetrics.condition; // 11
00633 qualities[MB_SCALED_JACOBIAN] = triMetrics.scaled_jacobian; // 13
00634 // does not exist, even though it was defined in verdict.h; remove it from there too
00635 // case MB_SHEAR: func = v_tri_shear; break; // 14
00636 qualities[MB_RELATIVE_SIZE_SQUARED] = triMetrics.relative_size_squared; // 16
00637 qualities[MB_SHAPE] = triMetrics.shape; // 15
00638 qualities[MB_SHAPE_AND_SIZE] = triMetrics.shape_and_size; // 17
00639 qualities[MB_DISTORTION] = triMetrics.distortion; // 19
00640 break;
00641 }
00642 default:
00643 return MB_NOT_IMPLEMENTED;
00644 }
00645 return MB_SUCCESS;
00646 }
00647
00648 } // namespace moab