// 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 "DiversStockage.h"
#include "CharUtil.h"
#include "Ddl_enum_etendu.h"
DiversStockage::DiversStockage () : // constructeur par defaut
tabEpaiss(),tabLargeurs(),tabSection(),tabMasseAddi(),tabMasseVolu(),tabCoefDila()
,tabGesHourglass(),tabIntegVol(),tabIntegVol_et_temps(),tabStabMembraneBiel()
,tabRepAnisotrope(),tabStatistique(),tabStatistique_et_temps()
{
}
// affichage des infos
void DiversStockage::Affiche () const // affichage de tous les infos
{ Affiche1();
Affiche2();
}
void DiversStockage::Affiche1 () const
{ bool te = false;
if (tabEpaiss.Taille() != 0)
{if (!te)
{cout << "\n ******** DiversStockages 1er lecture ******** \n";te = true;}
cout << tabEpaiss.Taille() << " reference(s) d epaisseur lue \n";
for (int i=1; i<=tabEpaiss.Taille(); i++)
tabEpaiss(i).Affiche();
cout << "\n\n";
}
if (tabLargeurs.Taille() != 0)
{if (!te)
{cout << "\n ******** DiversStockages 1er lecture ******** \n";te = true;}
cout << tabLargeurs.Taille() << " reference(s) de largeur lue \n";
for (int i=1; i<=tabLargeurs.Taille(); i++)
tabLargeurs(i).Affiche();
cout << "\n\n";
}
if (tabSection.Taille() != 0)
{if (!te)
{cout << "\n ******** DiversStockages 1er lecture ******** \n";te = true;}
cout << tabSection.Taille() << " reference(s) de section lue \n";
for (int i=1; i<=tabSection.Taille(); i++)
tabSection(i).Affiche();
cout << "\n\n";
}
if (tabVarSection.Taille() != 0)
{if (!te)
{cout << "\n ******** DiversStockages 1er lecture ******** \n";te = true;}
cout << tabVarSection.Taille() << " reference(s) de variation de section lue \n";
for (int i=1; i<=tabVarSection.Taille(); i++)
tabVarSection(i).Affiche();
cout << "\n\n";
}
if (tabMasseVolu.Taille() != 0)
{if (!te)
{cout << "\n ******** DiversStockages 1er lecture ******** \n";te = true;}
cout << tabMasseVolu.Taille() << " reference(s) de masse volumique lue \n";
for (int i=1; i<=tabMasseVolu.Taille(); i++)
tabMasseVolu(i).Affiche();
cout << "\n\n";
}
if (tabCoefDila.Taille() != 0)
{if (!te)
{cout << "\n ******** DiversStockages 1er lecture ******** \n";te = true;}
cout << tabCoefDila.Taille() << " reference(s) de coefficient de dilatation thermique lue \n";
for (int i=1; i<=tabCoefDila.Taille(); i++)
tabCoefDila(i).Affiche();
cout << "\n\n";
}
if (tabGesHourglass.Taille() != 0)
{if (!te)
{cout << "\n ******** DiversStockages 1er lecture ******** \n";te = true;}
cout << tabGesHourglass.Taille() << " reference(s) de blocage d'hourglass lue \n";
for (int i=1; i<=tabGesHourglass.Taille(); i++)
tabGesHourglass(i).Affiche();
cout << "\n\n";
}
if (tabIntegVol.Taille() != 0)
{if (!te)
{cout << "\n ******** DiversStockages 1er lecture ******** \n";te = true;}
cout << tabIntegVol.Taille() << " reference(s) de grandeur a integrer sur le volume \n";
for (int i=1; i<=tabIntegVol.Taille(); i++)
tabIntegVol(i).Affiche();
cout << "\n\n";
};
if (tabIntegVol_et_temps.Taille() != 0)
{if (!te)
{cout << "\n ******** DiversStockages 1er lecture ******** \n";te = true;}
cout << tabIntegVol_et_temps.Taille() << " reference(s) de grandeur a integrer sur le volume et dans le temps \n";
for (int i=1; i<=tabIntegVol_et_temps.Taille(); i++)
tabIntegVol_et_temps(i).Affiche();
cout << "\n\n";
};
if (tabStabMembraneBiel.Taille() != 0)
{if (!te)
{cout << "\n ******** DiversStockages 1er lecture ******** \n";te = true;}
cout << tabStabMembraneBiel.Taille() << " reference(s) de stabilisation transversale \n";
for (int i=1; i<=tabStabMembraneBiel.Taille(); i++)
tabStabMembraneBiel(i).Affiche();
cout << "\n\n";
};
if (tabRepAnisotrope.Taille() != 0)
{if (!te)
{cout << "\n ******** DiversStockages 1er lecture ******** \n";te = true;}
cout << tabRepAnisotrope.Taille() << " reference(s) de def de repere d'anisotropie \n";
for (int i=1; i<=tabRepAnisotrope.Taille(); i++)
tabRepAnisotrope(i).Affiche();
cout << "\n\n";
};
if (tabStatistique.Taille() != 0)
{if (!te)
{cout << "\n ******** DiversStockages 1er lecture ******** \n";te = true;}
cout << tabStatistique.Taille()
<< " reference(s) d'une statistique d'une ref de noeuds pour une grandeur quelconque \n";
for (int i=1; i<=tabStatistique.Taille(); i++)
tabStatistique(i).Affiche();
cout << "\n\n";
};
if (tabStatistique_et_temps.Taille() != 0)
{if (!te)
{cout << "\n ******** DiversStockages 1er lecture ******** \n";te = true;}
cout << tabStatistique_et_temps.Taille()
<< " reference(s) d'une statistique d'une ref de noeuds cumulee en temps pour une grandeur queconque \n";
for (int i=1; i<=tabStatistique_et_temps.Taille(); i++)
tabStatistique_et_temps(i).Affiche();
cout << "\n\n";
};
cout << endl;
};
void DiversStockage::Affiche2 () const
{ bool te = false;
if (tabMasseAddi.Taille() != 0)
{if (!te)
{cout << "\n ******** DiversStockages 2ieme lecture ******** \n"; te = true;}
cout << tabMasseAddi.Taille() << " reference(s) de masse additionnelle lue \n";
for (int i=1; i<=tabMasseAddi.Taille(); i++)
tabMasseAddi(i).Affiche();
cout << "\n\n";
}
cout << endl;
};
// lecture des infos
void DiversStockage::Lecture1(UtilLecture & entreePrinc,LesReferences& lesRef)
{ MotCle motCle; // ref aux mots cle
// on se positionne sur un mot cle
while ( !motCle.SimotCle(entreePrinc.tablcar))
entreePrinc.NouvelleDonnee();
bool sortie_info = false;
if ( (strstr(entreePrinc.tablcar,"epaisseurs")!=NULL) ||
(strstr(entreePrinc.tablcar,"largeurs")!=NULL) ||
(strstr(entreePrinc.tablcar,"masse_volumique")!=NULL) ||
(strstr(entreePrinc.tablcar,"dilatation_thermique")!=NULL) ||
(strstr(entreePrinc.tablcar,"hourglass_gestion_")!=NULL) ||
(strstr(entreePrinc.tablcar,"sections")!=NULL) ||
(strstr(entreePrinc.tablcar,"variation_section")!=NULL) ||
(strstr(entreePrinc.tablcar,"integrale_sur_volume_")!=NULL) ||
(strstr(entreePrinc.tablcar,"integrale_sur_vol_et_temps_")!=NULL) ||
(strstr(entreePrinc.tablcar,"stabilisation_transvers_membrane_biel_")!=NULL) ||
(strstr(entreePrinc.tablcar,"repere_anisotropie_")!=NULL) ||
(strstr(entreePrinc.tablcar,"statistique_sur_RefNoeuds_")!=NULL) ||
(strstr(entreePrinc.tablcar,"statistique_sur_RefNoeuds_et_temps_")!=NULL)
)
{if (ParaGlob::NiveauImpression() >= 4)
cout << " debut de la lecture des divers stockages 1 " << endl;
sortie_info = true;
};
// def d'une classe de lecture de bloc scalaire
LectBloc < BlocDdlLim > lecScal;
// def d'une classe de lecture de bloc BlocScal_ou_fctnD
LectBloc < BlocDdlLim > lecBlocScal_ou_fctnD;
// def d'une classe de lecture de bloc généraux
LectBloc < BlocDdlLim > lecGen;
// def d'une classe de lecture de bloc généraux pour les intégrales
LectBloc < BlocDdlLim > lecGen3_0;
// def d'une classe de lecture de bloc généraux pour la stabilisation membrane et/ou biel
// ici par défaut c'est un bloc 4,0 mais peut s'agrandir en fonction de la lecture
// cependant on garde le type BlocGen_4_0 car on ne peut pas faire de BlocDdlLim
// d'un bloc gen (4,0)
LectBloc < BlocDdlLim > lecGen4_0;
// def d'une classe de lecture de bloc généraux pour la définition de repère d'anisotropie
LectBloc < BlocDdlLim > lecGen6_0;
// maintenant il faut gérer le fait que l'on peut avoir les infos dans le désordre
// c'est à dire par exemple épaisseurs puis largeur, ou encore l'inverse etc..
// on doit arrêter la procédure de lecture lorqu'il n'y a plus a lire
while ( (strstr(entreePrinc.tablcar,"epaisseurs")!=NULL) ||
(strstr(entreePrinc.tablcar,"largeurs")!=NULL) ||
(strstr(entreePrinc.tablcar,"masse_volumique")!=NULL) ||
(strstr(entreePrinc.tablcar,"dilatation_thermique")!=NULL) ||
(strstr(entreePrinc.tablcar,"hourglass_gestion_")!=NULL) ||
(strstr(entreePrinc.tablcar,"sections")!=NULL) ||
(strstr(entreePrinc.tablcar,"variation_section")!=NULL) ||
(strstr(entreePrinc.tablcar,"integrale_sur_volume_")!=NULL) ||
(strstr(entreePrinc.tablcar,"integrale_sur_vol_et_temps_")!=NULL) ||
(strstr(entreePrinc.tablcar,"stabilisation_transvers_membrane_biel_")!=NULL) ||
(strstr(entreePrinc.tablcar,"repere_anisotropie_")!=NULL) ||
(strstr(entreePrinc.tablcar,"statistique_sur_RefNoeuds_")!=NULL) ||
(strstr(entreePrinc.tablcar,"statistique_sur_RefNoeuds_et_temps_")!=NULL)
)
{
// lecture eventuelle des epaisseurs
lecBlocScal_ou_fctnD.Lecture(entreePrinc,lesRef,"epaisseurs",
" lecture des epaisseurs ",tabEpaiss);
// lecture eventuelle des largeurs
lecBlocScal_ou_fctnD.Lecture(entreePrinc,lesRef,"largeurs",
" lecture des largeurs ",tabLargeurs);
// lecture eventuelle des sections
lecBlocScal_ou_fctnD.Lecture(entreePrinc,lesRef,"sections",
" lecture des sections ",tabSection);
// lecture eventuelle des variations de section
lecScal.Lecture(entreePrinc,lesRef,"variation_section",
" lecture des sections ",tabVarSection);
// lecture eventuelle des masse_volumiques
lecBlocScal_ou_fctnD.Lecture(entreePrinc,lesRef,"masse_volumique",
" lecture des masse_volumique ",tabMasseVolu);
// lecture eventuelle des coefficients de dilatation thermique
lecBlocScal_ou_fctnD.Lecture(entreePrinc,lesRef,"dilatation_thermique",
" lecture des coefficients de dilatation thermique ",tabCoefDila);
// lecture eventuelle de la gestion des modes d'hourglass
lecGen.Lecture(entreePrinc,lesRef,"hourglass_gestion_",
" lecture de la gestion des modes d'hourglass ",tabGesHourglass);
// lecture eventuelle des intégrales sur le volume
lecGen3_0.Lecture(entreePrinc,lesRef,"integrale_sur_volume_",
" lecture des integrales sur le volume ",tabIntegVol);
// lecture eventuelle des intégrales sur le volume et sur le temps
lecGen3_0.Lecture(entreePrinc,lesRef,"integrale_sur_vol_et_temps_",
" lecture des integrales sur le volume et le temps ",tabIntegVol_et_temps);
// lecture eventuelle d'une stabilisation transversale de membrane ou biel
lecGen4_0.Lecture(entreePrinc,lesRef,"stabilisation_transvers_membrane_biel_",
" lecture des stabilisations transversales ",tabStabMembraneBiel);
// lecture eventuelle de repère d'anisotropie à des éléments
lecGen6_0.Lecture(entreePrinc,lesRef,"repere_anisotropie_",
" lecture d'un repere d'anisotropie ",tabRepAnisotrope);
// lecture eventuelle des statistiques de ref de noeuds pour une grandeur quelconque
lecGen3_0.Lecture(entreePrinc,lesRef,"statistique_sur_RefNoeuds_",
" lecture des statistique_sur_RefNoeuds_ ",tabStatistique);
// lecture eventuelle des statistiques de ref de noeuds pour une grandeur
// quelconque avec cumul sur le temps
lecGen3_0.Lecture(entreePrinc,lesRef,"statistique_sur_RefNoeuds_et_temps_",
" lecture des statistique_sur_RefNoeuds_et_temps_",tabStatistique_et_temps);
};
////----- debug ---
//cout << "\n debug DiversStockage::Lecture1( "
// << "\n tabRepAnisotrope= "<< tabRepAnisotrope << endl;
////---- fin debug ---
// on vérifie qu'il n'y a pas 2 fois exactements les mêmes intégrales a effectuer, si oui on couine
// car cela va poser des pb
{int taille = tabIntegVol.Taille();
for (int i=1;i<= taille-1;i++)
for (int j=i+1;j<= taille;j++)
if (tabIntegVol(i) == tabIntegVol(j))
{cout << "\n erreur*** il y a deux integrales de volume qui sont strictement identiques "
<< " cela va poser des problemes de referencement a l'execution, il faut en supprimer une !! "
<< "\n integrale: "<< tabIntegVol(i)
<< endl;
Sortie(1);
};
};
{int taille = tabIntegVol_et_temps.Taille();
for (int i=1;i<= taille-1;i++)
for (int j=i+1;j<= taille;j++)
if (tabIntegVol_et_temps(i) == tabIntegVol_et_temps(j))
{cout << "\n erreur*** il y a deux integrales de volume et en temps qui sont strictement identiques "
<< " cela va poser des problemes de referencement a l'execution, il faut en supprimer une !! "
<< "\n integrale: "<< tabIntegVol_et_temps(i)
<< endl;
Sortie(1);
};
};
// on vérifie qu'il n'y a pas 2 fois exactements les mêmes statistique a effectuer, si oui on couine
// car cela va poser des pb
{int taille = tabStatistique.Taille();
for (int i=1;i<= taille-1;i++)
for (int j=i+1;j<= taille;j++)
if (tabStatistique(i) == tabStatistique(j))
{cout << "\n erreur*** il y a deux statistiques qui sont strictement identiques "
<< " cela va poser des problemes de referencement a l'execution, il faut en supprimer une !! "
<< "\n statistique: "<< tabStatistique(i)
<< endl;
Sortie(1);
};
};
{int taille = tabStatistique_et_temps.Taille();
for (int i=1;i<= taille-1;i++)
for (int j=i+1;j<= taille;j++)
if (tabStatistique_et_temps(i) == tabStatistique_et_temps(j))
{cout << "\n erreur*** il y a deux statistiques avec cumul en temps qui sont strictement identiques "
<< " cela va poser des problemes de referencement a l'execution, il faut en supprimer une !! "
<< "\n statistiques: "<< tabStatistique_et_temps(i)
<< endl;
Sortie(1);
};
};
if ((ParaGlob::NiveauImpression() >= 4) && sortie_info)
cout << " fin de la lecture des divers stockages 1 " << endl;
};
// dans la seconde lecture il s'agit des masses additionnelles
void DiversStockage::Lecture2(UtilLecture & entreePrinc,LesReferences& lesRef)
{ MotCle motCle; // ref aux mots cle
// on se positionne sur un mot cle
while ( !motCle.SimotCle(entreePrinc.tablcar))
entreePrinc.NouvelleDonnee();
bool sortie_info = false;
if ( (strstr(entreePrinc.tablcar,"masse_addi")!=NULL) )
{if (ParaGlob::NiveauImpression() >= 4)
cout << " debut de la lecture des divers stockages 2 " << endl;
sortie_info = true;
}
// def d'une classe de lecture de bloc scalaire
LectBloc < BlocDdlLim > lecScal;
// lecture eventuelle des masses
lecScal.Lecture(entreePrinc,lesRef,"masse_addi",
" lecture des masses additionnelles ",tabMasseAddi);
if ((ParaGlob::NiveauImpression() >= 4) && sortie_info)
cout << " fin de la lecture des divers stockages 2 " << endl;
};
// affichage et definition interactive des commandes
void DiversStockage::Info_commande_DiversStockage1(UtilLecture & entreePrinc)
{ ofstream & sort = *(entreePrinc.Commande_pointInfo()); // pour simplifier
//On va proposer un menu
string rep=" ";
bool plusieurs_maillages = false;
sort << "\n# --- divers stockages (1) ------- ";
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
while ((Minuscules(rep) != "f")&&(Minuscules(rep) != "0"))
{
try
{
cout << "\n -- definition de : --- "
<< "\n (0 ou f) (fin) "
<< "\n (1) epaisseurs "
<< "\n (2) largeurs "
<< "\n (3) sections "
<< "\n (4) variation de section "
<< "\n (5) masse volumique (obligatoire)"
<< "\n (6) dilatation_thermique "
<< "\n (7) gestion hourglass "
<< "\n (8) integrale sur volume "
<< "\n (9) integrale sur volume et temps "
<< "\n (10) stabilisation transversale "
<< "\n (11) repere d'anisotropie "
<< "\n (12) statistique sur ref de noeuds "
<< "\n (13) statistique sur ref de noeuds et temps "
<< "\n (14 ou ? ) informations "
<< "\n ";
rep = lect_return_defaut(false,"f");
if ((Minuscules(rep) == "f") || (Minuscules(rep) == "0"))// sortie directe
break;
int num = ChangeEntier(rep);
if (Minuscules(rep) == "?")
num = 14;
bool choix_valide=false;
if ((num >= 0)&&(num< 15))
{ choix_valide=true; }
else { cout << "\n Erreur on attendait un entier entre 0 et 14 !!, "
<< "\n redonnez une bonne valeur"
<< "\n ou taper f ou 0 pour arreter le programme";
choix_valide=false;
}
string grandeur=" "; // init
// cas d'une grandeur simple
switch (num)
{ case 1: grandeur = "epaisseurs";break;
case 2: grandeur = "largeurs";break;
case 3: grandeur = "sections";break;
case 4: grandeur = "variation_section";break;
case 5: grandeur = "masse_volumique";break;
case 6: grandeur = "dilatation_thermique";break;
case 7: grandeur = "hourglass_gestion_";break;
case 8: grandeur = "integrale_sur_volume_";break;
case 9: grandeur = "integrale_sur_vol_et_temps_";break;
case 10: grandeur = "stabilisation_transvers_membrane_biel_";break;
case 11: grandeur = "repere_anisotropie_";break;
case 12: grandeur = "statistique_sur_RefNoeuds_";break;
case 13: grandeur = "statistique_sur_RefNoeuds_et_temps_";break;
};
switch (num)
{ case 0: // sortie
{ break;} // normalement cela a déjà été filtré avant
case 1: case 2: case 3: case 5: case 6:
{ cout << "\n def de la ref associee : ";
bool lecture_ok=true; // init a priori
string sortie = "\n " + grandeur + " #--------# \n";;
//sort << "\n "<< grandeur<<" #--------# \n";
if (plusieurs_maillages)
{ string nom_mail=" ";
cout << "\n nom du maillage ? ";
nom_mail= lect_chaine(); cout << " nom lu = "<< nom_mail;
sortie += " nom_mail= " + nom_mail + " ";
// sort << " nom_mail= "<< nom_mail<< " ";
};
cout << "\n nom de la reference ? ";
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)<< " !!";
lecture_ok = false;
break;
}
else {sortie += " " + nom_ref+" ";} ;
int int_choix_loc=0;string rep_loc("");
while ((int_choix_loc > 3) || (int_choix_loc < 1))
{cout << "\n --- definition de la valeur --- "
<< "\n (1) valeur fixe -> un reel "
<< "\n (2) valeur via une fonction nD "
<< "\n (3 ou f ) arret "
<< "\n ";
rep_loc = lect_return_defaut(false,"f"); Minuscules(rep_loc);
int_choix_loc = ChangeEntier(rep_loc);
if ((rep_loc == "f")||(int_choix_loc == 3))
{lecture_ok = false; break;
};
switch (int_choix_loc)
{case 1:
{double d=0.;// init
cout << "\n un reel ? ";
d=lect_double();cout << " valeur lue = "<< d;
sortie += ChangeReelSTring(d)+" ";
}
break;
case 2:
{ cout << "\n nom de la fonction nD ? ";
string nom_fnD("");
nom_fnD= lect_chaine();cout << " nom lu = "<< nom_fnD;
sortie += " une_fonction_nD_ " + nom_fnD;
};
break;
default:
{cout << "\n *** mauvais choix, vous devez donner une valeur entre 1 et 3 !"
<< "\n recommencer ";
};
};
};
if(lecture_ok)
sort << sortie;
break;
}
case 4:
{ cout << "\n def de la ref associee : ";
string sortie = "\n " + grandeur + " #--------# \n";;
//sort << "\n "<< grandeur<<" #--------# \n";
if (plusieurs_maillages)
{ string nom_mail=" ";
cout << "\n nom du maillage ? ";
nom_mail= lect_chaine(); cout << " nom lu = "<< nom_mail;
sortie += " nom_mail= " + nom_mail + " ";
// sort << " nom_mail= "<< nom_mail<< " ";
};
cout << "\n nom de la reference ? ";
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;
};
cout << "\n valeur de: " << grandeur<<" (un entier) ? ";
int a = 0.;
a=(int) lect_double();cout << " valeur lue ="<< a;
sort << sortie;
sort << nom_ref << " " << a << " ";
break;
}
case 7:
{ cout << "\n def de la ref associee : ";
string sortie = "\n\n " + grandeur + " #--------# ";
//sort << "\n\n "<< grandeur<<" #--------# ";
//sort << "\n#----------------------------------------------------\n";
sortie += "\n#----------------------------------------------------\n";
if (plusieurs_maillages)
{ string nom_mail=" ";
cout << "\n nom du maillage ? ";
nom_mail= lect_chaine(); cout << " nom lu = "<< nom_mail;
//sort << " nom_mail= "<< nom_mail<< " ";
sortie += " nom_mail= " + nom_mail + " ";
};
cout << "\n nom de la reference d'element ? ";
string nom_ref=" ";
nom_ref= lect_chaine();cout << " nom lu = "<< nom_ref;
// choix du type de stabilisation
int choix_type_stabilistion = 0;
string type_stabilistion_lu="";
while (choix_type_stabilistion == 0)
{ cout << "\n -- choix du type de stabilisation --- "
<< "\n (1) STABHOURGLASS_PAR_COMPORTEMENT "
<< "\n (2) STABHOURGLASS_PAR_COMPORTEMENT_REDUIT (par defaut)"
<< "\n ";
type_stabilistion_lu= lect_chaine(); cout << " valeur lue ="<< type_stabilistion_lu;
if (type_stabilistion_lu == "1" )
{type_stabilistion_lu = " STABHOURGLASS_PAR_COMPORTEMENT ";choix_type_stabilistion=1;}
else if (type_stabilistion_lu == "2" )
{type_stabilistion_lu = " STABHOURGLASS_PAR_COMPORTEMENT_REDUIT ";choix_type_stabilistion=2;};
};
cout << "\n stabilisation par comportement: "
<< " nom associe a la loi ? ";
string nom_loi="_";
nom_loi= lect_chaine();cout << " nom lu = "<< nom_loi;
cout << "\n valeur de alpha (un reel) ? ";
double alpha= 0.;
alpha=lect_double();cout << " valeur lu = "<< alpha;
sort << sortie;
sort << nom_ref << type_stabilistion_lu
<< nom_loi << " " << alpha << " ";
break;
}
case 8: case 9:
{ string type_integrale;
if (num == 8) type_integrale="integrale_sur_volume_";
else type_integrale="integrale_sur_vol_et_temps_";
cout << "\n def de la ref associee : ";
string sortie = "\n\n " + grandeur + " #--------# ";
//sort << "\n\n "<< grandeur<<" #--------# ";
//sort << "\n#----------------------------------------------------\n";
sortie += "\n#----------------------------------------------------\n";
if (plusieurs_maillages)
{ string nom_mail=" ";
cout << "\n nom du maillage ? ";
nom_mail= lect_chaine(); cout << " nom lu = "<< nom_mail;
//sort << " nom_mail= "<< nom_mail<< " ";
sortie += " nom_mail= " + nom_mail + " ";
};
cout << "\n nom de la reference d'element ? ";
string nom_ref=" ";
nom_ref= lect_chaine();cout << " nom lu = "<< nom_ref;
// maintenant choix de la grandeur à intégrer
int choix_type_grandeur = 0;
string type_grandeur_lu="";
while (choix_type_grandeur == 0)
{ cout << "\n -- choix du type de grandeur a integrer sur le volume --- "
<< "\n (1) un ddl etendu "
<< "\n (2) une fonction nD "
<< "\n (f) fin sans sauvegarde (defaut) ";
type_grandeur_lu=lect_return_defaut(false,"f");
cout << " valeur lue ="<< type_grandeur_lu;
if (type_grandeur_lu == "1" )
{ string nom_ddl("");
Ddl_enum_etendu ddl;
cout << "\n nom du ddl "; nom_ddl= lect_chaine();
cout << " valeur lue = "<< nom_ddl;
if (!(ddl.VerifExistence(nom_ddl)))
{ cout << "\n *** "< un resultat pour chaque element et un resultat global "
<< "\n pour les statistiques: il s'agit de definir une grandeur dont on va calculer "
<< "\n sur les noeuds d'une ref: la somme, le mini, le maxi etc. "
<< "\n ";
}
default:
cout << "\n le cas "<= 0)&&(num<=7))
{ choix_valide=true; }
else { cout << "\n Erreur on attendait un entier entre 0 et 2 !!, "
<< "\n redonnez une bonne valeur"
<< "\n ou taper f ou 0 pour arreter le programme";
choix_valide=false;
}
string grandeur=" "; // init
// cas d'une grandeur simple
switch (num)
{ case 1: grandeur = "masse_addi";break;
};
switch (num)
{ case 0: // sortie
{ break;} // normalement cela a déjà été filtré avant
case 1:
{ string sortie = "\n def de la ref associee : ";
bool lecture_ok=true; // init a priori
//cout << "\n def de la ref associee : ";
sortie += "\n "+ grandeur +" #--------# \n";
//sort << "\n "<< grandeur <<" #--------# \n";
if (plusieurs_maillages)
{ string nom_mail=" ";
cout << "\n nom du maillage ? ";
nom_mail= lect_chaine(); cout << " nom lu = "<< nom_mail;
sortie += " nom_mail= "+ nom_mail+ " ";
//sort << " nom_mail= "<< nom_mail<< " ";
};
cout << "\n nom de la reference ? ";
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)<< " !!";
lecture_ok = false;
break;
}
else {sortie += " " + nom_ref+" ";} ;
int int_choix_loc=0;string rep_loc("");
while ((int_choix_loc > 3) || (int_choix_loc < 1))
{cout << "\n --- definition de la valeur --- "
<< "\n (1) valeur fixe -> un reel "
<< "\n (2) valeur via une fonction nD "
<< "\n (3 ou f ) arret "
<< "\n ";
rep_loc = lect_return_defaut(false,"f"); Minuscules(rep_loc);
int_choix_loc = ChangeEntier(rep_loc);
if ((rep_loc == "f")||(int_choix_loc == 3))
{lecture_ok = false; break;
};
switch (int_choix_loc)
{case 1:
{double d=0.;// init
d=lect_double();cout << " valeur lue = "<< d;
sortie += ChangeReelSTring(d)+" ";
}
break;
case 2:
{ cout << "\n nom de la fonction nD ? ";
string nom_fnD("");
nom_fnD= lect_chaine();cout << " nom lu = "<< nom_fnD;
sortie += " Fonction_nD_: " + nom_fnD;
};
break;
default:
{cout << "\n *** mauvais choix, vous devez donner une valeur entre 1 et 3 !"
<< "\n recommencer ";
};
};
};
if(lecture_ok)
sort << sortie << flush;
break;
}
case 2: // information
{ cout << "\n Au niveau des noeuds il est possible d'imposer une masse supplementaire ponctuelle "
<< "\n pour cela on indique une reference de noeud puis une valeur correspondant a la masse ponctuelle "
<< "\n on se reportera a la documentation pour plus d'info"
<< "\n sinon il suffit de repondre aux questions"
<< "\n ";
break;
}
default:
cout << "\n le cas "<> toto ;
// cas du tableau des épaisseurs
int tabEpaissTaille ;
entr >> toto >> tabEpaissTaille ;
tabEpaiss.Change_taille(tabEpaissTaille);
for (int i=1; i<= tabEpaissTaille; i++)
entr >> tabEpaiss(i) ;
// cas du tableau des largeurs
int tabLargeursTaille = tabLargeurs.Taille();
entr >> toto >> tabLargeursTaille ;
tabLargeurs.Change_taille(tabLargeursTaille);
for (int i=1; i<= tabLargeursTaille; i++)
entr >> tabLargeurs(i) ;
// cas du tableau des sections
int tabSectionTaille = tabSection.Taille();
entr >> toto >> tabSectionTaille ;
tabSection.Change_taille(tabSectionTaille);
for (int i=1; i<= tabSectionTaille; i++)
entr >> tabSection(i) ;
// cas du tableau des variation de section
int tabVarSectionTaille = tabVarSection.Taille();
entr >> toto >> tabVarSectionTaille ;
tabVarSection.Change_taille(tabVarSectionTaille);
for (int i=1; i<= tabVarSectionTaille; i++)
entr >> tabVarSection(i) ;
// cas du tableau des masses volumique
int tabMasseVoluTaille = tabMasseVolu.Taille();
entr >> toto >> tabMasseVoluTaille ;
tabMasseVolu.Change_taille(tabMasseVoluTaille);
for (int i=1; i<= tabMasseVoluTaille; i++)
entr >> tabMasseVolu(i) ;
// cas du tableau des coefficients de dilatation thermique
int tabCoefDilaTaille = tabCoefDila.Taille();
entr >> toto >> tabCoefDilaTaille ;
tabCoefDila.Change_taille(tabCoefDilaTaille);
for (int i=1; i<= tabCoefDilaTaille; i++)
entr >> tabCoefDila(i) ;
// cas du tableau des gestions d'hourglass
int tabGesHourglassTaille = tabGesHourglass.Taille();
entr >> toto >> tabGesHourglassTaille ;
tabGesHourglass.Change_taille(tabGesHourglassTaille);
for (int i=1; i<= tabGesHourglassTaille; i++)
entr >> tabGesHourglass(i) ;
// cas du tableau des intégrales sur volume
int tabIntegVolTaille = tabIntegVol.Taille();
entr >> toto >> tabIntegVolTaille ;
tabIntegVol.Change_taille(tabIntegVolTaille);
for (int i=1; i<= tabIntegVolTaille; i++)
entr >> tabIntegVol(i) ;
// cas du tableau des intégrales sur volume et temps
int tabIntegVol_et_tempsTaille = tabIntegVol_et_temps.Taille();
entr >> toto >> tabIntegVol_et_tempsTaille ;
tabIntegVol_et_temps.Change_taille(tabIntegVol_et_tempsTaille);
for (int i=1; i<= tabIntegVol_et_tempsTaille; i++)
entr >> tabIntegVol_et_temps(i) ;
// cas du tableau des stabilisations transversales de membrane ou biel
int tabStabMembraneBielTaille = tabStabMembraneBiel.Taille();
entr >> toto >> tabStabMembraneBielTaille ;
tabStabMembraneBiel.Change_taille(tabStabMembraneBielTaille);
for (int i=1; i<= tabStabMembraneBielTaille; i++)
entr >> tabStabMembraneBiel(i) ;
// cas du tableau des masses additionnelles
int tabMasseAddiTaille = tabMasseAddi.Taille();
entr >> toto >> tabMasseAddiTaille ;
tabMasseAddi.Change_taille(tabMasseAddiTaille);
for (int i=1; i<= tabMasseAddiTaille; i++)
entr >> tabMasseAddi(i) ;
// cas du tableau des repères d'anisotropie
int tabRepAnisotropeTaille = tabRepAnisotrope.Taille();
entr >> toto >> tabRepAnisotropeTaille ;
tabRepAnisotrope.Change_taille(tabRepAnisotropeTaille);
for (int i=1; i<= tabRepAnisotropeTaille; i++)
entr >> tabRepAnisotrope(i) ;
// cas du tableau des statistiques
int tabStatistiqueTaille = tabStatistique.Taille();
entr >> toto >> tabStatistiqueTaille ;
tabStatistique.Change_taille(tabStatistiqueTaille);
for (int i=1; i<= tabStatistiqueTaille; i++)
entr >> tabStatistique(i) ;
// cas du tableau des statistiques avec cumul en temps
int tabStatistique_et_tempsTaille = tabStatistique_et_temps.Taille();
entr >> toto >> tabStatistique_et_tempsTaille ;
tabStatistique_et_temps.Change_taille(tabStatistique_et_tempsTaille);
for (int i=1; i<= tabStatistique_et_tempsTaille; i++)
entr >> tabStatistique_et_temps(i) ;
}
};
// écriture base info
// = 1 : on sauvegarde tout
// = 2 : on sauvegarde uniquement les données variables (supposées comme telles)
void DiversStockage::Ecriture_base_info(ofstream& sort,const int cas)
{ // a priori les données stockées ne sont pas variables d'où seule le cas = 1
// est utilisé
if (cas == 1 )
{ sort << "\n ****divers_stockages \n" ;
// cas du tableau des épaisseurs
int tabEpaissTaille = tabEpaiss.Taille();
sort << "epaisseurs " << tabEpaissTaille << " " ;
for (int i=1; i<= tabEpaissTaille; i++)
sort << tabEpaiss(i) << " ";
// cas du tableau des largeurs
int tabLargeursTaille = tabLargeurs.Taille();
sort << "\n largeurs " << tabLargeursTaille << " " ;
for (int i=1; i<= tabLargeursTaille; i++)
sort << tabLargeurs(i) << " ";
// cas du tableau des sections
int tabSectionTaille = tabSection.Taille();
sort << "\n sections " << tabSectionTaille << " " ;
for (int i=1; i<= tabSectionTaille; i++)
sort << tabSection(i) << " ";
// cas du tableau des variations d sections
int tabVarSectionTaille = tabVarSection.Taille();
sort << "\n variation de section " << tabVarSectionTaille << " " ;
for (int i=1; i<= tabVarSectionTaille; i++)
sort << tabVarSection(i) << " ";
// cas du tableau des masses volumiques
int tabMasseVoluTaille = tabMasseVolu.Taille();
sort << "\n masse_volumique " << tabMasseVoluTaille << " " ;
for (int i=1; i<= tabMasseVoluTaille; i++)
sort << tabMasseVolu(i) << " ";
// cas du tableau des coefficients de dilatation thermique
int tabCoefDilaTaille = tabCoefDila.Taille();
sort << "\n dilatation_thermique " << tabCoefDilaTaille << " " ;
for (int i=1; i<= tabCoefDilaTaille; i++)
sort << tabCoefDila(i) << " ";
// cas du tableau des gestions d'hourglass
int tabGesHourglassTaille = tabGesHourglass.Taille();
sort << "\n hourglass_gestion_ " << tabGesHourglassTaille << " " ;
for (int i=1; i<= tabGesHourglassTaille; i++)
sort << tabGesHourglass(i) << " ";
// cas du tableau des intégrales de volume
int tabIntegVolTaille = tabIntegVol.Taille();
sort << "\n integrale_sur_volume_ " << tabIntegVolTaille << " " ;
for (int i=1; i<= tabIntegVolTaille; i++)
sort << tabIntegVol(i) << " ";
// cas du tableau des intégrales de volume et sur le temps
int tabIntegVol_et_tempsTaille = tabIntegVol_et_temps.Taille();
sort << "\n integrale_sur_vol_et_temps_ " << tabIntegVol_et_tempsTaille << " " ;
for (int i=1; i<= tabIntegVol_et_tempsTaille; i++)
sort << tabIntegVol_et_temps(i) << " ";
// cas du tableau des stabilisations transversales de membrane ou biel
int tabStabMembraneBielTaille = tabStabMembraneBiel.Taille();
sort << "\n stabilisation_transvers_membrane_biel_ " << tabStabMembraneBielTaille << " " ;
for (int i=1; i<= tabStabMembraneBielTaille; i++)
sort << tabStabMembraneBiel(i) << " ";
// cas du tableau des masses additionnelles
int tabMasseAddiTaille = tabMasseAddi.Taille();
sort << "\n masses_additionnelles " << tabMasseAddiTaille << " " ;
for (int i=1; i<= tabMasseAddiTaille; i++)
sort << tabMasseAddi(i) << " ";
// cas du tableau des repères d'anisotropie
int tabRepAnisotropeTaille = tabRepAnisotrope.Taille();
sort << "\n repere_anisotropie_ " << tabRepAnisotropeTaille << " " ;
for (int i=1; i<= tabRepAnisotropeTaille; i++)
sort << tabRepAnisotrope(i) << " ";
// cas du tableau des statistiques
int tabStatistiqueTaille = tabStatistique.Taille();
sort << "\n statistique_sur_RefNoeuds_ " << tabStatistiqueTaille << " " ;
for (int i=1; i<= tabStatistiqueTaille; i++)
sort << tabStatistique(i) << " ";
// cas du tableau des statistiques avec cumul en temps
int tabStatistique_et_tempsTaille = tabStatistique_et_temps.Taille();
sort << "\n statistique_sur_RefNoeuds_et_temps_ " << tabStatistique_et_tempsTaille << " " ;
for (int i=1; i<= tabStatistique_et_tempsTaille; i++)
sort << tabStatistique_et_temps(i) << " ";
}
};