Branch data Line data Source code
1 : : /*=========================================================================
2 : :
3 : : Module: $RCSfile: V_WedgeMetric.cpp,v $
4 : :
5 : : Copyright (c) 2006 Sandia Corporation.
6 : : All rights reserved.
7 : : See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
8 : :
9 : : This software is distributed WITHOUT ANY WARRANTY; without even
10 : : the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 : : PURPOSE. See the above copyright notice for more information.
12 : :
13 : : =========================================================================*/
14 : :
15 : : /*
16 : : *
17 : : * WedgeMetric.cpp contains quality calculations for wedges
18 : : *
19 : : * This file is part of VERDICT
20 : : *
21 : : */
22 : :
23 : : #define VERDICT_EXPORTS
24 : :
25 : : #include "moab/verdict.h"
26 : : #include "VerdictVector.hpp"
27 : : #include <memory.h>
28 : :
29 : : /*
30 : : the wedge element
31 : :
32 : :
33 : : 5
34 : : ^
35 : : / \
36 : : / | \
37 : : / /2\ \
38 : : 6/_______\4
39 : : | / \ |
40 : : |/_____\|
41 : : 3 1
42 : :
43 : : */
44 : :
45 : : /*!
46 : :
47 : : calculate the volume of a wedge
48 : :
49 : : this is done by dividing the wedge into 3 tets
50 : : and summing the volume of each tet
51 : :
52 : : */
53 : :
54 : 2 : C_FUNC_DEF double v_wedge_volume( int num_nodes, double coordinates[][3] )
55 : : {
56 : :
57 : 2 : double volume = 0;
58 [ + - ][ + - ]: 2 : VerdictVector side1, side2, side3;
[ + - ]
59 : :
60 [ + - ]: 2 : if( num_nodes == 6 )
61 : : {
62 : :
63 : : // divide the wedge into 3 tets and calculate each volume
64 : :
65 : 4 : side1.set( coordinates[1][0] - coordinates[0][0], coordinates[1][1] - coordinates[0][1],
66 [ + - ]: 2 : coordinates[1][2] - coordinates[0][2] );
67 : :
68 : 4 : side2.set( coordinates[2][0] - coordinates[0][0], coordinates[2][1] - coordinates[0][1],
69 [ + - ]: 2 : coordinates[2][2] - coordinates[0][2] );
70 : :
71 : 4 : side3.set( coordinates[3][0] - coordinates[0][0], coordinates[3][1] - coordinates[0][1],
72 [ + - ]: 2 : coordinates[3][2] - coordinates[0][2] );
73 : :
74 [ + - ][ + - ]: 2 : volume = side3 % ( side1 * side2 ) / 6;
75 : :
76 : 4 : side1.set( coordinates[4][0] - coordinates[1][0], coordinates[4][1] - coordinates[1][1],
77 [ + - ]: 2 : coordinates[4][2] - coordinates[1][2] );
78 : :
79 : 4 : side2.set( coordinates[5][0] - coordinates[1][0], coordinates[5][1] - coordinates[1][1],
80 [ + - ]: 2 : coordinates[5][2] - coordinates[1][2] );
81 : :
82 : 4 : side3.set( coordinates[3][0] - coordinates[1][0], coordinates[3][1] - coordinates[1][1],
83 [ + - ]: 2 : coordinates[3][2] - coordinates[1][2] );
84 : :
85 [ + - ][ + - ]: 2 : volume += side3 % ( side1 * side2 ) / 6;
86 : :
87 : 4 : side1.set( coordinates[5][0] - coordinates[1][0], coordinates[5][1] - coordinates[1][1],
88 [ + - ]: 2 : coordinates[5][2] - coordinates[1][2] );
89 : :
90 : 4 : side2.set( coordinates[2][0] - coordinates[1][0], coordinates[2][1] - coordinates[1][1],
91 [ + - ]: 2 : coordinates[2][2] - coordinates[1][2] );
92 : :
93 : 4 : side3.set( coordinates[3][0] - coordinates[1][0], coordinates[3][1] - coordinates[1][1],
94 [ + - ]: 2 : coordinates[3][2] - coordinates[1][2] );
95 : :
96 [ + - ][ + - ]: 2 : volume += side3 % ( side1 * side2 ) / 6;
97 : : }
98 : :
99 : 2 : return (double)volume;
100 : : }
101 : :
102 : 0 : C_FUNC_DEF void v_wedge_quality( int num_nodes, double coordinates[][3], unsigned int metrics_request_flag,
103 : : WedgeMetricVals* metric_vals )
104 : : {
105 : 0 : memset( metric_vals, 0, sizeof( WedgeMetricVals ) );
106 : :
107 [ # # ]: 0 : if( metrics_request_flag & V_WEDGE_VOLUME ) metric_vals->volume = v_wedge_volume( num_nodes, coordinates );
108 : 0 : }
|