/**
 * Prism.cpp
 *
 *      Date: 2012/05/02
 *      Author: KR
 */

#include "Prism.h"
#include "Node.h"

#include "MathTools.h"

namespace MeshLib {

Prism::Prism(Node* nodes[6], size_t value)
	: Cell(MshElemType::PRISM, value)
{
	_nodes = _nodes;
	_neighbors = new Element*[5];
	for (size_t i=0; i<5; i++)
		_neighbors[i] = NULL;
	this->_volume = this->calcVolume();
}

Prism::Prism(Node* n0, Node* n1, Node* n2, Node* n3, Node* n4, Node* n5, size_t value)
	: Cell(MshElemType::PRISM, value)
{
	_nodes = new Node*[6];
	_nodes[0] = n0;
	_nodes[1] = n1;
	_nodes[2] = n2;
	_nodes[3] = n3;
	_nodes[4] = n4;
	_nodes[5] = n5;
	_neighbors = new Element*[5];
	for (size_t i=0; i<5; i++)
		_neighbors[i] = NULL;
	this->_volume = this->calcVolume();
}

Prism::Prism(const Prism &prism)
	: Cell(MshElemType::PRISM, prism.getValue())
{
	_nodes = new Node*[6];
	for (size_t i=0; i<6; i++)
		_nodes[i] = prism._nodes[i];
	_neighbors = new Element*[5];
	for (size_t i=0; i<5; i++)
		_neighbors[i] = prism._neighbors[i];
	_volume = prism.getVolume();
}

Prism::~Prism()
{
}

double Prism::calcVolume()
{
	return MathLib::calcDetTetrahedron(_nodes[0]->getData(), _nodes[1]->getData(), _nodes[2]->getData(), _nodes[3]->getData())
		 + MathLib::calcDetTetrahedron(_nodes[1]->getData(), _nodes[4]->getData(), _nodes[2]->getData(), _nodes[3]->getData())
		 + MathLib::calcDetTetrahedron(_nodes[2]->getData(), _nodes[4]->getData(), _nodes[5]->getData(), _nodes[3]->getData());
}

}