![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /*=========================================================================
00002
00003 Module: $RCSfile: V_PyramidMetric.cpp,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 /*
00016 *
00017 * PyramidMetrics.cpp contains quality calculations for Pyramids
00018 *
00019 * This file is part of VERDICT
00020 *
00021 */
00022
00023 #define VERDICT_EXPORTS
00024
00025 #include "moab/verdict.h"
00026 #include "VerdictVector.hpp"
00027 #include
00028
00029 /*
00030 the pyramid element
00031
00032 5
00033 ^
00034 |\
00035 /| \\_
00036 | \ \
00037 | | \_ \_
00038 / \/4\ \
00039 | /| \ \_
00040 | / \ \ \
00041 / | \
00042 1 \_ | _/3
00043 \_ \ _/
00044 \_ | _/
00045 \_/
00046 2
00047
00048 a quadrilateral base and a pointy peak like a pyramid
00049
00050 */
00051
00052 /*!
00053 the volume of a pyramid
00054
00055 the volume is calculated by dividing the pyramid into
00056 2 tets and summing the volumes of the 2 tets.
00057 */
00058
00059 C_FUNC_DEF double v_pyramid_volume( int num_nodes, double coordinates[][3] )
00060 {
00061
00062 double volume = 0;
00063 VerdictVector side1, side2, side3;
00064
00065 if( num_nodes == 5 )
00066 {
00067 // divide the pyramid into 2 tets and calculate each
00068
00069 side1.set( coordinates[1][0] - coordinates[0][0], coordinates[1][1] - coordinates[0][1],
00070 coordinates[1][2] - coordinates[0][2] );
00071
00072 side2.set( coordinates[3][0] - coordinates[0][0], coordinates[3][1] - coordinates[0][1],
00073 coordinates[3][2] - coordinates[0][2] );
00074
00075 side3.set( coordinates[4][0] - coordinates[0][0], coordinates[4][1] - coordinates[0][1],
00076 coordinates[4][2] - coordinates[0][2] );
00077
00078 // volume of the first tet
00079 volume = ( side3 % ( side1 * side2 ) ) / 6.0;
00080
00081 side1.set( coordinates[3][0] - coordinates[2][0], coordinates[3][1] - coordinates[2][1],
00082 coordinates[3][2] - coordinates[2][2] );
00083
00084 side2.set( coordinates[1][0] - coordinates[2][0], coordinates[1][1] - coordinates[2][1],
00085 coordinates[1][2] - coordinates[2][2] );
00086
00087 side3.set( coordinates[4][0] - coordinates[2][0], coordinates[4][1] - coordinates[2][1],
00088 coordinates[4][2] - coordinates[2][2] );
00089
00090 // volume of the second tet
00091 volume += ( side3 % ( side1 * side2 ) ) / 6.0;
00092 }
00093 return (double)volume;
00094 }
00095
00096 C_FUNC_DEF void v_pyramid_quality( int num_nodes,
00097 double coordinates[][3],
00098 unsigned int metrics_request_flag,
00099 PyramidMetricVals* metric_vals )
00100 {
00101 memset( metric_vals, 0, sizeof( PyramidMetricVals ) );
00102
00103 if( metrics_request_flag & V_PYRAMID_VOLUME ) metric_vals->volume = v_pyramid_volume( num_nodes, coordinates );
00104 }