// 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(ostream& 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) << " "; } };