Beispiel #1
0
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);
}
Beispiel #2
0
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;
}