// 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) .
//
// 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 .
//
// For more information, please consult: .
#include "Charge.h"
#include "ConstMath.h"
#include "MathUtil.h"
#include "ReferenceNE.h"
#include "ReferenceAF.h"
#include "CourbePolyLineaire1D.h"
#include "Charge.h"
#include "ConstMath.h"
#include "MathUtil.h"
#include "ReferenceNE.h"
#include "ReferenceAF.h"
#include "CourbePolyLineaire1D.h"
#include "CharUtil.h"
// avancement de la charge
// il peut y avoir plusieurs type d'avancement
// en fonction des donnees ( transparent pour l'utilisateur)
// mais aussi en fonction des parametres
// retourne false par défaut, mais si le pas de temps a été modifié
// retourne true !!, car par exemple de la fin du chargement, d'où une modif du pas
// pour obtenir exactement la fin
bool Charge::Avance() // premier version
{ // appel de la fonction ad hoc
return(this->*PtAvance)();
};
// retour de la charge au cas précédent, c'est à dire
// avant le dernier ordre d'avancement
// valeur par défaut de "exacte "
// si exacte n'est pas présent ou faux: le compteur_essai_increment d'appel de Avance(), n'est pas décrémenté
// exacte=true: le compteur_essai_increment d'appel est décrémenté, en fait on revient exactement au départ
// ce qui permet d'utiliser plusieurs fois Avance() dans un même pas de temps
// en comptabilisant par exemple qu'une seule fois un appel de Avance(), cas d'une intégration
// temporelle par exemple
void Charge::Precedant(bool exacte)
{ // appel de la fonction ad hoc
(this->*PtPrecedent)();
if (exacte) compteur_essai_increment--;
};
// diminution de l'incrément de charge dans le cas par exemple d'une non convergence
// ramène true si la diminution est effective, sinon false
bool Charge::Diminue_inc_charge(double diminue)
{ // si le type est 5, les temps de calcul sont bloqué
if (nomtypeCharge == "TYPE5")
{ if (ParaGlob::NiveauImpression() > 4)
cout << "\n TYPE5: pas de temps fige, pas de diminution permise ";
return false;
};
// autres cas:
// //on commence par revenir à la charge précédente
// (this->*PtPrecedent)();
// on divise l'incrément de temps
double deltat_essai = paAlgo->Deltat() / diminue;
// on diminue si possible
return (!(paAlgo->Modif_Deltat(deltat_essai)));
//-// deltat /= diminue;
};
// augmentation de l'incrément de charge dans le cas de bonne convergence
// ramène true si l'augmentation est effective, sinon false
bool Charge::Augmente_inc_charge(double augmente)
{ // si le type est 5, les temps de calcul sont bloqué
if (nomtypeCharge == "TYPE5")
{ if (ParaGlob::NiveauImpression() > 4)
cout << "\n TYPE5: pas de temps fige, pas d'augmentation permise ";
return false;
};
// on augmente l'incrément de temps si possible
double deltat_essai = paAlgo->Deltat() * augmente;
// on augmente si possible
bool test_augmente = paAlgo->Modif_Deltat(deltat_essai);
if (!test_augmente)
{ return true;} // si tout est ok on ramène true
else
// sinon on essaie d'augmenter dans les bornes
{return paAlgo->Modif_Detat_dans_borne(deltat_essai); };
// return (!(paAlgo->Modif_Deltat(deltat_essai)));
};
// declaration de la fin en fonction du type de chargement
// 0 : la fin n'est pas valide, on continue
// 1 : temps fin dépassé
// 2 : compteur_increment dépassé
// 3 : compteur_essai_increment dépassé
// NB: c'est d'abort le temps fin qui est testé: qui donc conduit à un arrêt normal
// puis ensuite le compteur d'incréments
// puis le nombre d'essai maxi, puis enfin le cas normal
// si affichage est true, affichage d'un message
int Charge::Fin(const int & icharge,bool affichage)
{ // appel de la fonction ad hoc
////---debug
//cout << "\n Charge::Fin(...affichage="
// << affichage << endl;
////--fin debug
return (this->*PtFin)(icharge,affichage);
};
// affichage et definition interactive des commandes
void Charge::Info_commande_LesCharges1(UtilLecture & entreePrinc)
{ // ---------- définition des différents chargements ----------
ofstream & sort = *(entreePrinc.Commande_pointInfo()); // pour simplifier
bool plusieurs_maillages = false;
string rep;
cout << "\n cas d'un seul maillage (par defaut) : rep o "
<< "\n cas de plusieurs maillages : rep n ";
// procédure de lecture avec prise en charge d'un retour chariot
rep = lect_return_defaut(true,"o");
if (rep == "n")
{ plusieurs_maillages = true;};
rep="_"; // init
//On va proposer un menu
sort << "\n\n charges #------------# ";
while ((Minuscules(rep) != "f")&&(Minuscules(rep) != "0"))
{
try
{cout
<< "\n (0 ou f) (fin) "
<< "\n (1) ponctuelle (PONCTUELLE)"
<< "\n (2) volumique (VOLUMIQUE) "
<< "\n (3) lineique de direction fixe (LINEIQUE) "
<< "\n (4) lineique suiveuse (LINEIC_SUIVEUSE) "
<< "\n (5) surfacique de direction fixe (UNIFORME)"
<< "\n (6) pression (PRESSION)"
<< "\n (7) surfacique suiveuse (PRESSDIR)"
<< "\n (8) hydrostatique (PHYDRO)"
<< "\n (9) aero - hydrodynamique (P_HYDRODYNA)"
<< "\n (10) torseur d'efforts ponctuels (TORSEUR_PONCT)"
<< "\n (11 ou ? ) informations "
<< "\n ";
// procédure de lecture avec prise en charge d'un retour chariot
rep = lect_return_defaut(false,"f");
if ((Minuscules(rep) == "f") || (Minuscules(rep) == "0"))// sortie directe
break;
int num = ChangeEntier(rep);
if (Minuscules(rep) == "?")
num = 11;
bool choix_valide=false;
if ((num >= 0)&&(num<=11))
{ choix_valide=true; }
else { cout << "\n Erreur on attendait un entier entre 0 et 11 !!, "
<< "\n redonnez une bonne valeur"
<< "\n ou taper f ou 0 pour arreter le programme";
choix_valide=false;
}
switch (num)
{ case 0: // sortie
{ break;} // normalement cela a déjà été filtré avant
case 1: // ponctuelle
{ int dim = ParaGlob::Dimension();
Coordonnee trans(dim);
string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
cout << "\n nom de la reference de noeud ? ";
string nom_ref=" ";
nom_ref=lect_chaine();cout << " nom lu = "<< nom_ref;
if (nom_ref.at(0) != 'N')
{cout << "\n *** erreur, la premiere lettre de la ref de noeud "
<< " doit etre N et non "<< nom_ref.at(0)<< " !!";
break;
};
cout << "\n donner la force ("< > bloc;
bloc.Info_commande_BlocCharge(sort);
sort << endl;
break;
}
case 2: // volumique
{string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
cout << "\n nom de la reference d'elements ? ";
string nom_ref=" ";
nom_ref=lect_chaine();cout << " nom lu = "<< nom_ref;
if (nom_ref.at(0) != 'E')
{cout << "\n *** erreur, la premiere lettre de la ref d'element "
<< " doit etre E et non "<< nom_ref.at(0)<< " !!";
break;
};
int dim = ParaGlob::Dimension();
Coordonnee trans(dim);
cout << "\n donner la charge volumique ("< > bloc;
bloc.Info_commande_BlocCharge(sort);
sort << endl;
break;
}
case 3: // lineique de direction fixe
{ int dim = ParaGlob::Dimension();
Coordonnee trans(dim);
string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
cout << "\n nom de la reference d'arete ? ";
string nom_ref=" ";
nom_ref=lect_chaine();cout << " nom lu = "<< nom_ref;
if (nom_ref.at(0) != 'A')
{cout << "\n *** erreur, la premiere lettre de la ref d'arete "
<< " doit etre A et non "<< nom_ref.at(0)<< " !!";
break;
};
cout << "\n donner la force lineique ("< > bloc;
bloc.Info_commande_BlocCharge(sort);
sort << endl;
break;
}
case 4: // lineique suiveuse
{ int dim = ParaGlob::Dimension();
Coordonnee trans(dim);
string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
cout << "\n nom de la reference d'arete ? ";
string nom_ref=" ";
nom_ref=lect_chaine();cout << " nom lu = "<< nom_ref;
if (nom_ref.at(0) != 'A')
{cout << "\n *** erreur, la premiere lettre de la ref d'arete "
<< " doit etre A et non "<< nom_ref.at(0)<< " !!";
break;
};
cout << "\n donner la force lineique ("< > bloc;
bloc.Info_commande_BlocCharge(sort);
sort << endl;
break;
}
case 5: // surfacique de direction fixe
{ int dim = ParaGlob::Dimension();
Coordonnee trans(dim);
string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
cout << "\n nom de la reference surfacique ? ";
string nom_ref=" ";
nom_ref=lect_chaine();cout << " nom lu = "<< nom_ref;
if (nom_ref.at(0) != 'F')
{cout << "\n *** erreur, la premiere lettre de la ref surfacique "
<< " doit etre F et non "<< nom_ref.at(0)<< " !!";
break;
};
cout << "\n donner la force surfacique ("< > bloc;
bloc.Info_commande_BlocCharge(sort);
sort << endl;
break;
}
case 6: // pression
{string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
cout << "\n nom de la reference surfacique ? ";
string nom_ref=" ";
nom_ref=lect_chaine();cout << " nom lu = "<< nom_ref;
if (nom_ref.at(0) != 'F')
{cout << "\n *** erreur, la premiere lettre de la ref surfacique "
<< " doit etre F et non "<< nom_ref.at(0)<< " !!";
break;
};
cout << "\n donner la charge surfacique (1 reels) ? ";
double charge;
charge=lect_double(); cout << " valeur lue ="<< charge;
// écriture de la condition
if (plusieurs_maillages)
{sort <<"\n nom_mail= "< > bloc;
bloc.Info_commande_BlocCharge(sort);
sort << endl;
break;
}
case 7: // surfacique suiveuse
{ int dim = ParaGlob::Dimension();
Coordonnee trans(dim);
string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
cout << "\n nom de la reference surfacique ? ";
string nom_ref=" ";
nom_ref=lect_chaine();cout << " nom lu = "<< nom_ref;
if (nom_ref.at(0) != 'F')
{cout << "\n *** erreur, la premiere lettre de la ref surfacique "
<< " doit etre F et non "<< nom_ref.at(0)<< " !!";
break;
};
cout << "\n donner la force surfacique ("< > bloc;
bloc.Info_commande_BlocCharge(sort);
sort << endl;
break;
}
case 8: // hydrostatique
{ string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
cout << "\n nom de la reference surfacique ? ";
string nom_ref=" ";
nom_ref=lect_chaine();cout << " nom lu = "<< nom_ref;
if (nom_ref.at(0) != 'F')
{cout << "\n *** erreur, la premiere lettre de la ref surfacique "
<< " doit etre F et non "<< nom_ref.at(0)<< " !!";
break;
};
int dim = ParaGlob::Dimension();
Coordonnee dir(dim); // direction de la force
cout << "\n donner la direction de la normale au plan de reference ("< > bloc;
// le fait de passer la chaine "sans_limitation_" en paramètre
// fait qu'il y aura interrogation pour savoir si l'on veut ou non
// cet attribut en plus
bloc.Info_commande_BlocCharge(sort,"sans_limitation_");
sort << endl;
break;
}
case 9: // aero - hydrodynamique
{ string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
cout << "\n nom de la reference surfacique ? ";
string nom_ref=" ";
nom_ref=lect_chaine();cout << " nom lu = "<< nom_ref;
if (nom_ref.at(0) != 'F')
{cout << "\n *** erreur, la premiere lettre de la ref surfacique "
<< " doit etre F et non "<< nom_ref.at(0)<< " !!";
break;
};
string nom_courbeToVt="NULL";
cout << "\n nom de la courbe to(Vt), ou NULL si l'on n'en veut pas ? ";
nom_courbeToVt=lect_chaine();cout << " nom lu = "<< nom_courbeToVt;
string nom_courbef_n="NULL";
cout << "\n nom de la courbe f_n(V), ou NULL si l'on n'en veut pas ? ";
nom_courbef_n=lect_chaine();cout << " nom lu = "<< nom_courbef_n;
string nom_courbef_t="NULL";
cout << "\n nom de la courbe f_t(V), ou NULL si l'on n'en veut pas ? ";
nom_courbef_t=lect_chaine();cout << " nom lu = "<< nom_courbef_t;
cout << "\n donner la masse volumique (1 reels) ? ";
double charge;
charge=lect_double(); cout << " valeur lue ="<< charge;
// écriture de la condition
if (plusieurs_maillages)
{sort <<"\n nom_mail= "< > bloc;
bloc.Info_commande_BlocCharge(sort);
sort << endl;
break;
}
case 10: // torseur d'efforts ponctuels
{string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
// écriture de la condition
if (plusieurs_maillages)
{sort <<"\n nom_mail= "< > bloc_tors;
bool ecriture = bloc_tors.Info_commande_Charges(plusieurs_maillages,entreePrinc);
// maintenant on s'occupe du cas courbe de charge et bornes
if (ecriture)
{bloc_tors.Info_commande_BlocCharge(sort);
sort << endl;
};
break;
}
case 11: // information
{ cout << "\n pour plus de details il faut se reporter a la documentation d'herezh++ ";
break;
}
default:
cout << "\n le cas "<= 0)&&(num<=7))
{ choix_valide=true; }
else { cout << "\n Erreur on attendait un entier entre 0 et 7 !!, "
<< "\n redonnez une bonne valeur"
<< "\n ou taper f ou 0 pour arreter le programme";
choix_valide=false;
}
switch (num)
{ case 0: // sortie
{ break;} // normalement cela a déjà été filtré avant
case 1: // (courbe: rampe + palier)
{ int dim = ParaGlob::Dimension();
Coordonnee trans(dim);
string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
cout << "\n nom de la reference de noeud ? ";
string nom_ref=" ";
nom_ref=lect_chaine();cout << " nom lu = "<< nom_ref;
if (nom_ref.at(0) != 'N')
{cout << "\n *** erreur, la premiere lettre de la ref de noeud "
<< " doit etre N et non "<< nom_ref.at(0)<< " !!";
break;
};
cout << "\n donner la force ("< > bloc;
bloc.Info_commande_BlocCharge(sort);
sort << endl;
break;
}
case 2: // volumique
{string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
cout << "\n nom de la reference d'elements ? ";
string nom_ref=" ";
nom_ref=lect_chaine();cout << " nom lu = "<< nom_ref;
if (nom_ref.at(0) != 'E')
{cout << "\n *** erreur, la premiere lettre de la ref d'element "
<< " doit etre E et non "<< nom_ref.at(0)<< " !!";
break;
};
int dim = ParaGlob::Dimension();
Coordonnee trans(dim);
cout << "\n donner la charge volumique ("< > bloc;
bloc.Info_commande_BlocCharge(sort);
sort << endl;
break;
}
case 3: // lineique de direction fixe
{ int dim = ParaGlob::Dimension();
Coordonnee trans(dim);
string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
cout << "\n nom de la reference d'arete ? ";
string nom_ref=" ";
nom_ref=lect_chaine();cout << " nom lu = "<< nom_ref;
if (nom_ref.at(0) != 'A')
{cout << "\n *** erreur, la premiere lettre de la ref d'arete "
<< " doit etre A et non "<< nom_ref.at(0)<< " !!";
break;
};
cout << "\n donner la force lineique ("< > bloc;
bloc.Info_commande_BlocCharge(sort);
sort << endl;
break;
}
case 4: // lineique suiveuse
{ int dim = ParaGlob::Dimension();
Coordonnee trans(dim);
string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
cout << "\n nom de la reference d'arete ? ";
string nom_ref=" ";
nom_ref=lect_chaine();cout << " nom lu = "<< nom_ref;
if (nom_ref.at(0) != 'A')
{cout << "\n *** erreur, la premiere lettre de la ref d'arete "
<< " doit etre A et non "<< nom_ref.at(0)<< " !!";
break;
};
cout << "\n donner la force lineique ("< > bloc;
bloc.Info_commande_BlocCharge(sort);
sort << endl;
break;
}
case 5: // surfacique de direction fixe
{ int dim = ParaGlob::Dimension();
Coordonnee trans(dim);
string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
cout << "\n nom de la reference surfacique ? ";
string nom_ref=" ";
nom_ref=lect_chaine();cout << " nom lu = "<< nom_ref;
if (nom_ref.at(0) != 'F')
{cout << "\n *** erreur, la premiere lettre de la ref surfacique "
<< " doit etre F et non "<< nom_ref.at(0)<< " !!";
break;
};
cout << "\n donner la force surfacique ("< > bloc;
bloc.Info_commande_BlocCharge(sort);
sort << endl;
break;
}
case 6: // pression
{string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
cout << "\n nom de la reference surfacique ? ";
string nom_ref=" ";
nom_ref=lect_chaine();cout << " nom lu = "<< nom_ref;
if (nom_ref.at(0) != 'F')
{cout << "\n *** erreur, la premiere lettre de la ref surfacique "
<< " doit etre F et non "<< nom_ref.at(0)<< " !!";
break;
};
cout << "\n donner la charge surfacique (1 reels) ? ";
double charge;
charge=lect_double(); cout << " valeur lue ="<< charge;
// écriture de la condition
if (plusieurs_maillages)
{sort <<"\n nom_mail= "< > bloc;
bloc.Info_commande_BlocCharge(sort);
sort << endl;
break;
}
case 7: // surfacique suiveuse
{ int dim = ParaGlob::Dimension();
Coordonnee trans(dim);
string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
cout << "\n nom de la reference surfacique ? ";
string nom_ref=" ";
nom_ref=lect_chaine();cout << " nom lu = "<< nom_ref;
if (nom_ref.at(0) != 'F')
{cout << "\n *** erreur, la premiere lettre de la ref surfacique "
<< " doit etre F et non "<< nom_ref.at(0)<< " !!";
break;
};
cout << "\n donner la force surfacique ("< > bloc;
bloc.Info_commande_BlocCharge(sort);
sort << endl;
break;
}
case 8: // hydrostatique
{ string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
cout << "\n nom de la reference surfacique ? ";
string nom_ref=" ";
nom_ref=lect_chaine();cout << " nom lu = "<< nom_ref;
if (nom_ref.at(0) != 'F')
{cout << "\n *** erreur, la premiere lettre de la ref surfacique "
<< " doit etre F et non "<< nom_ref.at(0)<< " !!";
break;
};
int dim = ParaGlob::Dimension();
Coordonnee dir(dim); // direction de la force
cout << "\n donner la direction de la normale au plan de reference ("< > bloc;
// le fait de passer la chaine "sans_limitation_" en paramètre
// fait qu'il y aura interrogation pour savoir si l'on veut ou non
// cet attribut en plus
bloc.Info_commande_BlocCharge(sort,"sans_limitation_");
sort << endl;
break;
}
case 9: // aero - hydrodynamique
{ string nom_maillage="";
if (plusieurs_maillages)
{ cout << "\n nom du maillage ? ";
nom_maillage=lect_chaine(); cout << " nom lu = "<< nom_maillage;
};
cout << "\n nom de la reference surfacique ? ";
string nom_ref=" ";
nom_ref=lect_chaine();cout << " nom lu = "<< nom_ref;
if (nom_ref.at(0) != 'F')
{cout << "\n *** erreur, la premiere lettre de la ref surfacique "
<< " doit etre F et non "<< nom_ref.at(0)<< " !!";
break;
};
string nom_courbeToVt="NULL";
cout << "\n nom de la courbe to(Vt), ou NULL si l'on n'en veut pas ? ";
nom_courbeToVt=lect_chaine();cout << " nom lu = "<< nom_courbeToVt;
string nom_courbef_n="NULL";
cout << "\n nom de la courbe f_n(V), ou NULL si l'on n'en veut pas ? ";
nom_courbef_n=lect_chaine();cout << " nom lu = "<< nom_courbef_n;
string nom_courbef_t="NULL";
cout << "\n nom de la courbe f_t(V), ou NULL si l'on n'en veut pas ? ";
nom_courbef_t=lect_chaine();cout << " nom lu = "<< nom_courbef_t;
cout << "\n donner la masse volumique (1 reels) ? ";
double charge;
charge=lect_double(); cout << " valeur lue ="<< charge;
// écriture de la condition
if (plusieurs_maillages)
{sort <<"\n nom_mail= "< > bloc;
bloc.Info_commande_BlocCharge(sort);
sort << endl;
break;
}
case 10: // information
{ cout << "\n pour plus de details il faut se reporter a la documentation d'herezh++ ";
break;
}
default:
cout << "\n le cas "<Modif_Temps(0.);//temps = 0.;
ParaGlob::param->Mise_a_jour_TEMPS_COURANT();
compteur_essai_increment = 0;multi = 0.; coeff = 0.;
} ;
void Charge::Debut2()
{paAlgo->Modif_Temps(0.);//temps = 0.;
ParaGlob::param->Mise_a_jour_TEMPS_COURANT();
compteur_essai_increment = 0;multi = 0.; coeff = 0.;
} ;
void Charge::Debut3()
{paAlgo->Modif_Temps(0.);//temps = 0.;
ParaGlob::param->Mise_a_jour_TEMPS_COURANT();
compteur_essai_increment = 0;multi = 0.; coeff = 1.; // modif 9dec2008, car a priori dans le type 3
// on veut toujours un chargement, j'espère que cela sera ok pour la statique
} ;
void Charge::Debut4()
{paAlgo->Modif_Temps(0.);//temps = 0.;
ParaGlob::param->Mise_a_jour_TEMPS_COURANT();
compteur_essai_increment = 0;multi = 0.; coeff = 0.;
} ;
void Charge::Debut5()
{// on commence par récupérer la courbe
CourbePolyLineaire1D* fconnue_charge = (CourbePolyLineaire1D*) f_charge;
// s'il y a un nombre de point inférieur à 2 -> erreur
if (fconnue_charge->NombrePoint() < 2)
{ cout << "\n **** erreur, le nombre de point definissant la courbe de chargement avec le TYPE5 "
<< " doit etre au minimum de 2 (cf. doc), ajoutez des points ou changez de type de chargement ";
Sortie(1);
};
// cas où il y a plusieurs points
// on récupère le premier point de la courbe
Coordonnee2 poin = fconnue_charge->Pt_nbi(1);
paAlgo->Modif_Temps(poin(1));//temps initial;
ParaGlob::param->Mise_a_jour_TEMPS_COURANT();
compteur_essai_increment = 0;multi = 0.;
coeff = paAlgo->Multiplicateur() * poin(2);
num_pt_courant_type5=1; ancien_num_pt_type5 = 0;
// on modifie si possible également le deltat
Coordonnee2 poin2 = fconnue_charge->Pt_nbi(2);
double deltat= poin2(1)-poin(1);;
if (deltat <= ConstMath::trespetit)
{ cout << "\n **** erreur, variation du temps nulle avec le TYPE5 de chargement"
<< " temps = " << poin(1) << " numero du point " << ancien_num_pt_type5
<< "\n evolution non permise !! modifiez votre fichier de points ";
if (ParaGlob::NiveauImpression() >= 4){ cout << "\n Charge::Debut5() ";};
Sortie(1);
};
if (paAlgo->Modif_Deltat(deltat))
{ cout << "\n **** erreur, attention la variation de deltat a ete refusee avec le TYPE5 de chargement"
<< " deltat demandee = " << deltat
<< "\n erreur de coherence dans le fichier d'entree, il ne faut pas imposer de contrainte min max ou"
<< " autre sur le pas de temps, non compatible avec le TYPE5 qui lui, necessite que le pas de temps"
<< " soit impose par les points de la courbe de chargement "
<< " modifiez vos donnees d'entree ! ";
if (ParaGlob::NiveauImpression() >= 4){ cout << "\n Charge::Debut5() ";};
Sortie(1);
};
};
void Charge::Debut6()
{ cout << "\n methode non encore implantee \n";
cout << "void Charge::Debut6()" << endl;
Sortie (1);
};
void Charge::Debut7()
{ cout << "\n methode non encore implantee \n";
cout << "void Charge::Debut7()" << endl;
Sortie (1);
};
// declaration de l'avancement en fonction du type de chargement
bool Charge::Avance1()
{ double vieuxcoef = coeff;
bool retour = false; // init
// sauvegarde des paramètres avant avancement
double temps = paAlgo->Variables_de_temps().TempsCourant();//temps;
temps_sauve = temps;
multi_sauve = multi;
coeff_sauve = coeff;
// traitement
temps +=paAlgo->Deltat(); // cas courant
// éventuellement limitation
if (temps >= paAlgo->Variables_de_temps().Tempsfin() // limitation du temps si l'on dépasse
&& (!temps_fin_non_stricte) ) // si on est en non stricte on ne vise pas le temps exact final
{// calcul du nouveau deltat
double nouveau_temps = paAlgo->Variables_de_temps().Tempsfin()-temps_sauve;
// on recadre éventuellement dans les bornes le delta t
paAlgo->Modif_Detat_dans_borne(nouveau_temps);
// on modifie le deltat
paAlgo->Modif_Deltat(nouveau_temps);
// on calcul le temps courant : si tout c'est bien passé on est au maxi
temps = temps_sauve + paAlgo->Deltat();
retour = true;
};
// mise à jour du temps courant
paAlgo->Modif_Temps(temps);
ParaGlob::param->Mise_a_jour_TEMPS_COURANT();
compteur_essai_increment++;
if (temps < tabType(1))
{// fonction lineaire en fonction du temps
multi = paAlgo->Multiplicateur() * paAlgo->Deltat()/tabType(1);
coeff += multi;
}
else
{ // palier
coeff = paAlgo->Multiplicateur();
multi = coeff - vieuxcoef;
};
// retour
return retour;
};
bool Charge::Avance2()
{ double vieuxcoef = coeff;
bool retour = false; // init
// sauvegarde des paramètres avant avancement
double temps = paAlgo->Variables_de_temps().TempsCourant();
temps_sauve = temps;
multi_sauve = multi;
coeff_sauve = coeff;
// traitement
temps +=paAlgo->Deltat();
// éventuellement limitation
if (temps >= paAlgo->Variables_de_temps().Tempsfin() // limitation du temps si l'on dépasse
&& (!temps_fin_non_stricte) ) // si on est en non stricte on ne vise pas le temps exact final
{// calcul du nouveau deltat
double nouveau_temps = paAlgo->Variables_de_temps().Tempsfin()-temps_sauve;
// on recadre éventuellement dans les bornes le delta t
paAlgo->Modif_Detat_dans_borne(nouveau_temps);
// on modifie le deltat
paAlgo->Modif_Deltat(nouveau_temps);
// on calcul le temps courant : si tout c'est bien passé on est au maxi
temps = temps_sauve + paAlgo->Deltat();
retour = true;
};
// mise à jour du temps courant
paAlgo->Modif_Temps(temps);
ParaGlob::param->Mise_a_jour_TEMPS_COURANT();
compteur_essai_increment++;
if (temps < tabType(1))
{// fonction lineaire en fonction du temps
multi = paAlgo->Multiplicateur() * paAlgo->Deltat()/tabType(1);
coeff += multi;
}
else if ((temps >= tabType(1)) && (temps <= tabType(2)))
// phase de stabilisation c-a-dire le palier
{ // palier
coeff = paAlgo->Multiplicateur();
multi = coeff - vieuxcoef;
}
else
// on a dépassé t2, les coef sont mis à zéro brutalement
{
coeff = 0.;
multi = 0.;
};
// retour
return retour;
};
bool Charge::Avance3()
{ double vieuxcoef = coeff;
bool retour = false; // init
// sauvegarde des paramètres avant avancement
double temps = paAlgo->Variables_de_temps().TempsCourant();
temps_sauve = temps;
multi_sauve = multi;
coeff_sauve = coeff;
// traitement
temps +=paAlgo->Deltat();
// éventuellement limitation
if (temps >= paAlgo->Variables_de_temps().Tempsfin() // limitation du temps si l'on dépasse
&& (!temps_fin_non_stricte) ) // si on est en non stricte on ne vise pas le temps exact final
{// calcul du nouveau deltat
double nouveau_temps = paAlgo->Variables_de_temps().Tempsfin()-temps_sauve;
// on recadre éventuellement dans les bornes le delta t
paAlgo->Modif_Detat_dans_borne(nouveau_temps);
// on modifie le deltat
paAlgo->Modif_Deltat(nouveau_temps);
// on calcul le temps courant : si tout c'est bien passé on est au maxi
temps = temps_sauve + paAlgo->Deltat();
retour = true;
};
// mise à jour du temps courant
paAlgo->Modif_Temps(temps);
ParaGlob::param->Mise_a_jour_TEMPS_COURANT();
compteur_essai_increment++;
// ici le coefficient multiplicateur est 1 quelque soit le temps
coeff = 1.;
multi = coeff - vieuxcoef;;
// retour
return retour;
};
bool Charge::Avance4()
{ double vieuxcoef = coeff;
bool retour = false; // init
// sauvegarde des paramètres avant avancement
double temps = paAlgo->Variables_de_temps().TempsCourant();
temps_sauve = temps;
multi_sauve = multi;
coeff_sauve = coeff;
// traitement
temps +=paAlgo->Deltat();
// éventuellement limitation
if (temps >= paAlgo->Variables_de_temps().Tempsfin() // limitation du temps si l'on dépasse
&& (!temps_fin_non_stricte) ) // si on est en non stricte on ne vise pas le temps exact final
{// calcul du nouveau deltat
double nouveau_temps = paAlgo->Variables_de_temps().Tempsfin()-temps_sauve;
// on recadre éventuellement dans les bornes le delta t
paAlgo->Modif_Detat_dans_borne(nouveau_temps);
// on modifie le deltat
paAlgo->Modif_Deltat(nouveau_temps);
// on calcul le temps courant : si tout c'est bien passé on est au maxi
temps = temps_sauve + paAlgo->Deltat();
retour = true;
};
// mise à jour du temps courant
paAlgo->Modif_Temps(temps);
ParaGlob::param->Mise_a_jour_TEMPS_COURANT();
compteur_essai_increment++;
coeff = paAlgo->Multiplicateur() * f_charge->Valeur(temps);
multi = coeff - vieuxcoef;
// retour
return retour;
};
bool Charge::Avance5()
{ double vieuxcoef = coeff;
bool retour = false; // init
// sauvegarde des paramètres avant avancement
double temps = paAlgo->Variables_de_temps().TempsCourant();
temps_sauve = temps;
multi_sauve = multi;
coeff_sauve = coeff;
// --- traitement
// on commence par récupérer la courbe
CourbePolyLineaire1D* fconnue_charge = (CourbePolyLineaire1D*) f_charge;
ancien_num_pt_type5 = num_pt_courant_type5;
// on regarde si l'on peut incrémenter le temps
if (num_pt_courant_type5 < fconnue_charge->NombrePoint())
{ // ok
num_pt_courant_type5++; // incrémente le num de point
// récup du point
Coordonnee2 poin = fconnue_charge->Pt_nbi(num_pt_courant_type5);
temps = poin(1);
paAlgo->Modif_Temps(temps); // on affecte le temps
ParaGlob::param->Mise_a_jour_TEMPS_COURANT();
// on modifie si possible également le deltat
double deltat= temps-temps_sauve;
if (deltat <= ConstMath::trespetit)
{ cout << "\n **** erreur, variation du temps nulle avec le TYPE5 de chargement"
<< " temps = " << temps << " numero du point " << ancien_num_pt_type5
<< "\n evolution non permise !! modifiez votre fichier de points ";
Sortie(1);
}
if (paAlgo->Modif_Deltat(deltat))
{ cout << "\n **** Erreur , attention la variation de deltat a ete refusee avec le TYPE5 de chargement"
<< " deltat demandee = " << deltat
<< "\n erreur de coherence dans le fichier d'entree, il ne faut pas imposer de contrainte min max ou"
<< " autre sur le pas de temps, non compatible avec le TYPE5 qui lui, necessite que le pas de temps"
<< " soit impose par les points de la courbe de chargement "
<< " modifiez vos donnees d'entree ! ";
Sortie(1);
}
compteur_essai_increment++;
coeff = paAlgo->Multiplicateur() * poin(2);
multi = coeff - vieuxcoef;
retour = true;
};
// sinon on ne fait rien, mais le calcul va s'arrêter
// retour
return retour;
};
bool Charge::Avance6()
{ cout << "\n methode non encore implantee \n";
cout << "double Charge::Avance6()" << endl;
Sortie (1);
return false;
};
bool Charge::Avance7()
{ cout << "\n methode non encore implantee \n";
cout << "double Charge::Avance7()" << endl;
Sortie (1);
return false;
};
// declaration du retour à l'incrément précédent en fonction du type de chargement
void Charge::Precedent1()
{ // récupération des paramètres avant avancement
paAlgo->Modif_Temps(temps_sauve);//temps = temps_sauve;
ParaGlob::param->Mise_a_jour_TEMPS_COURANT();
multi = multi_sauve;
coeff = coeff_sauve;
};
void Charge::Precedent2()
{ // récupération des paramètres avant avancement
paAlgo->Modif_Temps(temps_sauve);//temps = temps_sauve;
ParaGlob::param->Mise_a_jour_TEMPS_COURANT();
multi = multi_sauve;
coeff = coeff_sauve;
};
void Charge::Precedent3()
{ // récupération des paramètres avant avancement
paAlgo->Modif_Temps(temps_sauve);//temps = temps_sauve;
ParaGlob::param->Mise_a_jour_TEMPS_COURANT();
multi = multi_sauve;
coeff = coeff_sauve;
};
void Charge::Precedent4()
{ // récupération des paramètres avant avancement
paAlgo->Modif_Temps(temps_sauve);//temps = temps_sauve;
ParaGlob::param->Mise_a_jour_TEMPS_COURANT();
multi = multi_sauve;
coeff = coeff_sauve;
};
void Charge::Precedent5()
{ // récupération des paramètres avant avancement
paAlgo->Modif_Temps(temps_sauve);//temps = temps_sauve;
ParaGlob::param->Mise_a_jour_TEMPS_COURANT();
multi = multi_sauve;
coeff = coeff_sauve;
num_pt_courant_type5=ancien_num_pt_type5;
};
void Charge::Precedent6()
{ cout << "\n methode non encore implantee \n";
cout << "double Charge::Precedent6()" << endl;
Sortie (1);
};
void Charge::Precedent7()
{ cout << "\n methode non encore implantee \n";
cout << "double Charge::Precedent7()" << endl;
Sortie (1);
};
// declaration de la fin en fonction du type de chargement
// 0 : la fin n'est pas valide, on continue
// 1 : temps fin dépassé
// 2 : compteur_increment dépassé
// 3 : compteur_essai_increment dépassé
// NB: c'est d'abort le temps fin qui est testé: qui donc conduit à un arrêt normal
// puis ensuite le compteur d'incréments
// puis le nombre d'essai maxi, puis enfin le cas normal
// si affichage est true, affichage d'un message
int Charge::Fin1(const int & icharge,bool affichage)
{ double temps = paAlgo->Variables_de_temps().TempsCourant();
if ((temps > paAlgo->Tempsfin()) || (Dabs(temps - paAlgo->Tempsfin()) <= paAlgo->Prectemps()))
{
#ifdef UTILISATION_MPI
if (ParaGlob::Monde()->rank() == 0)
#endif
if ((ParaGlob::NiveauImpression() >= 1)&& affichage)
{ cout << "\n >>>> temps fin ("<Tempsfin()<<") atteint <<<<< " << temps << endl ;};
return 1;
}
// else if (icharge >= paAlgo->Maxincre())
else if (icharge > paAlgo->Maxincre()) // modif 14 sept 2015
{
#ifdef UTILISATION_MPI
if (ParaGlob::Monde()->rank() == 0)
#endif
if (affichage) cout << "\n maximum d'increments fixes atteint : "<< paAlgo->Maxincre()
<< "\n (pour info: maximum d'essai calcul increments = "<< paAlgo->Max_essai_incre()<<") "
<< endl ;
return 2;
}
else if (compteur_essai_increment > paAlgo->Max_essai_incre())
{
#ifdef UTILISATION_MPI
if (ParaGlob::Monde()->rank() == 0)
#endif
if (affichage) cout << "\n maximum d'essai d'increments fixes atteint : "<< paAlgo->Max_essai_incre() << endl ;
return 3;
}
else
return 0;
};
int Charge::Fin2(const int & icharge,bool affichage)
{ double temps = paAlgo->Variables_de_temps().TempsCourant();
if ((temps > paAlgo->Tempsfin()) || (Dabs(temps - paAlgo->Tempsfin()) <= paAlgo->Prectemps()))
{
#ifdef UTILISATION_MPI
if (ParaGlob::Monde()->rank() == 0)
#endif
if ((ParaGlob::NiveauImpression() >= 1)&& affichage)
{ cout << "\n >>>> temps fin ("<Tempsfin()<<") atteint <<<<< " << temps << endl ;};
return 1;
}
// else if (icharge >= paAlgo->Maxincre())
else if (icharge > paAlgo->Maxincre()) // modif 14 sept 2015
{
#ifdef UTILISATION_MPI
if (ParaGlob::Monde()->rank() == 0)
#endif
if (affichage) cout << "\n maximum d'increments fixes atteint : "<< paAlgo->Maxincre()
<< "\n (pour info: maximum d'essai calcul increments = "<< paAlgo->Max_essai_incre()<<") "
<< endl ;
return 2;
}
else if (compteur_essai_increment >= paAlgo->Max_essai_incre())
{if (affichage) cout << "\n maximum d'essai d'increments fixes atteint : "<< paAlgo->Max_essai_incre() << endl ;
return 3;
}
else
return 0;
};
int Charge::Fin3(const int & icharge,bool affichage)
{ double temps = paAlgo->Variables_de_temps().TempsCourant();
if ((temps > paAlgo->Tempsfin()) || (Dabs(temps - paAlgo->Tempsfin()) <= paAlgo->Prectemps()))
{
#ifdef UTILISATION_MPI
if (ParaGlob::Monde()->rank() == 0)
#endif
if ((ParaGlob::NiveauImpression() >= 1)&& affichage)
{ cout << "\n >>>> temps fin ("<Tempsfin()<<") atteint <<<<< " << temps << endl ;};
return 1;
}
// else if (icharge >= paAlgo->Maxincre())
else if (icharge > paAlgo->Maxincre()) // modif 14 sept 2015
{
#ifdef UTILISATION_MPI
if (ParaGlob::Monde()->rank() == 0)
#endif
if (affichage) cout << "\n maximum d'increments fixes atteint : "<< paAlgo->Maxincre()
<< "\n (pour info: maximum d'essai calcul increments = "<< paAlgo->Max_essai_incre()<<") "
<< endl ;
return 2;
}
else if (compteur_essai_increment >= paAlgo->Max_essai_incre())
{
#ifdef UTILISATION_MPI
if (ParaGlob::Monde()->rank() == 0)
#endif
if (affichage) cout << "\n maximum d'essai d'increments fixes atteint : "<< paAlgo->Max_essai_incre() << endl ;
return 3;
}
else
return 0;
};
int Charge::Fin4(const int & icharge,bool affichage)
{ double temps = paAlgo->Variables_de_temps().TempsCourant();
if ((temps > paAlgo->Tempsfin()) || (Dabs(temps - paAlgo->Tempsfin()) <= paAlgo->Prectemps()))
{
#ifdef UTILISATION_MPI
if (ParaGlob::Monde()->rank() == 0)
#endif
if ((ParaGlob::NiveauImpression() >= 1)&& affichage)
{ cout << "\n >>>> temps fin ("<Tempsfin()<<") atteint <<<<< " << temps << endl ;};
return 1;
}
// else if (icharge >= paAlgo->Maxincre())
else if (icharge > paAlgo->Maxincre()) // modif 14 sept 2015
{
#ifdef UTILISATION_MPI
if (ParaGlob::Monde()->rank() == 0)
#endif
if (affichage) cout << "\n maximum d'increments fixes atteint : "<< paAlgo->Maxincre()
<< "\n (pour info: maximum d'essai calcul increments = "<< paAlgo->Max_essai_incre()<<") "
<< endl ;
return 2;
}
else if (compteur_essai_increment >= paAlgo->Max_essai_incre())
{
#ifdef UTILISATION_MPI
if (ParaGlob::Monde()->rank() == 0)
#endif
if (affichage) cout << "\n maximum d'essai d'increments fixes atteint : "<< paAlgo->Max_essai_incre() << endl ;
return 3;
}
else
return 0;
};
int Charge::Fin5(const int & icharge,bool affichage)
{ // on commence par récupérer la courbe
CourbePolyLineaire1D* fconnue_charge = (CourbePolyLineaire1D*) f_charge;
double temps = paAlgo->Variables_de_temps().TempsCourant(); // puis le temps
if ((temps > paAlgo->Tempsfin()) || (Dabs(temps - paAlgo->Tempsfin()) <= paAlgo->Prectemps()))
{
#ifdef UTILISATION_MPI
if (ParaGlob::Monde()->rank() == 0)
#endif
if ((ParaGlob::NiveauImpression() >= 1)&& affichage)
{ cout << "\n >>>> temps fin ("<Tempsfin()<<") atteint <<<<< " << temps << endl ;};
return 1;
}
else if ( num_pt_courant_type5 == fconnue_charge->NombrePoint())
{
#ifdef UTILISATION_MPI
if (ParaGlob::Monde()->rank() == 0)
#endif
if (affichage) cout << "\n >>>> dernier temps de la courbe de charge atteint <<<<< " << endl ;
return 1;
}
// else if (icharge >= paAlgo->Maxincre())
else if (icharge > paAlgo->Maxincre()) // modif 14 sept 2015
{
#ifdef UTILISATION_MPI
if (ParaGlob::Monde()->rank() == 0)
#endif
if (affichage) cout << "\n maximum d'increments fixes atteint : "<< paAlgo->Maxincre()
<< "\n (pour info: maximum d'essai calcul increments = "<< paAlgo->Max_essai_incre()<<") "
<< endl ;
return 2;
}
else if (compteur_essai_increment >= paAlgo->Max_essai_incre())
{
#ifdef UTILISATION_MPI
if (ParaGlob::Monde()->rank() == 0)
#endif
if (affichage) cout << "\n maximum d'essai d'increments fixes atteint : "<< paAlgo->Max_essai_incre() << endl ;
return 3;
}
else
return 0;
};
int Charge::Fin6(const int & icharge,bool affichage)
{ cout << "\n methode non encore implantee \n";
cout << "int Charge::Fin6()" << endl;
Sortie (1);
return 0;
};
int Charge::Fin7(const int & icharge,bool affichage)
{ cout << "\n methode non encore implantee \n";
cout << "int Charge::Fin7()" << endl;
Sortie (1);
return 0;
};