/*
 $Id: triangA.cc,v 1.3 1996/10/11 15:15:51 bzferdma Exp $
 (C)opyright 1996 by Konrad-Zuse-Center, Berlin
 All rights reserved.
 Part of the Kaskade distribution
*/

#include "triangA.h"

#include "utils.h"
#include "numerics.h"

#include "cmdpars.h"
extern CmdPars Cmd;


//-------------------------------------------------------------------------
//------------------------   0D objects  ---------------------------------


ostream& operator << (ostream& os, const PT& p) { p.print(os); return os; }

Bool operator == (const PT& p1, const PT& p2) 
{ 
    return p1.equal(p2);
}

Bool PT:: equal(const PT& /*pt*/) const 
{ 
    notImplemented("equal");  return 0;
}
//-------------------------------------------------------------------------

void PT:: print(ostream& /*os*/) const  {   notImplemented("print"); }


//-------------------------------------------------------------------------
//------------------------   1D objects  ---------------------------------


void EDG:: notImplemented(const char* s) const
{
    cout << "\n*** class EDG: " << s << " not implemented\n";  cout.flush(); abort();
}

ostream& operator << (ostream& os, const EDG& ed) { ed.print(os); return os; }

Bool operator == (const EDG& t1, const EDG& t2)
{ 
    return t1.equal(t2);
}

Bool EDG:: equal(const EDG& /*ed*/)  const {  notImplemented("equal"); return 0; }

//-------------------------------------------------------------------------

void EDG:: print(ostream& /*os*/) const
{
    notImplemented("print");
}
//-------------------------------------------------------------------------

/*
  void EDG1:: getInnerNodes(Vector<int>& nodes) const { node[1] = node; }
  void EDG2:: getInnerNodes(Vector<int>& nodes) const { node[1] = node; }
  void EDG3:: getInnerNodes(Vector<int>& nodes) const { node[1] = node; }
  
  void EDG1:: getPointNodes(Vector<int>& nodes) const
  {
  nodes[1] = p1->getNode();
  nodes[2] = p2->getNode();
  }
  void EDG2:: getPointNodes(Vector<int>& nodes) const
  {
  nodes[1] = p1->getNode();
  nodes[2] = p2->getNode();
  }
  void EDG3:: getPointNodes(Vector<int>& nodes) const
  {
  nodes[1] = p1->getNode();
  nodes[2] = p2->getNode();
  }
  */
//-------------------------------------------------------------------------

Real EDG:: volume() const
{
    int dim = spaceDim();
    Vector<Real> cP1(dim), cP2(dim);
    
    getCoordinates(cP1,cP2);
    
    if (dim==1) return Abs(cP2[1]-cP1[1]);
    else
    {
	Real l = 0.0;
	for (int i=1; i<=dim; ++i) l += sqr(cP2[i]-cP1[i]);
	return sqrt(l);
    }
}

Real EDG:: lengthSqr() const
{
    int dim = spaceDim();
    Vector<Real> cP1(dim), cP2(dim);
    
    getCoordinates(cP1,cP2);
    
    Real l = 0.0;
    for (int i=1; i<=dim; ++i) l += sqr(cP2[i]-cP1[i]);
    return l;
}
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------

void EDG:: centerOfGravity(Vector<Real>& xG)  const
{
    int dim = spaceDim();
    Vector<Real> cP1(dim), cP2(dim);

    getCoordinates(cP1,cP2);
    for (int i=1; i<=dim; ++i)  xG[i] = 0.5 * (cP1[i] + cP2[i]);
}

//-------------------------------------------------------------------------
//------------------------   2D objects  ---------------------------------


Bool operator == (const TR& t1, const TR& t2)
{ 
    return t1.equal(t2);
}

Bool TR:: equal(const TR& /*lr*/)  const {  notImplemented("equal"); return 0; }

//-------------------------------------------------------------------------

void TR:: notImplemented(const char* s) const
{
    cout << "\n*** class TR: " << s << " not implemented\n";  cout.flush(); abort();
}
//-------------------------------------------------------------------------

ostream& operator << (ostream& os, const TR& t) { t.print(os); return os; }

void TR:: print(ostream& os) const 
{
    const Vector<PT*>& p = getPoints();
    os << "Triangle points";
    for (int i=1; i<=3; ++i) os << " " << p[i]->getNode();
}

void TR:: centerOfGravity(Vector<Real>& xG) const
{
    int dim = spaceDim();
    Vector<Real> cP1(dim), cP2(dim), cP3(dim);
    const Real OneThird = 1./3.;

    getCoordinates(cP1,cP2,cP3);
    for (int i=1; i<=dim; ++i) xG[i] = OneThird * (cP1[i]+cP2[i]+cP3[i]);
}
//-------------------------------------------------------------------------
/*
  void TR2:: getPointNodes(Vector<int>& nodes) const
  {
  nodes[1] = p1->getNode();
  nodes[2] = p2->getNode();
  nodes[3] = p3->getNode();
  }
  void TR3:: getPointNodes(Vector<int>& nodes) const
  {
  nodes[1] = p1->getNode();
  nodes[2] = p2->getNode();
  nodes[3] = p3->getNode();
  }
  
  void TR2:: getEdgeNodes(Vector<int>& nodes) const
  {
  nodes[4] = e1->getNode();	// e1 is opposite to p1
  nodes[5] = e2->getNode();
  nodes[6] = e3->getNode();
  }
  void TR3:: getEdgeNodes(Vector<int>& nodes) const
  {
  nodes[4] = e1->getNode();	// e1 is opposite to p1
  nodes[5] = e2->getNode();
  nodes[6] = e3->getNode();
  }
  */

//-------------------------------------------------------------------------
//------------------------   3D objects  ---------------------------------


ostream& operator << (ostream& os, const TET& t) { t.print(os); return os; }

Bool operator == (const TET& t1, const TET& t2)  { return t1.equal(t2); }

Bool TET:: equal(const TET& /*t*/)  const { notImplemented("equal"); return 0; }

//-------------------------------------------------------------------------

//-------------------------------------------------------------------------

void TET:: centerOfGravity(Vector<Real>& xG) const
{
    int dim = spaceDim();
    Vector<Real> cP1(dim), cP2(dim), cP3(dim), cP4(dim);

    getCoordinates(cP1,cP2,cP3,cP4);
    for (int i=1; i<=dim; ++i) xG[i] = 0.25 * (cP1[i]+cP2[i]+cP3[i]+cP4[i]);
}

void TET:: print(ostream& os) const 
{
    const Vector<PT*>& p = getPoints();

    os << "Tetra points";
    for (int i=1; i<=4; ++i) os << " " << p[i]->getNode();
}

//-------------------------------------------------------------------------
//-------------------------------------------------------------------------

	


syntax highlighted by Code2HTML, v. 0.9.1