// cabecera para la funcion g2f.cpp : g2f.h
// funcines auxiliares de g2f()
#ifndef G2F_H
#define G2F_H
#include <fstream>

using std::ofstream;
using std::ifstream;

//! Clase principal G2f.
/*!
La clase G2f se encarga de asumir un archivo de mallado Gmsh y extraer a partir
de el archivos especificos para nodos, archivos de elementos interiores (3 nodos),
archivo de elementos contorno (2 nodos) y un archivo extra con la cantidad de
lineas de cada archivo.
G2f es llamado por P_sistemaEc pues los archivos que genera G2f los utiliza
directamente para crear la matriz de rigidez y el vector de terminos independientes.

NOTA suplementaria: Gmsh siempre genera nodos consecutivos unos de otros, esto
es un problema a la hora de generar un sistema de ecuaciones. Por ellos existe G2f.

NOTA procedimiento general:
-Se empieza a leer el archivo generado por gmsh.
-Se ignoran los primeros 34 caracteres.
-Se coloca en la variable N_N el numero de nodos.
	OJO, los nodos pueden estar desordenados.

-Con un bucle "for" se leen tantas lineas como nodos existan.
	Se lee del archivo origen el INDICE, coordenada X, coordenada Y y la ultima columna que se ignorara.
	Se escribe en el archivo destino el valor cardinal "i" del bucle, y los datos coordenada X, coordenada Y, y fin de linea.
	Se crea la variable tipo MAP para almacena pares (viejo nodo, nuevo nodo)
-Se ignoran los siguientes 18 caracteres.
-Se coloca en la variable N_E el numero de elementos.
	OJO, puesto que se han rebautizado los nodos con un nuevo indice, habra que cambiar los nodos asociados a cada elemento.
-Con un bucle for se barren todos los elementos.
	Se lee el indice y el tipo de elemento.
	Segun el caso (mediante un switch) se trata cada elemento.
		En cada caso se leen los nodos y los atributos que se desean conseguir, el resto se pasa a ignore.
		En cada caso se escriben los datos en el archivo destino, respentando el indice original.
			Mediante la relacion map "newNode" se colocan los nuevos numeros de nodos que forman cada elemento.
		En las variables N_nf, N_edg, N_ele se van contando el numero de elementos de cada tipo.

-Se termina cada archivo con un "end" y se escribe el sumario en otro archivo.
*/
class G2f { // gmsh to fem

public:

	//! Constructor de G2f .
  /*! El CONSTRUCTOR se encarga de crear todas las cadenas de caracteres que
	* apuntan a los archivos que creara esta clase.
  */
	G2f( const char*, const char* );		// default constructor

	void getOrder(short unsigned = 16); // default float precision 16
private:
	ifstream fileIn; /*!< Variable tipo flujo de entrada utilizada para trabajar con el archivo de mallado generado por Gmsh. */
	ofstream fileNode, /*!< Variable tipo flujo de salida utilizada para trabajar con el archivo de nodos. */
	fileEdge, /*!< Variable tipo flujo de salida utilizada para trabajar con el archivo de elementos de contorno. */
	fileEle, /*!< Variable tipo flujo de salida utilizada para trabajar con el archivo de elementos interiores. */
	fileNodef, /*!< Variable tipo flujo de salida utilizada para trabajar con el archivo de elementos punto (finalmente no se ha utilizado en Femsii). */
	fileData; /*!< Variable tipo flujo de salida utilizada para trabajar con el archivo que recuenta el numero de lineas de cada uno de los otros archivos generados por G2f. */
	unsigned N_N, /*!< variable que se encarga de almacenar el numero de nodos. */
	N_E; /*!< variable que se encarga de almacenar el numero de elementos. */
};	// fin de la clase G2f

#endif
