
// 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/>.


#include "VariablesTemps.h"
#include "Sortie.h"
#include <iomanip>
#include "ParaGlob.h"
        using namespace std;


    // CONSTRUCTEURS :
    // par défauts
VariablesTemps::VariablesTemps() : 
  temps(0.),deltat(0.),deltatmaxi(0.),deltatmini(0.),tempsfin(0.),prectemps(0.)
    {  };
    
    // constructeur de copies
VariablesTemps::VariablesTemps(const VariablesTemps& t) :
  temps(t.temps),deltat(t.deltat),deltatmaxi(t.deltatmaxi),deltatmini(t.deltatmini)
  ,tempsfin(t.tempsfin),prectemps(t.prectemps)
    {   };

    // affichage des parametres liés au temps
void VariablesTemps::Affiche()  const 
  { cout << "temps courant                    = " <<  deltatmaxi << '\n';
    cout << "increment de temps maxi          = " <<  deltatmaxi << '\n';
    cout << "increment de temps mini          = " <<  deltatmini << '\n';
    cout << "precision sur le temps final     = " <<  prectemps << '\n';
    cout << "increment de temps               = " <<  deltat << '\n';
    cout << "temps de fin de calcul           = " <<  tempsfin << '\n';
   };   
	 
	//----- lecture écriture dans base info -----
	// cas donne le niveau de la récupération
    // = 1 : on récupère tout
    // = 2 : on récupère uniquement les données variables (supposées comme telles)
    // = 3 : on met à jour uniquement les données variables (supposées comme telles)
    //       dans ce cas il y a modification des grandeurs, mais pas redimentionnement
void VariablesTemps::Lecture_base_info_temps(ifstream& entr,const int cas)
{switch (cas)
  { case 1 : // ------- on récupère tout -------------------------
      { cout << "== lecture des variables temps \n";
        string toto; entr >> toto ; // lecture en tête
        entr >> toto >> temps >> toto >> deltat
             >> toto >> deltatmaxi >> toto >> deltatmini >> toto >> tempsfin
             >> toto >> prectemps;
        break;
       }
    case  2 : case 3: // ----------- on récupère uniquement se qui varie --------------------
       { string toto;
   //      entr >> toto >> temps >> toto >> deltat;
        // si on lit le deltat on ne peut plus prendre en compte la modif éventuelle du .info !
         entr >> toto >> temps ;
        break;
        }
    default :
        {cout << "\nErreur : valeur incorrecte du type de sauvegarde !\n";
         cout << "VariablesTemps::Lecture_base_info(ifstream& entr,const int cas)"
               << " cas= " << cas << endl;
         Sortie(1);
         }
   };
  };    // cas donne le niveau de sauvegarde
    // = 1 : on sauvegarde tout
    // = 2 : on sauvegarde uniquement les données variables (supposées comme telles)
void VariablesTemps::Ecriture_base_info_temps(ofstream& sort,const int cas) const
{switch (cas)
  { case 1 : // ------- on sauvegarde tout -------------------------
    { sort << " ****info_temps " ;
      sort << " temps_courant " << setprecision(ParaGlob::NbdigdoCA()) << temps 
           << " increment_temps " << setprecision(ParaGlob::NbdigdoCA()) << deltat
           << " increment_maxi " << setprecision(ParaGlob::NbdigdoCA()) << deltatmaxi 
           << " increment_mini " << setprecision(ParaGlob::NbdigdoCA()) << deltatmini 
           << " temps_fin " << setprecision(ParaGlob::NbdigdoCA()) << tempsfin
           << " precision_temps " << setprecision(ParaGlob::NbdigdoCA()) << prectemps << "\n";
	  break;
	 }
    case  2 : // ----------- sauvegarde uniquement de se qui varie --------------------
    { sort << "\n temps_courant " << setprecision(ParaGlob::NbdigdoCA()) << temps ;
  //         << " increment_temps " << setprecision(ParaGlob::NbdigdoCA()) << deltat;
     break;
     }
    default :
	 { cout << "\nErreur : valeur incorrecte du type de sauvegarde !\n";
	   cout << "VariablesTemps::Ecriture_base_info(ofstream& sort,const int cas)"
			<< " cas= " << cas << endl;
	   Sortie(1);
	   }
   };
 };
