Mesh Oriented datABase  (version 5.5.1)
An array-based unstructured mesh library
V_KnifeMetric.cpp File Reference
#include "moab/verdict.h"
#include "VerdictVector.hpp"
#include <memory.h>
+ Include dependency graph for V_KnifeMetric.cpp:

Go to the source code of this file.

Macros

#define VERDICT_EXPORTS
 

Functions

C_FUNC_DEF double v_knife_volume (int num_nodes, double coordinates[][3])
 Calculates knife volume. More...
 
C_FUNC_DEF void v_knife_quality (int num_nodes, double coordinates[][3], unsigned int metrics_request_flag, KnifeMetricVals *metric_vals)
 Calculates quality metrics for knife elements. More...
 

Macro Definition Documentation

◆ VERDICT_EXPORTS

#define VERDICT_EXPORTS

Definition at line 23 of file V_KnifeMetric.cpp.

Function Documentation

◆ v_knife_quality()

C_FUNC_DEF void v_knife_quality ( int  num_nodes,
double  coordinates[][3],
unsigned int  metrics_request_flag,
KnifeMetricVals metric_vals 
)

Calculates quality metrics for knife elements.

calculate the quality metrics of a knife element.

There is only one, but we put this here to be consistent with functions for other element types. Who knows if we'll add more metrics.

Definition at line 117 of file V_KnifeMetric.cpp.

121 {
122  memset( metric_vals, 0, sizeof( KnifeMetricVals ) );
123 
124  if( metrics_request_flag & V_KNIFE_VOLUME ) metric_vals->volume = v_knife_volume( num_nodes, coordinates );
125 }

References V_KNIFE_VOLUME, v_knife_volume(), and KnifeMetricVals::volume.

◆ v_knife_volume()

C_FUNC_DEF double v_knife_volume ( int  num_nodes,
double  coordinates[][3] 
)

Calculates knife volume.

calculates the volume of a knife element

this is done by dividing the knife into 4 tets and summing the volumes of each.

Definition at line 58 of file V_KnifeMetric.cpp.

59 {
60  double volume = 0;
61  VerdictVector side1, side2, side3;
62 
63  if( num_nodes == 7 )
64  {
65 
66  // divide the knife into 4 tets and calculate the volume
67 
68  side1.set( coordinates[1][0] - coordinates[0][0], coordinates[1][1] - coordinates[0][1],
69  coordinates[1][2] - coordinates[0][2] );
70  side2.set( coordinates[3][0] - coordinates[0][0], coordinates[3][1] - coordinates[0][1],
71  coordinates[3][2] - coordinates[0][2] );
72  side3.set( coordinates[4][0] - coordinates[0][0], coordinates[4][1] - coordinates[0][1],
73  coordinates[4][2] - coordinates[0][2] );
74 
75  volume = side3 % ( side1 * side2 ) / 6;
76 
77  side1.set( coordinates[5][0] - coordinates[1][0], coordinates[5][1] - coordinates[1][1],
78  coordinates[5][2] - coordinates[1][2] );
79  side2.set( coordinates[3][0] - coordinates[1][0], coordinates[3][1] - coordinates[1][1],
80  coordinates[3][2] - coordinates[1][2] );
81  side3.set( coordinates[4][0] - coordinates[1][0], coordinates[4][1] - coordinates[1][1],
82  coordinates[4][2] - coordinates[1][2] );
83 
84  volume += side3 % ( side1 * side2 ) / 6;
85 
86  side1.set( coordinates[2][0] - coordinates[1][0], coordinates[2][1] - coordinates[1][1],
87  coordinates[2][2] - coordinates[1][2] );
88  side2.set( coordinates[3][0] - coordinates[1][0], coordinates[3][1] - coordinates[1][1],
89  coordinates[3][2] - coordinates[1][2] );
90  side3.set( coordinates[6][0] - coordinates[1][0], coordinates[6][1] - coordinates[1][1],
91  coordinates[6][2] - coordinates[1][2] );
92 
93  volume += side3 % ( side1 * side2 ) / 6;
94 
95  side1.set( coordinates[3][0] - coordinates[1][0], coordinates[3][1] - coordinates[1][1],
96  coordinates[3][2] - coordinates[1][2] );
97  side2.set( coordinates[5][0] - coordinates[1][0], coordinates[5][1] - coordinates[1][1],
98  coordinates[5][2] - coordinates[1][2] );
99  side3.set( coordinates[6][0] - coordinates[1][0], coordinates[6][1] - coordinates[1][1],
100  coordinates[6][2] - coordinates[1][2] );
101 
102  volume += side3 % ( side1 * side2 ) / 6;
103  }
104 
105  return (double)volume;
106 }

References VerdictVector::set().

Referenced by moab::VerdictWrapper::all_quality_measures(), moab::VerdictWrapper::quality_measure(), and v_knife_quality().