MOAB: Mesh Oriented datABase
(version 5.4.1)
|
Wrapper that implements TMP-based shape improvement. More...
#include <ShapeImprover.hpp>
Public Member Functions | |
MESQUITE_EXPORT | ShapeImprover () |
MESQUITE_EXPORT void | set_cpu_time_limit (double seconds) |
MESQUITE_EXPORT void | set_vertex_movement_limit_factor (double beta) |
MESQUITE_EXPORT void | set_parallel_iterations (int count) |
Protected Member Functions | |
MESQUITE_EXPORT void | run_wrapper (MeshDomainAssoc *mesh_and_domain, ParallelMesh *pmesh, Settings *settings, QualityAssessor *qa, MsqError &err) |
Private Attributes | |
double | maxTime |
double | mBeta |
int | parallelIterations |
Wrapper that implements TMP-based shape improvement.
Definition at line 43 of file ShapeImprover.hpp.
Definition at line 56 of file ShapeImprover.cpp.
: maxTime( 300.0 ), mBeta( DEFAULT_BETA ), parallelIterations( DEFUALT_PARALLEL_ITERATIONS ) { }
void MBMesquite::ShapeImprover::run_wrapper | ( | MeshDomainAssoc * | mesh_and_domain, |
ParallelMesh * | pmesh, | ||
Settings * | settings, | ||
QualityAssessor * | quality_assessor, | ||
MsqError & | err | ||
) | [protected, virtual] |
Function that each wrapper must implement
Implements MBMesquite::Wrapper.
Definition at line 84 of file ShapeImprover.cpp.
References MBMesquite::TerminationCriterion::add_absolute_vertex_movement_edge_length(), MBMesquite::TerminationCriterion::add_cpu_time(), MBMesquite::QualityAssessor::add_quality_assessment(), MBMesquite::InstructionQueue::add_quality_assessor(), MBMesquite::PatchData::attach_settings(), MBMesquite::Mesh::get_all_elements(), MBMesquite::Mesh::get_all_vertices(), MBMesquite::MeshDomainAssoc::get_domain(), MBMesquite::QualityAssessor::get_inverted_element_count(), MBMesquite::MeshDomainAssoc::get_mesh(), MBMesquite::PatchData::get_minmax_edge_length(), maxTime, mBeta, mesh, MSQ_ERRRTN, MBMesquite::InstructionQueue::run_common(), MBMesquite::PatchData::set_domain(), MBMesquite::QualityImprover::set_inner_termination_criterion(), MBMesquite::InstructionQueue::set_master_quality_improver(), MBMesquite::PatchData::set_mesh(), MBMesquite::PatchData::set_mesh_entities(), and MBMesquite::PatchSetUser::use_global_patch().
{ // Quality Metrics IdealShapeTarget target; Mesh* mesh = mesh_and_domain->get_mesh(); MeshDomain* domain = mesh_and_domain->get_domain(); // only calc min edge length if user hasn't set the vertex_movement_limit_factor if( !mBeta ) { // Calculate minimum edge length in mesh // create a temp global patch to get min edge len from PatchData patch; patch.set_mesh( mesh ); patch.set_domain( domain ); if( settings ) patch.attach_settings( settings ); std::vector< Mesh::ElementHandle > patch_elems; std::vector< Mesh::VertexHandle > patch_verts; mesh->get_all_elements( patch_elems, err ); mesh->get_all_vertices( patch_verts, err ); patch.set_mesh_entities( patch_elems, patch_verts, err ); // get min edge length from temp global patch double min_edge_len = 0.0, max_edge_len = 0.0; patch.get_minmax_edge_length( min_edge_len, max_edge_len ); mBeta = min_edge_len / 10.0; } TerminationCriterion inner_b; // check for inverted elements // create QualityAssessor instance without a Quality Metric QualityAssessor check_inverted( false, false ); InstructionQueue q_invert_check; // a QuallityAssessor without a metric will just check for inverted elements and samples q_invert_check.add_quality_assessor( &check_inverted, err ); q_invert_check.run_common( mesh_and_domain, pmesh, settings, err );MSQ_ERRRTN( err ); int inverted_elems = 0, inverted_samples = 0; check_inverted.get_inverted_element_count( inverted_elems, inverted_samples, err ); if( inverted_elems || inverted_samples ) { // use non barrier shape improvement on tangled mesh TShapeNB1 mu_no; TQualityMetric metric_no_0( &target, &mu_no ); ElementPMeanP metric_no( 1.0, &metric_no_0 ); // QualityAssessor qa->add_quality_assessment( &metric_no ); PMeanPTemplate obj_func_no( 1.0, &metric_no ); ConjugateGradient improver_no( &obj_func_no ); improver_no.use_global_patch(); TerminationCriterion inner_no; if( maxTime > 0.0 ) inner_no.add_cpu_time( maxTime ); inner_no.add_absolute_vertex_movement_edge_length( mBeta ); improver_no.set_inner_termination_criterion( &inner_no ); InstructionQueue q_no; q_no.add_quality_assessor( qa, err );MSQ_ERRRTN( err ); q_no.set_master_quality_improver( &improver_no, err );MSQ_ERRRTN( err ); q_no.add_quality_assessor( qa, err );MSQ_ERRRTN( err ); q_no.run_common( mesh_and_domain, pmesh, settings, err );MSQ_ERRRTN( err ); } else { // use barrer metric on non-tangled mesh Timer totalTimer; TShapeB1 mu_b; TQualityMetric metric_b_0( &target, &mu_b ); ElementPMeanP metric_b( 1.0, &metric_b_0 ); qa->add_quality_assessment( &metric_b ); PMeanPTemplate obj_func_b( 1.0, &metric_b ); ConjugateGradient improver_b( &obj_func_b ); improver_b.use_global_patch(); if( maxTime > 0.0 ) inner_b.add_cpu_time( maxTime ); inner_b.add_absolute_vertex_movement_edge_length( mBeta ); improver_b.set_inner_termination_criterion( &inner_b ); InstructionQueue q_b; q_b.add_quality_assessor( qa, err );MSQ_ERRRTN( err ); q_b.set_master_quality_improver( &improver_b, err );MSQ_ERRRTN( err ); q_b.add_quality_assessor( qa, err );MSQ_ERRRTN( err ); q_b.run_common( mesh_and_domain, pmesh, settings, err );MSQ_ERRRTN( err ); } }
void MBMesquite::ShapeImprover::set_cpu_time_limit | ( | double | seconds | ) |
Definition at line 68 of file ShapeImprover.cpp.
References maxTime.
Referenced by main().
{ assert( limit >= 0.0 ); maxTime = limit; }
void MBMesquite::ShapeImprover::set_parallel_iterations | ( | int | count | ) |
Definition at line 74 of file ShapeImprover.cpp.
References parallelIterations.
{ if( count < 1 ) { assert( false ); count = 1; } parallelIterations = count; }
void MBMesquite::ShapeImprover::set_vertex_movement_limit_factor | ( | double | beta | ) |
Definition at line 61 of file ShapeImprover.cpp.
Referenced by main(), and run_example().
double MBMesquite::ShapeImprover::maxTime [private] |
Definition at line 83 of file ShapeImprover.hpp.
Referenced by run_wrapper(), and set_cpu_time_limit().
double MBMesquite::ShapeImprover::mBeta [private] |
Definition at line 83 of file ShapeImprover.hpp.
Referenced by run_wrapper(), and set_vertex_movement_limit_factor().
int MBMesquite::ShapeImprover::parallelIterations [private] |
Definition at line 84 of file ShapeImprover.hpp.
Referenced by set_parallel_iterations().