MOAB: Mesh Oriented datABase
(version 5.4.1)
|
#include <EdgeLengthMetric.hpp>
Public Member Functions | |
MESQUITE_EXPORT | EdgeLengthMetric (double gamma=0.0) |
virtual MESQUITE_EXPORT std::string | get_name () const |
virtual MESQUITE_EXPORT int | get_negate_flag () const |
1 if metric should be minimized, -1 if metric should be maximized. | |
virtual MESQUITE_EXPORT bool | evaluate (PatchData &pd, size_t handle, double &value, MsqError &err) |
Get metric value at a logical location in the patch. | |
virtual MESQUITE_EXPORT 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. | |
Private Attributes | |
double | mGamma |
Definition at line 40 of file EdgeLengthMetric.hpp.
MBMesquite::EdgeLengthMetric::EdgeLengthMetric | ( | double | gamma = 0.0 | ) |
Definition at line 40 of file EdgeLengthMetric.cpp.
: mGamma( gamma ) {}
bool MBMesquite::EdgeLengthMetric::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.
pd | The patch. |
handle | The location in the patch (as passed back from get_evaluations). |
value | The output metric value. |
Implements MBMesquite::QualityMetric.
Definition at line 53 of file EdgeLengthMetric.cpp.
References MBMesquite::EdgeQM::edge(), MBMesquite::EdgeQM::elem(), MBMesquite::PatchData::element_by_index(), MBMesquite::MsqMeshEntity::get_element_type(), MBMesquite::MsqMeshEntity::get_vertex_index(), mGamma, MSQ_ERRZERO, and MBMesquite::PatchData::vertex_by_index().
{ MsqMeshEntity& e = pd.element_by_index( elem( p_handle ) ); const unsigned* vert_nums; vert_nums = TopologyInfo::edge_vertices( e.get_element_type(), edge( p_handle ), err ); MSQ_ERRZERO( err ); size_t svi = e.get_vertex_index( vert_nums[0] ); size_t evi = e.get_vertex_index( vert_nums[1] ); Vector3D diff = pd.vertex_by_index( svi ) - pd.vertex_by_index( evi ); double len_sqr = diff % diff - mGamma; if( len_sqr <= 0.0 ) { value = 0.0; return false; } value = sqrt( len_sqr ); return true; }
bool MBMesquite::EdgeLengthMetric::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.
pd | The patch. |
handle | The location in the patch (as passed back from get_evaluations). |
value | The output metric value. |
indices | The free vertices that the evaluation is a function of, specified as vertex indices in the PatchData. |
gradient | The 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 72 of file EdgeLengthMetric.cpp.
References MBMesquite::EdgeQM::edge(), MBMesquite::EdgeQM::elem(), MBMesquite::PatchData::element_by_index(), MBMesquite::MsqMeshEntity::get_element_type(), MBMesquite::MsqMeshEntity::get_vertex_index(), mGamma, MSQ_ERRZERO, MBMesquite::PatchData::num_free_vertices(), value(), and MBMesquite::PatchData::vertex_by_index().
{ MsqMeshEntity& e = pd.element_by_index( elem( p_handle ) ); const unsigned* vert_nums; vert_nums = TopologyInfo::edge_vertices( e.get_element_type(), edge( p_handle ), err ); MSQ_ERRZERO( err ); size_t svi = e.get_vertex_index( vert_nums[0] ); size_t evi = e.get_vertex_index( vert_nums[1] ); Vector3D diff = pd.vertex_by_index( svi ) - pd.vertex_by_index( evi ); double val_sqr = diff % diff - mGamma; if( val_sqr <= 0.0 ) { value = 0.0; return false; } value = sqrt( val_sqr ); diff *= 1.0 / value; indices.clear(); gradient.clear(); if( svi < pd.num_free_vertices() ) { indices.push_back( svi ); gradient.push_back( diff ); } if( evi < pd.num_free_vertices() ) { indices.push_back( evi ); gradient.push_back( -diff ); } return true; }
std::string MBMesquite::EdgeLengthMetric::get_name | ( | ) | const [virtual] |
Implements MBMesquite::QualityMetric.
Definition at line 42 of file EdgeLengthMetric.cpp.
{ return "EdgeLength"; }
int MBMesquite::EdgeLengthMetric::get_negate_flag | ( | ) | const [virtual] |
1 if metric should be minimized, -1 if metric should be maximized.
Implements MBMesquite::QualityMetric.
Definition at line 48 of file EdgeLengthMetric.cpp.
{
return 1;
}
double MBMesquite::EdgeLengthMetric::mGamma [private] |
Definition at line 59 of file EdgeLengthMetric.hpp.
Referenced by evaluate(), and evaluate_with_gradient().