From 079a0993b28c639aefce72314bcc794280975be4 Mon Sep 17 00:00:00 2001
From: Karsten Rink <karsten.rink@ufz.de>
Date: Tue, 2 Sep 2014 15:21:11 +0200
Subject: [PATCH] removed lots and lots of pointers

---
 Gui/VtkVis/VtkVisPipeline.cpp                 |  8 +--
 Gui/mainwindow.cpp                            | 10 ++-
 MeshLib/MeshQuality/AngleSkewMetric.cpp       | 70 +++++++++----------
 MeshLib/MeshQuality/AngleSkewMetric.h         | 12 ++--
 MeshLib/MeshQuality/AreaMetric.cpp            | 16 ++---
 MeshLib/MeshQuality/AreaMetric.h              |  2 +-
 MeshLib/MeshQuality/EdgeRatioMetric.cpp       | 70 +++++++++----------
 MeshLib/MeshQuality/EdgeRatioMetric.h         | 30 ++++----
 MeshLib/MeshQuality/ElementQualityMetric.cpp  | 15 ++--
 MeshLib/MeshQuality/ElementQualityMetric.h    |  6 +-
 MeshLib/MeshQuality/RadiusEdgeRatioMetric.cpp |  2 +-
 MeshLib/MeshQuality/RadiusEdgeRatioMetric.h   |  3 +-
 MeshLib/MeshQuality/VolumeMetric.cpp          | 12 ++--
 MeshLib/MeshQuality/VolumeMetric.h            |  2 +-
 14 files changed, 133 insertions(+), 125 deletions(-)

diff --git a/Gui/VtkVis/VtkVisPipeline.cpp b/Gui/VtkVis/VtkVisPipeline.cpp
index dc490fcd69e..aa2ac916868 100644
--- a/Gui/VtkVis/VtkVisPipeline.cpp
+++ b/Gui/VtkVis/VtkVisPipeline.cpp
@@ -462,13 +462,13 @@ void VtkVisPipeline::checkMeshQuality(VtkMeshSource* source, MeshQualityType t)
 		const MeshLib::Mesh* mesh = source->GetMesh();
 		MeshLib::ElementQualityMetric* quality_tester (nullptr);
 		if (t == MeshQualityType::EDGERATIO)
-			quality_tester = new MeshLib::EdgeRatioMetric(mesh);
+			quality_tester = new MeshLib::EdgeRatioMetric(*mesh);
 		else if (t == MeshQualityType::AREA)
-			quality_tester = new MeshLib::AreaMetric(mesh);
+			quality_tester = new MeshLib::AreaMetric(*mesh);
 		else if (t == MeshQualityType::VOLUME)
-			quality_tester = new MeshLib::VolumeMetric(mesh);
+			quality_tester = new MeshLib::VolumeMetric(*mesh);
 		else if (t == MeshQualityType::EQUIANGLESKEW)
-			quality_tester = new MeshLib::AngleSkewMetric(mesh);
+			quality_tester = new MeshLib::AngleSkewMetric(*mesh);
 		else
 		{
 			ERR("VtkVisPipeline::checkMeshQuality(): Unknown MeshQualityType.");
diff --git a/Gui/mainwindow.cpp b/Gui/mainwindow.cpp
index 6f93923da37..2a580bd5c8c 100644
--- a/Gui/mainwindow.cpp
+++ b/Gui/mainwindow.cpp
@@ -13,7 +13,8 @@
  */
 
 #include "mainwindow.h"
-
+#include <algorithm>
+#include "MeshQuality\RadiusEdgeRatioMetric.h"
 // ThirdParty/logog
 #include "logog/include/logog.hpp"
 
@@ -1298,6 +1299,13 @@ void MainWindow::showDataExplorerSettingsDialog()
 
 void MainWindow::FEMTestStart()
 {
+    const MeshLib::Mesh* msh = _project.getMesh("Ammer-Homogen100m-Final");
+    MeshLib::RadiusEdgeRatioMetric metric(*msh);
+    metric.calculateQuality();
+    std::vector<double> result (metric.getElementQuality());
+    auto minmax = std::minmax_element(result.begin(), result.end());
+    std::cout << "min: " << *minmax.first << " at pos " << minmax.first-result.begin() 
+              << ", max: " << *minmax.second << " at pos " << minmax.second-result.begin() << std::endl;
 }
 
 void MainWindow::showTrackingSettingsDialog()
diff --git a/MeshLib/MeshQuality/AngleSkewMetric.cpp b/MeshLib/MeshQuality/AngleSkewMetric.cpp
index fb6dc802bb8..2c14f59bcc5 100644
--- a/MeshLib/MeshQuality/AngleSkewMetric.cpp
+++ b/MeshLib/MeshQuality/AngleSkewMetric.cpp
@@ -29,7 +29,7 @@
 
 namespace MeshLib
 {
-AngleSkewMetric::AngleSkewMetric(Mesh const* const mesh) :
+AngleSkewMetric::AngleSkewMetric(Mesh const& mesh) :
 	ElementQualityMetric(mesh), M_PI_THIRD (M_PI / 3.0), TWICE_M_PI (2 * M_PI)
 {}
 
@@ -38,13 +38,13 @@ AngleSkewMetric::~AngleSkewMetric()
 
 void AngleSkewMetric::calculateQuality ()
 {
-	const std::vector<MeshLib::Element*>& elements(_mesh->getElements());
-	const size_t nElements (_mesh->getNElements());
+	const std::vector<MeshLib::Element*>& elements(_mesh.getElements());
+	const size_t nElements (_mesh.getNElements());
 
 	for (size_t k(0); k < nElements; k++)
 	{
-		const Element* elem (elements[k]);
-		switch (elem->getGeomType())
+		Element const& elem (*elements[k]);
+		switch (elem.getGeomType())
 		{
 		case MeshElemType::LINE:
 			_element_quality_metric[k] = -1.0;
@@ -70,11 +70,11 @@ void AngleSkewMetric::calculateQuality ()
 	}
 }
 
-double AngleSkewMetric::checkTriangle (Element const* const elem) const
+double AngleSkewMetric::checkTriangle (Element const& elem) const
 {
-	double const* const node0 (elem->getNode(0)->getCoords());
-	double const* const node1 (elem->getNode(1)->getCoords());
-	double const* const node2 (elem->getNode(2)->getCoords());
+	double const* const node0 (elem.getNode(0)->getCoords());
+	double const* const node1 (elem.getNode(1)->getCoords());
+	double const* const node2 (elem.getNode(2)->getCoords());
 
 	double min_angle (M_PI_2), max_angle (0.0);
 	getMinMaxAngleFromTriangle (node0, node1, node2, min_angle, max_angle);
@@ -84,12 +84,12 @@ double AngleSkewMetric::checkTriangle (Element const* const elem) const
 	                (M_PI_THIRD - min_angle) / (M_PI_THIRD));
 }
 
-double AngleSkewMetric::checkQuad (Element const* const elem) const
+double AngleSkewMetric::checkQuad (Element const& elem) const
 {
-	double const* const node0 (elem->getNode(0)->getCoords());
-	double const* const node1 (elem->getNode(1)->getCoords());
-	double const* const node2 (elem->getNode(2)->getCoords());
-	double const* const node3 (elem->getNode(3)->getCoords());
+	double const* const node0 (elem.getNode(0)->getCoords());
+	double const* const node1 (elem.getNode(1)->getCoords());
+	double const* const node2 (elem.getNode(2)->getCoords());
+	double const* const node3 (elem.getNode(3)->getCoords());
 
 	double min_angle (TWICE_M_PI);
 	double max_angle (0.0);
@@ -100,12 +100,12 @@ double AngleSkewMetric::checkQuad (Element const* const elem) const
 	       std::max((max_angle - M_PI_2) / (M_PI - M_PI_2), (M_PI_2 - min_angle) / (M_PI_2));
 }
 
-double AngleSkewMetric::checkTetrahedron (Element const* const elem) const
+double AngleSkewMetric::checkTetrahedron (Element const& elem) const
 {
-	double const* const node0 (elem->getNode(0)->getCoords());
-	double const* const node1 (elem->getNode(1)->getCoords());
-	double const* const node2 (elem->getNode(2)->getCoords());
-	double const* const node3 (elem->getNode(3)->getCoords());
+	double const* const node0 (elem.getNode(0)->getCoords());
+	double const* const node1 (elem.getNode(1)->getCoords());
+	double const* const node2 (elem.getNode(2)->getCoords());
+	double const* const node3 (elem.getNode(3)->getCoords());
 
 	double min_angle (M_PI_2);
 	double max_angle (0.0);
@@ -123,16 +123,16 @@ double AngleSkewMetric::checkTetrahedron (Element const* const elem) const
 	                      (M_PI_THIRD - min_angle) / (M_PI_THIRD));
 }
 
-double AngleSkewMetric::checkHexahedron (Element const* const elem) const
+double AngleSkewMetric::checkHexahedron (Element const& elem) const
 {
-	double const* const node0 (elem->getNode(0)->getCoords());
-	double const* const node1 (elem->getNode(1)->getCoords());
-	double const* const node2 (elem->getNode(2)->getCoords());
-	double const* const node3 (elem->getNode(3)->getCoords());
-	double const* const node4 (elem->getNode(4)->getCoords());
-	double const* const node5 (elem->getNode(5)->getCoords());
-	double const* const node6 (elem->getNode(6)->getCoords());
-	double const* const node7 (elem->getNode(7)->getCoords());
+	double const* const node0 (elem.getNode(0)->getCoords());
+	double const* const node1 (elem.getNode(1)->getCoords());
+	double const* const node2 (elem.getNode(2)->getCoords());
+	double const* const node3 (elem.getNode(3)->getCoords());
+	double const* const node4 (elem.getNode(4)->getCoords());
+	double const* const node5 (elem.getNode(5)->getCoords());
+	double const* const node6 (elem.getNode(6)->getCoords());
+	double const* const node7 (elem.getNode(7)->getCoords());
 
 	double min_angle (2 * M_PI);
 	double max_angle (0.0);
@@ -154,14 +154,14 @@ double AngleSkewMetric::checkHexahedron (Element const* const elem) const
 	       std::max((max_angle - M_PI_2) / (M_PI - M_PI_2), (M_PI_2 - min_angle) / (M_PI_2));
 }
 
-double AngleSkewMetric::checkPrism (Element const* const elem) const
+double AngleSkewMetric::checkPrism (Element const& elem) const
 {
-	double const* const node0 (elem->getNode(0)->getCoords());
-	double const* const node1 (elem->getNode(1)->getCoords());
-	double const* const node2 (elem->getNode(2)->getCoords());
-	double const* const node3 (elem->getNode(3)->getCoords());
-	double const* const node4 (elem->getNode(4)->getCoords());
-	double const* const node5 (elem->getNode(5)->getCoords());
+	double const* const node0 (elem.getNode(0)->getCoords());
+	double const* const node1 (elem.getNode(1)->getCoords());
+	double const* const node2 (elem.getNode(2)->getCoords());
+	double const* const node3 (elem.getNode(3)->getCoords());
+	double const* const node4 (elem.getNode(4)->getCoords());
+	double const* const node5 (elem.getNode(5)->getCoords());
 
 	double min_angle_tri (2 * M_PI);
 	double max_angle_tri (0.0);
diff --git a/MeshLib/MeshQuality/AngleSkewMetric.h b/MeshLib/MeshQuality/AngleSkewMetric.h
index bdf023b54bb..5cdaddee899 100644
--- a/MeshLib/MeshQuality/AngleSkewMetric.h
+++ b/MeshLib/MeshQuality/AngleSkewMetric.h
@@ -26,17 +26,17 @@ namespace MeshLib
 class AngleSkewMetric : public ElementQualityMetric
 {
 public:
-	AngleSkewMetric(Mesh const* const mesh);
+	AngleSkewMetric(Mesh const& mesh);
 	virtual ~AngleSkewMetric();
 
 	virtual void calculateQuality ();
 
 private:
-	double checkTriangle(Element const* const elem) const;
-	double checkQuad(Element const* const elem) const;
-	double checkTetrahedron(Element const* const elem) const;
-	double checkHexahedron(Element const* const elem) const;
-	double checkPrism (Element const* const elem) const;
+	double checkTriangle(Element const& elem) const;
+	double checkQuad(Element const& elem) const;
+	double checkTetrahedron(Element const& elem) const;
+	double checkHexahedron(Element const& elem) const;
+	double checkPrism (Element const& elem) const;
 	void getMinMaxAngleFromQuad(double const* const n0,
 	                            double const* const n1, double const* const n2,
 	                            double const* const n3, double &min_angle,
diff --git a/MeshLib/MeshQuality/AreaMetric.cpp b/MeshLib/MeshQuality/AreaMetric.cpp
index 6dc6fb6b6b5..f1094d3f274 100644
--- a/MeshLib/MeshQuality/AreaMetric.cpp
+++ b/MeshLib/MeshQuality/AreaMetric.cpp
@@ -18,36 +18,36 @@
 
 namespace MeshLib
 {
-AreaMetric::AreaMetric(Mesh const* const mesh)
+AreaMetric::AreaMetric(Mesh const& mesh)
 	: ElementQualityMetric(mesh)
 {}
 
 void AreaMetric::calculateQuality()
 {
-	const std::vector<MeshLib::Element*> &elements(_mesh->getElements());
+	const std::vector<MeshLib::Element*> &elements(_mesh.getElements());
 
 	const size_t nElems(elements.size());
 	for (size_t k(0); k < nElems; k++) 
 	{
 		double area(std::numeric_limits<double>::max());
-		const Element* elem (elements[k]);
+		Element const& elem (*elements[k]);
 
-		if (elem->getDimension() == 1)
+		if (elem.getDimension() == 1)
 		{
 			_element_quality_metric[k] = -1.0;
 			continue;
 		}
-		else if (elem->getDimension() == 2)
+		else if (elem.getDimension() == 2)
 		{		
-			area = elem->getContent();
+			area = elem.getContent();
 			if (area < sqrt(fabs(std::numeric_limits<double>::epsilon()))) errorMsg(elem, k);
 		} 
 		else {
-			size_t nFaces(elem->getNFaces());
+			size_t nFaces(elem.getNFaces());
 
 			for (size_t i = 0; i < nFaces; i++) 
 			{
-				const double sub_area (elem->getFace(i)->getContent());
+				const double sub_area (elem.getFace(i)->getContent());
 
 				if (sub_area < sqrt(fabs(std::numeric_limits<double>::epsilon())))
 					errorMsg(elem, k);
diff --git a/MeshLib/MeshQuality/AreaMetric.h b/MeshLib/MeshQuality/AreaMetric.h
index 334b318551e..5e80686672c 100644
--- a/MeshLib/MeshQuality/AreaMetric.h
+++ b/MeshLib/MeshQuality/AreaMetric.h
@@ -26,7 +26,7 @@ namespace MeshLib
 class AreaMetric : public ElementQualityMetric
 {
 public:
-	AreaMetric(Mesh const* const mesh);
+	AreaMetric(Mesh const& mesh);
 	virtual ~AreaMetric() {}
 
 	virtual void calculateQuality ();
diff --git a/MeshLib/MeshQuality/EdgeRatioMetric.cpp b/MeshLib/MeshQuality/EdgeRatioMetric.cpp
index 7c2cb981430..5471020dc97 100644
--- a/MeshLib/MeshQuality/EdgeRatioMetric.cpp
+++ b/MeshLib/MeshQuality/EdgeRatioMetric.cpp
@@ -18,7 +18,7 @@
 
 namespace MeshLib
 {
-EdgeRatioMetric::EdgeRatioMetric(Mesh const* const mesh) :
+EdgeRatioMetric::EdgeRatioMetric(Mesh const& mesh) :
 	ElementQualityMetric(mesh)
 {
 }
@@ -26,63 +26,63 @@ EdgeRatioMetric::EdgeRatioMetric(Mesh const* const mesh) :
 void EdgeRatioMetric::calculateQuality()
 {
 	// get all elements of mesh
-	const std::vector<MeshLib::Element*>& elements(_mesh->getElements());
-	const size_t nElements (_mesh->getNElements());
+	const std::vector<MeshLib::Element*>& elements(_mesh.getElements());
+	const size_t nElements (_mesh.getNElements());
 	for (size_t k(0); k < nElements; k++)
 	{
-		const Element* elem (elements[k]);
-		switch (elem->getGeomType())
+		Element const& elem (*elements[k]);
+		switch (elem.getGeomType())
 		{
 		case MeshElemType::LINE:
 			_element_quality_metric[k] = 1.0;
 			break;
 		case MeshElemType::TRIANGLE: {
-			_element_quality_metric[k] = checkTriangle(elem->getNode(0), elem->getNode(1), elem->getNode(2));
+			_element_quality_metric[k] = checkTriangle(*elem.getNode(0), *elem.getNode(1), *elem.getNode(2));
 			break;
 		}
 		case MeshElemType::QUAD: {
-			_element_quality_metric[k] = checkQuad(elem->getNode(0), elem->getNode(1), elem->getNode(2), elem->getNode(3));
+			_element_quality_metric[k] = checkQuad(*elem.getNode(0), *elem.getNode(1), *elem.getNode(2), *elem.getNode(3));
 			break;
 		}
 		case MeshElemType::TETRAHEDRON: {
-			_element_quality_metric[k] = checkTetrahedron(elem->getNode(0), elem->getNode(1), elem->getNode(2), elem->getNode(3));
+			_element_quality_metric[k] = checkTetrahedron(*elem.getNode(0), *elem.getNode(1), *elem.getNode(2), *elem.getNode(3));
 			break;
 		}
 		case MeshElemType::PRISM: {
 			std::vector<const GeoLib::Point*> pnts;
 			for (size_t j(0); j < 6; j++)
-				pnts.push_back(elem->getNode(j));
+				pnts.push_back(elem.getNode(j));
 			_element_quality_metric[k] = checkPrism(pnts);
 			break;
 		}
 		case MeshElemType::PYRAMID: {
 			std::vector<const GeoLib::Point*> pnts;
 			for (size_t j(0); j < 5; j++)
-				pnts.push_back(elem->getNode(j));
+				pnts.push_back(elem.getNode(j));
 			_element_quality_metric[k] = checkPyramid(pnts);
 			break;
 		}
 		case MeshElemType::HEXAHEDRON: {
 			std::vector<const GeoLib::Point*> pnts;
 			for (size_t j(0); j < 8; j++)
-				pnts.push_back(elem->getNode(j));
+				pnts.push_back(elem.getNode(j));
 			_element_quality_metric[k] = checkHexahedron(pnts);
 			break;
 		}
 		default:
 			ERR ("MeshQualityShortestLongestRatio::check () check for element type %s not implemented.",
-			     MeshElemType2String(elem->getGeomType()).c_str());
+			     MeshElemType2String(elem.getGeomType()).c_str());
 		}
 	}
 }
 
-double EdgeRatioMetric::checkTriangle (GeoLib::Point const* const a,
-                                                       GeoLib::Point const* const b,
-                                                       GeoLib::Point const* const c) const
+double EdgeRatioMetric::checkTriangle (GeoLib::Point const& a,
+                                       GeoLib::Point const& b,
+                                       GeoLib::Point const& c) const
 {
-	double len0 (sqrt(MathLib::sqrDist (*b,*a)));
-	double len1 (sqrt(MathLib::sqrDist (*b,*c)));
-	double len2 (sqrt(MathLib::sqrDist (*a,*c)));
+	double len0 (sqrt(MathLib::sqrDist (b,a)));
+	double len1 (sqrt(MathLib::sqrDist (b,c)));
+	double len2 (sqrt(MathLib::sqrDist (a,c)));
 
 	if (len0 < len1 && len0 < len2)
 	{
@@ -110,15 +110,15 @@ double EdgeRatioMetric::checkTriangle (GeoLib::Point const* const a,
 	}
 }
 
-double EdgeRatioMetric::checkQuad (GeoLib::Point const* const a,
-                                                   GeoLib::Point const* const b,
-                                                   GeoLib::Point const* const c,
-                                                   GeoLib::Point const* const d) const
+double EdgeRatioMetric::checkQuad (GeoLib::Point const& a,
+                                   GeoLib::Point const& b,
+                                   GeoLib::Point const& c,
+                                   GeoLib::Point const& d) const
 {
-	double sqr_lengths[4] = {MathLib::sqrDist (*b,*a),
-		                 MathLib::sqrDist (*c,*b),
-		                 MathLib::sqrDist (*d,*c),
-		                 MathLib::sqrDist (*a,*d)};
+	double sqr_lengths[4] = {MathLib::sqrDist (b,a),
+		                 MathLib::sqrDist (c,b),
+		                 MathLib::sqrDist (d,c),
+		                 MathLib::sqrDist (a,d)};
 
 	// sort lengths - since this is a very small array we use bubble sort
 	for (size_t i(0); i < 4; i++)
@@ -129,14 +129,14 @@ double EdgeRatioMetric::checkQuad (GeoLib::Point const* const a,
 	return sqrt(sqr_lengths[0]) / sqrt(sqr_lengths[3]);
 }
 
-double EdgeRatioMetric::checkTetrahedron (GeoLib::Point const* const a,
-                                                          GeoLib::Point const* const b,
-                                                          GeoLib::Point const* const c,
-                                                          GeoLib::Point const* const d) const
+double EdgeRatioMetric::checkTetrahedron (GeoLib::Point const& a,
+                                          GeoLib::Point const& b,
+                                          GeoLib::Point const& c,
+                                          GeoLib::Point const& d) const
 {
-	double sqr_lengths[6] = {MathLib::sqrDist (*b,*a), MathLib::sqrDist (*c,*b),
-		                 MathLib::sqrDist (*c,*a), MathLib::sqrDist (*a,*d),
-		                 MathLib::sqrDist (*b,*d), MathLib::sqrDist (*c,*d)};
+	double sqr_lengths[6] = {MathLib::sqrDist (b,a), MathLib::sqrDist (c,b),
+		                 MathLib::sqrDist (c,a), MathLib::sqrDist (a,d),
+		                 MathLib::sqrDist (b,d), MathLib::sqrDist (c,d)};
 
 	// sort lengths - since this is a very small array we use bubble sort
 	for (size_t i(0); i < 6; i++)
@@ -147,7 +147,7 @@ double EdgeRatioMetric::checkTetrahedron (GeoLib::Point const* const a,
 	return sqrt(sqr_lengths[0]) / sqrt(sqr_lengths[5]);
 }
 
-double EdgeRatioMetric::checkPrism (std::vector<const GeoLib::Point*> const & pnts) const
+double EdgeRatioMetric::checkPrism (std::vector<const GeoLib::Point*> const& pnts) const
 {
 	double sqr_lengths[9] = {MathLib::sqrDist (*pnts[0],*pnts[1]),
 		                 MathLib::sqrDist (*pnts[1],*pnts[2]),
@@ -168,7 +168,7 @@ double EdgeRatioMetric::checkPrism (std::vector<const GeoLib::Point*> const & pn
 	return sqrt(sqr_lengths[0]) / sqrt(sqr_lengths[8]);
 }
 
-double EdgeRatioMetric::checkPyramid (std::vector<const GeoLib::Point*> const & pnts) const
+double EdgeRatioMetric::checkPyramid (std::vector<const GeoLib::Point*> const &pnts) const
 {
 	double sqr_lengths[8] = {MathLib::sqrDist (*pnts[0],*pnts[1]),
 		                 MathLib::sqrDist (*pnts[1],*pnts[2]),
diff --git a/MeshLib/MeshQuality/EdgeRatioMetric.h b/MeshLib/MeshQuality/EdgeRatioMetric.h
index 45b2148820c..b6c321da488 100644
--- a/MeshLib/MeshQuality/EdgeRatioMetric.h
+++ b/MeshLib/MeshQuality/EdgeRatioMetric.h
@@ -27,26 +27,26 @@ namespace MeshLib
 class EdgeRatioMetric : public ElementQualityMetric
 {
 public:
-	EdgeRatioMetric(Mesh const* const mesh);
+	EdgeRatioMetric(Mesh const& mesh);
 	virtual ~EdgeRatioMetric () {}
 
 	virtual void calculateQuality ();
 
 private:
-	double checkTriangle (GeoLib::Point const* const a,
-	                      GeoLib::Point const* const b,
-	                      GeoLib::Point const* const c) const;
-	double checkQuad (GeoLib::Point const* const a,
-	                  GeoLib::Point const* const b,
-	                  GeoLib::Point const* const c,
-	                  GeoLib::Point const* const d) const;
-	double checkTetrahedron (GeoLib::Point const* const a,
-	                         GeoLib::Point const* const b,
-	                         GeoLib::Point const* const c,
-	                         GeoLib::Point const* const d) const;
-	double checkPrism (std::vector<const GeoLib::Point*> const & pnts) const;
-	double checkPyramid (std::vector<const GeoLib::Point*> const & pnts) const;
-	double checkHexahedron (std::vector<const GeoLib::Point*> const & pnts) const;
+	double checkTriangle (GeoLib::Point const& a,
+	                      GeoLib::Point const& b,
+	                      GeoLib::Point const& c) const;
+	double checkQuad (GeoLib::Point const& a,
+	                  GeoLib::Point const& b,
+	                  GeoLib::Point const& c,
+	                  GeoLib::Point const& d) const;
+	double checkTetrahedron (GeoLib::Point const& a,
+	                         GeoLib::Point const& b,
+	                         GeoLib::Point const& c,
+	                         GeoLib::Point const& d) const;
+	double checkPrism (std::vector<const GeoLib::Point*> const& pnts) const;
+	double checkPyramid (std::vector<const GeoLib::Point*> const& pnts) const;
+	double checkHexahedron (std::vector<const GeoLib::Point*> const& pnts) const;
 };
 }
 
diff --git a/MeshLib/MeshQuality/ElementQualityMetric.cpp b/MeshLib/MeshQuality/ElementQualityMetric.cpp
index 53842242af6..119215908bb 100644
--- a/MeshLib/MeshQuality/ElementQualityMetric.cpp
+++ b/MeshLib/MeshQuality/ElementQualityMetric.cpp
@@ -20,30 +20,29 @@
 
 namespace MeshLib
 {
-ElementQualityMetric::ElementQualityMetric(Mesh const* const mesh) :
+ElementQualityMetric::ElementQualityMetric(Mesh const& mesh) :
 	_min (std::numeric_limits<double>::max()), _max (0), _mesh (mesh)
 {
-	if (_mesh)
-		_element_quality_metric.resize (_mesh->getNElements(), -1.0);
+	_element_quality_metric.resize (_mesh.getNElements(), -1.0);
 }
 
 BaseLib::Histogram<double> ElementQualityMetric::getHistogram (size_t nclasses) const
 {
 	if (nclasses == 0) {
 		// simple suggestion: number of classes with Sturges criterion
-		nclasses = static_cast<size_t>(1 + 3.3 * log (static_cast<float>((_mesh->getNElements()))));
+		nclasses = static_cast<size_t>(1 + 3.3 * log (static_cast<float>((_mesh.getNElements()))));
 	}
 
 	return BaseLib::Histogram<double>(getElementQuality(), nclasses, true);
 }
 
-void ElementQualityMetric::errorMsg (const Element* elem, size_t idx) const
+void ElementQualityMetric::errorMsg (Element const& elem, size_t idx) const
 {
 	ERR ("Error in MeshQualityChecker::check() - Calculated value of element is below double precision minimum.");
-	ERR ("Points of %s-Element %d: ", MeshElemType2String(elem->getGeomType()).c_str(), idx);
-	for (size_t i(0); i < elem->getNNodes(); i++)
+	ERR ("Points of %s-Element %d: ", MeshElemType2String(elem.getGeomType()).c_str(), idx);
+	for (size_t i(0); i < elem.getNNodes(); i++)
 	{
-		const double* coords = elem->getNode(i)->getCoords();
+		const double* coords = elem.getNode(i)->getCoords();
 		ERR ("\t Node %d: (%f, %f, %f)", i, coords[0], coords[1], coords[2]);
 	}
 }
diff --git a/MeshLib/MeshQuality/ElementQualityMetric.h b/MeshLib/MeshQuality/ElementQualityMetric.h
index 3629e45abdc..584eb223a68 100644
--- a/MeshLib/MeshQuality/ElementQualityMetric.h
+++ b/MeshLib/MeshQuality/ElementQualityMetric.h
@@ -35,7 +35,7 @@ namespace MeshLib
 class ElementQualityMetric
 {
 public:
-	ElementQualityMetric(Mesh const* const mesh);
+	ElementQualityMetric(Mesh const& mesh);
 
 	virtual ~ElementQualityMetric () {}
 
@@ -51,11 +51,11 @@ public:
 	virtual BaseLib::Histogram<double> getHistogram (std::size_t nclasses = 0) const;
 
 protected:
-	void errorMsg (const Element* elem, std::size_t idx) const;
+	void errorMsg (Element const& elem, std::size_t idx) const;
 
 	double _min;
 	double _max;
-	Mesh const* const _mesh;
+	Mesh const& _mesh;
 	std::vector<double> _element_quality_metric;
 };
 }
diff --git a/MeshLib/MeshQuality/RadiusEdgeRatioMetric.cpp b/MeshLib/MeshQuality/RadiusEdgeRatioMetric.cpp
index c0d1d537dc7..c530d4152ec 100644
--- a/MeshLib/MeshQuality/RadiusEdgeRatioMetric.cpp
+++ b/MeshLib/MeshQuality/RadiusEdgeRatioMetric.cpp
@@ -20,7 +20,7 @@
 namespace MeshLib
 {
 
-RadiusEdgeRatioMetric::RadiusEdgeRatioMetric(Mesh const*const mesh) 
+RadiusEdgeRatioMetric::RadiusEdgeRatioMetric(Mesh const& mesh) 
 : ElementQualityMetric(mesh)
 {}
 
diff --git a/MeshLib/MeshQuality/RadiusEdgeRatioMetric.h b/MeshLib/MeshQuality/RadiusEdgeRatioMetric.h
index 9ca6738a6a4..90c79aa7ca4 100644
--- a/MeshLib/MeshQuality/RadiusEdgeRatioMetric.h
+++ b/MeshLib/MeshQuality/RadiusEdgeRatioMetric.h
@@ -21,7 +21,8 @@ namespace MeshLib
 {
 
 /** 
- * Calculates the quality of mesh elements based on the EquiAngleSkew measure
+ * Calculates the quality of mesh elements based on the ratio between
+ * radius of the smallest enclosing sphere and the shortest element edge
  */
 class RadiusEdgeRatioMetric : public ElementQualityMetric
 {
diff --git a/MeshLib/MeshQuality/VolumeMetric.cpp b/MeshLib/MeshQuality/VolumeMetric.cpp
index d090fa201ec..07ae817eb0f 100644
--- a/MeshLib/MeshQuality/VolumeMetric.cpp
+++ b/MeshLib/MeshQuality/VolumeMetric.cpp
@@ -20,28 +20,28 @@
 namespace MeshLib
 {
 
-VolumeMetric::VolumeMetric(Mesh const* const mesh) :
+VolumeMetric::VolumeMetric(Mesh const& mesh) :
 	ElementQualityMetric(mesh)
 { }
 
 void VolumeMetric::calculateQuality()
 {
 	// get all elements of mesh
-	const std::vector<MeshLib::Element*>& elements(_mesh->getElements());
+	const std::vector<MeshLib::Element*>& elements(_mesh.getElements());
 
 	size_t error_count(0);
-	size_t nElements (_mesh->getNElements());
+	size_t nElements (_mesh.getNElements());
 
 	for (size_t k(0); k < nElements; k++)
 	{
-		const Element* elem (elements[k]);
-		if (elem->getDimension()<3)
+		Element const& elem (*elements[k]);
+		if (elem.getDimension()<3)
 		{
             _element_quality_metric[k] = 0.0;
             continue;
         }
 
-        double volume (elem->getContent());
+        double volume (elem.getContent());
         if (volume > _max)
             _max = volume;
         if (volume < sqrt(fabs(std::numeric_limits<double>::epsilon()))) {
diff --git a/MeshLib/MeshQuality/VolumeMetric.h b/MeshLib/MeshQuality/VolumeMetric.h
index f9a9bb28259..0c0a75b9a1c 100644
--- a/MeshLib/MeshQuality/VolumeMetric.h
+++ b/MeshLib/MeshQuality/VolumeMetric.h
@@ -26,7 +26,7 @@ namespace MeshLib
 class VolumeMetric : public ElementQualityMetric
 {
 public:
-	VolumeMetric(Mesh const* const mesh);
+	VolumeMetric(Mesh const& mesh);
 	virtual ~VolumeMetric() {}
 
 	virtual void calculateQuality ();
-- 
GitLab