MOAB: Mesh Oriented datABase  (version 5.4.1)
MBMesquite::PowerQualityMetric Class Reference

Raises a single quality metrics (qMetric1) to an arbitrary power (a double value, scaleAlpha) for two- and three-diminsional elements. More...

#include <PowerQualityMetric.hpp>

+ Inheritance diagram for MBMesquite::PowerQualityMetric:
+ Collaboration diagram for MBMesquite::PowerQualityMetric:

Public Member Functions

 PowerQualityMetric (QualityMetric *qm1, double pow_double)
virtual ~PowerQualityMetric ()
MetricType get_metric_type () const
std::string get_name () const
int get_negate_flag () const
 1 if metric should be minimized, -1 if metric should be maximized.
QualityMetricget_metric () const
virtual void get_evaluations (PatchData &pd, std::vector< size_t > &handles, bool free_vertices_only, MsqError &err)
 Get locations at which metric can be evaluated.
virtual bool evaluate (PatchData &pd, size_t handle, double &value, MsqError &err)
 Get metric value at a logical location in the patch.
virtual bool evaluate_with_indices (PatchData &pd, size_t handle, double &value, std::vector< size_t > &indices, MsqError &err)
 Get metric value at a logical location in the patch.
virtual bool evaluate_with_gradient (PatchData &pd, size_t handle, double &value, std::vector< size_t > &indices, std::vector< Vector3D > &gradient, MsqError &err)
 Get metric value and gradient at a logical location in the patch.
virtual bool evaluate_with_Hessian (PatchData &pd, size_t handle, double &value, std::vector< size_t > &indices, std::vector< Vector3D > &gradient, std::vector< Matrix3D > &Hessian, MsqError &err)
 Get metric value and deravitives at a logical location in the patch.

Private Attributes

QualityMetricmMetric
MBMesquite::Exponent mPower

Detailed Description

Raises a single quality metrics (qMetric1) to an arbitrary power (a double value, scaleAlpha) for two- and three-diminsional elements.

Definition at line 55 of file PowerQualityMetric.hpp.


Constructor & Destructor Documentation

PowerQualityMetric::PowerQualityMetric ( QualityMetric qm1,
double  pow_double 
)

Ensures that qm1 is not NULL. If qm1 is only valid on a certain feasible, then the composite metric has the same constraint. The composite metric also has the same negate flag as qm1.

Definition at line 40 of file PowerQualityMetric.cpp.

: mMetric( *qm ), mPower( pow_factor ) {}

Definition at line 42 of file PowerQualityMetric.cpp.

{}

Member Function Documentation

bool PowerQualityMetric::evaluate ( PatchData pd,
size_t  handle,
double &  value,
MsqError err 
) [virtual]

Get metric value at a logical location in the patch.

Evaluate the metric at one location in the PatchData.

Parameters:
pdThe patch.
handleThe location in the patch (as passed back from get_evaluations).
valueThe output metric value.

Implements MBMesquite::QualityMetric.

Definition at line 59 of file PowerQualityMetric.cpp.

References MBMesquite::QualityMetric::evaluate(), mMetric, mPower, MSQ_CHKERR, and MBMesquite::Exponent::raise().

{
    bool rval = mMetric.evaluate( pd, handle, value, err );
    value     = mPower.raise( value );
    return !MSQ_CHKERR( err ) && rval;
}
bool PowerQualityMetric::evaluate_with_gradient ( PatchData pd,
size_t  handle,
double &  value,
std::vector< size_t > &  indices,
std::vector< Vector3D > &  gradient,
MsqError err 
) [virtual]

Get metric value and gradient at a logical location in the patch.

Evaluate the metric at one location in the PatchData.

Parameters:
pdThe patch.
handleThe location in the patch (as passed back from get_evaluations).
valueThe output metric value.
indicesThe free vertices that the evaluation is a function of, specified as vertex indices in the PatchData.
gradientThe gradient of the metric as a function of the coordinates of the free vertices passed back in the indices list.

Reimplemented from MBMesquite::QualityMetric.

Definition at line 77 of file PowerQualityMetric.cpp.

References MBMesquite::QualityMetric::evaluate_with_gradient(), mMetric, mPower, MSQ_CHKERR, MBMesquite::Exponent::raise(), and MBMesquite::Exponent::value().

{
    bool rval      = mMetric.evaluate_with_gradient( pd, handle, value, indices, gradient, err );
    const double v = mPower.raise( value );
    const double g = fabs( value ) > DBL_EPSILON ? mPower.value() * v / value : 0;
    value          = v;
    for( std::vector< Vector3D >::iterator i = gradient.begin(); i != gradient.end(); ++i )
        *i *= g;
    return !MSQ_CHKERR( err ) && rval;
}
bool PowerQualityMetric::evaluate_with_Hessian ( PatchData pd,
size_t  handle,
double &  value,
std::vector< size_t > &  indices,
std::vector< Vector3D > &  gradient,
std::vector< Matrix3D > &  Hessian,
MsqError err 
) [virtual]

Get metric value and deravitives at a logical location in the patch.

Evaluate the metric at one location in the PatchData.

Parameters:
pdThe patch.
handleThe location in the patch (as passed back from get_evaluations).
valueThe output metric value.
indicesThe free vertices that the evaluation is a function of, specified as vertex indices in the PatchData.
gradientThe gradient of the metric as a function of the coordinates of the free vertices passed back in the indices list.
HessianThe Hessian of the metric as a function of the coordinates. The Hessian is passed back as the upper-triangular portion of the matrix in row-major order, where each Matrix3D is the portion of the Hessian with respect to the vertices at the corresponding positions in the indices list.

Reimplemented from MBMesquite::QualityMetric.

Definition at line 93 of file PowerQualityMetric.cpp.

References MBMesquite::QualityMetric::evaluate_with_Hessian(), mMetric, mPower, MSQ_CHKERR, n, MBMesquite::Matrix3D::outer_product(), MBMesquite::Exponent::raise(), and MBMesquite::Exponent::value().

{
    indices.clear();
    bool rval      = mMetric.evaluate_with_Hessian( pd, handle, value, indices, gradient, Hessian, err );
    const double v = mPower.raise( value );
    const double g = fabs( value ) > DBL_EPSILON ? mPower.value() * v / value : 0.0;
    const double h = fabs( value ) > DBL_EPSILON ? g * ( mPower.value() - 1 ) / value : 0.0;
    value          = v;
    Matrix3D op;
    unsigned idx = 0;
    unsigned n   = indices.size();
    for( unsigned r = 0; r < n; ++r )
    {
        for( unsigned c = r; c < n; ++c )
        {
            Hessian[idx] *= g;
            op.outer_product( gradient[r], gradient[c] );
            op *= h;
            Hessian[idx] += op;
            ++idx;
        }
        gradient[r] *= g;
    }
    return !MSQ_CHKERR( err ) && rval;
}
bool PowerQualityMetric::evaluate_with_indices ( PatchData pd,
size_t  handle,
double &  value,
std::vector< size_t > &  indices,
MsqError err 
) [virtual]

Get metric value at a logical location in the patch.

Evaluate the metric at one location in the PatchData.

Parameters:
pdThe patch.
handleThe location in the patch (as passed back from get_evaluations).
valueThe output metric value.
indicesThe free vertices that the evaluation is a function of, specified as vertex indices in the PatchData.

Implements MBMesquite::QualityMetric.

Definition at line 66 of file PowerQualityMetric.cpp.

References MBMesquite::QualityMetric::evaluate_with_indices(), mMetric, mPower, MSQ_CHKERR, and MBMesquite::Exponent::raise().

{
    bool rval = mMetric.evaluate_with_indices( pd, handle, value, indices, err );
    value     = mPower.raise( value );
    return !MSQ_CHKERR( err ) && rval;
}
void PowerQualityMetric::get_evaluations ( PatchData pd,
std::vector< size_t > &  handles,
bool  free_vertices_only,
MsqError err 
) [virtual]

Get locations at which metric can be evaluated.

Different metrics are evaluated for different things within a patch. For example, an element-based metric will be evaluated once for each element in patch, a vertex-based metric once for each veretx, and a target/sample-point based metric will be evaluated once for each samle point in each element. This method returns a list of handles, one for each location in the patch at which the metric can be evaluated. The handle values are used as input to the evaluate methods.

Parameters:
pdThe patch
handlesOutput list of handles
free_vertices_onlyIf true, only pass back evaluation points that depend on at least one free vertex.

Implements MBMesquite::QualityMetric.

Definition at line 54 of file PowerQualityMetric.cpp.

References MBMesquite::QualityMetric::get_evaluations(), mMetric, and MSQ_CHKERR.

{
    mMetric.get_evaluations( pd, handles, free_only, err );MSQ_CHKERR( err );
}

Definition at line 77 of file PowerQualityMetric.hpp.

References mMetric.

    {
        return &mMetric;
    }
std::string PowerQualityMetric::get_name ( ) const [virtual]

Implements MBMesquite::QualityMetric.

Definition at line 44 of file PowerQualityMetric.cpp.

References MBMesquite::QualityMetric::get_name(), and mMetric.

{
    return std::string( "pow(" ) + mMetric.get_name() + ")";
}
int PowerQualityMetric::get_negate_flag ( ) const [virtual]

1 if metric should be minimized, -1 if metric should be maximized.

Implements MBMesquite::QualityMetric.

Definition at line 49 of file PowerQualityMetric.cpp.

References MBMesquite::QualityMetric::get_negate_flag(), mMetric, mPower, and MBMesquite::Exponent::value().


Member Data Documentation

List of all members.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines