/**
 * \file
 * \author Karsten Rink
 * \date   2012-05-02
 * \brief  Implementation of the Cell class.
 *
 * \copyright
 * Copyright (c) 2012-2014, OpenGeoSys Community (http://www.opengeosys.org)
 *            Distributed under a Modified BSD License.
 *              See accompanying file LICENSE.txt or
 *              http://www.opengeosys.org/project/license
 *
 */

#include "Cell.h"

#include "MathLib/Vector3.h"
#include "MeshLib/Node.h"

namespace MeshLib {

const unsigned Cell::dimension = 3u;

/*
Cell::Cell(Node** nodes, MeshElemType type, unsigned value)
	: Element(nodes, type, value)
{
}
*/
Cell::Cell(unsigned value, std::size_t id)
	: Element(value, id), _volume(-1.0) // init with invalid value to detect errors
{
}

Cell::~Cell()
{}

bool Cell::testElementNodeOrder() const
{
	const MathLib::Vector3 c (getCenterOfGravity());
	const unsigned nFaces (this->getNFaces());
	for (unsigned j=0; j<nFaces; ++j)
	{
		MeshLib::Face const*const face (dynamic_cast<const MeshLib::Face*>(this->getFace(j)));
		const MeshLib::Node x (*(face->getNode(1)));
		const MathLib::Vector3 cx (c, x);
		const double s = MathLib::scalarProduct(face->getSurfaceNormal(), cx);
		delete face;
		if (s >= 0)
			return false;
	}
	return true;
}

}