

#include "mem.h"

#ifndef __mesh__
#define __mesh__

typedef struct element ELEMENT;
typedef struct face FACE;
typedef struct mesh_data MESH_DATA;

/* triangular or quadrilateral face */
struct face
{
  REAL normal [3]; /* current normal */

  int type, /* 3, 4 => triangle, quadrilateral */
      nodes [4], /* node numbers */
      index, /* index within the element */
      color; /* surface color */

  ELEMENT *ele;

  FACE *next, *n; /* element, mesh list */
};

/* finite element */
struct element
{
  short type, /* 4, 5, 6, 8 => tetrahedron, pyramid, wedge, hexahedron */
	neighs, /* number of neighbours */
	flag;  /* auxiliary flag used internally */

  int nodes [8], /* node numbers */
      material; /* material number */

  ELEMENT *prev,
	  *next,
	  *adj [6]; /* neighbouring elements */

  FACE *faces; /* corresponding surface faces */
};

/* general mesh */
struct mesh_data
{
  MEM facmem,
      elemem,
      mapmem;

  REAL (*nodes) [3];

  ELEMENT *surfeles,
	  *bulkeles;
  
  FACE *faces;

  int  surfeles_count,
       bulkeles_count,
       nodes_count;
};

/* create mesh from a vector of nodes, element list in format =>
 * {nuber of nodes, node0, node1, ..., material}, {REPEAT}, ..., 0 (end of list); and surface colors in format =>
 * global surface, {number of nodes, node0, node1, ..., color}, {REPEAT}, ..., 0 (end of list); */
MESH_DATA* MESH_Create (REAL (*nodes) [3], int *elements, int *surfaces);

/* calculate mass characteristics: scalar mass, mass center, inertia tensor */
void MESH_Char (MESH_DATA *msh, REAL *mass, REAL *center, REAL *inertia);

/* free mesh memory */
void MESH_Destroy (MESH_DATA *msh);
  
#endif
