#ifndef SISTEMA_H
#define SISTEMA

#include "g2f.h"
#include <map>
#include <list>

using namespace std;

//! Clase principal Sistema_ecuaciones.
/*!
La clase Sistema_ecuaciones contiene todas las funciones y variables que se utilizan para el programa pre.bin.
*/
class Sistema_ecuaciones {

public:

  //! Constructor de Sistema_ecuaciones .
  /*! El CONSTRUCTOR crea las cadenas de caracteres (ptrMesh, ptrConducti, etc) con las direcciones
  * de los diferentes archivos de trabajo. Ademas se llama a la funcion getOrder() de
  * de la clase G2f para crear archivos ordenados con los datos del archivo GMSH.
  * Por ultimo se llama a la funcion regiones, que crear variables de tipo map globales con
  * valores de permeabilidad y conductividad.
  */
	Sistema_ecuaciones( const char* ); // default constructor

	//! Destructor de Sistema_ecuaciones .
	/*! El destructor de Sistema_ecuaciones se encarga de eliminar de la memoria la matriz
	* principal de rigidez y el vector de terminos independientes.
	* Ademas lanza la orden de finalizar PetscFinalize().
	*/
	~Sistema_ecuaciones(); // default destructor

	int getStiffness( int = 0 ); // default verbose mode off
	void print_global();
	int rightSide();
	int dirichletPto();
	int dirichletLin();
	int paresHomologos();
	int kelvin();
	int aBinario();
	int mkdir( const char* );
	const char* enrrutar( const char* );
private:
// funciones
	int local_matrix( double,double,double,double,double,double,int );
	int regiones();
	int regNodos( int**, int, int);
// variables
	int N_N; /*!< variable que se encarga de almacenar el numero de nodos. */
	int N_E; /*!< variable que se encarga de almacenar el numero de elementos. */
	int N_ED; /*!< variable que se encarga de almacenar el numero de elementos de contorno. */
	float frec; /*!< variable que se encarga de almacenar la frecuencia de la densidad de corriente. */
	double VACIO; /*!< variable que se encarga de almacenar el valor de la permeabilidad magnetica en el vacio. */
	double **pNode; /*!< variable que almacena los nodos del mallado, la utilizan getStiffness(), regiones() y archivoGmshPot(). */
	string ruta;

// LTS
	map<unsigned,double> permeabilidad; /*!< Variable tipo mapa para almacenar pares region-permeabilidad. Lo utiliza local_matrix(). */
	map<unsigned,double> conductividad; /*!< Variable tipo mapa para almacenar pares region-conductividad. Lo utiliza local_matrix() */
	list<int> listaRegNodos0; /*!< variable lista para almacenar la primera columna de los pares de nodos homologos. (en desarrollo) */
	list<int> listaRegNodos1;  /*!< variable lista para almacenar la segunda columna de los pares de nodos homologos. (en desarrollo) */
};	// fin de la clase Rigidez

#endif
