本文整理汇总了C++中TerminationCriterion类的典型用法代码示例。如果您正苦于以下问题:C++ TerminationCriterion类的具体用法?C++ TerminationCriterion怎么用?C++ TerminationCriterion使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了TerminationCriterion类的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: main
int main( int argc, char* argv[] )
{
parse_options( argv, argc );
MeshImpl mesh;
XYRectangle domain( max_x - min_x, max_y - min_y, min_x, min_y );
MsqError err;
create_input_mesh( input_x, mesh, err );
if (MSQ_CHKERR(err)) { std::cerr << err << std::endl; return 2; }
domain.setup( &mesh, err );
if (MSQ_CHKERR(err)) { std::cerr << err << std::endl; return 2; }
QualityMetric* metric = 0;
if (mMetric == 'c')
metric = new ConditionNumberQualityMetric;
else
metric = new IdealWeightInverseMeanRatio;
LPtoPTemplate function( 1, metric );
VertexMover* solver = 0;
if (mSolver == 'j')
solver = new ConjugateGradient( &function );
else
solver = new FeasibleNewton( &function );
if (PatchSetUser* psu = dynamic_cast<PatchSetUser*>(solver))
psu->use_global_patch();
TerminationCriterion inner;
inner.add_absolute_vertex_movement( 1e-4 );
inner.write_mesh_steps( "synchronous", TerminationCriterion::GNUPLOT );
solver->set_inner_termination_criterion( &inner );
InstructionQueue q;
QualityAssessor qa( metric, 10 );
q.add_quality_assessor( &qa, err );
q.set_master_quality_improver( solver, err );
q.add_quality_assessor( &qa, err );
MeshDomainAssoc mesh_and_domain = MeshDomainAssoc(&mesh, &domain);
q.run_instructions( &mesh_and_domain, err );
delete solver;
delete metric;
if (MSQ_CHKERR(err))
{ std::cerr << err << std::endl; return 3; }
mesh.write_vtk( outputFile, err );
if (MSQ_CHKERR(err))
{ std::cerr << err << std::endl; return 2; }
return 0;
}
示例2: err
//VERTEX BOUND
void TerminationCriterionTest::test_vertex_bound()
{
MsqPrintError err(std::cout);
PatchData pd;
create_twelve_hex_patch( pd, err );
ASSERT_NO_ERROR(err);
// get bounding dimension for patch
double maxcoord = 0.0;
for (size_t i = 0; i < pd.num_nodes(); ++i)
for (int d = 0; d < 3; ++d)
if (fabs(pd.vertex_by_index(i)[d]) > maxcoord)
maxcoord = fabs(pd.vertex_by_index(i)[d]);
// add a little bit for rounding error
maxcoord += 1e-5;
TerminationCriterion tc;
tc.add_bounded_vertex_movement( maxcoord );
tc.reset_inner( pd, ofEval, err );
ASSERT_NO_ERROR(err);
tc.reset_patch( pd, err );
ASSERT_NO_ERROR(err);
CPPUNIT_ASSERT(!tc.terminate());
int idx = pd.num_free_vertices() - 1;
Vector3D pos = pd.vertex_by_index(idx);
pos[0] = 2*maxcoord;
pd.set_vertex_coordinates( pos, idx, err );
ASSERT_NO_ERROR(err);
tc.accumulate_inner( pd, 0.0, 0, err );
ASSERT_NO_ERROR(err);
tc.accumulate_patch( pd, err );
ASSERT_NO_ERROR(err);
CPPUNIT_ASSERT(tc.terminate());
}
示例3: LaplacianIQ
//! Constructor sets the instructions in the queue.
LaplacianIQ() {
MsqError err;
// creates a mean ratio quality metric ...
inverseMeanRatio = new IdealWeightInverseMeanRatio(err);
// creates the laplacian smoother procedures
lapl1 = new LaplacianSmoother(err);
mQA = new QualityAssessor(inverseMeanRatio,QualityAssessor::MAXIMUM, err);
//**************Set stopping criterion****************
mTerm = new TerminationCriterion();
mTerm->add_criterion_type_with_int(TerminationCriterion::NUMBER_OF_ITERATES,10,err);
lapl1->set_outer_termination_criterion(mTerm);
// sets a culling method on the first QualityImprover
lapl1->add_culling_method(PatchData::NO_BOUNDARY_VTX);
// adds 1 pass of pass1
this->add_quality_assessor(mQA,err); MSQ_CHKERR(err);
this->set_master_quality_improver(lapl1, err); MSQ_CHKERR(err);
this->add_quality_assessor(mQA,err); MSQ_CHKERR(err);
}
示例4: run_test
void run_test( Grouping grouping, int of_power, Weight w, const string filename )
{
MsqError err;
IdentityTarget target;
TSquared target_metric;
AffineMapMetric qual_metric( &target, &target_metric );
ElementPMeanP elem_metric( of_power, &qual_metric );
QualityMetric* qm_ptr = (grouping == ELEMENT) ? (QualityMetric*)&elem_metric : (QualityMetric*)&qual_metric;
PMeanPTemplate OF( of_power, qm_ptr );
ConjugateGradient solver( &OF );
TerminationCriterion tc;
TerminationCriterion itc;
tc.add_absolute_vertex_movement( 1e-4 );
itc.add_iteration_limit( 2 );
#ifdef USE_GLOBAL_PATCH
solver.use_global_patch();
solver.set_inner_termination_criterion( &tc );
#else
solver.use_element_on_vertex_patch();
solver.set_inner_termination_criterion( &itc );
solver.set_outer_termination_criterion( &tc );
#endif
MeshImpl mesh, expected_mesh;
mesh.read_vtk( SRCDIR "/initial.vtk", err );
CHKERR(err)
// expected_mesh.read_vtk( (filename + ".vtk").c_str(), err ); CHKERR(err)
PlanarDomain plane( PlanarDomain::XY );
MeshDomainAssoc mesh_and_domain = MeshDomainAssoc(&mesh, &plane);
MetricWeight mw( &qual_metric );
InverseMetricWeight imw( &qual_metric );
WeightReader reader;
if (w == METRIC) {
TargetWriter writer( 0, &mw );
InstructionQueue tq;
tq.add_target_calculator( &writer, err );
tq.run_instructions( &mesh_and_domain, err );
CHKERR(err);
qual_metric.set_weight_calculator( &reader );
}
else if (w == INV_METRIC) {
TargetWriter writer( 0, &imw );
InstructionQueue tq;
tq.add_target_calculator( &writer, err );
tq.run_instructions( &mesh_and_domain, err );
CHKERR(err);
qual_metric.set_weight_calculator( &reader );
}
InstructionQueue q;
q.set_master_quality_improver( &solver, err );
q.run_instructions( &mesh_and_domain, err );
CHKERR(err)
/*
vector<Mesh::VertexHandle> vemain.cpprts;
vector<MsqVertex> mesh_coords, expected_coords;
mesh.get_all_vertices( verts, err ); CHKERR(err)
mesh_coords.resize(verts.size());
mesh.vertices_get_coordinates( arrptr(verts), arrptr(mesh_coords), verts.size(), err ); CHKERR(err)
expected_mesh.get_all_vertices( verts, err ); CHKERR(err)
expected_coords.resize(verts.size());
expected_mesh.vertices_get_coordinates( arrptr(verts), arrptr(expected_coords), verts.size(), err ); CHKERR(err)
if (expected_coords.size() != mesh_coords.size()) {
cerr << "Invlid expected mesh. Vertex count doesn't match" << endl;
exit(1);
}
unsigned error_count = 0;
for (size_t i = 0; i < mesh_coords.size(); ++i)
if ((expected_coords[i] - mesh_coords[i]).length_squared() > epsilon*epsilon)
++error_count;
if (!error_count)
cout << filename << " : SUCCESS" << endl;
else
cout << filename << " : FAILURE (" << error_count
<< " vertices differ by more than " << epsilon << ")" << endl;
*/
if (write_results)
mesh.write_vtk( (filename + ".results.vtk").c_str(), err );
CHKERR(err)
}
示例5: main
int main( int argc, char* argv[] )
{
const double default_fraction = 0.05;
const double zero = 0.0;
int one = 1;
CLArgs::ToggleArg allow_invalid( false );
CLArgs::DoubleRangeArg rand_percent( default_fraction, &zero, 0 );
CLArgs::IntRangeArg unoptimize( 0, &one, 0 );
CLArgs args( "vtkrandom",
"Randomize mesh vertex locations.",
"Read VTK file, randomize locations of containded vertices, and re-write file." );
args.toggle_flag( INVALID_FLAG, "Allow inverted elements in output", &allow_invalid );
args.double_flag( PERCENT_FLAG, "fract", "Randomize fraction", &rand_percent );
args.int_flag( UNOPTIMIZE_FLAG, "N", "Use UnOptimizer with N passes rather than Randomize", &unoptimize );
add_domain_args( args );
args.add_required_arg( "input_file" );
args.add_required_arg( "output_file" );
std::vector<std::string> files;
if (!args.parse_options( argc, argv, files, std::cerr )) {
args.print_usage( std::cerr );
exit(1);
}
std::string input_file = files[0];
std::string output_file = files[1];
MsqError err;
MeshImpl mesh;
mesh.read_vtk( input_file.c_str(), err );
if (err) {
std::cerr << "ERROR READING FILE: " << input_file << std::endl
<< err << std::endl;
return 2;
}
MeshDomain* domain = process_domain_args( &mesh );
TerminationCriterion tc;
QualityAssessor qa( false );
InstructionQueue q;
Randomize op( rand_percent.value() );
IdealWeightInverseMeanRatio metric;
PMeanPTemplate of( 1, &metric );
UnOptimizer op2( &of );
if (unoptimize.seen()) {
tc.add_iteration_limit( unoptimize.value() );
op2.set_outer_termination_criterion( &tc );
q.add_preconditioner( &op, err );
q.set_master_quality_improver( &op2, err );
}
else {
q.set_master_quality_improver( &op, err );
}
q.add_quality_assessor( &qa, err );
q.run_instructions( &mesh, domain, err );
if (err) {
std::cerr << err << std::endl;
return 3;
}
int inverted, junk;
if (qa.get_inverted_element_count( inverted, junk, err ) && inverted ) {
if (allow_invalid.value())
std::cerr << "Warning: output mesh contains " << inverted << " inverted elements" << std::endl;
else {
std::cerr << "Error: output mesh contains " << inverted << " inverted elements" << std::endl;
return 4;
}
}
mesh.write_vtk( output_file.c_str(), err );
if (err) {
std::cerr << "ERROR WRITING FILE: " << output_file << std::endl
<< err << std::endl;
return 2;
}
return 0;
}