1 /*
2 * VerdictWrapper.hpp
3 *
4 * Created on: Nov 18, 2014
5 * Author: iulian
6 */
7
8 #ifndef SRC_VERDICT_MOAB_VERDICTWRAPPER_HPP_
9 #define SRC_VERDICT_MOAB_VERDICTWRAPPER_HPP_
10
11 #include <map>
12
13 namespace moab
14 {
15
16 class Interface;
17
18 enum QualityType
19 {
20 // order exactly from HexMetricVals
21 MB_UNDEFINED_QUALITY = -1,
22 MB_EDGE_RATIO = 0, // 0 MBHEX, MBTET, MBQUAD, MBTRI
23 MB_MAX_EDGE_RATIO, // 1 MBHEX, MBQUAD
24 MB_SKEW, // 2 MBHEX, MBQUAD
25 MB_TAPER, // 3 MBHEX, MBQUAD
26 MB_VOLUME, // 4 MBHEX, MBTET, MBPRISM, MBKNIFE
27 MB_STRETCH, // 5 MBHEX, MBQUAD
28 MB_DIAGONAL, // 6 MBHEX,
29 MB_DIMENSION, // 7 MBHEX,
30 MB_ODDY, // 8 MBHEX, MBQUAD
31 MB_MED_ASPECT_FROBENIUS, // 9 MBHEX, MBQUAD
32 MB_MAX_ASPECT_FROBENIUS, // 10 MBHEX, MBTET (aspect_frobenius) MBQUAD, MBTRI
33 // (aspect_frobenius)
34 MB_CONDITION, // 11 MBHEX, MBTET, MBQUAD, MBTRI
35 MB_JACOBIAN, // 12 MBHEX, MBTET, MBQUAD
36 MB_SCALED_JACOBIAN, // 13 MBHEX, MBTET, MBQUAD, MBTRI
37 MB_SHEAR, // 14 MBHEX, MBQUAD, MBTRI
38 MB_SHAPE, // 15 MBHEX, MBTET, MBQUAD, MBTRI
39 MB_RELATIVE_SIZE_SQUARED, // 16 MBHEX, MBTET, MBQUAD, MBTRI
40 MB_SHAPE_AND_SIZE, // 17 MBHEX, MBTET, MBQUAD
41 MB_SHEAR_AND_SIZE, // 18 MBHEX, MBQUAD
42 MB_DISTORTION, // 19 MBHEX, MBTET, MBQUAD
43 // length for edge:
44 MB_LENGTH, // 20 only for MBEDGE
45 // specific to tets
46 MB_RADIUS_RATIO, // 21 MBTET, MBQUAD, MBTRI
47 MB_ASPECT_BETA, // 22 MBTET
48 MB_ASPECT_RATIO, // 23 MBTET, MBQUAD, MBTRI
49 MB_ASPECT_GAMMA, // 24 MBTET
50 MB_MINIMUM_ANGLE, // 25 MBTET, MBQUAD, MBTRI
51 MB_COLLAPSE_RATIO, // 26 MBTET
52 // specific to quads
53 MB_WARPAGE, // 27 MBQUAD
54 MB_AREA, // 28 MBQUAD, MBTRI
55 MB_MAXIMUM_ANGLE, // 29 MBQUAD, MBTRI
56 MB_QUALITY_COUNT // used to size the arrays
57
58 };
59
60 inline std::string QualityType_ToString( QualityType qtype )
61 {
62 switch( qtype )
63 {
64 case MB_UNDEFINED_QUALITY:
65 return "MB_UNDEFINED_QUALITY";
66 case MB_EDGE_RATIO:
67 return "MB_EDGE_RATIO";
68 case MB_MAX_EDGE_RATIO:
69 return "MB_MAX_EDGE_RATIO";
70 case MB_SKEW:
71 return "MB_SKEW";
72 case MB_TAPER:
73 return "MB_TAPER";
74 case MB_VOLUME:
75 return "MB_VOLUME";
76 case MB_STRETCH:
77 return "MB_STRETCH";
78 case MB_DIAGONAL:
79 return "MB_DIAGONAL";
80 case MB_DIMENSION:
81 return "MB_DIMENSION";
82 case MB_ODDY:
83 return "MB_ODDY";
84 case MB_MED_ASPECT_FROBENIUS:
85 return "MB_MED_ASPECT_FROBENIUS";
86 case MB_MAX_ASPECT_FROBENIUS:
87 return "MB_MAX_ASPECT_FROBENIUS";
88 case MB_CONDITION:
89 return "MB_CONDITION";
90 case MB_JACOBIAN:
91 return "MB_JACOBIAN";
92 case MB_SCALED_JACOBIAN:
93 return "MB_SCALED_JACOBIAN";
94 case MB_SHEAR:
95 return "MB_SHEAR";
96 case MB_SHAPE:
97 return "MB_SHAPE";
98 case MB_RELATIVE_SIZE_SQUARED:
99 return "MB_RELATIVE_SIZE_SQUARED";
100 case MB_SHAPE_AND_SIZE:
101 return "MB_SHAPE_AND_SIZE";
102 case MB_SHEAR_AND_SIZE:
103 return "MB_SHEAR_AND_SIZE";
104 case MB_DISTORTION:
105 return "MB_DISTORTION";
106 case MB_LENGTH:
107 return "MB_LENGTH";
108 case MB_RADIUS_RATIO:
109 return "MB_RADIUS_RATIO";
110 case MB_ASPECT_BETA:
111 return "MB_ASPECT_BETA";
112 case MB_ASPECT_RATIO:
113 return "MB_ASPECT_RATIO";
114 case MB_ASPECT_GAMMA:
115 return "MB_ASPECT_GAMMA";
116 case MB_MINIMUM_ANGLE:
117 return "MB_MINIMUM_ANGLE";
118 case MB_COLLAPSE_RATIO:
119 return "MB_COLLAPSE_RATIO";
120 case MB_WARPAGE:
121 return "MB_WARPAGE";
122 case MB_AREA:
123 return "MB_AREA";
124 case MB_MAXIMUM_ANGLE:
125 return "MB_MAXIMUM_ANGLE";
126 default:
127 return "MB_QUALITY_COUNT";
128 }
129 }
130
131 class VerdictWrapper
132 {
133 public:
134 VerdictWrapper( Interface* mb );
135 virtual ~VerdictWrapper();
136 //! return a quality for an entity
137 /** compute the quality for an element; the coordinates and number of nodes can be passed
138 * if available
139 \param eh element entity handle.
140 \param q quality requested
141 \param quality output
142 \param num_nodes optional, number of vertices
143 \param coords options, interleaved coordinates
144 return MB_SUCCESS
145 Example: \code
146 EntityHandle hex;
147 double jac;
148 rval = quality_measure(hex, MB_JACOBIAN, jac); \endcode
149 */
150 ErrorCode quality_measure( EntityHandle eh,
151 QualityType q,
152 double& quality,
153 int num_nodes = 0,
154 EntityType etype = MBMAXTYPE,
155 double* coords = NULL );
156 //! return a quality name
157 /** return quality name (convert an enum QualityType to a string)
158 \param q quality type
159 return string
160 Example: \code
161
162 const char * name = quality_name(MB_JACOBIAN); \endcode
163 */
164 const char* quality_name( QualityType q );
165 //! return a string with entity type name
166 const char* entity_type_name( EntityType etype );
167 //! return an int with total available qualities for type
168 int num_qualities( EntityType etype );
169 //! return true if quality possible
170 int possible_quality( EntityType et, QualityType q );
171 // relative size needs a base size, that is set at global level, one for each major type (hex,
172 // tet, quad, tri)
173 ErrorCode set_size( double size );
174 //! return all qualities for an element
175 /** compute all qualities for an element
176 \param eh element entity handle.
177 \param qs list of QualityType
178 \param qualities list of qualities
179 return MB_SUCCESS
180 Example: \code
181 EntityHandle hex;
182 std::vector<QualityType> qs;
183 std::vector<double> qualities;
184 all_quality_measures(hex, qs, qualities); \endcode
185 */
186 ErrorCode all_quality_measures( EntityHandle eh, std::map< QualityType, double >& qualities );
187
188 private:
189 Interface* mbImpl;
190 };
191 } // namespace moab
192 #endif /* SRC_VERDICT_MOAB_VERDICTWRAPPER_HPP_ */