16#include <Schema_Temps_base.h>
17#include <EcrFicCollecte.h>
18#include <communications.h>
19#include <Probleme_base.h>
20#include <Matrice_Morse.h>
21#include <LecFicDiffuse.h>
22#include <Equation_base.h>
23#include <TRUST_2_PDI.h>
29#include <DeviceMemory.h>
30#include <Perf_counters.h>
52Schema_Temps_base::Schema_Temps_base() :
109 Cout <<
"Time step finally used to solve the next time step (taking into account facsec) : " << dt <<
" s." << finl;
114 Cerr <<
"---------------------------------------------------------" << finl;
115 Cerr <<
"Problem with the time step " << dt <<
" which is less than dt_min " <<
dt_min_ << finl;
116 Cerr <<
"Lower dt_min value or check why the time step decreases..." << finl;
117 Cerr <<
"Results are saved to provide help." << finl;
118 Cerr <<
"---------------------------------------------------------" << finl;
145 stationnaire_atteint_ = -1;
166 Cout<<
"====================================================" << finl;
167 Cout<< equation.
que_suis_je()<<
" equation is not solved."<<finl;
168 Cout<<
"====================================================" << finl;
207 double i, j, epsilon = 1.e-8;
215 statistics().begin_count(STD_COUNTERS::update_variables,statistics().get_last_opened_counter_level()+1);
227 statistics().end_count(STD_COUNTERS::update_variables);
233 progress_<< (int)100<< finl;
243 if (stationnaire_atteint_ && (
nb_pas_dt_ >= 2))
245 Cerr <<
"---------------------------------------------------------"
248 <<
" has reached the steady state"
274 mon_probleme=un_probleme;
348 param.
ajouter_non_std(
"periode_sauvegarde_securite_en_heures",(
this));
352 param.
ajouter_flag(
"disable_progress",&disable_progress_);
380 os <<
"dt " <<
dt_ << finl;
382 os <<
"tinit " <<
tinit_ << finl;
383 os <<
"tmax " <<
tmax_ << finl ;
384 os <<
"tcpumax " <<
tcpumax_ << finl ;
387 os <<
"dt_min " <<
dt_min_ << finl;
388 os <<
"dt_max " <<
dt_max_ << finl;
389 os <<
"facsec " <<
facsec_ << finl;
393 os <<
"dt_sauv " <<
dt_sauv_ << finl;
396 os <<
"dt_impr " <<
dt_impr_ << finl;
398 os <<
"stationnaire_atteint " << stationnaire_atteint_ << finl;
405 os <<
"disable_progress " << int(disable_progress_) << finl ;
406 os <<
"disable_dt_ev " << int(disable_dt_ev_) << finl ;
408 os <<
"fin " << finl;
430 Cerr<<
"Reading of data for a "<<
que_suis_je()<<
" time scheme"<<finl;
433 param.lire_avec_accolades_depuis(is);
436 Cerr<<
"dt_min has not been read or is set to 0."<<finl;
437 Cerr<<
"Assign a value strictly positive to dt_min."<<finl;
444 Cerr <<
"NO next backup, by security, because dt_sauv = " <<
dt_sauv_ << finl;
446 Cerr <<
"The next backup, by security, will take place after " <<
limite_cpu_sans_sauvegarde_/3600 <<
" hours of calculation." << finl;
467 les_mots2[0]=
"dt_std";
468 les_mots2[1]=
"dt_min";
469 les_mots2[2]=
"dt_calc";
470 les_mots2[3]=
"dt_fixe";
471 int rang2=les_mots2.
search(motlu);
488 Cerr<<
" We do not understand "<<motlu <<
"in Schema_Temps_base::lire_motcle_non_standard"<<finl;
489 Cerr<<
"keywords understood "<<les_mots2<<finl;
495 else if (mot==
"nb_pas_dt_max")
497 else if (mot==
"periode_sauvegarde_securite_en_heures")
499 else if (mot==
"tcpumax")
501 else if (mot==
"no_check_disk_space")
503 else if (mot ==
"residuals")
505 else if(mot ==
"facsec")
518 Cerr <<
"Reading of the maximum number of time steps" << finl;
525 Cerr <<
"Reading of the safety backup period in hours" << finl;
534 Cerr <<
"Reading the max cpu time allowed" << finl;
550 residuals_mots[0]=
"relative";
551 residuals_mots[1]=
"norm";
552 int res_rang=residuals_mots.
search(m);
563 Cerr<<
" We do not understand "<<m <<
"in Schema_Temps_base::lire_motcle_non_standard"<<finl;
564 Cerr<<
" keywords understood "<<residuals_mots<<finl;
584 os <<
"-------------------------------------------------------------------" << finl;
585 os <<
"We finished treating the time step number "<<
nb_pas_dt_ <<
" , for the time scheme ..." << finl
586 <<
" stable dt used = " <<
dt_ << finl
601 os <<
" Problem : " << pb.
le_nom() << finl;
602 os <<
"We treat the time step number "<<
nb_pas_dt_ << finl;
603 os <<
" dt = " <<
dt_ << finl;
611 os <<
" Problem : " << pb.
le_nom() << finl;
612 os <<
"We treat the time step number "<<
nb_pas_dt_ << finl;
613 os <<
" dt = " <<
dt_ << finl;
620 int ccc_tremain(
double*);
632 statistics().end_count(STD_COUNTERS::update_variables,0,0);
634 statistics().begin_count(STD_COUNTERS::update_variables,statistics().get_last_opened_counter_level()+1);
653 Cerr <<
"NO next backup, by security, because dt_sauv = " <<
dt_sauv_ << finl;
655 Cerr <<
"The next backup, by security, will take place after " <<
limite_cpu_sans_sauvegarde_/3600 <<
" hours of calculation." << finl;
660 temps_cpu_ecoule_ = statistics().get_time_since_last_open(STD_COUNTERS::total_execution_time);
670 double second_remain;
671 int error = ccc_tremain(&second_remain);
674 int hour_remain = (int)(second_remain/3600);
675 second_remain-=hour_remain*3600;
676 int minute_remain = (int)(second_remain/60);
677 second_remain-=minute_remain*60;
678 Cout << hour_remain <<
"h"<<minute_remain<<
"mn"<<second_remain<<
"s before job is killed on CCRT." << finl;
681 Cout <<
"Error." << finl;
707 double i, j, epsilon = 1.e-8;
762 int simple_checkpoint = ref_cast_non_const(
Probleme_base, mon_probleme.valeur()).is_sauvegarde_simple();
765 if(!simple_checkpoint)
768 Cerr <<
"WARNING ! Overwriting the first " <<
nb_sauv_max_ <<
" backups..." << finl;
777 pdi_interface.
trigger(
"time_scheme");
807 if (!get_disable_stop())
816 ficstop << stop_lu_l;
822 ficstop >> stop_lu_l;
850 double dt = std::min(
dt_max_, dt_propose);
853 bool adapt_dt_tmax =
false;
859 adapt_dt_tmax =
true;
864 adapt_dt_tmax =
true;
870 if ((dt -
dt_min_) / (dt + DMINFLOAT) < -1.e-6 && !adapt_dt_tmax)
873 Cerr <<
"---------------------------------------------------------" << finl;
874 Cerr <<
"Problem with the time step " << dt <<
" which is less than dt_min " <<
dt_min_ << finl;
875 Cerr <<
"Lower dt_min value or check why the time step decreases..." << finl;
876 Cerr <<
"Results are saved to provide help." << finl;
877 Cerr <<
"---------------------------------------------------------" << finl;
901 Cerr <<
"---------------------------------------------------------"
904 <<
" wants to stop : final time reached"
911 Cerr <<
"---------------------------------------------------------"
914 <<
" wants to stop : the maximum number of time steps reached"
921 Cerr <<
"---------------------------------------------------------"
924 <<
" wants to stop : max cpu time reached"
929 if (!get_disable_stop())
933 Cerr <<
"---------------------------------------------------------"
936 <<
" wants to stop : stop file detected"
947 return mon_probleme.valeur();
952 return mon_probleme.valeur();
978 DoubleVect& residu_equation = equation.
get_residu();
984 Cerr <<
"Error in Schema_Temps_base::update_critere_statio" << finl;
985 Cerr <<
"Array residu_equation has a null size" << finl;
987 if (
pb_base().equation(i).get_residu().size_array()==0)
990 Cerr <<
"Please, contact TRUST support." << finl;
997 residu_equation(0) = mp_max_abs_vect(tab_critere);
999 residu_equation(0) = mp_norme_vect(tab_critere);
1002 Cerr <<
"Schema_Temps_base::update_critere_statio : only norm max and norm L2 are allowed to compute residuals ("
1010 mp_max_abs_tab(tab_critere, residu_equation);
1012 mp_norme_tab(tab_critere, residu_equation);
1015 Cerr <<
"Schema_Temps_base::update_critere_statio : only norm max and norm L2 are allowed to compute residuals ("
1027 for (
int i=0; i<size; i++)
1028 residu_initial_equation(i) = residu_equation(i);
1033 for (
int i=0; i<size; i++)
1034 if (residu_initial_equation(i)>0)
1035 residu_equation(i) /= residu_initial_equation(i);
1039 const double max_var = mp_max_abs_vect(equation.
inconnue().
futur());
1040 const double min_var = mp_min_abs_vect(equation.
inconnue().
futur());
1041 residu_equation /= max_var - min_var + 1e-2;
1046 double equation_residual = local_max_abs_vect(residu_equation);
1057 int precision_temps;
1059 precision_temps=std::max( precision_actuelle, (
int)(2+log10(1/std::fabs(
pas_de_temps()))+(
int)(log10(std::fabs(
temps_courant())))) );
1061 precision_temps=std::max( precision_actuelle, (
int)(2+log10(1/std::fabs(
pas_de_temps()))) );
1076 if (!progress_.is_open())
1077 progress_.ouvrir(
nom_du_cas() +
".progress");
1093 double nb_pas_avant_fin = std::min(nb_pas_selon_tmax, nb_pas_selon_nb_pas_dt_max);
1095 double dpercent = (1. - nb_pas_avant_fin /
1107 dpercent = std::max(dpercent, dpercent2);
1109 int percent = int(dpercent * 100);
1113 double seconds_to_finish = statistics().get_time_since_last_open(STD_COUNTERS::total_execution_time) * (1. - dpercent) / dpercent;
1114 int integer_limit = (int) (pow(2.0, (
double) ((
sizeof(
int) * 8) - 1)) - 1);
1115 if (seconds_to_finish < integer_limit)
1117 int h = int(seconds_to_finish / 3600);
1118 int mn = int((seconds_to_finish - 3600 * h) / 60);
1119 int s = int(seconds_to_finish - 3600 * h - 60 * mn);
1120 Cout << finl <<
"Estimated CPU time to finish the run (according to "
1121 << (nb_pas_selon_tmax < nb_pas_selon_nb_pas_dt_max ?
"tmax" :
"nb_pas_dt_max")
1123 if (seconds_to_finish < 1)
1124 Cout << seconds_to_finish <<
" s";
1126 Cout << h <<
"h" << mn <<
"mn" << s <<
"s";
1128 Cout <<
". Progress: " << (percent) << finl;
1132 progress_ << (percent) << finl;
1142static bool header_complete =
false;
1143void open_dt_ev(IOS_OPEN_MODE mode)
1145 if (!dt_ev_.is_open())
1148 dt_ev_.ouvrir(fichier, mode);
1149 dt_ev_.setf(ios::scientific);
1161 if ((
nb_pas_dt_ == 0) && ((stat(fichier, &f)) || !(
pb_base().reprise_effectuee() == 1)))
1165 open_dt_ev(ios::out);
1166 dt_ev_ <<
"# temps\t\t dt\t\t facsec\t\t residu=max|Ri|\t dt_stab\t ";
1168 open_dt_ev(ios::app);
1175 open_dt_ev(ios::app);
1180 open_dt_ev(ios::app);
1185 header_complete =
true;
1200 if (header_complete) dt_ev_ << finl;
1202 header_complete =
false;
DoubleTab & futur(int i=1) override
Renvoie les valeurs du champs a l'instant t+i.
DoubleTab & passe(int i=1) override
Renvoie les valeurs du champs a l'instant t-i.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual int equation_non_resolue() const
void set_residuals(const DoubleTab &residual)
Solveur_Masse_base & solv_masse()
Renvoie le solveur de masse associe a l'equation.
virtual const Champ_Inc_base & inconnue() const =0
DoubleVect & get_residu()
virtual void abortTimeStep()
Reinitialiser ce qui doit l'etre.
virtual void imprime_residu(SFichier &)
virtual DoubleTab & derivee_en_temps_inco(DoubleTab &)
Returns the time derivative of the unknown I of the equation: dI/dt = M-1*(sum(operators(I) + sources...
DoubleVect & residu_initial()
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
int disable_equation_residual() const
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
virtual Nom expression_residu()
Cette classe implemente les operateurs et les methodes virtuelles de la classe EFichier de la facon s...
Classe Matrice_Base Classe de base de la hierarchie des matrices.
Une chaine de caractere (Nom) en majuscules.
Un tableau d'objets de la classe Motcle.
int search(const Motcle &t) const
class Nom Une chaine de caractere pour nommer les objets de TRUST
classe Objet_U Cette classe est la classe de base des Objets de TRUST
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
static const Nom & nom_du_cas()
Renvoie une reference constante vers le nom du cas.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Helper class to factorize the readOn method of Objet_U classes.
void ajouter_flag(const char *keyword, const bool *value)
Register a boolean flag whose mere presence switches it to true.
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
void ajouter_non_std(const char *keyword, const Objet_U *value, Param::Nature nat=Param::OPTIONAL)
Register a keyword handled by Objet_U::lire_motcle_non_standard.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
int postraiter(int force=1) override
Si force=1, effectue le postraitement sans tenir compte des frequences de postraitement.
void sauver() const override
Ecriture sur fichier en vue d'une reprise (sauvegarde).
virtual double calculer_pas_de_temps() const
Calcul la valeur du prochain pas de temps du probleme.
virtual void mettre_a_jour(double temps)
Effectue une mise a jour en temps du probleme.
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
virtual int nombre_d_equations() const =0
virtual const Equation_base & equation(int) const =0
static int node_master()
renvoie 1 si on est sur le processeur maitre du noeud numa, 0 sinon.
static void imprimer_ram_totale(int all_process=0)
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
int seuil_statio_relatif_deconseille_
Drapeau pour specifier si seuil_statio_ est une valeur absolue (defaut) ou relative.
virtual Entree & lire_periode_sauvegarde_securite_en_heures(Entree &)
int precision_impr_
Nombre de chiffres significatifs impression.
int limpr() const
Renvoie 1 s'il y a lieu d'effectuer une impression (cf dt_impr) Renvoie 0 sinon.
virtual double computeTimeStep(bool &stop) const
int & set_stationnaire_atteint()
bool ind_nb_pas_dt_max_atteint
virtual bool isStationary() const
Retourne 1 si lors du dernier pas de temps, le probleme n'a pas evolue.
double temps_courant() const
Renvoie le temps courant.
virtual void resetTime(double time)
Nom dt_max_str_
reglage de dt_max comme une fonction du temps
virtual bool corriger_dt_calcule(double &dt) const
Corrige le pas de temps calcule que l'on passe en parametre et verifie qu'il n'est pas "trop" petit (...
int sauvegarder(Sortie &) const override
Sauvegarde le temps courant et le nombre de pas de temps sur un flot de sortie.
int nb_pas_dt_max_atteint() const
Renvoie 1 si (le nombre de pas de temps >= nombre de pas de temps maximum).
Parser_U dt_max_fn_
Parser_U associe.
virtual void set_param(Param &titi) const override
int nb_sauv_
how many checkpoints have we performed so far?
double dt_
Pas de temps de calcul.
virtual void ajouter_inertie(Matrice_Base &mat_morse, DoubleTab &secmem, const Equation_base &eqn) const
bool disable_progress() const
double dt_failed_
Si on a rate un pas de temps, sa valeur.
int no_error_if_not_converged_diff_impl_
virtual void associer_pb(const Probleme_base &)
void write_dt_ev(bool init)
double temps_max() const
Renvoie une reference sur le temps maximum.
double dt_max_
Pas de temps max fixe par l'utilisateur.
double mode_dt_start_
Mode calcul du pas de temps de depart - contient un double si option dt_init.
virtual void abortTimeStep()
double periode_cpu_sans_sauvegarde_
Par defaut 23 heures;.
bool ind_tps_final_atteint
double limite_cpu_sans_sauvegarde_
Par defaut 23 heures;.
int temps_final_atteint() const
Renvoie 1 si le temps final est atteint (ou depasse).
virtual int stop() const
Renvoie 1 si il y lieu de stopper le calcul pour differente raisons: - le temps final est atteint.
Probleme_base & pb_base()
bool disable_dt_ev() const
virtual void validateTimeStep()
void imprimer_temps_courant(SFichier &) const
int lire_motcle_non_standard(const Motcle &, Entree &) override
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
virtual int impr(Sortie &os) const
Impression du numero du pas de temps, la valeur du pas de temps.
int niter_max_diff_impl_
Iterations maximale pour GC implicitation - Above 1000 iterations, diffusion implicit algorithm may b...
virtual void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const Equation_base &eqn, const tabs_t &semi_impl={}) const
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
int no_conv_subiteration_diff_impl_
virtual void imprimer(Sortie &os) const
Imprime le pas de temps sur un flot de sortie s'il y a lieu.
virtual void initialize()
virtual bool initTimeStep(double dt)
virtual Entree & lire_residuals(Entree &)
int nb_sauv_max_
Max number of checkpoints that will be performed (useful for PDI backup file).
virtual int faire_un_pas_de_temps_eqn_base(Equation_base &)=0
int nb_pas_dt() const
Renvoie le nombre de pas de temps effectues.
double dt_impr_
Pas de temps d'impression.
int stop_lu() const
Renvoie 1 si le fichier (d'extension) .
double dt_min_
Pas de temps min fixe par l'utilisateur.
int reprendre(Entree &) override
Reprise (lecture) du temps courant et du nombre de pas de temps effectues a partir d'un flot d'entree...
virtual bool iterateTimeStep(bool &converged)
Calculate the U(n+1) unknown for each equation (if solved) of the problem with the selected time sche...
virtual int mettre_a_jour()
Mise a jour du temps courant (t+=dt) et du nombre de pas de temps effectue (nb_pas_dt_++).
double dt_stab_
Pas de temps de stabilite.
virtual Entree & lire_temps_cpu_max(Entree &)
virtual void mettre_a_jour_dt_stab()
int temps_cpu_max_atteint() const
virtual Entree & lire_nb_pas_dt_max(Entree &)
Lecture du nombre de pas de temps maximal.
int nb_pas_dt_max() const
Renvoie une reference sur le nombre de pas maxi.
double seuil_diff_impl_
Seuil pour implicitation de la diffusion par GC.
void update_critere_statio(const DoubleTab &tab_critere, Equation_base &equation)
//Actualisation de stationnaire_atteint_ et residu_ (critere residu_<seuil_statio_)
bool ind_temps_cpu_max_atteint
void write_progress(bool init)
Ecriture du fichier .progress (temps CPU estime restant).
void finir() const
Fermeture du fichier .dt_ev.
virtual Matrice_Base & ajouter_masse(double dt, Matrice_Base &matrice, int penalisation=1) const
virtual void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, double dt, const tabs_t &semi_impl, int resoudre_en_increments) const
virtual int get_precision()
void precision(int pre) override
Classe de base des flux de sortie.
_SIZE_ size_array() const
classe TRUST_2_PDI Encapsulation of PDI methods (library used for IO operations). See the website pdi...
void stop_sharing_last_variable()
static int is_PDI_checkpoint()
void TRUST_start_sharing(const std::string &name, const void *data)
void trigger(const std::string &event)