// This file is part of the Herezh++ application.
//
// The finite element software Herezh++ is dedicated to the field
// of mechanics for large transformations of solid structures.
// It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600)
// INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) <https://www.irdl.fr/>.
//
// Herezh++ is distributed under GPL 3 license ou ultérieure.
//
// Copyright (C) 1997-2022 Université Bretagne Sud (France)
// AUTHOR : Gérard Rio
// E-MAIL  : gerardrio56@free.fr
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License,
// or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
// For more information, please consult: <https://herezh.irdl.fr/>.

/************************************************************************
 *                                                                      *
 *     DATE:        15/01/97                                            *
 *                                                                $     *
 *     AUTEUR:      G RIO   (mailto:gerardrio56@free.fr)                *
 *                                                                $     *
 *     PROJET:      Herezh++                                            *
 *                                                                $     *
 ************************************************************************
 *     CLASSE:      Projet                                              *
 *                                                                $     *
 *     BUT:         definition des operations de haut niveau :          *
 *                  Lecture, Calcul, Sortie des Resultats.              *
 *                                                                $     *
 *     ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''     *                                                                      *
 *     VERIFICATION:                                                    *
 *                                                                      *
 *     !  date  !   auteur   !       but                          !     *
 *     ------------------------------------------------------------     *
 *     !        !            !                                    !     *
 *                                                                $     *
 *     ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''     *
 *     MODIFICATIONS:
 *                                                                      *
 *     !  date  !   auteur   !       but                          !     *
 *     ------------------------------------------------------------     *
 *                                                                      *
 *                                                                $     *
 *                                                                      *
 ************************************************************************/
 #ifndef PROJET_H
 #define PROJET_H
 #include <iostream>
//#include "Debug.h"
#ifndef ENLINUX_STREAM
  #include <sstream> // pour le flot en memoire centrale
#else  
  #include <strstream> // pour le flot en memoire centrale
#endif
 #include "UtilLecture.h"
 #include "LesMaillages.h"
 #include "ParaGlob.h"
// pour la definition de nouveaux tenseurs
#include "NevezTenseur.h"
// "DefValConsTens.h" 
// est a placer dans le fichier qui defini les valeurs des constantes
// des tenseurs 
# include "DefValConsTens.h"

#include "Algori.h"
#include "LesReferences.h"
#include "LesLoisDeComp.h"
#include "LesCourbes1D.h"
#include "LesFonctions_nD.h"
#include "DiversStockage.h"
#include "Charge.h"
#include "LesCondLim.h"
#include "Resultats.h"
#include "LesContacts.h"
#include "Enum_IO_XML.h"
#include "VariablesExporter.h"
#ifdef UTILISATION_MPI
  #include "Distribution_CPU.h"
#endif


//------------------------------------------------------------------
//!      definition des operations de haut niveau : Lecture, Calcul, Sortie des Resultats.
//------------------------------------------------------------------
/// \author    Gérard Rio
/// \version   1.0
/// \date       15/01/97


 class Projet
 {
  public:
       // --------------  constructeurs  ------------------ :
       // défaut inutilisable
       Projet () {cout << "\n erreur constructeur de Projet"; Sortie(1);};
       
       // ++ le constructeur officiel ++
       // il y a passage éventuelle d'argument : argc=le nombre d'argument
       // argv : donne un tableau correspondant de mots clés
       Projet (string& retour,int argc=0, const char * argv[] = NULL);
       // --------------  destructeur    ------------------ :
       ~Projet ();
       // --------------  methodes       ------------------ :
       // lecture initiale des informations
       void Lecture();
       // lectures secondaires éventuelles: ramène true s'il y a effectivement
       // une lecture secondaire, qui donc modifie la lecture initiale
       bool Lecture_secondaire();
       
       // dans le cas MPI, transmission au sous_process des infos nécessaire à la
       // lecture initiale
       #ifdef UTILISATION_MPI
        void Transmission_process_Lecture(int process);
       #endif

       // calculs
       void Calcul ();
  
       // type de calcul
       EnumTypeCalcul TypeDeCalcul() const {return algori->TypeDeCalcul();};
       
       // sortie des resultats
       void SortieDesResultats ();
       
       // visualisation (éventuelle)
       void Visualisation_interactive ();
       
       //  définition d'un fichier de commandes
       void Def_fichier_commande(string& retour); 

       //  définition du fichier schema XML
       void Def_fichier_SchemaXML(string& );
  
       // fermeture des fichiers de visualisation liés au projet
       void FermetureFichiersVisualisation();
  
       // sortie sur fichier des temps cpu
       // retourne un pointeur sur UtilLecture pour la récupération du fichier
       // de temps, qui peut ainsi être utilisé par la méthode appelant
       UtilLecture * Sortie_temps_cpu();

       // def du fichier des temps cpu
       // puis retourne un pointeur sur UtilLecture pour la récupération du fichier
       // de temps, qui peut ainsi être utilisé par la méthode appelant
       UtilLecture * Def_sortie_temps_cpu();
 
       // une méthode qui a pour objectif de terminer tous les comptages, utile
       // dans le cas d'un arrêt impromptu
       void Arret_du_comptage_CPU();

  private : 
   
    // VARIABLES PROTEGEES : 
    ParaGlob *       paraGlob;         // parametres globaux
    UtilLecture *    entreePrinc;      // acces a la lecture du fichier principal
    LesMaillages *   lesMaillages;     // description des maillages
    Algori*          algori;           // algorithme de calcul
    LesReferences*   lesRef;           // references des maillages
    LesCourbes1D*    lesCourbes1D;     // courbes 1D
    LesFonctions_nD*  lesFonctionsnD;  // les fonctions multi-dimensionnelles
    LesLoisDeComp*   lesLoisDeComp;    // lois de comportement
    DiversStockage*  diversStockage;   // stockage divers
    Charge*          charge;           // chargement
    LesCondLim*      lesCondLim;       // conditions limites
    LesContacts*     lescontacts;      // le contact eventuel
    Resultats*       resultats;        // sortie des resultats
    VariablesExporter* varExpor;       // variables exportées globalement
    
    Tableau <Algori* > tabAlgo;  // pour le schema XML
    Temps_CPU_HZpp    tempsMiseEnDonnees;    // TempsCpu

    // METHODES PROTEGEES :
    // lecture eventuelle de la dimension sinon elle est mise a trois
    int  LectureDimension();
    // lecture eventuelle du niveau de sortie des commentaires
    int LectureNiveauCommentaire();
    // affichage de toutes les informations lue
    void Affiche() const ;
    //  procedure qui definit un exemplaire de chaque element
    // pour que l'edition de lien est lieu effectivement
   // void   DefElement();
    
    // lecture des données externes pour chaque entitée gérée par le projet
    // type indique le type de données externes à lire
    void  LectureDonneesExternes();
  

    // -- def de la dimension pour une sortie sur un fichier de commande
    int Info_commande_dimension(UtilLecture * entreePrinc);
    // -- def du niveau de commentaire pour une sortie sur un fichier de commande
    int Info_commande_niveauCommentaire(UtilLecture * entreePrinc);
    
    // -- def de l'entête  pour une sortie schema XML
    void SchemaXML_entete(UtilLecture * entreePrinc);
    // -- def de la fin  pour une sortie schema XML
    void SchemaXML_fin(UtilLecture * entreePrinc);
    // -- def de  la dimension pour une sortie schema XML suivant le type d'io
    void SchemaXML_dim(UtilLecture * entreePrinc,Enum_IO_XML enuIO_XML);
    // sortie du schemaXML: en fonction de enu
    // ceci pour tous les types de base  
    void SchemaXML_Type_de_base(ostream& sort,const Enum_IO_XML enu); 
         
    void LectureVersion(); // lecture éventuelle de l'indicateur  de version
    void LectureLangue(); // lecture éventuelle de l'indicateur de langue
    
    // ---- fonctions d'aides pour le constructeur de Projet ----
    //  démarrage: cas de la construction du schema XML  
    void InitConstructionSchemaXml(string & retour);  
    //  démarrage: cas d'une écriture d'un fichier de commande  
    void InitConstructionFichierCommande(string & retour);  
    //  démarrage: cas d'une entrée via un fichier .info  
    void InitEntreeFichierInfo(string & retour);  
    //  démarrage: cas d'une entrée via un fichier .base-info  
    void InitEntreeFichierBaseInfo(string & retour);  
 };
 
 #endif