C_FUNC_DEF void v_knife_quality( int num_nodes, double coordinates[][3], unsigned int metrics_request_flag, KnifeMetricVals *metric_vals ) { memset( metric_vals, 0, sizeof(KnifeMetricVals) ); if(metrics_request_flag & V_KNIFE_VOLUME) metric_vals->volume = v_knife_volume(num_nodes, coordinates); }
ErrorCode VerdictWrapper::all_quality_measures(EntityHandle eh, std::map<QualityType, double> & qualities) { EntityType etype = TYPE_FROM_HANDLE(eh); if (etype == MBPOLYHEDRON || etype == MBVERTEX || etype == MBENTITYSET) return MB_SUCCESS; // no quality for polyhedron or vertex or set double coordinates[27][3]; // at most 27 nodes per element // get coordinates of points, if not passed already const EntityHandle * conn = NULL; int num_nodes; ErrorCode rval = mbImpl->get_connectivity(eh, conn, num_nodes); if (rval != MB_SUCCESS) return rval; rval = mbImpl->get_coords(conn, num_nodes, &(coordinates[0][0])); if (rval != MB_SUCCESS) return rval; switch (etype) { case MBEDGE: { double leng = v_edge_length(2, coordinates); qualities[MB_LENGTH] = leng; break; } case MBHEX: { num_nodes = 8; HexMetricVals hexMetric; v_hex_quality(num_nodes, coordinates, V_HEX_ALL, &hexMetric); qualities[MB_EDGE_RATIO] = hexMetric.edge_ratio; qualities[MB_MAX_EDGE_RATIO] = hexMetric.max_edge_ratio; qualities[MB_SKEW] = hexMetric.skew; qualities[MB_TAPER] = hexMetric.taper; qualities[MB_VOLUME] = hexMetric.volume; qualities[MB_STRETCH] = hexMetric.stretch; qualities[MB_DIAGONAL] = hexMetric.diagonal; qualities[MB_DIMENSION] = hexMetric.dimension; qualities[MB_ODDY] = hexMetric.oddy; qualities[MB_MED_ASPECT_FROBENIUS] = hexMetric.med_aspect_frobenius; // MB_CONDITION is the same as MB_MAX_ASPECT_FROBENIUS qualities[MB_MAX_ASPECT_FROBENIUS] = hexMetric.condition; qualities[MB_CONDITION] = hexMetric.condition; qualities[MB_JACOBIAN] = hexMetric.jacobian; qualities[MB_SCALED_JACOBIAN] = hexMetric.scaled_jacobian; qualities[MB_SHEAR] = hexMetric.shear; qualities[MB_SHAPE] = hexMetric.shape; qualities[MB_RELATIVE_SIZE_SQUARED] = hexMetric.relative_size_squared; qualities[MB_SHAPE_AND_SIZE] = hexMetric.shape_and_size; qualities[MB_SHEAR_AND_SIZE] = hexMetric.shear_and_size; qualities[MB_DISTORTION] = hexMetric.distortion; break; } case MBTET: { num_nodes = 4; TetMetricVals tetMetrics; v_tet_quality(num_nodes, coordinates, V_TET_ALL, &tetMetrics); qualities[MB_EDGE_RATIO]=tetMetrics.edge_ratio; qualities[MB_RADIUS_RATIO] = tetMetrics.radius_ratio; qualities[MB_ASPECT_BETA] = tetMetrics.aspect_beta; qualities[MB_ASPECT_RATIO] = tetMetrics.aspect_ratio; qualities[MB_ASPECT_GAMMA] = tetMetrics.aspect_gamma; qualities[MB_MAX_ASPECT_FROBENIUS] = tetMetrics.aspect_frobenius; qualities[MB_MINIMUM_ANGLE] = tetMetrics.minimum_angle; qualities[MB_COLLAPSE_RATIO] = tetMetrics.collapse_ratio; qualities[MB_VOLUME] = tetMetrics.volume; qualities[MB_CONDITION] = tetMetrics.condition; qualities[MB_JACOBIAN] = tetMetrics.jacobian; qualities[MB_SCALED_JACOBIAN] = tetMetrics.scaled_jacobian; qualities[MB_SHAPE] = tetMetrics.shape; qualities[MB_RELATIVE_SIZE_SQUARED] = tetMetrics.relative_size_squared; qualities[MB_SHAPE_AND_SIZE] = tetMetrics.shape_and_size; qualities[MB_DISTORTION] = tetMetrics.distortion; break; } case MBPRISM: { num_nodes = 6; double volu = v_wedge_volume(num_nodes, coordinates); qualities[MB_VOLUME] = volu; break; } case MBKNIFE: { num_nodes = 7; double volu = v_knife_volume(num_nodes, coordinates); qualities[MB_VOLUME] = volu; break; } case MBQUAD: { num_nodes = 4; QuadMetricVals quadMetrics; v_quad_quality(num_nodes, coordinates, V_QUAD_ALL, &quadMetrics); qualities[MB_EDGE_RATIO] = quadMetrics.edge_ratio; qualities[MB_MAX_EDGE_RATIO] = quadMetrics.max_edge_ratio; qualities[MB_ASPECT_RATIO] = quadMetrics.aspect_ratio; // 23 qualities[MB_RADIUS_RATIO] = quadMetrics.radius_ratio; // 21 qualities[MB_MED_ASPECT_FROBENIUS] = quadMetrics.med_aspect_frobenius; // 9 qualities[MB_MAX_ASPECT_FROBENIUS] = quadMetrics.max_aspect_frobenius; //10 qualities[MB_SKEW] = quadMetrics.skew; // 2 qualities[MB_TAPER] = quadMetrics.taper; // 3 qualities[MB_WARPAGE] = quadMetrics.warpage; // 27 qualities[MB_AREA] = quadMetrics.area; // 28 qualities[MB_STRETCH] = quadMetrics.stretch; // 5 qualities[MB_MINIMUM_ANGLE] = quadMetrics.minimum_angle; // 25 qualities[MB_MAXIMUM_ANGLE] = quadMetrics.maximum_angle; // 29 qualities[MB_ODDY] = quadMetrics.oddy; // 8 qualities[MB_CONDITION] = quadMetrics.condition; // 11 qualities[MB_JACOBIAN] = quadMetrics.jacobian; // 12 qualities[MB_SCALED_JACOBIAN] = quadMetrics.scaled_jacobian; // 13 qualities[MB_SHEAR] = quadMetrics.shear; // 14 qualities[MB_SHAPE] = quadMetrics.shape; // 15 qualities[MB_RELATIVE_SIZE_SQUARED] = quadMetrics.relative_size_squared; // 16 qualities[MB_SHAPE_AND_SIZE] = quadMetrics.shape_and_size; // 17 qualities[MB_SHEAR_AND_SIZE] = quadMetrics.shear_and_size; // 18 qualities[MB_DISTORTION] = quadMetrics.distortion; // 19 break; } case MBTRI: { num_nodes = 3; TriMetricVals triMetrics; v_tri_quality(num_nodes, coordinates, V_TRI_ALL, &triMetrics); qualities[MB_EDGE_RATIO] = triMetrics.edge_ratio; // 0 qualities[MB_ASPECT_RATIO] = triMetrics.aspect_ratio; // 23 qualities[MB_RADIUS_RATIO] = triMetrics.radius_ratio; // 21 qualities[MB_MAX_ASPECT_FROBENIUS] = triMetrics.aspect_frobenius; // 10 qualities[MB_AREA] = triMetrics.area; // 28 qualities[MB_MINIMUM_ANGLE] = triMetrics.minimum_angle; // 25 qualities[MB_MAXIMUM_ANGLE] = triMetrics.maximum_angle; // 29 qualities[MB_CONDITION] = triMetrics.condition; // 11 qualities[MB_SCALED_JACOBIAN] = triMetrics.scaled_jacobian; // 13 // does not exist, even though it was defined in verdict.h; remove it from there too // case MB_SHEAR: func = v_tri_shear; break; // 14 qualities[MB_RELATIVE_SIZE_SQUARED] = triMetrics.relative_size_squared; // 16 qualities[MB_SHAPE] = triMetrics.shape; // 15 qualities[MB_SHAPE_AND_SIZE] = triMetrics.shape_and_size; // 17 qualities[MB_DISTORTION] = triMetrics.distortion; // 19 break; } default: return MB_NOT_IMPLEMENTED; } return MB_SUCCESS; }