1 #include "CLArgs.hpp"
2 #include "QualityAssessor.hpp"
3 #include "IdealWeightInverseMeanRatio.hpp"
4 #include "SizeMetric.hpp"
5 #include "TQualityMetric.hpp"
6 #include "IdealShapeTarget.hpp"
7 #include "TShapeNB1.hpp"
8 #include "InstructionQueue.hpp"
9 #include "MsqError.hpp"
10 #include "MeshImpl.hpp"
11 //#include "QuadLagrangeShape.hpp"
12 //#include "TetLagrangeShape.hpp"
13 //#include "TriLagrangeShape.hpp"
14 #include "ElementMaxQM.hpp"
15 #include "domain.hpp"
16
17 using namespace MBMesquite;
18
19 #include <vector>
20 #include <algorithm>
21
main(int argc,char * argv[])22 int main( int argc, char* argv[] )
23 {
24 int two;
25 CLArgs::ToggleArg freeonly;
26 CLArgs::IntRangeArg histogram( &two );
27 CLArgs args( "msqquality", "Assess mesh quality",
28 "Caculate various quality metrics for a mesh,"
29 "and optinally export a VTK file for which quality "
30 "values are stored as attribute data." );
31 args.int_flag( 'H', "ints", "Print histograms with specified number of intervals", &histogram );
32 args.toggle_flag( 'f', "Assess quality only for elements with at least one free vertex", &freeonly );
33 args.add_required_arg( "input_file" );
34 args.add_optional_arg( "output_file" );
35 add_domain_args( args );
36 std::vector<std::string> files;
37 if (!args.parse_options( argc, argv, files, std::cerr )) {
38 args.print_usage( std::cerr );
39 return 1;
40 }
41
42 MsqError err;
43 MeshImpl mesh;
44 mesh.read_vtk( files.front().c_str(), err );
45 if (err) {
46 std::cerr << err << std::endl
47 << "Failed to read file: " << files.front() << std::endl;
48 return 2;
49 }
50
51 MeshDomain* domain = process_domain_args( &mesh );
52
53 QualityAssessor qa( true, freeonly.value(), "INVERTED" );
54 IdealWeightInverseMeanRatio imr;
55 SizeMetric size;
56 IdealShapeTarget tc;
57 TShapeNB1 tm;
58 TQualityMetric tmp( &tc, &tm );
59 ElementMaxQM max_tmp( &tmp );
60
61 int intervals = histogram.seen() ? histogram.value() : 0;
62 qa.add_quality_assessment( &imr, intervals, 0.0, "InverseMeanRatio" );
63 qa.add_quality_assessment( &size, intervals, 0.0, "Size" );
64 qa.add_quality_assessment( &max_tmp, intervals, 0.0, "TMP_Shape" );
65 qa.tag_fixed_elements( "FIXED_ELEMS" );
66
67 // QuadLagrangeShape quad;
68 // TriLagrangeShape tri;
69 // TetLagrangeShape tet;
70 InstructionQueue q;
71 // q.set_mapping_function( &quad );
72 // q.set_mapping_function( &tri );
73 // q.set_mapping_function( &tet );
74
75 q.add_quality_assessor( &qa, err );
76 MeshDomainAssoc mesh_and_domain = MeshDomainAssoc(&mesh, domain);
77 q.run_instructions( &mesh_and_domain, err );
78 delete domain;
79 if (err) {
80 std::cerr << err << std::endl;
81 return 3;
82 }
83
84 if (files.size() > 1) {
85 mesh.write_vtk( files[1].c_str(), err );
86 if (err) {
87 std::cerr << err << std::endl
88 << "Failed to write file: " << files[1] << std::endl;
89 return 2;
90 }
91 }
92
93 return 0;
94 }
95