+//=======================================================================
+//function : GetVolumeType
+//purpose :
+//=======================================================================
+
+SMDS_VolumeTool::VolumeType SMDS_VolumeTool::GetVolumeType() const
+{
+ if ( myPolyedre )
+ return POLYHEDA;
+
+ if ( myVolume ) {
+ static const VolumeType types[] = {
+ TETRA, // myVolumeNbNodes = 4
+ PYRAM, // myVolumeNbNodes = 5
+ PENTA, // myVolumeNbNodes = 6
+ UNKNOWN, // myVolumeNbNodes = 7
+ HEXA // myVolumeNbNodes = 8
+ };
+ return types[ myVolumeNbNodes - 4 ];
+ }
+
+ return UNKNOWN;
+}
+
+//=======================================================================
+//function : getTetraVolume
+//purpose :
+//=======================================================================
+
+static double getTetraVolume(const SMDS_MeshNode* n1,
+ const SMDS_MeshNode* n2,
+ const SMDS_MeshNode* n3,
+ const SMDS_MeshNode* n4)
+{
+ double X1 = n1->X();
+ double Y1 = n1->Y();
+ double Z1 = n1->Z();
+
+ double X2 = n2->X();
+ double Y2 = n2->Y();
+ double Z2 = n2->Z();
+
+ double X3 = n3->X();
+ double Y3 = n3->Y();
+ double Z3 = n3->Z();
+
+ double X4 = n4->X();
+ double Y4 = n4->Y();
+ double Z4 = n4->Z();
+
+ double Q1 = -(X1-X2)*(Y3*Z4-Y4*Z3);
+ double Q2 = (X1-X3)*(Y2*Z4-Y4*Z2);
+ double R1 = -(X1-X4)*(Y2*Z3-Y3*Z2);
+ double R2 = -(X2-X3)*(Y1*Z4-Y4*Z1);
+ double S1 = (X2-X4)*(Y1*Z3-Y3*Z1);
+ double S2 = -(X3-X4)*(Y1*Z2-Y2*Z1);
+
+ return (Q1+Q2+R1+R2+S1+S2)/6.0;
+}
+