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