Mesh Oriented datABase  (version 5.4.1)
Array-based unstructured mesh datastructure
verdict.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Module:    $RCSfile: verdict.h,v $
00004 
00005   Copyright (c) 2006 Sandia Corporation.
00006   All rights reserved.
00007   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00008 
00009      This software is distributed WITHOUT ANY WARRANTY; without even
00010      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00011      PURPOSE.  See the above copyright notice for more information.
00012 
00013 =========================================================================*/
00014 
00015 /*! \file verdict.h
00016   \brief Header file for verdict library that calculates metrics for finite elements.
00017     Also see: \ref index "Main Page" 
00018  *
00019  * verdict.h is the header file for applications/libraries to include
00020  *           to compute quality metrics.
00021  *
00022  * This file is part of VERDICT
00023  *
00024 */
00025 
00026 /* note: changes to this file must be propagated to verdict.h.in so that 
00027    Verdict can be compiled using CMake and autoconf. */
00028 
00029 #ifndef VERDICT_INC_LIB
00030 #define VERDICT_INC_LIB
00031 
00032 #ifndef VERDICT_VERSION
00033 #define VERDICT_VERSION 120
00034 #endif
00035 
00036 #define VERDICT_DBL_MIN 1.0E-30
00037 #define VERDICT_DBL_MAX 1.0E+30
00038 #define VERDICT_PI      3.1415926535897932384626
00039 
00040 #ifdef __cplusplus
00041 #if defined( WIN32 ) && defined( VERDICT_SHARED_LIB )
00042 #ifdef verdict_EXPORTS
00043 #define C_FUNC_DEF extern "C" __declspec( dllexport )
00044 #else
00045 #define C_FUNC_DEF extern "C" __declspec( dllimport )
00046 #endif
00047 #else
00048 #define C_FUNC_DEF extern "C"
00049 #endif
00050 #else
00051 #if defined( WIN32 ) && defined( VERDICT_SHARED_LIB )
00052 #ifdef verdict_EXPORTS
00053 #define C_FUNC_DEF __declspec( dllexport )
00054 #else
00055 #define C_FUNC_DEF __declspec( dllimport )
00056 #endif
00057 #else
00058 #define C_FUNC_DEF
00059 #endif
00060 #endif
00061 
00062 /* typedef for the user if they want to use
00063  *    function pointers */
00064 #ifdef __cplusplus
00065 extern "C" {
00066 #endif
00067 typedef double ( *VerdictFunction )( int, double[][3] );
00068 typedef int ( *ComputeNormal )( double point[3], double normal[3] );
00069 #ifdef __cplusplus
00070 }
00071 #endif
00072 
00073 /** HexMetricVals is a <em>struct</em> used to return calculated metrics  
00074     when calling the function <em>v_hex_quality(...)</em> 
00075 
00076     HexMetricVals is used just as QuadMetricVals.
00077     For an example, see Detailed Description in QuadMetricVals  
00078 */
00079 struct HexMetricVals
00080 {
00081     /** \sa v_hex_edge_ratio */
00082     double edge_ratio;
00083     /** \sa v_hex_max_edge_ratio */
00084     double max_edge_ratio;
00085     /** \sa v_hex_skew */
00086     double skew;
00087     /** \sa v_hex_taper */
00088     double taper;
00089     /** \sa v_hex_volume */
00090     double volume;
00091     /** \sa v_hex_stretch */
00092     double stretch;
00093     /** \sa v_hex_diagonal */
00094     double diagonal;
00095     /** \sa v_hex_dimension */
00096     double dimension;
00097     /** \sa v_hex_oddy */
00098     double oddy;
00099     /** \sa v_hex_med_aspect_frobenius */
00100     double med_aspect_frobenius;
00101     /** \sa v_hex_condition */
00102     double condition;
00103     /** \sa v_hex_jacobian */
00104     double jacobian;
00105     /** \sa v_hex_scaled_jacobian */
00106     double scaled_jacobian;
00107     /** \sa v_hex_shear */
00108     double shear;
00109     /** \sa v_hex_shape */
00110     double shape;
00111     /** \sa v_hex_relative_size */
00112     double relative_size_squared;
00113     /** \sa v_hex_shape_and_size */
00114     double shape_and_size;
00115     /** \sa v_hex_shear_and_size */
00116     double shear_and_size;
00117     /** \sa v_hex_distortion */
00118     double distortion;
00119 };
00120 
00121 /** EdgeMetricVals is a <em>struct</em> used to return calculated metrics  
00122     when calling the function <em>v_edge_quality(...)</em> 
00123 
00124     EdgeMetricVals is used just as QuadMetricVals.
00125     For an example, see Detailed Description in QuadMetricVals  
00126 */
00127 struct EdgeMetricVals
00128 {
00129     double length;
00130 };
00131 
00132 /** KnifeMetricVals is a <em>struct</em> used to return calculated metrics  
00133     when calling the function <em>v_knife_quality(...)</em> 
00134 
00135     KnifeMetricVals is used just as QuadMetricVals.
00136     For an example, see Detailed Description in QuadMetricVals  
00137 */
00138 struct KnifeMetricVals
00139 {
00140     double volume;
00141 };
00142 
00143 /** QuadMetricVals is a <em>struct</em> used to return calculated metrics  
00144     when calling the function <em>v_quad_quality(...)</em> 
00145  
00146     The following is an example of how this struct is used with Verdict.
00147 
00148     Example: \code
00149     QuadMetricVals quad_metrics = {0};
00150     unsigned long metrics_flag = 0;
00151     metrics_flag += V_QUAD_SHAPE;
00152     metrics_flag += V_QUAD_DISTORTION;
00153     metrics_flag += V_QUAD_AREA;   
00154     double quad_nodes[4][3];
00155     get_quad_nodes( quad_nodes );  //some user-defined function to load 
00156                                    //xyz coordinate info. into array  
00157     v_quad_quality( 4, quad_nodes, metrics_flag, quad_metrics );
00158     double my_shape      = quad_metrics.shape; 
00159     double my_distortion = quad_metrics.distortion; 
00160     double my_area       = quad_metrics.area;  \endcode
00161      
00162  */
00163 
00164 struct QuadMetricVals
00165 {
00166     /** \sa v_quad_edge_ratio function */
00167     double edge_ratio;
00168     /** \sa v_quad_max_edge_ratio function */
00169     double max_edge_ratio;
00170     /** \sa v_quad_aspect_ratio function */
00171     double aspect_ratio;
00172     /** \sa v_quad_radius_ratio function */
00173     double radius_ratio;
00174     /** \sa v_quad_med_aspect_frobenius function */
00175     double med_aspect_frobenius;
00176     /** \sa v_quad_max_aspect_frobenius function */
00177     double max_aspect_frobenius;
00178     /** \sa v_quad_skew function */
00179     double skew;
00180     /** \sa v_quad_taper function */
00181     double taper;
00182     /** \sa v_quad_warpage function */
00183     double warpage;
00184     /** \sa v_quad_area function */
00185     double area;
00186     /** \sa v_quad_stretch function */
00187     double stretch;
00188     /** \sa v_quad_smallest_angle function */
00189     double minimum_angle;
00190     /** \sa v_quad_largest_angle function */
00191     double maximum_angle;
00192     /** \sa v_quad_oddy function */
00193     double oddy;
00194     /** \sa v_quad_condition function */
00195     double condition;
00196     /** \sa v_quad_jacobian function */
00197     double jacobian;
00198     /** \sa v_quad_scaled_jacobian function */
00199     double scaled_jacobian;
00200     /** \sa v_quad_shear function */
00201     double shear;
00202     /** \sa v_quad_shape function */
00203     double shape;
00204     /** \sa v_quad_relative_size_squared function */
00205     double relative_size_squared;
00206     /** \sa v_quad_shape_and_size function */
00207     double shape_and_size;
00208     /** \sa v_quad_shear_and_size function */
00209     double shear_and_size;
00210     /** \sa v_quad_distortion function */
00211     double distortion;
00212 };
00213 
00214 /** PyramidMetricVals is a <em>struct</em> used to return calculated metrics  
00215     when calling the function <em>v_pyramid_quality(...)</em> 
00216 
00217     PyramidMetricVals is used just as QuadMetricVals.
00218     For an example, see Detailed Description in QuadMetricVals  
00219 */
00220 struct PyramidMetricVals
00221 {
00222     double volume;
00223 };
00224 
00225 /** WedgeMetricVals is a <em>struct</em> used to return calculated metrics  
00226     when calling the function <em>v_wedge_quality(...)</em> 
00227 
00228     WedgeMetricVals is used just as QuadMetricVals.
00229     For an example, see Detailed Description in QuadMetricVals  
00230 */
00231 struct WedgeMetricVals
00232 {
00233     double volume;
00234 };
00235 
00236 /** TetMetricVals is a <em>struct</em> used to return calculated metrics  
00237     when calling the function <em>v_tet_quality(...)</em> 
00238 
00239     TetMetricVals is used just as QuadMetricVals.
00240     For an example, see Detailed Description in QuadMetricVals  
00241 */
00242 struct TetMetricVals
00243 {
00244     /** \sa v_tet_edge_ratio*/
00245     double edge_ratio;
00246     /** \sa v_tet_radius_ratio*/
00247     double radius_ratio;
00248     /** \sa v_tet_aspect_beta*/
00249     double aspect_beta;
00250     /** \sa v_tet_aspect_ratio */
00251     double aspect_ratio;
00252     /** \sa v_tet_aspect_gamma */
00253     double aspect_gamma;
00254     /** \sa v_tet_aspect_frobenius */
00255     double aspect_frobenius;
00256     /** \sa v_tet_minimum_angle */
00257     double minimum_angle;
00258     /** \sa v_tet_collapse_ratio*/
00259     double collapse_ratio;
00260     /** \sa v_tet_volume */
00261     double volume;
00262     /** \sa v_tet_condition */
00263     double condition;
00264     /** \sa v_tet_jacobian */
00265     double jacobian;
00266     /** \sa v_tet_scaled_jacobian */
00267     double scaled_jacobian;
00268     /** \sa v_tet_shape */
00269     double shape;
00270     /** \sa v_tet_relative_size */
00271     double relative_size_squared;
00272     /** \sa v_tet_shape_and_size*/
00273     double shape_and_size;
00274     /** \sa v_tet_distortion */
00275     double distortion;
00276 };
00277 
00278 /** TriMetricVals is a <em>struct</em> used to return calculated metrics  
00279     when calling the function <em>v_tri_quality(...)</em> 
00280 
00281     TriMetricVals is used just as QuadMetricVals.
00282     For an example, see Detailed Description in QuadMetricVals  
00283 */
00284 struct TriMetricVals
00285 {
00286     /** \sa v_tri_edge_ratio */
00287     double edge_ratio;
00288     /** \sa v_tri_aspect_ratio */
00289     double aspect_ratio;
00290     /** \sa v_tri_radius_ratio */
00291     double radius_ratio;
00292     /** \sa v_tri_aspect_frobenius */
00293     double aspect_frobenius;
00294     /** \sa v_tri_area*/
00295     double area;
00296     /** \sa v_tri_minimum_angle*/
00297     double minimum_angle;
00298     /** \sa v_tri_maximum_angle */
00299     double maximum_angle;
00300     /** \sa v_tri_condition */
00301     double condition;
00302     /** \sa v_tri_scaled_jacobian */
00303     double scaled_jacobian;
00304     /** \sa v_tri_shape */
00305     double shape;
00306     /** \sa v_tri_relative_size_squared */
00307     double relative_size_squared;
00308     /** \sa v_tri_shape_and_size */
00309     double shape_and_size;
00310     /** \sa v_tri_distortion */
00311     double distortion;
00312 };
00313 
00314 /* definition of bit fields to determine which metrics to calculate */
00315 
00316 //! \name Hex bit fields
00317 //!
00318 //@{
00319 
00320 #define V_HEX_MAX_EDGE_RATIO        1      /*!< \hideinitializer */
00321 #define V_HEX_SKEW                  2      /*!< \hideinitializer */
00322 #define V_HEX_TAPER                 4      /*!< \hideinitializer */
00323 #define V_HEX_VOLUME                8      /*!< \hideinitializer */
00324 #define V_HEX_STRETCH               16     /*!< \hideinitializer */
00325 #define V_HEX_DIAGONAL              32     /*!< \hideinitializer */
00326 #define V_HEX_DIMENSION             64     /*!< \hideinitializer */
00327 #define V_HEX_ODDY                  128    /*!< \hideinitializer */
00328 #define V_HEX_MAX_ASPECT_FROBENIUS  256    /*!< \hideinitializer */
00329 #define V_HEX_CONDITION             256    /*!< \hideinitializer */
00330 #define V_HEX_JACOBIAN              512    /*!< \hideinitializer */
00331 #define V_HEX_SCALED_JACOBIAN       1024   /*!< \hideinitializer */
00332 #define V_HEX_SHEAR                 2048   /*!< \hideinitializer */
00333 #define V_HEX_SHAPE                 4096   /*!< \hideinitializer */
00334 #define V_HEX_RELATIVE_SIZE_SQUARED 8192   /*!< \hideinitializer */
00335 #define V_HEX_SHAPE_AND_SIZE        16384  /*!< \hideinitializer */
00336 #define V_HEX_SHEAR_AND_SIZE        32768  /*!< \hideinitializer */
00337 #define V_HEX_DISTORTION            65536  /*!< \hideinitializer */
00338 #define V_HEX_EDGE_RATIO            131072 /*!< \hideinitializer */
00339 #define V_HEX_MED_ASPECT_FROBENIUS  262144 /*!< \hideinitializer */
00340 #define V_HEX_ALL                   524287 /*!< \hideinitializer */
00341 /*!< \hideinitializer */
00342 #define V_HEX_TRADITIONAL                                                                             \
00343     ( V_HEX_MAX_EDGE_RATIO + V_HEX_SKEW + V_HEX_TAPER + V_HEX_STRETCH + V_HEX_DIAGONAL + V_HEX_ODDY + \
00344       V_HEX_CONDITION + V_HEX_JACOBIAN + V_HEX_SCALED_JACOBIAN + V_HEX_DIMENSION )
00345 
00346 /*!< \hideinitializer */
00347 #define V_HEX_DIAGNOSTIC V_HEX_VOLUME
00348 /*!< \hideinitializer */
00349 #define V_HEX_ALGEBRAIC \
00350     ( V_HEX_SHAPE + V_HEX_SHEAR + V_HEX_RELATIVE_SIZE_SQUARED + V_HEX_SHAPE_AND_SIZE + V_HEX_SHEAR_AND_SIZE )
00351 /*!< \hideinitializer */
00352 #define V_HEX_ROBINSON ( V_HEX_SKEW + V_HEX_TAPER )
00353 //@}
00354 
00355 //! \name Tet bit fields
00356 //!
00357 //@{
00358 #define V_TET_RADIUS_RATIO          1     /*!< \hideinitializer */
00359 #define V_TET_ASPECT_BETA           2     /*!< \hideinitializer */
00360 #define V_TET_ASPECT_GAMMA          4     /*!< \hideinitializer */
00361 #define V_TET_VOLUME                8     /*!< \hideinitializer */
00362 #define V_TET_CONDITION             16    /*!< \hideinitializer */
00363 #define V_TET_JACOBIAN              32    /*!< \hideinitializer */
00364 #define V_TET_SCALED_JACOBIAN       64    /*!< \hideinitializer */
00365 #define V_TET_SHAPE                 128   /*!< \hideinitializer */
00366 #define V_TET_RELATIVE_SIZE_SQUARED 256   /*!< \hideinitializer */
00367 #define V_TET_SHAPE_AND_SIZE        512   /*!< \hideinitializer */
00368 #define V_TET_DISTORTION            1024  /*!< \hideinitializer */
00369 #define V_TET_EDGE_RATIO            2048  /*!< \hideinitializer */
00370 #define V_TET_ASPECT_RATIO          4096  /*!< \hideinitializer */
00371 #define V_TET_ASPECT_FROBENIUS      8192  /*!< \hideinitializer */
00372 #define V_TET_MINIMUM_ANGLE         16384 /*!< \hideinitializer */
00373 #define V_TET_COLLAPSE_RATIO        32768 /*!< \hideinitializer */
00374 #define V_TET_ALL                   65535 /*!< \hideinitializer */
00375 /*!< \hideinitializer */
00376 #define V_TET_TRADITIONAL \
00377     ( V_TET_ASPECT_BETA + V_TET_ASPECT_GAMMA + V_TET_CONDITION + V_TET_JACOBIAN + V_TET_SCALED_JACOBIAN )
00378 /*!< \hideinitializer */
00379 #define V_TET_DIAGNOSTIC V_TET_VOLUME
00380 /*!< \hideinitializer */
00381 #define V_TET_ALGEBRAIC ( V_TET_SHAPE + V_TET_RELATIVE_SIZE_SQUARED + V_TET_SHAPE_AND_SIZE )
00382 //@}
00383 
00384 //! \name Pyramid bit fields
00385 //!
00386 //@{
00387 #define V_PYRAMID_VOLUME 1 /*!< \hideinitializer */
00388 //@}
00389 
00390 //! \name Wedge bit fields
00391 //!
00392 //@{
00393 #define V_WEDGE_VOLUME 1 /*!< \hideinitializer */
00394 //@}
00395 
00396 //! \name Knife bit fields
00397 //!
00398 //@{
00399 #define V_KNIFE_VOLUME 1 /*!< \hideinitializer */
00400 //@}
00401 
00402 //! \name Quad bit fields
00403 //!
00404 //@{
00405 #define V_QUAD_MAX_EDGE_RATIO        1       /*!< \hideinitializer */
00406 #define V_QUAD_SKEW                  2       /*!< \hideinitializer */
00407 #define V_QUAD_TAPER                 4       /*!< \hideinitializer */
00408 #define V_QUAD_WARPAGE               8       /*!< \hideinitializer */
00409 #define V_QUAD_AREA                  16      /*!< \hideinitializer */
00410 #define V_QUAD_STRETCH               32      /*!< \hideinitializer */
00411 #define V_QUAD_MINIMUM_ANGLE         64      /*!< \hideinitializer */
00412 #define V_QUAD_MAXIMUM_ANGLE         128     /*!< \hideinitializer */
00413 #define V_QUAD_ODDY                  256     /*!< \hideinitializer */
00414 #define V_QUAD_CONDITION             512     /*!< \hideinitializer */
00415 #define V_QUAD_JACOBIAN              1024    /*!< \hideinitializer */
00416 #define V_QUAD_SCALED_JACOBIAN       2048    /*!< \hideinitializer */
00417 #define V_QUAD_SHEAR                 4096    /*!< \hideinitializer */
00418 #define V_QUAD_SHAPE                 8192    /*!< \hideinitializer */
00419 #define V_QUAD_RELATIVE_SIZE_SQUARED 16384   /*!< \hideinitializer */
00420 #define V_QUAD_SHAPE_AND_SIZE        32768   /*!< \hideinitializer */
00421 #define V_QUAD_SHEAR_AND_SIZE        65536   /*!< \hideinitializer */
00422 #define V_QUAD_DISTORTION            131072  /*!< \hideinitializer */
00423 #define V_QUAD_EDGE_RATIO            262144  /*!< \hideinitializer */
00424 #define V_QUAD_ASPECT_RATIO          524288  /*!< \hideinitializer */
00425 #define V_QUAD_RADIUS_RATIO          1048576 /*!< \hideinitializer */
00426 #define V_QUAD_MED_ASPECT_FROBENIUS  2097152 /*!< \hideinitializer */
00427 #define V_QUAD_MAX_ASPECT_FROBENIUS  4194304 /*!< \hideinitializer */
00428 #define V_QUAD_ALL                   8388607 /*!< \hideinitializer */
00429 /*!< \hideinitializer */
00430 #define V_QUAD_TRADITIONAL                                                                                          \
00431     ( V_QUAD_MAX_EDGE_RATIO + V_QUAD_SKEW + V_QUAD_TAPER + V_QUAD_WARPAGE + V_QUAD_STRETCH + V_QUAD_MINIMUM_ANGLE + \
00432       V_QUAD_MAXIMUM_ANGLE + V_QUAD_ODDY + V_QUAD_CONDITION + V_QUAD_JACOBIAN + V_QUAD_SCALED_JACOBIAN )
00433 /*!< \hideinitializer */
00434 #define V_QUAD_DIAGNOSTIC V_QUAD_AREA
00435 /*!< \hideinitializer */
00436 #define V_QUAD_ALGEBRAIC ( V_QUAD_SHEAR + V_QUAD_SHAPE + V_QUAD_RELATIVE_SIZE_SQUARED + V_QUAD_SHAPE_AND_SIZE )
00437 /*!< \hideinitializer */
00438 #define V_QUAD_ROBINSON ( V_QUAD_MAX_EDGE_RATIO + V_QUAD_SKEW + V_QUAD_TAPER )
00439 //@}
00440 
00441 //! \name Tri bit fields
00442 //!
00443 //@{
00444 #define V_TRI_ASPECT_FROBENIUS      1    /*!< \hideinitializer */
00445 #define V_TRI_AREA                  2    /*!< \hideinitializer */
00446 #define V_TRI_MINIMUM_ANGLE         4    /*!< \hideinitializer */
00447 #define V_TRI_MAXIMUM_ANGLE         8    /*!< \hideinitializer */
00448 #define V_TRI_CONDITION             16   /*!< \hideinitializer */
00449 #define V_TRI_SCALED_JACOBIAN       32   /*!< \hideinitializer */
00450 #define V_TRI_SHAPE                 64   /*!< \hideinitializer */
00451 #define V_TRI_RELATIVE_SIZE_SQUARED 128  /*!< \hideinitializer */
00452 #define V_TRI_SHAPE_AND_SIZE        256  /*!< \hideinitializer */
00453 #define V_TRI_DISTORTION            512  /*!< \hideinitializer */
00454 #define V_TRI_RADIUS_RATIO          1024 /*!< \hideinitializer */
00455 #define V_TRI_EDGE_RATIO            2048 /*!< \hideinitializer */
00456 #define V_TRI_ALL                   4095 /*!< \hideinitializer */
00457 /*!< \hideinitializer */
00458 #define V_TRI_TRADITIONAL \
00459     ( V_TRI_ASPECT_FROBENIUS + V_TRI_MINIMUM_ANGLE + V_TRI_MAXIMUM_ANGLE + V_TRI_CONDITION + V_TRI_SCALED_JACOBIAN )
00460 /*!< \hideinitializer */
00461 #define V_TRI_DIAGNOSTIC V_TRI_AREA
00462 /*!< \hideinitializer */
00463 #define V_TRI_ALGEBRAIC ( V_TRI_SHAPE + V_TRI_SHAPE_AND_SIZE + V_TRI_RELATIVE_SIZE_SQUARED )
00464 
00465 #define V_EDGE_LENGTH 1 /*!< \hideinitializer */
00466                         //@}
00467 
00468 /*! \mainpage
00469   Verdict is a library used to calculate metrics on the following type of elements:
00470 
00471     \li Hexahedra
00472     \li Tetrahedra
00473     \li Pryamid 
00474     \li Wedge 
00475     \li Knife 
00476     \li Quadrilateral
00477     \li Triangle
00478     \li Edge 
00479 
00480   Verdict calculates individual or multiple metrics on a single element.
00481   The v_*_quality(...) functions allow for efficient calculations of 
00482   multiple metrics on a single element.  Individual metrics may be 
00483   calculated on a single element as well. 
00484 
00485   \section jack Using Verdict
00486 
00487   The v_*_quality functions take the following parameters: 
00488 
00489   \param num_nodes Number of nodes in the element. 
00490   \param coordinates 2D array containing x,y,z coordinate data of the nodes.
00491   \param metrics_request_flag Bitfield to define which metrics to calculate.
00492   \param metric_vals Struct to hold the metric calculated values. 
00493 
00494   All other functions take these parameters below and return the calculated
00495   metric value.
00496 
00497   \param num_nodes Number of nodes in the element. 
00498   \param coordinates 2D array containing x,y,z coordinate data of the nodes.
00499 
00500   
00501   \par Setting the metrics_request_flag: 
00502   In order to use v_*_quality functions you must know how to set the bitfield argument 
00503   correctly.  To calculate aspect ratio, condition number, shape and shear metrics on a triangle, set
00504   the "metrics_request_flag" like so: 
00505 
00506   \code
00507   unsigned int metrics_request_flag = 0;
00508   metrics_request_flag += V_TRI_ASPECT_FROBENIUS;  
00509   metrics_request_flag += V_CONDITION;
00510   metrics_request_flag += V_SHAPE;
00511   metrics_request_flag += V_SHEAR;
00512   \endcode 
00513 
00514   The bitwise field can also be set for many metrics at once using #deinfed numbers.  V_HEX_ALL,
00515   V_HEX_DIAGNOSTIC, V_TRI_ALGEBRAIC are examples.
00516 
00517   Below is an example of how use Verdict's functions:
00518 
00519     
00520     Example: \code
00521     QuadMetricVals quad_metrics = {0};
00522     unsigned long metrics_flag = 0;
00523     metrics_flag += V_QUAD_SHAPE;
00524     metrics_flag += V_QUAD_DISTORTION;
00525     metrics_flag += V_QUAD_AREA;
00526     double quad_nodes[4][3];
00527  
00528     //node 1
00529     quad_node[0][0] = 0;  //x
00530     quad_node[0][1] = 0;  //y
00531     quad_node[0][2] = 0;  //z
00532 
00533     //node 2
00534     quad_node[1][0] = 1; 
00535     quad_node[1][1] = 0.1;
00536     quad_node[1][2] = 0.1;
00537 
00538     //node 3
00539     quad_node[2][0] = 0.9; 
00540     quad_node[2][1] = 0.9;
00541     quad_node[2][2] = -0.1;
00542 
00543     //node 4
00544     quad_node[3][0] = -0.05; 
00545     quad_node[3][1] = 1;
00546     quad_node[3][2] = 0;
00547 
00548     //calculate multiple metrics with one call
00549     v_quad_quality( 4, quad_nodes, metrics_flag, quad_metrics );
00550     double my_shape      = quad_metrics.shape; 
00551     double my_distortion = quad_metrics.distortion; 
00552     double my_area       = quad_metrics.area;  
00553   
00554     //calculate an individual metric 
00555     double my_relative_size = v_quad_relative_size( 4, quad_nodes );
00556     \endcode
00557 
00558 */
00559 
00560 //! Calculates quality metrics for hexahedral elements.
00561 C_FUNC_DEF void v_hex_quality( int num_nodes,
00562                                double coordinates[][3],
00563                                unsigned int metrics_request_flag,
00564                                struct HexMetricVals* metric_vals );
00565 
00566 //! Calculates quality metrics for tetrahedral elements.
00567 C_FUNC_DEF void v_tet_quality( int num_nodes,
00568                                double coordinates[][3],
00569                                unsigned int metrics_request_flag,
00570                                struct TetMetricVals* metric_vals );
00571 
00572 //! Calculates quality metrics for pyramid elements.
00573 C_FUNC_DEF void v_pyramid_quality( int num_nodes,
00574                                    double coordinates[][3],
00575                                    unsigned int metrics_request_flag,
00576                                    struct PyramidMetricVals* metric_vals );
00577 
00578 //! Calculates quality metrics for wedge elements.
00579 C_FUNC_DEF void v_wedge_quality( int num_nodes,
00580                                  double coordinates[][3],
00581                                  unsigned int metrics_request_flag,
00582                                  struct WedgeMetricVals* metric_vals );
00583 
00584 //! Calculates quality metrics for knife elements.
00585 C_FUNC_DEF void v_knife_quality( int num_nodes,
00586                                  double coordinates[][3],
00587                                  unsigned int metrics_request_flag,
00588                                  struct KnifeMetricVals* metric_vals );
00589 
00590 //! Calculates quality metrics for quadrilateral elements.
00591 C_FUNC_DEF void v_quad_quality( int num_nodes,
00592                                 double coordinates[][3],
00593                                 unsigned int metrics_request_flag,
00594                                 struct QuadMetricVals* metric_vals );
00595 
00596 //! Calculates quality metrics for triangle elements.
00597 C_FUNC_DEF void v_tri_quality( int num_nodes,
00598                                double coordinates[][3],
00599                                unsigned int metrics_request_flag,
00600                                struct TriMetricVals* metric_vals );
00601 
00602 //! Calculates quality metrics for edge elements.
00603 C_FUNC_DEF void v_edge_quality( int num_nodes,
00604                                 double coordinates[][3],
00605                                 unsigned int metrics_request_flag,
00606                                 struct EdgeMetricVals* metric_vals );
00607 
00608 /* individual quality functions for hex elements */
00609 
00610 //! Sets average size (volume) of hex, needed for v_hex_relative_size(...)
00611 C_FUNC_DEF void v_set_hex_size( double size );
00612 
00613 //! Calculates hex edge ratio metric.
00614 /**  Hmax / Hmin where Hmax and Hmin are respectively the maximum and the
00615          minimum edge lengths */
00616 C_FUNC_DEF double v_hex_edge_ratio( int num_nodes, double coordinates[][3] );
00617 
00618 //! Calculates hex maximum of edge ratio
00619 /**Maximum edge length ratio at hex center.
00620       Reference --- L.M. Taylor, and D.P. Flanagan, Pronto3D - A Three Dimensional Transient
00621          Solid Dynamics Program, SAND87-1912, Sandia National Laboratories, 1989. */
00622 C_FUNC_DEF double v_hex_max_edge_ratio( int num_nodes, double coordinates[][3] );
00623 
00624 //! Calculates hex skew metric.
00625 /** Maximum |cos A| where A is the angle between edges at hex center.   
00626       Reference --- L.M. Taylor, and D.P. Flanagan, Pronto3D - A Three Dimensional Transient
00627          Solid Dynamics Program, SAND87-1912, Sandia National Laboratories, 1989. */
00628 C_FUNC_DEF double v_hex_skew( int num_nodes, double coordinates[][3] );
00629 
00630 //! Calculates hex taper metric
00631 /**  Maximum ratio of lengths derived from opposite edges. 
00632       Reference --- L.M. Taylor, and D.P. Flanagan, Pronto3D - A Three Dimensional Transient
00633          Solid Dynamics Program, SAND87-1912, Sandia National Laboratories, 1989. */
00634 C_FUNC_DEF double v_hex_taper( int num_nodes, double coordinates[][3] );
00635 
00636 //! Calculates hex volume
00637 /**  Jacobian at hex center. 
00638       Reference --- L.M. Taylor, and D.P. Flanagan, Pronto3D - A Three Dimensional Transient
00639          Solid Dynamics Program, SAND87-1912, Sandia National Laboratories, 1989. */
00640 C_FUNC_DEF double v_hex_volume( int num_nodes, double coordinates[][3] );
00641 
00642 //! Calculates hex stretch metric
00643 /**  Sqrt(3) * minimum edge length / maximum diagonal length. 
00644       Reference --- FIMESH code */
00645 C_FUNC_DEF double v_hex_stretch( int num_nodes, double coordinates[][3] );
00646 
00647 //! Calculates hex diagonal metric
00648 /** Minimum diagonal length / maximum diagonal length. 
00649       Reference --- Unknown */
00650 C_FUNC_DEF double v_hex_diagonal( int num_nodes, double coordinates[][3] );
00651 
00652 //! Calculates hex dimension metric
00653 /** Pronto-specific characteristic length for stable time step calculation.  
00654         Char_length = Volume / 2 grad Volume. 
00655       Reference --- L.M. Taylor, and D.P. Flanagan, Pronto3D - A Three Dimensional Transient
00656          Solid Dynamics Program, SAND87-1912, Sandia National Laboratories, 1989. */
00657 C_FUNC_DEF double v_hex_dimension( int num_nodes, double coordinates[][3] );
00658 
00659 //! Calculates hex oddy metric
00660 C_FUNC_DEF double v_hex_oddy( int num_nodes, double coordinates[][3] );
00661 
00662 //! Calculates hex condition metric
00663 /** Average Frobenius condition number of the Jacobian matrix at 8 corners. */
00664 C_FUNC_DEF double v_hex_med_aspect_frobenius( int num_nodes, double coordinates[][3] );
00665 
00666 //! Calculates hex condition metric
00667 /** Maximum Frobenius condition number of the Jacobian matrix at 8 corners.
00668        Reference --- P. Knupp, Achieving Finite Element Mesh Quality via 
00669        Optimization of the Jacobian Matrix Norm and Associated Quantities, 
00670        Intl. J. Numer. Meth. Engng. 2000, 48:1165-1185. */
00671 C_FUNC_DEF double v_hex_max_aspect_frobenius( int num_nodes, double coordinates[][3] );
00672 C_FUNC_DEF double v_hex_condition( int num_nodes, double coordinates[][3] );
00673 
00674 //! Calculates hex jacobian metric
00675 /** Minimum pointwise volume of local map at 8 corners & center of hex. 
00676        Reference --- P. Knupp, Achieving Finite Element Mesh Quality via 
00677        Optimization of the Jacobian Matrix Norm and Associated Quantities, 
00678        Intl. J. Numer. Meth. Engng. 2000, 48:1165-1185. */
00679 C_FUNC_DEF double v_hex_jacobian( int num_nodes, double coordinates[][3] );
00680 
00681 //! Calculates hex scaled jacobian metric
00682 /** Minimum Jacobian divided by the lengths of the 3 edge vectors. 
00683        Reference --- P. Knupp, Achieving Finite Element Mesh Quality via 
00684        Optimization of the Jacobian Matrix Norm and Associated Quantities, 
00685        Intl. J. Numer. Meth. Engng. 2000, 48:1165-1185. */
00686 C_FUNC_DEF double v_hex_scaled_jacobian( int num_nodes, double coordinates[][3] );
00687 
00688 //! Calculates hex shear metric
00689 /** 3/Mean Ratio of Jacobian Skew matrix.
00690        Reference --- P. Knupp, Algebraic Mesh Quality Metrics for
00691        Unstructured Initial Meshes, submitted for publication.  */
00692 C_FUNC_DEF double v_hex_shear( int num_nodes, double coordinates[][3] );
00693 
00694 //! Calculates hex shape metric.
00695 /** 3/Mean Ratio of weighted Jacobian matrix. 
00696        Reference --- P. Knupp, Algebraic Mesh Quality Metrics for
00697        Unstructured Initial Meshes, submitted for publication.  */
00698 C_FUNC_DEF double v_hex_shape( int num_nodes, double coordinates[][3] );
00699 
00700 //! Calculates hex relative size metric.
00701 /** 3/Mean Ratio of weighted Jacobian matrix.
00702        Reference --- P. Knupp, Algebraic Mesh Quality Metrics for
00703        Unstructured Initial Meshes, submitted for publication.  */
00704 C_FUNC_DEF double v_hex_relative_size_squared( int num_nodes, double coordinates[][3] );
00705 
00706 //! Calculates hex shape-size metric.
00707 /** Product of Shape and Relative Size.
00708        Reference --- P. Knupp, Algebraic Mesh Quality Metrics for
00709        Unstructured Initial Meshes, submitted for publication.  */
00710 C_FUNC_DEF double v_hex_shape_and_size( int num_nodes, double coordinates[][3] );
00711 
00712 //! Calculates hex shear-size metric
00713 /** Product of Shear and Relative Size.
00714        Reference --- P. Knupp, Algebraic Mesh Quality Metrics for
00715        Unstructured Initial Meshes, submitted for publication.  */
00716 C_FUNC_DEF double v_hex_shear_and_size( int num_nodes, double coordinates[][3] );
00717 
00718 //! Calculates hex distortion metric
00719 /** {min(|J|)/actual volume}*parent volume, parent volume = 8 for hex.
00720        Reference --- SDRC/IDEAS Simulation: Finite Element Modeling--User's Guide */
00721 C_FUNC_DEF double v_hex_distortion( int num_nodes, double coordinates[][3] );
00722 
00723 /* individual quality functions for tet elements */
00724 
00725 //! Sets average size (volume) of tet, needed for v_tet_relative_size(...)
00726 C_FUNC_DEF void v_set_tet_size( double size );
00727 
00728 //! Calculates tet edge ratio metric.
00729 /**  Hmax / Hmin where Hmax and Hmin are respectively the maximum and the
00730        minimum edge lengths */
00731 C_FUNC_DEF double v_tet_edge_ratio( int num_nodes, double coordinates[][3] );
00732 
00733 //! Calculates tet radius ratio metric.
00734 /** CR / (3.0 * IR)  where CR = circumsphere radius, IR = inscribed sphere radius.
00735         Reference ---  V. N. Parthasarathy et al, A comparison of tetrahedron 
00736         quality measures, Finite Elem. Anal. Des., Vol 15(1993), 255-261. */
00737 C_FUNC_DEF double v_tet_radius_ratio( int num_nodes, double coordinates[][3] );
00738 
00739 //! Calculates the radius ratio metric of a positively oriented tet.
00740 /** CR / (3.0 * IR)  where CR = circumsphere radius, IR = inscribed sphere radius
00741         if the element is positively-oriented.
00742         Reference ---  V. N. Parthasarathy et al, A comparison of tetrahedron 
00743         quality measures, Finite Elem. Anal. Des., Vol 15(1993), 255-261. */
00744 C_FUNC_DEF double v_tet_aspect_beta( int num_nodes, double coordinates[][3] );
00745 
00746 //! Calculates tet aspect ratio metric.
00747 /**  Hmax / (2 sqrt(6) r) where Hmax and r respectively denote the greatest edge 
00748        length and the inradius of the tetrahedron
00749        Reference ---  P. Frey and P.-L. George, Meshing, Hermes (2000). */
00750 C_FUNC_DEF double v_tet_aspect_ratio( int num_nodes, double coordinates[][3] );
00751 
00752 //! Calculates tet aspect gamma metric.
00753 /**  Srms**3 / (8.479670*V) where Srms = sqrt(Sum(Si**2)/6), Si = edge length. 
00754        Reference ---  V. N. Parthasarathy et al, A comparison of tetrahedron 
00755        quality measures, Finite Elem. Anal. Des., Vol 15(1993), 255-261. */
00756 C_FUNC_DEF double v_tet_aspect_gamma( int num_nodes, double coordinates[][3] );
00757 
00758 //! Calculates tet aspect frobenius metric.
00759 /** Frobenius condition number when the reference element is regular
00760        Reference --- P. Knupp, Achieving Finite Element Mesh Quality via 
00761        Optimization of the Jacobian Matrix Norm and Associated Quantities,
00762        Intl. J. Numer. Meth. Engng. 2000, 48:1165-1185. */
00763 C_FUNC_DEF double v_tet_aspect_frobenius( int num_nodes, double coordinates[][3] );
00764 
00765 //! Calculates tet minimum dihedral angle.
00766 /** Minimum (nonoriented) dihedral angle of a tetrahedron, expressed in degrees. */
00767 C_FUNC_DEF double v_tet_minimum_angle( int num_nodes, double coordinates[][3] );
00768 
00769 //! Calculates tet collapse ratio metric.
00770 /**  Collapse ratio */
00771 C_FUNC_DEF double v_tet_collapse_ratio( int num_nodes, double coordinates[][3] );
00772 
00773 //! Calculates tet volume.
00774 /** (1/6) * Jacobian at corner node.
00775        Reference ---  V. N. Parthasarathy et al, A comparison of tetrahedron 
00776        quality measures, Finite Elem. Anal. Des., Vol 15(1993), 255-261. */
00777 C_FUNC_DEF double v_tet_volume( int num_nodes, double coordinates[][3] );
00778 
00779 //! Calculates tet condition metric.
00780 /** Condition number of the Jacobian matrix at any corner. 
00781        Reference --- P. Knupp, Achieving Finite Element Mesh Quality via 
00782        Optimization of the Jacobian Matrix Norm and Associated Quantities,
00783        Intl. J. Numer. Meth. Engng. 2000, 48:1165-1185. */
00784 C_FUNC_DEF double v_tet_condition( int num_nodes, double coordinates[][3] );
00785 
00786 //! Calculates tet jacobian.
00787 /** Minimum pointwise volume at any corner. 
00788        Reference --- P. Knupp, Achieving Finite Element Mesh Quality via 
00789        Optimization of the Jacobian Matrix Norm and Associated Quantities,
00790        Intl. J. Numer. Meth. Engng. 2000, 48:1165-1185. */
00791 C_FUNC_DEF double v_tet_jacobian( int num_nodes, double coordinates[][3] );
00792 
00793 //! Calculates tet scaled jacobian.
00794 /** Minimum Jacobian divided by the lengths of 3 edge vectors 
00795        Reference --- P. Knupp, Achieving Finite Element Mesh Quality via 
00796        Optimization of the Jacobian Matrix Norm and Associated Quantities,
00797        Intl. J. Numer. Meth. Engng. 2000, 48:1165-1185. */
00798 C_FUNC_DEF double v_tet_scaled_jacobian( int num_nodes, double coordinates[][3] );
00799 
00800 //! Calculates tet shape metric.
00801 /** 3/Mean Ratio of weighted Jacobian matrix.
00802        Reference --- P. Knupp, Algebraic Mesh Quality Metrics for
00803        Unstructured Initial Meshes, submitted for publication. */
00804 C_FUNC_DEF double v_tet_shape( int num_nodes, double coordinates[][3] );
00805 
00806 //! Calculates tet relative size metric.
00807 /** Min( J, 1/J ), where J is determinant of weighted Jacobian matrix.
00808        Reference --- P. Knupp, Algebraic Mesh Quality Metrics for
00809        Unstructured Initial Meshes, submitted for publication. */
00810 C_FUNC_DEF double v_tet_relative_size_squared( int num_nodes, double coordinates[][3] );
00811 
00812 //! Calculates tet shape-size metric.
00813 /** Product of Shape and Relative Size. 
00814        Reference --- P. Knupp, Algebraic Mesh Quality Metrics for
00815        Unstructured Initial Meshes, submitted for publication. */
00816 C_FUNC_DEF double v_tet_shape_and_size( int num_nodes, double coordinates[][3] );
00817 
00818 //! Calculates tet distortion metric.
00819 /** {min(|J|)/actual volume}*parent volume, parent volume = 1/6 for tet.
00820        Reference --- SDRC/IDEAS Simulation: Finite Element Modeling--User's Guide */
00821 C_FUNC_DEF double v_tet_distortion( int num_nodes, double coordinates[][3] );
00822 
00823 /* individual quality functions for pyramid elements */
00824 
00825 //! Calculates pyramid volume.
00826 C_FUNC_DEF double v_pyramid_volume( int num_nodes, double coordinates[][3] );
00827 
00828 /* individual quality functions for wedge elements */
00829 
00830 //! Calculates wedge volume.
00831 C_FUNC_DEF double v_wedge_volume( int num_nodes, double coordinates[][3] );
00832 
00833 /* individual quality functions for knife elements */
00834 
00835 //! Calculates knife volume.
00836 C_FUNC_DEF double v_knife_volume( int num_nodes, double coordinates[][3] );
00837 
00838 /* individual quality functions for edge elements */
00839 
00840 //! Calculates edge length.
00841 C_FUNC_DEF double v_edge_length( int num_nodes, double coordinates[][3] );
00842 
00843 /* individual quality functions for quad elements */
00844 //! Sets average size (area) of quad, needed for v_quad_relative_size(...)
00845 C_FUNC_DEF void v_set_quad_size( double size );
00846 
00847 //! Calculates quad edge ratio
00848 /** edge ratio
00849         Reference --- P. P. Pebay, Planar Quadrangle Quality
00850         Measures, Eng. Comp., 2004, 20(2):157-173 */
00851 C_FUNC_DEF double v_quad_edge_ratio( int num_nodes, double coordinates[][3] );
00852 
00853 //! Calculates quad maximum of edge ratio.
00854 /** Maximum edge length ratio at quad center.
00855        Reference --- J. Robinson, CRE Method of element testing and the 
00856        Jacobian shape parameters, Eng. Comput., Vol 4, 1987. */
00857 C_FUNC_DEF double v_quad_max_edge_ratio( int num_nodes, double coordinates[][3] );
00858 
00859 //! Calculates quad aspect ratio
00860 /** aspect ratio
00861         Reference --- P. P. Pebay, Planar Quadrangle Quality
00862         Measures, Eng. Comp., 2004, 20(2):157-173 */
00863 C_FUNC_DEF double v_quad_aspect_ratio( int num_nodes, double coordinates[][3] );
00864 
00865 //! Calculates quad radius ratio
00866 /** radius ratio
00867         Reference --- P. P. Pebay, Planar Quadrangle Quality
00868         Measures, Eng. Comp., 2004, 20(2):157-173 */
00869 C_FUNC_DEF double v_quad_radius_ratio( int num_nodes, double coordinates[][3] );
00870 
00871 //! Calculates quad average Frobenius aspect
00872 /** average Frobenius aspect
00873         Reference --- P. P. Pebay, Planar Quadrangle Quality
00874         Measures, Eng. Comp., 2004, 20(2):157-173 */
00875 C_FUNC_DEF double v_quad_med_aspect_frobenius( int num_nodes, double coordinates[][3] );
00876 
00877 //! Calculates quad maximum Frobenius aspect
00878 /** average Frobenius aspect
00879         Reference --- P. P. Pebay, Planar Quadrangle Quality
00880         Measures, Eng. Comp., 2004, 20(2):157-173 */
00881 C_FUNC_DEF double v_quad_max_aspect_frobenius( int num_nodes, double coordinates[][3] );
00882 
00883 //! Calculates quad skew metric.
00884 /** Maximum |cos A| where A is the angle between edges at quad center. 
00885        Reference --- J. Robinson, CRE Method of element testing and the 
00886        Jacobian shape parameters, Eng. Comput., Vol 4, 1987. */
00887 C_FUNC_DEF double v_quad_skew( int num_nodes, double coordinates[][3] );
00888 
00889 //! Calculates quad taper metric.
00890 /** Maximum ratio of lengths derived from opposite edges. 
00891        Reference --- J. Robinson, CRE Method of element testing and the 
00892        Jacobian shape parameters, Eng. Comput., Vol 4, 1987. */
00893 C_FUNC_DEF double v_quad_taper( int num_nodes, double coordinates[][3] );
00894 
00895 //! Calculates quad warpage metric.
00896 /** Cosine of Minimum Dihedral Angle formed by Planes Intersecting in Diagonals. 
00897        Reference --- J. Robinson, CRE Method of element testing and the 
00898        Jacobian shape parameters, Eng. Comput., Vol 4, 1987. */
00899 C_FUNC_DEF double v_quad_warpage( int num_nodes, double coordinates[][3] );
00900 
00901 //! Calculates quad area.
00902 /** Jacobian at quad center.
00903        Reference --- J. Robinson, CRE Method of element testing and the 
00904        Jacobian shape parameters, Eng. Comput., Vol 4, 1987. */
00905 C_FUNC_DEF double v_quad_area( int num_nodes, double coordinates[][3] );
00906 
00907 //! Calculates quad strech metric.
00908 /** Sqrt(2) * minimum edge length / maximum diagonal length.
00909        Reference --- FIMESH code. */
00910 C_FUNC_DEF double v_quad_stretch( int num_nodes, double coordinates[][3] );
00911 
00912 //! Calculates quad's smallest angle.
00913 /** Smallest included quad angle (degrees).
00914        Reference --- Unknown. */
00915 C_FUNC_DEF double v_quad_minimum_angle( int num_nodes, double coordinates[][3] );
00916 
00917 //! Calculates quad's largest angle.
00918 /** Largest included quad angle (degrees). 
00919        Reference --- Unknown. */
00920 C_FUNC_DEF double v_quad_maximum_angle( int num_nodes, double coordinates[][3] );
00921 
00922 //! Calculates quad oddy metric.
00923 C_FUNC_DEF double v_quad_oddy( int num_nodes, double coordinates[][3] );
00924 
00925 //! Calculates quad condition number metric.
00926 /** Maximum condition number of the Jacobian matrix at 4 corners.
00927        Reference --- P. Knupp, Achieving Finite Element Mesh Quality via 
00928        Optimization of the Jacobian Matrix Norm and Associated Quantities,
00929        Intl. J. Numer. Meth. Engng. 2000, 48:1165-1185. */
00930 C_FUNC_DEF double v_quad_condition( int num_nodes, double coordinates[][3] );
00931 
00932 //! Calculates quad jacobian.
00933 /** Minimum pointwise volume of local map at 4 corners & center of quad. 
00934        Reference --- P. Knupp, Achieving Finite Element Mesh Quality via 
00935        Optimization of the Jacobian Matrix Norm and Associated Quantities,
00936        Intl. J. Numer. Meth. Engng. 2000, 48:1165-1185. */
00937 C_FUNC_DEF double v_quad_jacobian( int num_nodes, double coordinates[][3] );
00938 
00939 //! Calculates quad scaled jacobian.
00940 /** Minimum Jacobian divided by the lengths of the 2 edge vectors. 
00941        Reference --- P. Knupp, Achieving Finite Element Mesh Quality via 
00942        Optimization of the Jacobian Matrix Norm and Associated Quantities,
00943        Intl. J. Numer. Meth. Engng. 2000, 48:1165-1185. */
00944 C_FUNC_DEF double v_quad_scaled_jacobian( int num_nodes, double coordinates[][3] );
00945 
00946 //! Calculates quad shear metric.
00947 /** 2/Condition number of Jacobian Skew matrix.
00948        Reference --- P. Knupp, Algebraic Mesh Quality Metrics for
00949        Unstructured Initial Meshes, submitted for publication. */
00950 C_FUNC_DEF double v_quad_shear( int num_nodes, double coordinates[][3] );
00951 
00952 //! Calculates quad shape metric.
00953 /** 2/Condition number of weighted Jacobian matrix. 
00954        Reference --- P. Knupp, Algebraic Mesh Quality Metrics for
00955        Unstructured Initial Meshes, submitted for publication. */
00956 C_FUNC_DEF double v_quad_shape( int num_nodes, double coordinates[][3] );
00957 
00958 //! Calculates quad relative size metric.
00959 /** Min( J, 1/J ), where J is determinant of weighted Jacobian matrix. 
00960        Reference --- P. Knupp, Algebraic Mesh Quality Metrics for
00961        Unstructured Initial Meshes, submitted for publication. */
00962 C_FUNC_DEF double v_quad_relative_size_squared( int num_nodes, double coordinates[][3] );
00963 
00964 //! Calculates quad shape-size metric.
00965 /** Product of Shape and Relative Size. 
00966        Reference --- P. Knupp, Algebraic Mesh Quality Metrics for
00967        Unstructured Initial Meshes, submitted for publication. */
00968 C_FUNC_DEF double v_quad_shape_and_size( int num_nodes, double coordinates[][3] );
00969 
00970 //! Calculates quad shear-size metric.
00971 /** Product of Shear and Relative Size. 
00972        Reference --- P. Knupp, Algebraic Mesh Quality Metrics for
00973        Unstructured Initial Meshes, submitted for publication. */
00974 C_FUNC_DEF double v_quad_shear_and_size( int num_nodes, double coordinates[][3] );
00975 
00976 //! Calculates quad distortion metric.
00977 /** {min(|J|)/actual area}*parent area, parent area = 4 for quad.
00978        Reference --- SDRC/IDEAS Simulation: Finite Element Modeling--User's Guide */
00979 C_FUNC_DEF double v_quad_distortion( int num_nodes, double coordinates[][3] );
00980 
00981 /* individual quality functions for tri elements */
00982 
00983 //! Sets average size (area) of tri, needed for v_tri_relative_size(...)
00984 C_FUNC_DEF void v_set_tri_size( double size );
00985 
00986 //! Sets fuction pointer to calculate tri normal wrt surface
00987 C_FUNC_DEF void v_set_tri_normal_func( ComputeNormal func );
00988 
00989 //! Calculates tri metric.
00990 /** edge ratio
00991         Reference --- P. P. Pebay & T. J. Baker, Analysis of Triangle Quality
00992         Measures, AMS Math. Comp., 2003, 72(244):1817-1839 */
00993 C_FUNC_DEF double v_tri_edge_ratio( int num_nodes, double coordinates[][3] );
00994 
00995 //! Calculates tri metric.
00996 /** aspect ratio
00997         Reference --- P. P. Pebay & T. J. Baker, Analysis of Triangle Quality
00998         Measures, AMS Math. Comp., 2003, 72(244):1817-1839 */
00999 C_FUNC_DEF double v_tri_aspect_ratio( int num_nodes, double coordinates[][3] );
01000 
01001 //! Calculates tri metric.
01002 /** radius ratio
01003         Reference --- P. P. Pebay & T. J. Baker, Analysis of Triangle Quality
01004         Measures, AMS Math. Comp., 2003, 72(244):1817-1839 */
01005 C_FUNC_DEF double v_tri_radius_ratio( int num_nodes, double coordinates[][3] );
01006 
01007 //! Calculates tri metric.
01008 /** Frobenius aspect */
01009 C_FUNC_DEF double v_tri_aspect_frobenius( int num_nodes, double coordinates[][3] );
01010 
01011 //! Calculates tri metric.
01012 /** Maximum included angle in triangle */
01013 C_FUNC_DEF double v_tri_area( int num_nodes, double coordinates[][3] );
01014 
01015 //! Calculates tri metric.
01016 /** Minimum included angle in triangle */
01017 C_FUNC_DEF double v_tri_minimum_angle( int num_nodes, double coordinates[][3] );
01018 
01019 //! Calculates tri metric.
01020 /** Maximum included angle in triangle */
01021 C_FUNC_DEF double v_tri_maximum_angle( int num_nodes, double coordinates[][3] );
01022 
01023 //! Calculates tri metric.
01024 /** Condition number of the Jacobian matrix.
01025        Reference --- P. Knupp, Achieving Finite Element Mesh Quality via 
01026        Optimization of the Jacobian Matrix Norm and Associated Quantities,
01027        Intl. J. Numer. Meth. Engng. 2000, 48:1165-1185. */
01028 C_FUNC_DEF double v_tri_condition( int num_nodes, double coordinates[][3] );
01029 
01030 //! Calculates tri metric.
01031 /** Minimum Jacobian divided by the lengths of 2 edge vectors. 
01032        Reference --- P. Knupp, Achieving Finite Element Mesh Quality via 
01033        Optimization of the Jacobian Matrix Norm and Associated Quantities,
01034        Intl. J. Numer. Meth. Engng. 2000, 48:1165-1185. */
01035 C_FUNC_DEF double v_tri_scaled_jacobian( int num_nodes, double coordinates[][3] );
01036 
01037 //! Calculates tri metric.
01038 /** Min( J, 1/J ), where J is determinant of weighted Jacobian matrix. 
01039        Reference ---  P. Knupp, Algebraic Mesh Quality Metrics for
01040        Unstructured Initial Meshes, submitted for publication. */
01041 C_FUNC_DEF double v_tri_relative_size_squared( int num_nodes, double coordinates[][3] );
01042 
01043 //! Calculates tri metric.
01044 /** 2/Condition number of weighted Jacobian matrix. 
01045        Reference ---  P. Knupp, Algebraic Mesh Quality Metrics for
01046        Unstructured Initial Meshes, submitted for publication. */
01047 C_FUNC_DEF double v_tri_shape( int num_nodes, double coordinates[][3] );
01048 
01049 //! Calculates tri metric.
01050 /**  Product of Shape and Relative Size. 
01051        Reference ---  P. Knupp, Algebraic Mesh Quality Metrics for
01052        Unstructured Initial Meshes, submitted for publication. */
01053 C_FUNC_DEF double v_tri_shape_and_size( int num_nodes, double coordinates[][3] );
01054 
01055 //! Calculates tri metric.
01056 /** {min(|J|)/actual area}*parent area, parent area = 1/2 for triangular element. 
01057        Reference --- SDRC/IDEAS Simulation: Finite Element Modeling--User's Guide */
01058 C_FUNC_DEF double v_tri_distortion( int num_nodes, double coordinates[][3] );
01059 
01060 #endif /* VERDICT_INC_LIB */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines