本文整理汇总了C++中TerminationCriterion::add_absolute_vertex_movement方法的典型用法代码示例。如果您正苦于以下问题:C++ TerminationCriterion::add_absolute_vertex_movement方法的具体用法?C++ TerminationCriterion::add_absolute_vertex_movement怎么用?C++ TerminationCriterion::add_absolute_vertex_movement使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类TerminationCriterion
的用法示例。
在下文中一共展示了TerminationCriterion::add_absolute_vertex_movement方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: test_vertex_movement_common
void TerminationCriterionTest::test_vertex_movement_common( bool absolute )
{
MsqPrintError err(std::cout);
PatchData pd;
create_twelve_hex_patch( pd, err );
ASSERT_NO_ERROR(err);
const double LIMIT = 1e-4;
TerminationCriterion tc;
if (absolute)
tc.add_absolute_vertex_movement( LIMIT );
else
tc.add_relative_vertex_movement( LIMIT );
tc.reset_inner( pd, ofEval, err );
ASSERT_NO_ERROR(err);
tc.reset_patch( pd, err );
ASSERT_NO_ERROR(err);
CPPUNIT_ASSERT(!tc.terminate());
const double FIRST_STEP=10.0;
// move a vertex by 10 units and check that it did not meet criterion
pd.move_vertex( Vector3D(FIRST_STEP,0,0), 0, 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());
double test_limit = LIMIT;
if (!absolute)
test_limit *= FIRST_STEP;
int idx = 0;
for (double step = FIRST_STEP; step > test_limit; step *= 0.09) {
idx = (idx + 1) % pd.num_free_vertices();
pd.move_vertex( Vector3D(step,0,0), 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());
}
idx = (idx + 1) % pd.num_free_vertices();
pd.move_vertex( Vector3D(0.5*test_limit,0,0), 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());
}
示例2: 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;
}
示例3: 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)
}