// 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-2021 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 "Choix_grandeurs_maple.h" #include "CharUtil.h" #include "ReferenceNE.h" #include "ReferencePtiAF.h" #include #include // ------------------------------------------------ méthodes protégées -------------------------------------- // entrée du choix de ddl principaux aux noeuds void Choix_grandeurs_maple::Entree_grandeur_principale_aux_noeuds(string& rep) { // cas de grandeurs aux noeuds, on boucle sur les maillages int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); list::const_iterator ilm,ilmfin=list_mail.end(); int taille_list_maille = list_mail.size(); if (list_mail.size() == 0) { cout << "\n aucun maillage n'est definit ! , il faut commencer par definir les maillages pour" << " lesquels on veut une sortie "; return; }; // on balaie les différents maillages for (ilm = list_mail.begin();ilm!=ilmfin;ilm++) {int n_mail = abs(*ilm); // numéro du maillage // -- boucle sur les maillages // affichage du nom du maillages s'il y en a plusieurs if (taille_list_maille > 1) cout << "\n ======>>>>> maillage : " << lesMail->NomMaillage(n_mail); // on affiche la liste actuelle des grandeurs si elle n'est pas vide if ((tabnoeud_type_ddl_retenu(n_mail)).size()) { cout << "\n liste des grandeurs actuellement a sortir: "; List_io < Ddl_enum_etendu >::iterator iet,ietfin = (tabnoeud_type_ddl_retenu(n_mail)).end(); for (iet=(tabnoeud_type_ddl_retenu(n_mail)).begin();iet!=ietfin;iet++) cout << (*iet) << " " ; } // on affiche les différentes grandeurs possibles cout << "\n maillage nb : " << n_mail ; cout << "\n la liste des grandeurs disponibles est la suivante : "; List_io < Ddl_enum_etendu >::iterator iet,ietfin = (tabnoeud_type_ddl(n_mail)).end(); for (iet=(tabnoeud_type_ddl(n_mail)).begin();iet!=ietfin;iet++) cout << (*iet) << " " ; // if ((*iet).Nom_vide()) cout << Nom_ddl((*iet).Enum()) << " "; else cout << (*iet).Nom() << " "; cout << "\n donnez la ou les grandeurs que vous voulez visualiser (rep grandeurs?) " << "\n ou toutes les grandeurs sans les reactions (rep : to) " << "\n ou toutes les grandeurs (rep : tr) " << "\n effacer la liste actuelle (rep : ef) " << "\n type de sortie de ddl retenue (rep : ts) " << "\n (pour terminer tapez : fin (ou f)) "; rep = ""; while ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) { cout << "\n grandeur ? ";rep = lect_return_defaut(false,"f"); if (rep == "to") // cas de toutes les grandeurs sans les réactions {List_io::iterator ite,itefin = tabnoeud_type_ddl(n_mail).end(); for (ite = tabnoeud_type_ddl(n_mail).begin();ite != itefin; ite++) if ( !Ddl_reaction((*ite).Enum())) tabnoeud_type_ddl_retenu(n_mail).push_back(*ite); tabnoeud_type_ddl_retenu(n_mail).sort(); // on ordonne tabnoeud_type_ddl_retenu(n_mail).unique();// on supprime les doublons } else if (rep == "tr") // cas de toutes les grandeurs avec les réactions {List_io::iterator ite,itefin = tabnoeud_type_ddl(n_mail).end(); for (ite = tabnoeud_type_ddl(n_mail).begin();ite != itefin; ite++) tabnoeud_type_ddl_retenu(n_mail).push_back(*ite); tabnoeud_type_ddl_retenu(n_mail).sort(); // on ordonne tabnoeud_type_ddl_retenu(n_mail).unique();// on supprime les doublons } else if (ExisteEnum_ddl(rep)) { // on vérifie qu'il appartiend à la liste des ddl proposés Enum_ddl enume=Id_nom_ddl (rep); Ddl_enum_etendu enu_etendu(enume); if (Ddl_enum_etendu::Existe_dans_la_liste(tabnoeud_type_ddl(n_mail),enu_etendu)) { (tabnoeud_type_ddl_retenu(n_mail)).push_back(enu_etendu); tabnoeud_type_ddl_retenu(n_mail).sort(); // on ordonne (tabnoeud_type_ddl_retenu(n_mail)).unique(); // supprime le doublon si nécessaire } else cout << " erreur de choix de ddl, celui choisit n'appartient pas a la liste propose"; } else if (rep == "ef") { // on efface la liste (tabnoeud_type_ddl_retenu(n_mail)).clear(); } else if (rep == "ts") { cout << "\n actuellement type_sortie_ddl_retenue= " << type_sortie_ddl_retenue << "\n"; cout << "\n sortie des grandeurs a t (par defaut) : (rep: 0)" << "\n sortie des grandeurs entre t et 0 : (rep: 1)" << "\n sortie des grandeurs a 0 et a t : (rep: 2)" << "\n laisser tel-quel : (rep: f)\n"; string reep=""; reep = lect_return_defaut(false,"f"); if (reep == "0") {type_sortie_ddl_retenue=0;} else if (reep == "1") {type_sortie_ddl_retenue=1;} else if (reep == "2") {type_sortie_ddl_retenue=2;} cout << "\n nouvelle valeur: type_sortie_ddl_retenue= " << type_sortie_ddl_retenue << "\n"; } else if ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) cout << " erreur de syntaxe dans le ddl! recommencez "; }; // choix du ou des noeuds, on affiche la liste actuelle if ((tab_num_noeud(n_mail)).size()) { cout << "\n liste actuelle de noeud: "; List_io ::iterator ieint,ieintfin = tab_num_noeud(n_mail).end(); for (ieint=tab_num_noeud(n_mail).begin();ieint!=ieintfin;ieint++) cout << *ieint << " "; cout << endl; } if ((nomDeRef(n_mail)).size() != 0) { cout << "\n liste actuelle de reference de noeuds: "; List_io ::iterator ieint1,ieintfin1 = (nomDeRef(n_mail)).end(); for (ieint1=(nomDeRef(n_mail)).begin();ieint1!=ieintfin1;ieint1++) cout << *ieint1 << " "; cout << endl; } // questions cout << "\n choix du ou des noeuds ou l'on veut la visualisation " << "\n le reperage d'un noeuds peut se faire de differentes manieres :" << "\n par son numero dans le maillage -> (choix : 1)" << "\n par ses coordonnees, meme approximatives -> (choix : 2)" << "\n par une reference de liste de noeuds -> (choix : 3)" << "\n donnez pour chaque noeud le type de choix puis le numero " << "\n ou les cordonnees " << "\n effacer la liste actuelle de noeuds (rep : ef) " << "\n effacer la liste actuelle des references de noeuds (rep : efref) " << "\n afficher la liste des references de noeuds existants (rep : affref) " << "\n (pour finir tapez : fin (ou f))"; rep = ""; while ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) { cout << "\n choix ? ";rep = lect_return_defaut(false,"f"); bool verif = true; // pour la vérification du numéro du noeud int nu=0 ; // le numéro de noeud if (rep == "1") { cout << " numero ? "; rep = lect_return_defaut(false,"f"); nu = ChangeEntier(rep); } else if (rep =="2") { Coordonnee xi(dim); cout << "\n coordonnee ("<> xi(j); std::cin.ignore( std::numeric_limits::max(), '\n' );// purge de cin cout << "\n les coordonnees sont a: t = 0 ou t ou tdt (repondre 0 ou t ou tdt) ?"; rep = lect_chaine(); // recherche du noeud le plus proche if (rep == "0") nu = lesMail->Noeud_le_plus_proche_0(xi,n_mail); else if (rep == "t") nu = lesMail->Noeud_le_plus_proche_t(xi,n_mail); else if (rep == "tdt") nu = lesMail->Noeud_le_plus_proche_tdt(xi,n_mail); else { cout << "\n erreur de syntaxe, on attendait 0 ou t ou tdt ! ";verif = false;}; cout << "\n noeud le plus proche nb= " << nu; verif = true; } else if (rep =="3") { string nom_ref; cout << "\n nom de la reference ? ";nom_ref= lect_chaine(); // vérif que la référence existe if ((!(lesRef->Existe(nom_ref,n_mail))) || (lesRef->Trouve(nom_ref,n_mail).Indic() != 1)) { cout << "\n erreur de nom donne (** "<< nom_ref << " **) ne correspond pas a une reference de noeud correcte ";} else // on enregistre { nomDeRef(n_mail).push_back(nom_ref); nomDeRef(n_mail).sort(); // on ordonne nomDeRef(n_mail).unique();// on supprime les doublons }; verif = false; // pour ne pas enregistrer de numéro dans la liste de noeud car ici c'est // la liste de référence de noeud qui est en cause } else if (rep == "ef") { // on efface la liste des noeuds (tab_num_noeud(n_mail)).clear(); verif = false; } else if (rep == "efref") { // on efface la liste des références de noeuds (nomDeRef(n_mail)).clear(); verif = false; } else if (rep == "affref") { // affichage de la liste des références enregistrées dans les maillages cout << "\n liste des references de noeuds "; if (taille_list_maille > 1) cout << "pour le maillage " << lesMail->NomMaillage(n_mail); const Reference* reff =NULL; bool prempass = true; do { if (prempass) { reff= lesRef->Init_et_Premiere();} // récup de la ref 1 et init else { reff = lesRef->Reference_suivante();} // récup de la ref courante // sortie de la ref si c'est le bon maillage, et si c'est une ref de noeud if (reff != NULL) if ((reff->Nbmaille() == n_mail) && (reff->Indic() == 1)) cout << reff->Nom() << " "; prempass = false; } while (reff != NULL); verif = false; } else if ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) { cout << " erreur de syntaxe on attendait 1 ou 2 ! recommencez ";verif = false;}; // vérif que le numéro est acceptable et enregistrement if ((nu>0)&&(nu<=lesMail->Nombre_noeud(n_mail))) { // on vérifie que les ddls à sortir sont bien présent pour ce noeud List_io::iterator ienu,ienufin=tabnoeud_type_ddl_retenu(n_mail).end(); for (ienu = tabnoeud_type_ddl_retenu(n_mail).begin();ienu!=ienufin;ienu++) {if ( (!(lesMail->Noeud_LesMaille(n_mail,nu).Existe_ici((*ienu).Enum()))) // cas où le ddl principal n'existe pas && (!(lesMail->Noeud_LesMaille(n_mail,nu).Existe_ici_ddlEtendu((*ienu))))) // cas où le ddl étendu n'existe pas {cout << "\n attention le ddl " << Nom_ddl((*ienu).Enum()) << " n'existe pas pour le noeud " << nu << " du maillage " << n_mail << "\n il y aura 0 en sortie ! "; verif = true; } } } if ((verif)&&((Minuscules(rep) != "fin") && (Minuscules(rep) != "f"))) { // enregistrement tab_num_noeud(n_mail).push_back(nu); tab_num_noeud(n_mail).sort(); // on ordonne tab_num_noeud(n_mail).unique();// on supprime les doublons } }// -- fin de la boucle infini sur l'entrée de numéro de noeud }// -- fin de la boucle sur les maillages }; // -- fin du cas des ddl principaux aux noeuds // entrée du choix de ddl étendus secondaires aux noeuds void Choix_grandeurs_maple::Entree_grandeur_etendue_secondaire_aux_noeuds(string& rep) { // cas de grandeurs aux noeuds, on boucle sur les maillages int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); list::const_iterator ilm,ilmfin=list_mail.end(); int taille_list_maille = list_mail.size(); if (list_mail.size() == 0) { cout << "\n aucun maillage n'est definit ! , il faut commencer par definir les maillages pour" << " lesquels on veut une sortie "; return; }; // on balaie les différents maillages for (ilm = list_mail.begin();ilm!=ilmfin;ilm++) {int n_mail = abs(*ilm); // numéro du maillage // dans le cas où aucune grandeur particulière sont défini on passe if ( (tabnoeud_type_ddlEtendu(n_mail)).size() == 0) { cout << "\n aucune grandeur etendue n'est definit, donc aucune proposition ";} else {// affichage du nom du maillages s'il y en a plusieurs rep = ""; // init while ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) {if (taille_list_maille > 1) cout << "\n ======>>>>> maillage : " << lesMail->NomMaillage(n_mail); // on affiche la liste actuelle des grandeurs si elle n'est pas vide if ((tabnoeud_type_ddlEtendu_retenu(n_mail)).size()) { cout << "\n liste des grandeurs actuellement a sortir: "; List_io < Ddl_enum_etendu >::iterator iet,ietfin = (tabnoeud_type_ddlEtendu_retenu(n_mail)).end(); for (iet=(tabnoeud_type_ddlEtendu_retenu(n_mail)).begin();iet!=ietfin;iet++) cout << (*iet) << " " ; }; // on affiche les différentes grandeurs possibles cout << "\n maillage nb : " << n_mail ; cout << "\n la liste des grandeurs disponibles est la suivante : "; List_io < Ddl_enum_etendu >::iterator iet,ietfin = (tabnoeud_type_ddlEtendu(n_mail)).end(); for (iet=(tabnoeud_type_ddlEtendu(n_mail)).begin();iet!=ietfin;iet++) cout << (*iet) << " " ; cout << "\n donnez la ou les grandeurs que vous voulez visualiser (rep grandeurs?) " << "\n ou toutes les grandeurs sans les reactions (rep : to) " << "\n ou toutes les grandeurs (rep : tr) " << "\n effacer la liste actuelle (rep : ef) " << "\n (pour terminer tapez : fin (ou f)) "; rep = ""; cout << "\n grandeur ? ";rep = lect_return_defaut(false,"f"); if (rep == "to") // cas de toutes les grandeurs sans les réactions {List_io::iterator ite,itefin = tabnoeud_type_ddlEtendu(n_mail).end(); for (ite = tabnoeud_type_ddlEtendu(n_mail).begin();ite != itefin; ite++) if ( !Ddl_reaction((*ite).Enum())) tabnoeud_type_ddlEtendu_retenu(n_mail).push_back(*ite); tabnoeud_type_ddlEtendu_retenu(n_mail).sort(); // on ordonne tabnoeud_type_ddlEtendu_retenu(n_mail).unique();// on supprime les doublons } else if (rep == "tr") // cas de toutes les grandeurs avec les réactions {List_io::iterator ite,itefin = tabnoeud_type_ddlEtendu(n_mail).end(); for (ite = tabnoeud_type_ddlEtendu(n_mail).begin();ite != itefin; ite++) tabnoeud_type_ddlEtendu_retenu(n_mail).push_back(*ite); tabnoeud_type_ddlEtendu_retenu(n_mail).sort(); // on ordonne tabnoeud_type_ddlEtendu_retenu(n_mail).unique();// on supprime les doublons } else if (Ddl_enum_etendu::VerifExistence(rep)) { // on vérifie qu'il appartiend à la liste des ddl étendus proposés Ddl_enum_etendu enu_etendu(rep); if (Ddl_enum_etendu::Existe_dans_la_liste(tabnoeud_type_ddlEtendu(n_mail),enu_etendu)) { (tabnoeud_type_ddlEtendu_retenu(n_mail)).push_back(enu_etendu); tabnoeud_type_ddlEtendu_retenu(n_mail).sort(); // on ordonne (tabnoeud_type_ddlEtendu_retenu(n_mail)).unique(); // supprime le doublon si nécessaire } else cout << " erreur de choix de ddl, celui choisit n'appartient pas a la liste propose"; } else if (rep == "ef") { // on efface la liste (tabnoeud_type_ddlEtendu_retenu(n_mail)).clear(); } else if ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) cout << " erreur de syntaxe dans le ddl! recommencez "; }; // maintenant si la liste de ddl étendu est vide on s'arrête sinon on choisit éventuellement des noeuds if ( (tabnoeud_type_ddlEtendu_retenu(n_mail)).size() != 0) { Choix_noeud_a_retenir(n_mail,tabnoeud_type_ddlEtendu_retenu(n_mail)); } else { cout << "\n aucune grandeur enregistree ! pour le maillage " << n_mail <<"\n "; }; }; };// -- fin de la boucle sur les maillages }; // -- fin du cas des ddl étendus secondaires aux noeuds // entrée du choix de cas de grandeurs particulières aux noeuds void Choix_grandeurs_maple::Entree_grandeur_TypeQuelconque_secondaire_aux_noeuds(string& rep) { // cas de grandeurs particulières aux noeuds, on boucle sur les maillages int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); list::const_iterator ilm,ilmfin=list_mail.end(); int taille_list_maille = list_mail.size(); if (list_mail.size() == 0) { cout << "\n aucun maillage n'est definit ! , il faut commencer par definir les maillages pour" << " lesquels on veut une sortie "; return; }; // on balaie les différents maillages for (ilm = list_mail.begin();ilm!=ilmfin;ilm++) {int n_mail = abs(*ilm); // numéro du maillage // dans le cas où aucune grandeur particulière sont défini on passe if ( ((tabnoeud_TypeQuelconque(n_mail)).size() == 0) && (listeVecGlobbal.size() == 0)) { cout << "\n aucune grandeur particuliere n'est definit, donc aucune proposition ";} else { // def d'une liste de travail, pour vérifier que tous les grandeurs particuliers sont relatives // à un même point d'intégration List_io < Ddl_enum_etendu > li_ddl; // on affiche la liste actuelle des grandeurs enregistrées if ((tabnoeud_TypeQuelconque_retenu(n_mail)).size()) { cout << "\n liste des grandeurs particulieres actuellement a sortir: "; List_io < TypeQuelconque >::iterator iet,ietfin = (tabnoeud_TypeQuelconque_retenu(n_mail)).end(); for (iet=(tabnoeud_TypeQuelconque_retenu(n_mail)).begin();iet!=ietfin;iet++) cout << ((*iet).EnuTypeQuelconque().NomPlein()) << " " ; cout << endl; }; // on affiche les différentes grandeurs possibles cout << "\n maillage nb : " << n_mail ; cout << "\n la liste des grandeurs particulieres disponibles est la suivante : "; // tout d'abord celles venant du maillage {List_io < TypeQuelconque >::iterator iet,ietfin = (tabnoeud_TypeQuelconque(n_mail)).end(); for (iet=(tabnoeud_TypeQuelconque(n_mail)).begin();iet!=ietfin;iet++) cout << "\n " << ((*iet).EnuTypeQuelconque().NomPlein()) ; }; // puis celles venant de l'algorithme {List_io < TypeQuelconque >::iterator iet,ietfin = listeVecGlobbal.end(); List_io& tpg = (tabnoeud_TypeQuelconque(n_mail)); for (iet=listeVecGlobbal.begin();iet!=ietfin;iet++) { if ( find(tpg.begin(),tpg.end(),(*iet)) == tpg.end()) // on ne sort que si ça n'a pas déjà été sorti cout << "\n " << ((*iet).EnuTypeQuelconque().NomPlein()) ; }; }; cout << "\n"; cout << "\n grandeurs que vous voulez visualiser (rep : grandeurs?)" << "\n effacer la liste actuelle (rep : ef) " << "\n toutes les grandeurs : (rep : to) " << "\n (pour terminer tapez : fin (ou f))"; rep = ""; while ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) { cout << "\n grandeur ? ";rep = lect_return_defaut(false,"f"); // -- cas de toutes les grandeurs if (rep == "to") {// tout d'abord celles venant du maillage {List_io& tpg_ret = (tabnoeud_TypeQuelconque_retenu(n_mail)); // pour simplifier List_io& tpg = (tabnoeud_TypeQuelconque(n_mail)); // pour simplifier List_io::iterator ite,itefin = tpg.end(); for (ite = tabnoeud_TypeQuelconque(n_mail).begin();ite != itefin; ite++) if (find(tpg_ret.begin(),tpg_ret.end(),*ite) == tpg_ret.end()) { tpg_ret.push_back(*ite);}; }; // puis celles venant de l'algorithme {List_io& tpg_ret = (tabnoeud_TypeQuelconque_retenu(n_mail)); // pour simplifier List_io& tpg = listeVecGlobbal; // pour simplifier List_io::iterator ite,itefin = tpg.end(); for (ite = listeVecGlobbal.begin();ite != itefin; ite++) if (find(tpg_ret.begin(),tpg_ret.end(),*ite) == tpg_ret.end()) { tpg_ret.push_back(*ite); listeVecGlobbal_retenu.push_back(*ite); // sert pour ajouter les conteneurs aux noeuds }; // on sort un message pour indiquer que les grandeurs globales ne seront // disponible qu'au fil du calcul {cout << "\n ---- attention, les grandeurs suivantes ne sont disponibles qu'au fil du calcul ----"; List_io < TypeQuelconque >::iterator iet,ietfin = listeVecGlobbal.end(); for (iet=listeVecGlobbal.begin();iet!=ietfin;iet++) cout << "\n " << ((*iet).EnuTypeQuelconque().NomPlein()) ; }; }; } // -- cas d'une grandeur particulière else if (TypeQuelconque_enum_etendu::VerifExistence(rep) ) // vérif que c'est une grandeur possible {// maintenant on vérifie qu'elle appartient à la liste des grandeurs disponibles TypeQuelconque a(TypeQuelconque_enum_etendu::RecupTypeQuelconque_enum_etendu(rep)); // création d'un type quelconque sans grandeur bool trouve=false; // init pour le message d'erreur // tout d'abord vérif pour celles venant du maillage {List_io& tpg_ret = (tabnoeud_TypeQuelconque_retenu(n_mail)); // pour simplifier List_io& tpg = (tabnoeud_TypeQuelconque(n_mail)); // pour simplifier if (find(tpg.begin(),tpg.end(),a) != tpg.end()) { // il existe -> enregistrement List_io::iterator il = find(tpg.begin(),tpg.end(),a); // récup du réel type // s'il n'existe pas déjà on l'enregistre vraiment if (find(tpg_ret.begin(),tpg_ret.end(),a) == tpg_ret.end()) { tpg_ret.push_back(*il);}; trouve = true; // on a bien trouvé une grandeur }; }; // puis vérif pour celles venant de l'algorithme {List_io& tpg_ret = (tabnoeud_TypeQuelconque_retenu(n_mail)); // pour simplifier List_io& tpg = listeVecGlobbal; // pour simplifier if (find(tpg.begin(),tpg.end(),a) != tpg.end()) { // il existe -> enregistrement List_io::iterator il = find(tpg.begin(),tpg.end(),a); // récup du réel type // s'il n'existe pas déjà on l'enregistre vraiment if (find(tpg_ret.begin(),tpg_ret.end(),a) == tpg_ret.end()) { tpg_ret.push_back(*il); listeVecGlobbal_retenu.push_back(*il); // sert pour ajouter les conteneurs aux noeuds }; trouve = true; // on a bien trouvé une grandeur // on sort un message pour indiquer que la grandeur globale ne sera // disponible qu'au fil du calcul {cout << "\n ---- attention, la grandeur suivante ne sera disponible qu'au fil du calcul ----"; cout << "\n " << ((*il).EnuTypeQuelconque().NomPlein()) ; }; }; }; if (!trouve) { cout << "\n erreur, grandeur non disponible !, recommencez ";}; } // -- cas où on veut effacer la liste else if (rep == "ef") {(tabnoeud_TypeQuelconque_retenu(n_mail)).clear(); listeVecGlobbal_retenu.clear(); } // -- cas fin else if ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) cout << " erreur de syntaxe recommencez "; }; // affichage des infos actuellement enregistrées if ( (tabnoeud_TypeQuelconque_retenu(n_mail)).size() != 0) { cout << "\n liste des grandeurs particulieres enregistrees: "; List_io < TypeQuelconque >::iterator iet,ietfin = (tabnoeud_TypeQuelconque_retenu(n_mail)).end(); for (iet=(tabnoeud_TypeQuelconque_retenu(n_mail)).begin();iet!=ietfin;iet++) cout << ((*iet).EnuTypeQuelconque().NomPlein()) << " " ; cout << endl; } else { cout << "\n aucune grandeur enregistree ! \n "; }; // maintenant si la liste de grandeurs quelconques est vide on s'arrête sinon on choisit éventuellement des noeuds if ( (tabnoeud_type_ddlEtendu_retenu(n_mail)).size() != 0) { Choix_noeud_a_retenir(n_mail,tabnoeud_type_ddlEtendu_retenu(n_mail)); } else { cout << "\n aucune grandeur enregistree ! pour le maillage " << n_mail <<"\n "; }; }; //-- fin du choix sur le fait qu'il existe ou non des grandeurs particulières pour le maillage }; //-- fin de la boucle sur les maillages }; // -- fin du cas des grandeurs particulières aux noeuds // entrée du choix d'une grandeur aux éléments void Choix_grandeurs_maple::Entree_grandeur_aux_elements(string& rep) { // cas de grandeurs aux éléments, on boucle sur les maillages int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); list::const_iterator ilm,ilmfin=list_mail.end(); int taille_list_maille = list_mail.size(); if (list_mail.size() == 0) { cout << "\n aucun maillage n'est definit ! , il faut commencer par definir les maillages pour" << " lesquels on veut une sortie "; return; }; // on balaie les différents maillages for (ilm = list_mail.begin();ilm!=ilmfin;ilm++) { int n_mail = abs(*ilm); // numéro du maillage // int taille_list_maille = tabelement_type_ddl.Taille(); // for (int n_mail=1;n_mail<=taille_list_maille;n_mail++) // on affiche la liste actuelle if ((tabelement_type_ddl_retenu(n_mail)).size()) { cout << "\n liste actuelle des element a sortir en info: "; List_io ::iterator ieint,ieintfin = tab_num_element(n_mail).end(); for (ieint=tab_num_element(n_mail).begin();ieint!=ieintfin;ieint++) cout << *ieint << " "; cout << "\n liste des grandeurs actuellement a sortir: "; List_io < Ddl_enum_etendu >::iterator iet,ietfin = (tabelement_type_ddl_retenu(n_mail)).end(); for (iet=(tabelement_type_ddl_retenu(n_mail)).begin();iet!=ietfin;iet++) cout << (*iet) << " " ; // if ((*iet).Nom_vide()) cout << Nom_ddl((*iet).Enum()) << " "; else cout << (*iet).Nom() << " "; cout << endl; } // on affiche les différentes grandeurs possibles cout << "\n maillage nb : " << n_mail ; cout << "\n la liste des grandeurs disponibles est la suivante : "; List_io < Ddl_enum_etendu >::iterator iet,ietfin = (tabelement_type_ddl(n_mail)).end(); for (iet=(tabelement_type_ddl(n_mail)).begin();iet!=ietfin;iet++) cout << (*iet) << " " ; // if ((*iet).Nom_vide()) cout << Nom_ddl((*iet).Enum()) << " "; else cout << (*iet).Nom() << " "; cout << "\n grandeurs que vous voulez visualiser ( rep : grandeurs?)" << "\n REMARQUE : il faut donner uniquement un jeux de ddl " << "\n def au meme point d'integration (contraintes/def " << "\n ou (exclusif) erreur ou ...) " << "\n effacer la liste actuelle (rep : ef) " << "\n (pour terminer tapez : fin (ou f))"; rep = ""; while ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) { cout << "\n grandeur ? ";rep = lect_return_defaut(false,"f"); if (rep == "to") // cas de toutes les grandeurs {List_io::iterator ite,itefin = tabelement_type_ddl(n_mail).end(); for (ite = tabelement_type_ddl(n_mail).begin();ite != itefin; ite++) tabelement_type_ddl_retenu(n_mail).push_back(*ite); } else if (Ddl_enum_etendu::VerifExistence(rep)) // on vérifie que cette grandeur existe // enregistrement { Ddl_enum_etendu a = Ddl_enum_etendu::RecupDdl_enum_etendu(rep); (tabelement_type_ddl_retenu(n_mail)).push_back(a); (tabelement_type_ddl_retenu(n_mail)).sort(); // on ordonne, pour qu'unique fonctionne (tabelement_type_ddl_retenu(n_mail)).unique(); // supprime le doublon si nécessaire } else if (rep == "ef") { // on efface la liste (tabelement_type_ddl_retenu(n_mail)).clear(); } else if (((Minuscules(rep) == "fin") || (Minuscules(rep) == "f")) && ( (tabelement_type_ddl_retenu(n_mail)).size()==0)) { rep = "-"; cout << " \n *** ERREUR: vous devez definir au moins une grandeur a visualiser !!";} else if ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) cout << " erreur de syntaxe dans le ddl! recommencez "; } // maintenant si la liste de grandeur quelconque est vide on s'arrête sinon on choisit les éléments if ( (tabelement_type_ddl_retenu(n_mail)).size() != 0) { Choix_element_a_retenir(n_mail,tabelement_type_ddl_retenu(n_mail)); } else { cout << "\n aucune grandeur enregistree ! \n "; }; } // -- fin de la boucle sur les maillages pour les éléments }; // entrée du choix d'une grandeur particulières (diff des ddl génériques) aux éléments void Choix_grandeurs_maple::Entree_grandeur_particuliere_aux_elements(string& rep) { // cas de grandeurs particulières aux éléments, on boucle sur les maillages int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); list::const_iterator ilm,ilmfin=list_mail.end(); int taille_list_maille = list_mail.size(); if (list_mail.size() == 0) { cout << "\n aucun maillage n'est definit ! , il faut commencer par definir les maillages pour" << " lesquels on veut une sortie "; return; }; // on balaie les différents maillages for (ilm = list_mail.begin();ilm!=ilmfin;ilm++) {int n_mail = abs(*ilm); // numéro du maillage // dans le cas où aucune grandeur particulière sont défini on passe if ( (tabelement_typeParti(n_mail)).size() == 0) { cout << "\n aucune grandeur particuliere n'est definit, donc aucune proposition ";} else { // def d'une liste de travail, pour vérifier que tous les grandeurs particuliers sont relatives // à un même point d'intégration List_io < Ddl_enum_etendu > li_ddl; // on affiche la liste actuelle if ((tabelement_typeParti_retenu(n_mail)).size()) { cout << "\n liste actuelle des element a sortir en info: "; List_io ::iterator ieint,ieintfin = tab_num_element(n_mail).end(); for (ieint=tab_num_element(n_mail).begin();ieint!=ieintfin;ieint++) cout << (*ieint) << " "; cout << "\n liste des grandeurs particulieres actuellement a sortir: "; List_io < TypeQuelconque >::iterator iet,ietfin = (tabelement_typeParti_retenu(n_mail)).end(); for (iet=(tabelement_typeParti_retenu(n_mail)).begin();iet!=ietfin;iet++) cout << ((*iet).EnuTypeQuelconque().NomPlein()) << " " ; cout << endl; } // on affiche les différentes grandeurs possibles cout << "\n maillage nb : " << n_mail ; cout << "\n la liste des grandeurs particulieres disponibles est la suivante : "; List_io < TypeQuelconque >::iterator iet,ietfin = (tabelement_typeParti(n_mail)).end(); for (iet=(tabelement_typeParti(n_mail)).begin();iet!=ietfin;iet++) cout << "\n " << ((*iet).EnuTypeQuelconque().NomPlein()) ; cout << "\n"; cout << "\n grandeurs que vous voulez visualiser ( rep : grandeurs?)" << "\n REMARQUE : il faut donner uniquement un jeu de grandeurs " << "\n definies au meme point d'integration " << "\n effacer la liste actuelle (rep : ef) " << "\n toutes les grandeurs : (rep : to) " << "\n (pour terminer tapez : fin (ou f))"; rep = ""; while ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) { cout << "\n grandeur ? ";rep = lect_return_defaut(false,"f"); if (rep == "to") // cas de toutes les grandeurs {List_io& tpg_ret = (tabelement_typeParti_retenu(n_mail)); // pour simplifier List_io& tpg = (tabelement_typeParti(n_mail)); // pour simplifier List_io::iterator ite,itefin = tpg.end(); for (ite = tabelement_typeParti(n_mail).begin();ite != itefin; ite++) if (find(tpg_ret.begin(),tpg_ret.end(),*ite) == tpg_ret.end()) { tpg_ret.push_back(*ite); // on enregistre également le ddl associé qui définit le point d'integ où est calculé la grandeur // particulière li_ddl.push_back(Ddl_enum_etendu((*ite).Enum())); }; } else if (TypeQuelconque_enum_etendu::VerifExistence(rep) ) // vérif que c'est une grandeur possible { // maintenant on vérifie qu'elle appartient à la liste des grandeurs disponibles TypeQuelconque a(TypeQuelconque_enum_etendu::RecupTypeQuelconque_enum_etendu(rep)); // création d'un type quelconque sans grandeur List_io& tpg_ret = (tabelement_typeParti_retenu(n_mail)); // pour simplifier List_io& tpg = (tabelement_typeParti(n_mail)); // pour simplifier if (find(tpg.begin(),tpg.end(),a) != tpg.end()) { // il existe -> enregistrement List_io::iterator il = find(tpg.begin(),tpg.end(),a); // récup du réel type // s'il n'existe pas déjà on l'enregistre vraiment if (find(tpg_ret.begin(),tpg_ret.end(),a) == tpg_ret.end()) { tpg_ret.push_back(*il); // on enregistre également le ddl associé qui définit le point d'integ où est calculé la grandeur // particulière li_ddl.push_back(Ddl_enum_etendu((*il).Enum())); }; } else { cout << "\n erreur, grandeur non disponible !, recommencez ";}; } else if (rep == "ef") { // on efface la liste (tabelement_typeParti_retenu(n_mail)).clear(); } else if ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) cout << " erreur de syntaxe recommencez "; }; // maintenant si la liste de grandeur quelconque est vide on s'arrête sinon on choisit les éléments if ( (tabelement_typeParti_retenu(n_mail)).size() != 0) { cout << "\n liste des grandeurs particulieres enregistrees: "; List_io < TypeQuelconque >::iterator iet,ietfin = (tabelement_typeParti_retenu(n_mail)).end(); for (iet=(tabelement_typeParti_retenu(n_mail)).begin();iet!=ietfin;iet++) cout << ((*iet).EnuTypeQuelconque().NomPlein()) << " " ; cout << endl; Choix_element_a_retenir(n_mail,li_ddl); } else { cout << "\n aucune grandeur enregistree ! \n "; }; }; //-- fin du choix sur le fait qu'il existe ou non des grandeurs particulières pour le maillage }; //-- fin de la boucle sur les maillages }; // entrée du choix d'une grandeur évoluées (tensorielles) aux éléments void Choix_grandeurs_maple::Entree_grandeur_tensorielle_aux_elements(string& rep) { // cas de grandeurs tensorielles aux éléments, on boucle sur les maillages int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); list::const_iterator ilm,ilmfin=list_mail.end(); int taille_list_maille = list_mail.size(); if (list_mail.size() == 0) { cout << "\n aucun maillage n'est definit ! , il faut commencer par definir les maillages pour" << " lesquels on veut une sortie "; return; }; // on balaie les différents maillages for (ilm = list_mail.begin();ilm!=ilmfin;ilm++) {int n_mail = abs(*ilm); // numéro du maillage // dans le cas où aucune grandeur particulière sont défini on passe if ( (tabelement_evoluee(n_mail)).size() == 0) { cout << "\n aucune grandeur tensorielle n'est definit, donc aucune proposition ";} else { // def d'une liste de travail, pour vérifier que tous les grandeurs évoluées sont relatives // à un même point d'intégration List_io < Ddl_enum_etendu > li_ddl; // on affiche la liste actuelle if ((tabelement_evoluee_retenu(n_mail)).size()) { cout << "\n liste actuelle des element a sortir en info: "; List_io ::iterator ieint,ieintfin = tab_num_element(n_mail).end(); for (ieint=tab_num_element(n_mail).begin();ieint!=ieintfin;ieint++) cout << (*ieint) << " "; cout << "\n liste des grandeurs tensorielles actuellement a sortir: (attention: peuvent ne pas etre definies) "; List_io < TypeQuelconque >::iterator iet,ietfin = (tabelement_evoluee_retenu(n_mail)).end(); for (iet=(tabelement_evoluee_retenu(n_mail)).begin();iet!=ietfin;iet++) cout << ((*iet).EnuTypeQuelconque().NomPlein()) << " " ; cout << endl; } // on affiche les différentes grandeurs possibles cout << "\n maillage nb : " << n_mail ; cout << "\n la liste des grandeurs tensorielles disponibles est la suivante : (attention: peuvent ne pas etre definies)"; List_io < TypeQuelconque >::iterator iet,ietfin = (tabelement_evoluee(n_mail)).end(); for (iet=(tabelement_evoluee(n_mail)).begin();iet!=ietfin;iet++) cout << "\n" << ((*iet).EnuTypeQuelconque().NomPlein()) ; cout << "\n"; cout << "\n grandeurs que vous voulez visualiser ( rep : grandeurs?)" << "\n REMARQUE : il faut donner uniquement un jeu de grandeurs " << "\n defini au meme point d'integration " << "\n effacer la liste actuelle (rep : ef) " << "\n toutes les grandeurs : (rep : to) " << "\n (pour terminer tapez : fin (ou f))"; rep = ""; while ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) { cout << "\n grandeur ? ";rep = lect_return_defaut(false,"f"); if (rep == "to") // cas de toutes les grandeurs {List_io& tpg_ret = (tabelement_evoluee_retenu(n_mail)); // pour simplifier List_io& tpg = (tabelement_evoluee(n_mail)); // pour simplifier List_io::iterator ite,itefin = tpg.end(); for (ite = tabelement_evoluee(n_mail).begin();ite != itefin; ite++) if (find(tpg_ret.begin(),tpg_ret.end(),*ite) == tpg_ret.end()) { tpg_ret.push_back(*ite); // on enregistre également le ddl associé qui définit le point d'integ où est calculé la grandeur // évoluées li_ddl.push_back(Ddl_enum_etendu((*ite).Enum())); }; } else if (TypeQuelconque_enum_etendu::VerifExistence(rep) ) // vérif que c'est une grandeur possible { // maintenant on vérifie qu'elle appartient à la liste des grandeurs disponibles TypeQuelconque a(TypeQuelconque_enum_etendu::RecupTypeQuelconque_enum_etendu(rep)); // création d'un type quelconque sans grandeur List_io& tpg_ret = (tabelement_evoluee_retenu(n_mail)); // pour simplifier List_io& tpg = (tabelement_evoluee(n_mail)); // pour simplifier if (find(tpg.begin(),tpg.end(),a) != tpg.end()) { // il existe -> enregistrement List_io::iterator il = find(tpg.begin(),tpg.end(),a); // récup du réel type // s'il n'existe pas déjà on l'enregistre vraiment if (find(tpg_ret.begin(),tpg_ret.end(),a) == tpg_ret.end()) { tpg_ret.push_back(*il); // on enregistre également le ddl associé qui définit le point d'integ où est calculé la grandeur // évoluées li_ddl.push_back(Ddl_enum_etendu((*il).Enum())); }; } else { cout << "\n erreur, grandeur non disponible !, recommencez ";}; } else if (rep == "ef") { // on efface la liste (tabelement_evoluee_retenu(n_mail)).clear(); } else if ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) cout << " erreur de syntaxe recommencez "; }; // maintenant si la liste de grandeur quelconque est vide on s'arrête sinon on choisit les éléments if ( (tabelement_evoluee_retenu(n_mail)).size() != 0) { cout << "\n liste des grandeurs tensorielles enregistrees: "; List_io < TypeQuelconque >::iterator iet,ietfin = (tabelement_evoluee_retenu(n_mail)).end(); for (iet=(tabelement_evoluee_retenu(n_mail)).begin();iet!=ietfin;iet++) cout << ((*iet).EnuTypeQuelconque().NomPlein()) << " " ; cout << endl; Choix_element_a_retenir(n_mail,li_ddl); } else { cout << "\n aucune grandeur enregistree ! \n "; }; }; //-- fin du choix sur le fait qu'il existe ou non des grandeurs évoluées pour le maillage }; //-- fin de la boucle sur les maillages }; // entrée du choix d'une grandeur quelconque aux faces d'éléments void Choix_grandeurs_maple::Entree_grandeur_quelconque_aux_faces_element(string& rep) { // cas de grandeurs quelconques aux faces des éléments, on boucle sur les maillages int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); list::const_iterator ilm,ilmfin=list_mail.end(); int taille_list_maille = list_mail.size(); if (list_mail.size() == 0) { cout << "\n aucun maillage n'est definit ! , il faut commencer par definir les maillages pour" << " lesquels on veut une sortie "; return; }; // on balaie les différents maillages for (ilm = list_mail.begin();ilm!=ilmfin;ilm++) {int n_mail = abs(*ilm); // numéro du maillage // dans le cas où aucune grandeur particulière sont défini on passe if ( (tab_F_element_TypeQuelconque(n_mail)).size() == 0) { cout << "\n aucune grandeur quelconque n'est definit aux faces d'element, donc aucune proposition ";} else { // def de la liste de travail qui contient les grandeurs à visualiser, // sert également pour vérifier que tous les grandeurs quelconques sont relatives // à un même point d'intégration List_io < EnumTypeQuelconque > li_enu_quelconque; // on affiche la liste actuelle if ((tab_F_element_TypeQuelconque_retenu(n_mail)).size()) { cout << "\n liste actuelle des faces element a sortir en info: < (num_ele, num_face) > "; List_io ::iterator ieint,ieintfin = tab_num_F_element(n_mail).end(); List_io ::iterator ifint = tab_num_F(n_mail).begin(); for (ieint=tab_num_F_element(n_mail).begin();ieint!=ieintfin;ieint++,ifint++) cout << " (" << (*ieint) << ", "<<(*ifint)<<") "; cout << "\n liste des grandeurs quelconques actuellement a sortir: "; List_io < TypeQuelconque >::iterator iet,ietfin = (tab_F_element_TypeQuelconque_retenu(n_mail)).end(); for (iet=(tab_F_element_TypeQuelconque_retenu(n_mail)).begin();iet!=ietfin;iet++) cout << ((*iet).EnuTypeQuelconque().NomPlein()) << " " ; cout << endl; } // on affiche les différentes grandeurs possibles cout << "\n maillage nb : " << n_mail ; cout << "\n la liste des grandeurs quelconque disponibles aux faces d'element est la suivante : "; {List_io < TypeQuelconque >::iterator iet,ietfin = (tab_F_element_TypeQuelconque(n_mail)).end(); for (iet=(tab_F_element_TypeQuelconque(n_mail)).begin();iet!=ietfin;iet++) cout << "\n " << ((*iet).EnuTypeQuelconque().NomPlein()) ; } cout << "\n"; cout << "\n grandeurs que vous voulez visualiser ( rep : grandeurs?)" << "\n REMARQUE : il faut donner uniquement un jeu de grandeurs " << "\n definies au meme point d'integration " << "\n effacer la liste actuelle (rep : ef) " << "\n toutes les grandeurs : (rep : to) " << "\n (pour terminer tapez : fin (ou f))"; rep = ""; while ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) { cout << "\n grandeur ? ";rep = lect_return_defaut(false,"f"); if (rep == "to") // cas de toutes les grandeurs {List_io& tpg_ret = (tab_F_element_TypeQuelconque_retenu(n_mail)); // pour simplifier List_io& tpg = (tab_F_element_TypeQuelconque(n_mail)); // pour simplifier List_io::iterator ite,itefin = tpg.end(); for (ite = tab_F_element_TypeQuelconque(n_mail).begin();ite != itefin; ite++) if (find(tpg_ret.begin(),tpg_ret.end(),*ite) == tpg_ret.end()) { tpg_ret.push_back(*ite); // on enregistre également l'enum quelconque associé qui définit le point d'integ où est calculé la grandeur li_enu_quelconque.push_back((*ite).EnuTypeQuelconque().EnumTQ()); }; } else if (TypeQuelconque_enum_etendu::VerifExistence(rep) ) // vérif que c'est une grandeur possible { // maintenant on vérifie qu'elle appartient à la liste des grandeurs disponibles TypeQuelconque a(TypeQuelconque_enum_etendu::RecupTypeQuelconque_enum_etendu(rep)); // création d'un type quelconque sans grandeur List_io& tpg_ret = (tab_F_element_TypeQuelconque_retenu(n_mail)); // pour simplifier List_io& tpg = (tab_F_element_TypeQuelconque(n_mail)); // pour simplifier if (find(tpg.begin(),tpg.end(),a) != tpg.end()) { // il existe -> enregistrement List_io::iterator il = find(tpg.begin(),tpg.end(),a); // récup du réel type // s'il n'existe pas déjà on l'enregistre vraiment if (find(tpg_ret.begin(),tpg_ret.end(),a) == tpg_ret.end()) { tpg_ret.push_back(*il); // on enregistre également l'enum quelconque associé qui définit le point d'integ où est calculé la grandeur li_enu_quelconque.push_back((*il).EnuTypeQuelconque().EnumTQ()); }; } else { cout << "\n erreur, grandeur non disponible !, recommencez ";}; } else if (rep == "ef") { // on efface la liste (tab_F_element_TypeQuelconque_retenu(n_mail)).clear(); } else if ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) cout << " erreur de syntaxe recommencez "; }; // maintenant si la liste de grandeur quelconque est vide on s'arrête sinon on choisit les faces d'élément if ( (tab_F_element_TypeQuelconque_retenu(n_mail)).size() != 0) { cout << "\n liste des grandeurs particulieres enregistrees: "; List_io < TypeQuelconque >::iterator iet,ietfin = (tab_F_element_TypeQuelconque_retenu(n_mail)).end(); for (iet=(tab_F_element_TypeQuelconque_retenu(n_mail)).begin();iet!=ietfin;iet++) cout << ((*iet).EnuTypeQuelconque().NomPlein()) << " " ; cout << endl; Choix_faces_element_a_retenir(n_mail,li_enu_quelconque); } else { cout << "\n aucune grandeur enregistree ! \n "; }; }; //-- fin du choix sur le fait qu'il existe ou non des grandeurs particulières pour le maillage }; //-- fin de la boucle sur les maillages }; // entrée du choix d'une grandeur quelconque aux arêtes d'éléments void Choix_grandeurs_maple::Entree_grandeur_quelconque_aux_aretes_element(string& rep) { // cas de grandeurs quelconques aux arêtes des éléments, on boucle sur les maillages int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); list::const_iterator ilm,ilmfin=list_mail.end(); int taille_list_maille = list_mail.size(); if (list_mail.size() == 0) { cout << "\n aucun maillage n'est definit ! , il faut commencer par definir les maillages pour" << " lesquels on veut une sortie "; return; }; // on balaie les différents maillages for (ilm = list_mail.begin();ilm!=ilmfin;ilm++) {int n_mail = abs(*ilm); // numéro du maillage // dans le cas où aucune grandeur particulière sont défini on passe if ( (tab_A_element_TypeQuelconque(n_mail)).size() == 0) { cout << "\n aucune grandeur quelconque n'est definit aux aretes d'element, donc aucune proposition ";} else { // def de la liste de travail qui contient les grandeurs à visualiser, // sert également pour vérifier que tous les grandeurs quelconques sont relatives // à un même point d'intégration List_io < EnumTypeQuelconque > li_enu_quelconque; // on affiche la liste actuelle if ((tab_A_element_TypeQuelconque_retenu(n_mail)).size()) { cout << "\n liste actuelle des aretes element a sortir en info: < (num_ele, num_arete) > "; List_io ::iterator ieint,ieintfin = tab_num_A_element(n_mail).end(); List_io ::iterator ifint = tab_num_A(n_mail).begin(); for (ieint=tab_num_A_element(n_mail).begin();ieint!=ieintfin;ieint++,ifint++) cout << " (" << (*ieint) << ", "<<(*ifint)<<") "; cout << "\n liste des grandeurs quelconques actuellement a sortir: "; List_io < TypeQuelconque >::iterator iet,ietfin = (tab_A_element_TypeQuelconque_retenu(n_mail)).end(); for (iet=(tab_A_element_TypeQuelconque_retenu(n_mail)).begin();iet!=ietfin;iet++) cout << ((*iet).EnuTypeQuelconque().NomPlein()) << " " ; cout << endl; } // on affiche les différentes grandeurs possibles cout << "\n maillage nb : " << n_mail ; cout << "\n la liste des grandeurs quelconque disponibles aux aretes d'element est la suivante : "; List_io < TypeQuelconque >::iterator iet,ietfin = (tab_A_element_TypeQuelconque(n_mail)).end(); for (iet=(tab_A_element_TypeQuelconque(n_mail)).begin();iet!=ietfin;iet++) cout << "\n " << ((*iet).EnuTypeQuelconque().NomPlein()) ; cout << "\n"; cout << "\n grandeurs que vous voulez visualiser ( rep : grandeurs?)" << "\n REMARQUE : il faut donner uniquement un jeu de grandeurs " << "\n definies au meme point d'integration " << "\n effacer la liste actuelle (rep : ef) " << "\n toutes les grandeurs : (rep : to) " << "\n (pour terminer tapez : fin (ou f))"; rep = ""; while ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) { cout << "\n grandeur ? ";rep = lect_return_defaut(false,"f"); if (rep == "to") // cas de toutes les grandeurs {List_io& tpg_ret = (tab_A_element_TypeQuelconque_retenu(n_mail)); // pour simplifier List_io& tpg = (tab_A_element_TypeQuelconque(n_mail)); // pour simplifier List_io::iterator ite,itefin = tpg.end(); for (ite = tab_A_element_TypeQuelconque(n_mail).begin();ite != itefin; ite++) if (find(tpg_ret.begin(),tpg_ret.end(),*ite) == tpg_ret.end()) { tpg_ret.push_back(*ite); // on enregistre également l'enum quelconque associé qui définit le point d'integ où est calculé la grandeur li_enu_quelconque.push_back((*ite).EnuTypeQuelconque().EnumTQ()); }; } else if (TypeQuelconque_enum_etendu::VerifExistence(rep) ) // vérif que c'est une grandeur possible { // maintenant on vérifie qu'elle appartient à la liste des grandeurs disponibles TypeQuelconque a(TypeQuelconque_enum_etendu::RecupTypeQuelconque_enum_etendu(rep)); // création d'un type quelconque sans grandeur List_io& tpg_ret = (tab_A_element_TypeQuelconque_retenu(n_mail)); // pour simplifier List_io& tpg = (tab_A_element_TypeQuelconque(n_mail)); // pour simplifier if (find(tpg.begin(),tpg.end(),a) != tpg.end()) { // il existe -> enregistrement List_io::iterator il = find(tpg.begin(),tpg.end(),a); // récup du réel type // s'il n'existe pas déjà on l'enregistre vraiment if (find(tpg_ret.begin(),tpg_ret.end(),a) == tpg_ret.end()) { tpg_ret.push_back(*il); // on enregistre également l'enum quelconque associé qui définit le point d'integ où est calculé la grandeur li_enu_quelconque.push_back((*il).EnuTypeQuelconque().EnumTQ()); }; } else { cout << "\n erreur, grandeur non disponible !, recommencez ";}; } else if (rep == "ef") { // on efface la liste (tab_A_element_TypeQuelconque_retenu(n_mail)).clear(); } else if ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) cout << " erreur de syntaxe recommencez "; }; // maintenant si la liste de grandeur quelconque est vide on s'arrête sinon on choisit les arêtes élément if ( (tab_A_element_TypeQuelconque_retenu(n_mail)).size() != 0) { cout << "\n liste des grandeurs particulieres enregistrees: "; List_io < TypeQuelconque >::iterator iet,ietfin = (tab_A_element_TypeQuelconque_retenu(n_mail)).end(); for (iet=(tab_A_element_TypeQuelconque_retenu(n_mail)).begin();iet!=ietfin;iet++) cout << ((*iet).EnuTypeQuelconque().NomPlein()) << " " ; cout << endl; Choix_aretes_element_a_retenir(n_mail,li_enu_quelconque); } else { cout << "\n aucune grandeur enregistree ! \n "; }; }; //-- fin du choix sur le fait qu'il existe ou non des grandeurs particulières pour le maillage }; //-- fin de la boucle sur les maillages }; // choix des éléments void Choix_grandeurs_maple::Choix_element_a_retenir(int n_mail,List_io < Ddl_enum_etendu >& li_ddl) { // def de grandeur globale int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); list::const_iterator ilm,ilmfin=list_mail.end(); int taille_list_maille = list_mail.size(); // choix du ou des elements, on affiche la liste actuelle si elle est non nulle if (tab_num_element(n_mail).size()) {cout << "\n liste actuelle des element: "; List_io ::iterator ieint,ieintfin = tab_num_element(n_mail).end(); for (ieint=tab_num_element(n_mail).begin();ieint!=ieintfin;ieint++) cout << *ieint << " "; }; cout <::iterator ieint1,ieintfin1 = (nomDeRef_E(n_mail)).end(); for (ieint1=(nomDeRef_E(n_mail)).begin();ieint1!=ieintfin1;ieint1++) cout << (*ieint1).NomRef() << " "<< (int) ((*ieint1).Val()) << " "; cout << endl; } // cas des références de point d'intégration d'éléments if ((nomDeRef_ptinteg(n_mail)).size() != 0) { cout << "\n liste actuelle de reference de pt d'integration d'elements: (ref) "; List_io ::iterator ieint1,ieintfin1 = (nomDeRef_ptinteg(n_mail)).end(); for (ieint1=(nomDeRef_ptinteg(n_mail)).begin();ieint1!=ieintfin1;ieint1++) cout << (*ieint1) << " "; cout << endl; } cout << "\n choix de la position sur le ou les elements ou l'on veut la visualisation " << "\n le reperage peut se faire de differentes manieres : " << "\n par un numero d'element dans le maillage + un ou plusieurs " << "\n numero(s) de pt d'integration (au sens classique) -> (choix : 1)" << "\n par des coordonnees d'un point (interne !!), meme approximatives " << "\n la grandeur affichee sera a un point le plus proche ou elle existe -> (choix : 2)" << "\n par une reference de liste d'element (avec 1 ou tous les pti) -> (choix : 3)" << "\n (dans ce dernier cas il faut que tous les elements soient de meme type) " << "\n par une reference de liste de point d'integration d'element -> (choix : 4)" << "\n donnez le type de choix puis les infos correspondantes " << "\n effacer la liste actuelle -> (rep : ef) " << "\n effacer la liste actuelle des references d'elements -> (rep : efref) " << "\n afficher la liste des references d'elements existants -> (rep : affref) " << "\n effacer la liste actuelle des references de pt integ d'element -> (rep : efrefpti) " << "\n afficher la liste des references de pt integ d'elements existants -> (rep : affrefpti) " << "\n (tapez fin pour finir(ou f))"; string rep = ""; // -- début boucle choix position sur element while ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) { cout << "\n choix ? ";rep = lect_return_defaut(false,"f"); if ((Minuscules(rep) == "fin") || (Minuscules(rep) == "f")) break; // def du conteneur des numéros que l'on cherche // comme on peut en définir plusieurs d'un coup (par exemple tous les pti d'un élément) on utilise une liste list list_nut; // à chaque passage elle est initialisée et donc vide au début Maillage::NBelemEtptInteg nut; // idem, initialisé à chaque passage bool verif = true; // pour la vérification des numéros if (rep == "1") { cout << " numero d'element ? "; rep = lect_chaine(); nut.nbElem = ChangeEntier(rep); cout << " numero du point d'integration (ou -1 pour tous les pti de l'element) ? "; rep = lect_chaine(); nut.nbPtInteg = ChangeEntier(rep); if (nut.nbPtInteg != -1) {list_nut.push_back(nut);} // cas d'un seul pti else // cas de tous les pti {// on commence par tester si l'élément existe vraiment if ((nut.nbElem < 0) || (nut.nbElem > lesMail->Nombre_element(n_mail))) {if (nut.nbElem < 0) { cout << "\n le numero d'element doit etre superieur a 0 !!!";verif = false;}; if (nut.nbElem > lesMail->Nombre_element(n_mail)) { cout << "\n chois non valide, le numero d'element doit etre inferieur ou egal" << " au nombre total d'element du maillage !!!";verif = false; }; } else // sinon c'est ok, on continue au niveau des pti {Element& ele = lesMail->Element_LesMaille(n_mail,nut.nbElem); // par simplification // maintenant on va vérifier que tous les ddl correspondent aux mêmes nombre de pti // on récupère le nb de pti pour le premier ddl retenu List_io::iterator ite,itefin = li_ddl.end(); ite = li_ddl.begin(); int nbpti = 0; // init bool veriflocal = true; if (ite == li_ddl.end()) {veriflocal = false;} // la liste est vide on ne peut pas aller plus loin else {nbpti = ele.NbPtInteg((*ite).Enum()); for (nut.nbPtInteg = 1; nut.nbPtInteg <= nbpti;nut.nbPtInteg++) // boucle sur les ddl retenus for (ite = li_ddl.begin();ite != itefin; ite++) { // vérification de l'adéquation numéro de point d'intégration et énumération et élément if (!(lesMail->Element_LesMaille(n_mail,nut.nbElem).Existe_pt_integ(nut.nbPtInteg,(*ite).Enum()))) { cout << "\n le numero " << nut.nbPtInteg << " de numero d'ordre " << " pour le ddl " << Nom_ddl((*ite).Enum()) << " n'est pas valide pour l'element " << nut.nbElem << " du maillage " << n_mail << " !!!! "; cout << "\n une raison possible est qu'il y a des elements avec un nombre different de " << "points d'integration : cas non permis actuellement (se plaindre !! ) "; veriflocal = false; }; }; //-- fin de la boucle sur les ddl retenus }; // si tout est ok arrivée ici on enregistre if (veriflocal) { for (nut.nbPtInteg = 1; nut.nbPtInteg <= nbpti;nut.nbPtInteg++) list_nut.push_back(nut); } else // sinon on averti que c'est mauvais {verif = false;}; }; }; } else if (rep == "2") { Coordonnee xi(dim); cout << "\n coordonnee ("<> xi(j); std::cin.ignore( std::numeric_limits::max(), '\n' );// purge de cin cout << "\n les coordonnees sont a: t = 0 ou t ou tdt (repondre 0 ou t ou tdt) ? "; rep = lect_chaine(); bool rep_exploitable = true; Enum_dure enu_temps; if (rep == "0") enu_temps = TEMPS_0; else if (rep == "t") enu_temps = TEMPS_t; else if (rep == "tdt") enu_temps = TEMPS_tdt; else { cout << "\n erreur de syntaxe, on attendait 0 t ou tdt ";verif = false; rep_exploitable = false; }; if (rep_exploitable) {nut = lesMail->Element_le_plus_proche(enu_temps,li_ddl,xi,n_mail); if (nut.nbElem == 0) // cas où l'on ne trouve pas d'élément { cout << "\n pas d'element qui contiend ce point, pour les ddl et le temps " << rep << " recommencez ! "; verif = false; } else if ( nut.nbPtInteg < 0) { cout << "\n il n'est pas possible de trouver un seul point d'integration pour " << " tous les ddl que vous avez choisi, le mieux est de recommencer avec " << " des ddl de meme type c-a-d par exemple contrainte ou erreur, mais " << " pas les deux en meme temps car ils n'utilisent pas le meme systeme de " << " points d'integration !! "; verif = false; } else { cout << "\n element contenant le point nb= " << nut.nbElem << " et le numero d'ordre le plus proche " << nut.nbPtInteg << " de coordonnee a t: " ; List_io::iterator ienu=li_ddl.begin(); bool erreur=false; // ici on n'en tiend pas compte car déjà testé Coordonnee ncor = lesMail->Element_LesMaille(n_mail,nut.nbElem).CoordPtInteg (TEMPS_t,(*ienu).Enum(),nut.nbPtInteg,erreur); for (int ic=1;ic<=ncor.Dimension();ic++) cout << ncor(ic) << " "; // le choix est a priori ok, on enregistre list_nut.push_back(nut); }; }; } else if (rep == "3") { string nom_ref; cout << "\n nom de la reference ? "; nom_ref= lect_chaine(); // vérif que la référence existe if ((!(lesRef->Existe(nom_ref,n_mail))) || (lesRef->Trouve(nom_ref,n_mail).Indic() != 2)) { cout << "\n erreur de nom (** "<< nom_ref << " **) donne ne correspond pas a une reference d'element correcte ";} else { // choix du point d'intégration, ici on ne va pas utiliser la liste list_nut, mais une liste particulière string repo; cout << " numero d'un point d'integration ou: -1 pour tous les pti ? "; repo = lect_chaine(); nut.nbPtInteg = ChangeEntier(repo); if (nut.nbPtInteg != -1) // cas d'un seul pti {// on vérifie que ce point d'intégration est valide pour tous les éléments de la référence bool veriflocal = true; List_io ::iterator idl,idlfin= nomDeRef_E(n_mail).end(); List_io::iterator ite,itefin = li_ddl.end(); // boucle sur les ddl retenus for (ite = li_ddl.begin();ite != itefin; ite++) { // recup de la reference correspondant au mot cle const Reference& refi = lesRef->Trouve(nom_ref,n_mail); const ReferenceNE & reff = ((ReferenceNE &) refi); // transfo en ref d'élément int taillen=reff.Taille(); // nombre d'éléments dans la référence for (int ielem=1;ielem<=taillen;ielem++) // on boucle sur les éléments de la référence { nut.nbElem = reff.Numero(ielem); // vérification de l'adéquation numéro de point d'intégration et énumération et élément if (!(lesMail->Element_LesMaille(n_mail,nut.nbElem).Existe_pt_integ(nut.nbPtInteg,(*ite).Enum()))) { cout << "\n le numero " << nut.nbPtInteg << " de numero d'ordre " << " pour le ddl " << Nom_ddl((*ite).Enum()) << " n'est pas valide pour l'element " << nut.nbElem << " du maillage " << n_mail << " !!!! "; veriflocal = false; }; } //-- fin de la boucle sur les éléments de la référence }; //-- fin de la boucle sur les ddl retenus // on enregistre si la vérification a été ok if (veriflocal) { nomDeRef_E(n_mail).push_back(BlocScal(nom_ref,nut.nbPtInteg)); nomDeRef_E(n_mail).sort(); // on ordonne nomDeRef_E(n_mail).unique();// on supprime les doublons }; } else // cas de tous les pti { // il faut d'abord que l'on vérifie que tous les pti pour tous les éléments sont valides // .. on commence par tester si un premier élément existe vraiment et si oui, on récupère le nb de pti associé bool veriflocal = true; int nbpti = 0; // init { // on encapsule pour pas de redondance de nom const Reference& refi = lesRef->Trouve(nom_ref,n_mail); const ReferenceNE & reff = ((ReferenceNE &) refi); // transfo en ref d'élément int taillen=reff.Taille(); // nombre d'éléments dans la référence if (taillen < 1) {veriflocal = false;} // cas d'une ref vide, on ne peut pas aller plus loin else {nut.nbElem = reff.Numero(1); if ((nut.nbElem < 0) || (nut.nbElem > lesMail->Nombre_element(n_mail))) {if (nut.nbElem < 0) { cout << "\n le numero d'element doit etre superieur a 0 !!!";verif = false;}; if (nut.nbElem > lesMail->Nombre_element(n_mail)) { cout << "\n chois non valide, le numero d'element doit etre inferieur ou egal " << " au nombre total d'element du maillage !!!";verif = false; }; } else // sinon c'est ok, on continue au niveau des pti {Element& ele = lesMail->Element_LesMaille(n_mail,nut.nbElem); // par simplification List_io::iterator ite = li_ddl.begin(); if (ite == li_ddl.end()) {veriflocal = false;} // la liste est vide on ne peut pas aller plus loin else {nbpti = ele.NbPtInteg((*ite).Enum());}; }; }; }; // .. puis on balaie l'ensemble des éléments et l'ensemble des pti if (veriflocal) {List_io ::iterator idl,idlfin= nomDeRef_E(n_mail).end(); List_io::iterator ite,itefin = li_ddl.end(); // boucle sur les ddl retenus for (ite = li_ddl.begin();ite != itefin; ite++) { // recup de la reference correspondant au mot cle const Reference& refi = lesRef->Trouve(nom_ref,n_mail); const ReferenceNE & reff = ((ReferenceNE &) refi); // transfo en ref d'élément int taillen=reff.Taille(); // nombre d'éléments dans la référence for (int ielem=1;ielem<=taillen;ielem++) // on boucle sur les éléments de la référence { nut.nbElem = reff.Numero(ielem); for (nut.nbPtInteg = 1; nut.nbPtInteg <= nbpti;nut.nbPtInteg++) // vérification de l'adéquation numéro de point d'intégration et énumération et élément if (!(lesMail->Element_LesMaille(n_mail,nut.nbElem).Existe_pt_integ(nut.nbPtInteg,(*ite).Enum()))) { cout << "\n le numero " << nut.nbPtInteg << " de numero d'ordre " << " pour le ddl " << Nom_ddl((*ite).Enum()) << " n'est pas valide pour l'element " << nut.nbElem << " du maillage " << n_mail << " !!!! "; veriflocal = false; break; }; if (!veriflocal) break; } //-- fin de la boucle sur les éléments de la référence if (!veriflocal) break; }; //-- fin de la boucle sur les ddl retenus }; // arrivée ici, si tout est ok on enregistre if (veriflocal) for (nut.nbPtInteg = 1; nut.nbPtInteg <= nbpti;nut.nbPtInteg++) { nomDeRef_E(n_mail).push_back(BlocScal(nom_ref,nut.nbPtInteg)); nomDeRef_E(n_mail).sort(); // on ordonne nomDeRef_E(n_mail).unique();// on supprime les doublons }; }; }; // fin du choix du point d'intégration et de l'enregistrement verif = false; // pour ne pas enregistrer de numéro dans la liste directe d'element car ici c'est // la liste de référence de référence d'éléments qui est en cause } else if (rep == "4") { string nom_ref; cout << "\n nom de la reference ? ";nom_ref= lect_chaine(); // vérif que la référence existe if ((!(lesRef->Existe(nom_ref,n_mail))) || (lesRef->Trouve(nom_ref,n_mail).Indic() != 6)) { cout << "\n erreur de nom (** "<< nom_ref << " **) donne ne correspond pas a une reference de point d'integration " << " d'element correcte ";} else { // on vérifie que le choix est valide bool veriflocal = true; List_io ::iterator idl,idlfin= nomDeRef_ptinteg(n_mail).end(); List_io::iterator ite,itefin = li_ddl.end(); // boucle sur les ddl retenus for (ite = li_ddl.begin();ite != itefin; ite++) { // recup de la reference correspondant au mot cle const Reference& refi = lesRef->Trouve(nom_ref,n_mail); const ReferenceAF & reff = ((ReferenceAF &) refi); // transfo en ref d'élément int taillen=reff.Taille(); // nombre d'éléments dans la référence for (int ielem=1;ielem<=taillen;ielem++) // on boucle sur les éléments de la référence { nut.nbElem = reff.NumeroElem(ielem); nut.nbPtInteg = reff.NumeroFA(ielem); // vérification de l'adéquation numéro de point d'intégration et énumération et élément if (!(lesMail->Element_LesMaille(n_mail,nut.nbElem).Existe_pt_integ(nut.nbPtInteg,(*ite).Enum()))) { cout << "\n le numero " << nut.nbPtInteg << " de numero d'ordre " << " pour le ddl " << Nom_ddl((*ite).Enum()) << " n'est pas valide pour l'element " << nut.nbElem << " du maillage " << n_mail << " !!!! "; veriflocal = false; }; } //-- fin de la boucle sur les éléments de la référence } //-- fin de la boucle sur les ddl retenus // on enregistre si la vérification a été ok if (veriflocal) { nomDeRef_ptinteg(n_mail).push_back(nom_ref); nomDeRef_ptinteg(n_mail).sort(); // on ordonne nomDeRef_ptinteg(n_mail).unique();// on supprime les doublons }; }; // fin du choix du point d'intégration et de l'enregistrement verif = false; // pour ne pas enregistrer de numéro dans la liste directe d'element car ici c'est // la liste de référence de référence d'éléments qui est en cause } else if (rep == "ef") { // on efface les deux listes (tab_num_element(n_mail)).clear(); (tab_num_integ(n_mail)).clear(); verif = false; } else if (rep == "efref") { // on efface la liste des références d'éléments et la liste de pt d'integ associée (nomDeRef_E(n_mail)).clear(); verif = false; } else if (rep == "affref") { // affichage de la liste des références d'éléments enregistrées dans les maillages cout << "\n liste des references d'elements "; if (taille_list_maille > 1) cout << "pour le maillage " << lesMail->NomMaillage(n_mail); const Reference* reff =NULL; bool prempass = true; do { if (prempass) { reff= lesRef->Init_et_Premiere();} // récup de la ref 1 et init else { reff = lesRef->Reference_suivante();} // récup de la ref courante // sortie de la ref si c'est le bon maillage, et si c'est une ref d'élément if (reff != NULL) if ((reff->Nbmaille() == n_mail) && (reff->Indic() == 2)) cout << reff->Nom() << " "; prempass = false; } while (reff != NULL); verif = false; } else if (rep == "efrefpti") { // on efface la liste des références de pt d'integ d'éléments (nomDeRef_ptinteg(n_mail)).clear(); verif = false; } else if (rep == "affrefpti") { // affichage de la liste des références de pti enregistrées dans les maillages cout << "\n liste des references de pt integ d'elements "; if (taille_list_maille > 1) cout << "pour le maillage " << lesMail->NomMaillage(n_mail); const Reference* reff =NULL; bool prempass = true; do { if (prempass) { reff= lesRef->Init_et_Premiere();} // récup de la ref 1 et init else { reff = lesRef->Reference_suivante();} // récup de la ref courante // sortie de la ref si c'est le bon maillage, et si c'est une ref d'élément if (reff != NULL) if ((reff->Nbmaille() == n_mail) && (reff->Indic() == 6)) cout << reff->Nom() << " "; prempass = false; } while (reff != NULL); verif = false; } else { cout << "\n reponse non valide, recommencez " << endl; }; // vérification des numéros d'éléments if (verif) { // on balaie les numéros de la liste list ::iterator i_list_nut,i_list_nut_fin = list_nut.end(); for (i_list_nut=list_nut.begin();i_list_nut != i_list_nut_fin;i_list_nut++) { nut = (*i_list_nut); // par simplicité if (nut.nbElem < 0) { cout << "\n le numero d'element doit etre superieur a 0 !!!";verif = false;}; if (nut.nbElem > lesMail->Nombre_element(n_mail)) { cout << "\n chois non valide, le numero d'element doit etre inferieur ou egal" << " au nombre total d'element du maillage !!!";verif = false; }; }; }; // .. vérification des numéros de pti // tout d'abord les numéros négatifs if (verif) { // on balaie les numéros de la liste list ::iterator i_list_nut,i_list_nut_fin = list_nut.end(); for (i_list_nut=list_nut.begin();i_list_nut != i_list_nut_fin;i_list_nut++) { nut = (*i_list_nut); // par simplicité if (nut.nbPtInteg < 0) { cout << "\n le numero du point d'integration doit etre superieur a 0 !!!";verif = false;}; }; }; // puis vérif que le pt d'integ existe // on récupère l'élément géométrique qui correspond aux ddl if (verif) { // on balaie les numéros de la liste list ::iterator i_list_nut,i_list_nut_fin = list_nut.end(); for (i_list_nut=list_nut.begin();i_list_nut != i_list_nut_fin;i_list_nut++) { nut = (*i_list_nut); // par simplicité List_io::iterator ite,itefin = li_ddl.end(); for (ite = li_ddl.begin();ite != itefin; ite++) { // vérification de l'adéquation numéro de point d'intégration et énumération et élément if (!(lesMail->Element_LesMaille(n_mail,nut.nbElem).Existe_pt_integ(nut.nbPtInteg,(*ite).Enum()))) { cout << "\n le numero " << nut.nbPtInteg << " de numero d'ordre " << " pour le ddl " << Nom_ddl((*ite).Enum()) << " n'est pas valide pour l'element " << nut.nbElem << " du maillage " << n_mail << " !!!! "; verif = false; }; }; }; }; // enregistrement si tout est ok if ((verif)&&((Minuscules(rep) != "fin") && (Minuscules(rep) != "f"))) { // on balaie les numéros de la liste list ::iterator i_list_nut,i_list_nut_fin = list_nut.end(); for (i_list_nut=list_nut.begin();i_list_nut != i_list_nut_fin;i_list_nut++) { nut = (*i_list_nut); // par simplicité // si le groupe (élément, nb point d'intégration) n'est pas actuellement enregistré, on l'enregistre // on boucle sur les datas déjà enregistrés bool a_enregistrer=true; List_io ::iterator ilelem,ilinteg,ilelemfin=tab_num_element(n_mail).end(); ilinteg = tab_num_integ(n_mail).begin(); for (ilelem=tab_num_element(n_mail).begin();ilelem != ilelemfin;ilelem++,ilinteg++) if ((nut.nbElem==(*ilelem))&&(nut.nbPtInteg==(*ilinteg))) a_enregistrer = false; if (a_enregistrer) { tab_num_element(n_mail).push_back(nut.nbElem); tab_num_integ(n_mail).push_back(nut.nbPtInteg); }; }; // if ( (find(tab_num_element(n_mail).begin(),tab_num_element(n_mail).end(),nut.nbElem) // == tab_num_element(n_mail).end()) // && (find(tab_num_integ(n_mail).begin(),tab_num_integ(n_mail).end(),nut.nbPtInteg) // == tab_num_integ(n_mail).end())) // { tab_num_element(n_mail).push_back(nut.nbElem); // tab_num_integ(n_mail).push_back(nut.nbPtInteg); // }; }; }; // -- fin boucle choix position sur element }; // choix des faces d'éléments void Choix_grandeurs_maple::Choix_faces_element_a_retenir(int n_mail,List_io < EnumTypeQuelconque >& li_enu_quelc) { // def de grandeur globale int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); list::const_iterator ilm,ilmfin=list_mail.end(); int taille_list_maille = list_mail.size(); // choix du ou des faces d'elements, on affiche la liste actuelle si elle est non nulle if (tab_num_F_element(n_mail).size()) { cout << "\n liste actuelle des faces element a sortir en info: < (num_ele, num_face) > "; List_io ::iterator ieint,ieintfin = tab_num_F_element(n_mail).end(); List_io ::iterator ifint = tab_num_F(n_mail).begin(); for (ieint=tab_num_F_element(n_mail).begin();ieint!=ieintfin;ieint++,ifint++) cout << " (" << (*ieint) << ", "<<(*ifint)<<") "; cout << endl; } // cas des références de faces d'élément if ((nomDeRef_F_E(n_mail)).size() != 0) { cout << "\n liste actuelle de reference de faces d'element: (ref et num integ) "; List_io ::iterator ieint1,ieintfin1 = (nomDeRef_F_E(n_mail)).end(); for (ieint1=(nomDeRef_F_E(n_mail)).begin();ieint1!=ieintfin1;ieint1++) cout << (*ieint1).NomRef() << " "<< (int) ((*ieint1).Val()) << " "; cout << endl; }; // cas des références de point d'intégration de faces d'élément if ((nomDeRef_F_ptinteg(n_mail)).size() != 0) { cout << "\n liste actuelle de reference de pt d'integration de faces d'element: (ref) "; List_io ::iterator ieint1,ieintfin1 = (nomDeRef_F_ptinteg(n_mail)).end(); for (ieint1=(nomDeRef_F_ptinteg(n_mail)).begin();ieint1!=ieintfin1;ieint1++) cout << (*ieint1) << " "; cout << endl; }; cout << "\n --- choix de la position sur le ou les faces ou l'on veut la visualisation " << "\n le reperage peut se faire de differentes manieres : " << "\n par 2 numeros (element, face) dans le maillage + un ou plusieurs " << "\n numero(s) de pt d'integration (au sens classique) -> (choix : 1)" // << "\n par des coordonnees d'un point (interne !!), meme approximatives " // << "\n la grandeur affichee sera a un point le plus proche ou elle existe -> (choix : 2)" << "\n par une reference de liste de faces d'element (avec 1 ou tous les pti) -> (choix : 3)" << "\n (dans ce dernier cas il faut que toutes les faces soient de meme type) " << "\n par une reference de liste de point d'integration de faces d'element -> (choix : 4)" << "\n ---> donnez le type de choix puis les infos correspondantes <--- " << "\n effacer la liste actuelle de faces d'element -> (rep : efF) " << "\n effacer la liste actuelle des references de faces d'element -> (rep : efrefF) " << "\n afficher la liste des references de faces d'element existantes -> (rep : affrefF) " << "\n effacer la liste actuelle des references de pti de faces d'element -> (rep : efrefFpti) " << "\n afficher la liste des references de pti de faces d'element existantes -> (rep : affrefFpti) " << "\n (tapez fin pour finir(ou f))"; string rep = ""; // -- début boucle choix while ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) { cout << "\n choix ? ";rep = lect_return_defaut(false,"f"); if ((Minuscules(rep) == "fin") || (Minuscules(rep) == "f")) break; // def du conteneur des numéros que l'on cherche // comme on peut en définir plusieurs d'un coup (par exemple tous les pti d'une face) on utilise une liste list list_nut; // à chaque passage elle est initialisée et donc vide au début Maillage::NBelemFAEtptInteg nut; // idem, initialisé à chaque passage bool verif = true; // pour la vérification des numéros if (rep == "1") { cout << " numero d'element ? "; rep = lect_chaine(); nut.nbElem = ChangeEntier(rep); cout << " numero de face ? "; rep = lect_chaine(); nut.nbFA = ChangeEntier(rep); cout << " numero du point d'integration (ou -1 pour tous les pti de l'element) ? "; rep = lect_chaine(); nut.nbPtInteg = ChangeEntier(rep); if (nut.nbPtInteg != -1) {list_nut.push_back(nut);} // cas d'un seul pti else // cas de tous les pti {// on commence par tester si l'élément existe vraiment if ((nut.nbElem < 0) || (nut.nbElem > lesMail->Nombre_element(n_mail))) {if (nut.nbElem < 0) { cout << "\n le numero d'element doit etre superieur a 0 !!!";verif = false;}; if (nut.nbElem > lesMail->Nombre_element(n_mail)) { cout << "\n chois non valide, le numero d'element doit etre inferieur ou egal" << " au nombre total d'element du maillage !!!";verif = false; }; } else // sinon c'est ok pour l'élément, on continue au niveau de la face et des pti {Element& ele = lesMail->Element_LesMaille(n_mail,nut.nbElem); // par simplification int nbpti=0; // init // test si l'élément face existe if (!ele.SurfExiste(nut.nbFA)) {cout << "\n la surface "<< nut.nbFA << " n'existe pas pour l'element "<ElementGeometrique().Nbi(); // récup le maxi des num pti de la face }; // si tout est ok arrivée ici on enregistre if (verif) { for (nut.nbPtInteg = 1; nut.nbPtInteg <= nbpti;nut.nbPtInteg++) list_nut.push_back(nut); } else // sinon on averti que c'est mauvais {verif = false;}; }; }; } else if (rep == "3") { string nom_ref; cout << "\n nom de la reference de faces ? "; nom_ref= lect_chaine(); // vérif que la référence existe if ((!(lesRef->Existe(nom_ref,n_mail))) || (lesRef->Trouve(nom_ref,n_mail).Indic() != 3)) { cout << "\n erreur de nom (** "<< nom_ref << " **) donne ne correspond pas a une reference de faces d'element correcte ";} else // choix du point d'intégration, ici on ne va pas utiliser la liste list_nut, mais une liste particulière { string repo; cout << " numero d'un point d'integration ou: -1 pour tous les pti ? "; repo = lect_chaine(); nut.nbPtInteg = ChangeEntier(repo); if (nut.nbPtInteg != -1) // cas d'un seul pti {// on vérifie que ce point d'intégration est valide pour toutes les faces de la référence bool veriflocal = true; List_io ::iterator idl,idlfin= nomDeRef_F_E(n_mail).end(); // recup de la reference correspondant au mot cle const Reference& refi = lesRef->Trouve(nom_ref,n_mail); const ReferenceAF & reff = ((ReferenceAF &) refi); // transfo en ref de faces d'élément int taillen=reff.Taille(); // nombre d'éléments dans la référence for (int ielem=1;ielem<=taillen;ielem++) // on boucle sur les éléments de la référence { nut.nbElem = reff.NumeroElem(ielem); nut.nbFA = reff.NumeroFA(ielem); Element& ele = lesMail->Element_LesMaille(n_mail,nut.nbElem); // récup élément // test si l'élément face existe if (!ele.SurfExiste(nut.nbFA)) {cout << "\n la surface "<< nut.nbFA << " n'existe pas pour l'element "<ElementGeometrique().Nbi(); // récup le maxi des num pti de la face // vérification que le point d'intégration est possible if ((nut.nbPtInteg > max_pti)||(nut.nbPtInteg < 1)) { cout << "\n le numero de pti " << nut.nbPtInteg << " n'est pas valide " << " pour la face " << nut.nbFA << "pour l'element " << nut.nbElem << " du maillage " << n_mail << ", car la face ne comporte que " << max_pti << " pti possible(s) " << " !!!! " << flush; veriflocal = false; }; }; }; //-- fin de la boucle sur les éléments de la référence // --- on enregistre si la vérification a été ok if (veriflocal) { nomDeRef_F_E(n_mail).push_back(BlocScal(nom_ref,nut.nbPtInteg)); nomDeRef_F_E(n_mail).sort(); // on ordonne nomDeRef_F_E(n_mail).unique();// on supprime les doublons }; } else // cas de tous les pti { // il faut d'abord que l'on vérifie que tous les pti pour tous les faces d'élément sont valides // .. on commence par tester si une première face d'élément existe vraiment et si oui, on récupère le nb de pti associé bool veriflocal = true; int nbpti = 0; // init-> ensuite sera == au nombre de pti pour chaque élément { // on encapsule pour pas de redondance de nom const Reference& refi = lesRef->Trouve(nom_ref,n_mail); const ReferenceAF & reff = ((ReferenceAF &) refi); // transfo en ref de face d'élément int taillen=reff.Taille(); // nombre d'éléments dans la référence if (taillen < 1) {veriflocal = false;} // cas d'une ref vide, on ne peut pas aller plus loin else {nut.nbElem = reff.NumeroElem(1); nut.nbFA = reff.NumeroFA(1); if ((nut.nbElem < 0) || (nut.nbElem > lesMail->Nombre_element(n_mail))) {if (nut.nbElem < 0) { cout << "\n le numero d'element (ici"< lesMail->Nombre_element(n_mail)) { cout << "\n chois non valide, le numero d'element (ici"<Nombre_element(n_mail)<<") !!!"; }; veriflocal = false; } else // sinon c'est ok, on continue au niveau des pti {Element& ele = lesMail->Element_LesMaille(n_mail,nut.nbElem); // par simplification // test si l'élément face existe if (!ele.SurfExiste(nut.nbFA)) {cout << "\n la surface "<< nut.nbFA << " n'existe pas pour l'element "<ElementGeometrique().Nbi(); // récup le maxi des num pti de la face List_io < TypeQuelconque >& li_quelc = tab_F_element_TypeQuelconque_retenu(n_mail); // on regarde si listes ne sont pas toutes vides if ((li_quelc.empty())&&(li_enu_quelc.empty())) {// toutes les listes sont vides, on ne pourra pas aller plus loin cout << "\n pas encore de grandeurs choisies !! "; veriflocal = false; } else // sinon on peut continuer {nbpti = max_pti;}; }; } }; }; // .. puis on balaie l'ensemble des éléments et l'ensemble des pti if (veriflocal) {List_io ::iterator idl,idlfin= tab_nomDeRef_F_E_SM(n_mail).end(); // --- cas des types quelconques aux faces d'éléments {List_io::iterator ite,itefin = li_enu_quelc.end(); // boucle sur les grandeurs retenus for (ite = li_enu_quelc.begin();ite != itefin; ite++) { // recup de la reference correspondant au mot cle const Reference& refi = lesRef->Trouve(nom_ref,n_mail); const ReferenceAF & reff = ((ReferenceAF &) refi); // transfo en ref de faces d'élément int taillen=reff.Taille(); // nombre d'éléments dans la référence for (int ielem=1;ielem<=taillen;ielem++) // on boucle sur les éléments de la référence { nut.nbElem = reff.NumeroElem(ielem); nut.nbFA = reff.NumeroFA(ielem); Element& ele = lesMail->Element_LesMaille(n_mail,nut.nbElem); // par simplification if (!ele.SurfExiste(nut.nbFA)) {cout << "\n la surface "<< nut.nbFA << " n'existe pas pour l'element "<ElementGeometrique().Nbi(); // récup le maxi des num pti de la face // vérification que l'on a le même nombre de pti if (max_pti != nbpti) { cout << "\n ---> traitement de la reference: "<Existe(nom_ref,n_mail))) || (lesRef->Trouve(nom_ref,n_mail).Indic() != 7)) { cout << "\n erreur de nom (** "<< nom_ref << " **) donne ne correspond pas a une reference de point d'integration " << " de faces d'element correcte ";} else { // on vérifie que le choix est valide bool veriflocal = true; // --- cas des types quelconques aux éléments {List_io::iterator ite,itefin = li_enu_quelc.end(); // boucle sur les grandeurs retenus for (ite = li_enu_quelc.begin();ite != itefin; ite++) { // recup de la reference correspondant au mot cle const Reference& refi = lesRef->Trouve(nom_ref,n_mail); const ReferencePtiAF & reff = ((ReferencePtiAF &) refi); // transfo en ref de pti de faces d'élément int taillen=reff.Taille(); // nombre d'éléments dans la référence for (int ielem=1;ielem<=taillen;ielem++) // on boucle sur les éléments de la référence { nut.nbElem = reff.NumeroElem(ielem); nut.nbFA = reff.NumeroFA(ielem); nut.nbPtInteg = reff.NumeroPti(ielem); Element& ele = lesMail->Element_LesMaille(n_mail,nut.nbElem); // récup élément if (!ele.SurfExiste(nut.nbFA)) {cout << "\n la surface "<< nut.nbFA << " n'existe pas pour l'element "<ElementGeometrique().Nbi(); // récup le maxi des num pti de la face // vérification que le point d'intégration est possible if ((nut.nbPtInteg > max_pti)||(nut.nbPtInteg < 1)) { cout << "\n le numero de pti " << nut.nbPtInteg << " pour la grandeur " << NomTypeQuelconque((*ite)) << " n'est pas valide " << " pour la face " << nut.nbFA << "pour l'element " << nut.nbElem << " du maillage " << n_mail << ", car la face ne comporte que " << max_pti << " pti possible(s) " << " !!!! " << flush; veriflocal = false; }; }; }; //-- fin de la boucle sur les éléments de la référence }; //-- fin de la boucle sur les grandeurs retenus }; // on enregistre si la vérification a été ok if (veriflocal) { nomDeRef_F_ptinteg(n_mail).push_back(nom_ref); nomDeRef_F_ptinteg(n_mail).sort(); // on ordonne nomDeRef_F_ptinteg(n_mail).unique();// on supprime les doublons }; }; // fin de la vérification verif = false; // pour ne pas enregistrer de numéro dans la liste directe d'element car ici c'est // la liste de référence de référence d'éléments qui est en cause } else if (rep == "efF") { // on efface les 3 listes (tab_num_F_element(n_mail)).clear(); (tab_num_F(n_mail)).clear(); (tab_num_F_integ(n_mail)).clear(); verif = false; } else if (rep == "efrefF") { // on efface la liste des références d'éléments et la liste de pt d'integ associée (nomDeRef_F_E(n_mail)).clear(); verif = false; } else if (rep == "affrefF") { // affichage de la liste des références d'éléments enregistrées dans les maillages cout << "\n liste des references de face d'elements "; if (taille_list_maille > 1) cout << "pour le maillage " << lesMail->NomMaillage(n_mail); const Reference* reff =NULL; bool prempass = true; do { if (prempass) { reff= lesRef->Init_et_Premiere();} // récup de la ref 1 et init else { reff = lesRef->Reference_suivante();} // récup de la ref courante // sortie de la ref si c'est le bon maillage, et si c'est une ref de faces d'élément if (reff != NULL) if ((reff->Nbmaille() == n_mail) && (reff->Indic() == 3)) cout << reff->Nom() << " "; prempass = false; } while (reff != NULL); verif = false; } else if (rep == "efrefFpti") { // on efface la liste des références de pt d'integ d'éléments (nomDeRef_F_ptinteg(n_mail)).clear(); verif = false; } else if (rep == "affrefFpti") { // affichage de la liste des références de pti enregistrées dans les maillages cout << "\n liste des references de pt integ de faces d'elements "; if (taille_list_maille > 1) cout << "pour le maillage " << lesMail->NomMaillage(n_mail); const Reference* reff =NULL; bool prempass = true; do { if (prempass) { reff= lesRef->Init_et_Premiere();} // récup de la ref 1 et init else { reff = lesRef->Reference_suivante();} // récup de la ref courante // sortie de la ref si c'est le bon maillage, et si c'est une ref de faces d'élément if (reff != NULL) if ((reff->Nbmaille() == n_mail) && (reff->Indic() == 7)) cout << reff->Nom() << " "; prempass = false; } while (reff != NULL); verif = false; } else { cout << "\n reponse non valide, recommencez " << endl; }; // enregistrement si tout est ok if ((verif)&&((Minuscules(rep) != "fin") && (Minuscules(rep) != "f"))) { // on balaie les numéros de la liste list ::iterator i_list_nut,i_list_nut_fin = list_nut.end(); for (i_list_nut=list_nut.begin();i_list_nut != i_list_nut_fin;i_list_nut++) { nut = (*i_list_nut); // par simplicité // si le groupe (élément, face et nb point d'intégration) n'est pas actuellement enregistré, on l'enregistre // on boucle sur les datas déjà enregistrés bool a_enregistrer=true; List_io ::iterator ilelem,iliface,ilinteg,ilelemfin=tab_num_F_element(n_mail).end(); ilinteg = tab_num_F_integ(n_mail).begin(); iliface = tab_num_F(n_mail).begin(); for (ilelem=tab_num_F_element(n_mail).begin();ilelem != ilelemfin;ilelem++,iliface++,ilinteg++) if ((nut.nbElem==(*ilelem))&&(nut.nbFA==(*iliface))&&(nut.nbPtInteg==(*ilinteg))) a_enregistrer = false; if (a_enregistrer) { tab_num_F_element(n_mail).push_back(nut.nbElem); tab_num_F(n_mail).push_back(nut.nbFA); tab_num_F_integ(n_mail).push_back(nut.nbPtInteg); }; }; }; }; // -- fin boucle choix position sur element }; // choix des arête d'éléments void Choix_grandeurs_maple::Choix_aretes_element_a_retenir(int n_mail,List_io < EnumTypeQuelconque >& li_enu_quelc) { // def de grandeur globale int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); list::const_iterator ilm,ilmfin=list_mail.end(); int taille_list_maille = list_mail.size(); // choix du ou des arêtes d'elements, on affiche la liste actuelle si elle est non nulle if (tab_num_A_element(n_mail).size()) { cout << "\n liste actuelle des aretes d'element a sortir en info: < (num_ele, num_arete) > "; List_io ::iterator ieint,ieintfin = tab_num_A_element(n_mail).end(); List_io ::iterator ifint = tab_num_A(n_mail).begin(); for (ieint=tab_num_A_element(n_mail).begin();ieint!=ieintfin;ieint++,ifint++) cout << " (" << (*ieint) << ", "<<(*ifint)<<") "; cout << endl; } // cas des références d'arêtes d'élément if ((nomDeRef_A_E(n_mail)).size() != 0) { cout << "\n liste actuelle de reference d'aretes d'element: (ref et num integ) "; List_io ::iterator ieint1,ieintfin1 = (nomDeRef_A_E(n_mail)).end(); for (ieint1=(nomDeRef_A_E(n_mail)).begin();ieint1!=ieintfin1;ieint1++) cout << (*ieint1).NomRef() << " "<< (int) ((*ieint1).Val()) << " "; cout << endl; }; // cas des références de point d'intégration d'arêtes d'élément if ((nomDeRef_A_ptinteg(n_mail)).size() != 0) { cout << "\n liste actuelle de reference de pt d'integration d'arete d'element: (ref) "; List_io ::iterator ieint1,ieintfin1 = (nomDeRef_A_ptinteg(n_mail)).end(); for (ieint1=(nomDeRef_A_ptinteg(n_mail)).begin();ieint1!=ieintfin1;ieint1++) cout << (*ieint1) << " "; cout << endl; }; cout << "\n --- choix de la position sur le ou les aretes ou l'on veut la visualisation " << "\n le reperage peut se faire de differentes manieres : " << "\n par 2 numeros (element, arete) dans le maillage + un ou plusieurs " << "\n numero(s) de pt d'integration (au sens classique) -> (choix : 1)" // << "\n par des coordonnees d'un point (interne !!), meme approximatives " // << "\n la grandeur affichee sera a un point le plus proche ou elle existe -> (choix : 2)" << "\n par une reference de liste d'arete d'element (avec 1 ou tous les pti) -> (choix : 3)" << "\n (dans ce dernier cas il faut que toutes les aretes soient de meme type) " << "\n par une reference de liste de point d'integration d'aretes d'element -> (choix : 4)" << "\n ---> donnez le type de choix puis les infos correspondantes <--- " << "\n effacer la liste actuelle d'aretes d'element -> (rep : efA) " << "\n effacer la liste actuelle des references d'aretes d'element -> (rep : efrefA) " << "\n afficher la liste des references d'aretes d'element existantes -> (rep : affrefA) " << "\n effacer la liste actuelle des references de pti d'aretes d'element -> (rep : efrefApti) " << "\n afficher la liste des references de pti d'aretes d'element existantes -> (rep : affrefApti) " << "\n (tapez fin pour finir(ou f))"; string rep = ""; // -- début boucle choix while ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) { cout << "\n choix ? ";rep = lect_return_defaut(false,"f"); if ((Minuscules(rep) == "fin") || (Minuscules(rep) == "f")) break; // def du conteneur des numéros que l'on cherche // comme on peut en définir plusieurs d'un coup (par exemple tous les pti d'une arête on utilise une liste list list_nut; // à chaque passage elle est initialisée et donc vide au début Maillage::NBelemFAEtptInteg nut; // idem, initialisé à chaque passage bool verif = true; // pour la vérification des numéros if (rep == "1") { cout << " numero d'element ? "; rep = lect_chaine(); nut.nbElem = ChangeEntier(rep); cout << " numero de l'arete ? "; rep = lect_chaine(); nut.nbFA = ChangeEntier(rep); cout << " numero du point d'integration (ou -1 pour tous les pti de l'element) ? "; rep = lect_chaine(); nut.nbPtInteg = ChangeEntier(rep); if (nut.nbPtInteg != -1) {list_nut.push_back(nut);} // cas d'un seul pti else // cas de tous les pti {// on commence par tester si l'élément existe vraiment if ((nut.nbElem < 0) || (nut.nbElem > lesMail->Nombre_element(n_mail))) {if (nut.nbElem < 0) { cout << "\n le numero d'element doit etre superieur a 0 !!!";verif = false;}; if (nut.nbElem > lesMail->Nombre_element(n_mail)) { cout << "\n chois non valide, le numero d'element doit etre inferieur ou egal" << " au nombre total d'element du maillage !!!";verif = false; }; } else // sinon c'est ok pour l'élément, on continue au niveau de l'arête et des pti {Element& ele = lesMail->Element_LesMaille(n_mail,nut.nbElem); // par simplification int nbpti=0; // init // test si l'élément arête existe if (!ele.SurfExiste(nut.nbFA)) {cout << "\n l'arete "<< nut.nbFA << " n'existe pas pour l'element "<ElementGeometrique().Nbi(); // récup le maxi des num pti de l'arête }; // si tout est ok arrivée ici on enregistre if (verif) { for (nut.nbPtInteg = 1; nut.nbPtInteg <= nbpti;nut.nbPtInteg++) list_nut.push_back(nut); } else // sinon on averti que c'est mauvais {verif = false;}; }; }; } else if (rep == "3") { string nom_ref; cout << "\n nom de la reference d'aretes ? "; nom_ref= lect_chaine(); // vérif que la référence existe if ((!(lesRef->Existe(nom_ref,n_mail))) || (lesRef->Trouve(nom_ref,n_mail).Indic() != 3)) { cout << "\n erreur de nom (** "<< nom_ref << " **) donne ne correspond pas a une reference d'aretes d'element correcte ";} else // choix du point d'intégration, ici on ne va pas utiliser la liste list_nut, mais une liste particulière { string repo; cout << " numero d'un point d'integration ou: -1 pour tous les pti ? "; repo = lect_chaine(); nut.nbPtInteg = ChangeEntier(repo); if (nut.nbPtInteg != -1) // cas d'un seul pti {// on vérifie que ce point d'intégration est valide pour toutes les arêtes de la référence bool veriflocal = true; List_io ::iterator idl,idlfin= nomDeRef_A_E(n_mail).end(); // recup de la reference correspondant au mot cle const Reference& refi = lesRef->Trouve(nom_ref,n_mail); const ReferenceAF & reff = ((ReferenceAF &) refi); // transfo en ref d'arêtes d'élément int taillen=reff.Taille(); // nombre d'éléments dans la référence for (int ielem=1;ielem<=taillen;ielem++) // on boucle sur les éléments de la référence { nut.nbElem = reff.NumeroElem(ielem); nut.nbFA = reff.NumeroFA(ielem); Element& ele = lesMail->Element_LesMaille(n_mail,nut.nbElem); // récup élément // test si l'élément arête existe if (!ele.SurfExiste(nut.nbFA)) {cout << "\n l'arete "<< nut.nbFA << " n'existe pas pour l'element "<ElementGeometrique().Nbi(); // récup le maxi des num pti de l'arête // vérification que le point d'intégration est possible if ((nut.nbPtInteg > max_pti)||(nut.nbPtInteg < 1)) { cout << "\n le numero de pti " << nut.nbPtInteg << " n'est pas valide " << " pour l'arete " << nut.nbFA << "pour l'element " << nut.nbElem << " du maillage " << n_mail << ", car l'arete ne comporte que " << max_pti << " pti possible(s) " << " !!!! " << flush; veriflocal = false; }; }; }; //-- fin de la boucle sur les éléments de la référence // --- on enregistre si la vérification a été ok if (veriflocal) { nomDeRef_A_E(n_mail).push_back(BlocScal(nom_ref,nut.nbPtInteg)); nomDeRef_A_E(n_mail).sort(); // on ordonne nomDeRef_A_E(n_mail).unique();// on supprime les doublons }; } else // cas de tous les pti { // il faut d'abord que l'on vérifie que tous les pti pour toutes les arêtes d'élément sont valides // .. on commence par tester si une première arête d'élément existe vraiment et si oui, on récupère le nb de pti associé bool veriflocal = true; int nbpti = 0; // init-> ensuite sera == au nombre de pti pour chaque élément { // on encapsule pour pas de redondance de nom const Reference& refi = lesRef->Trouve(nom_ref,n_mail); const ReferenceAF & reff = ((ReferenceAF &) refi); // transfo en ref d'arêtes d'élément int taillen=reff.Taille(); // nombre d'éléments dans la référence if (taillen < 1) {veriflocal = false;} // cas d'une ref vide, on ne peut pas aller plus loin else {nut.nbElem = reff.NumeroElem(1); nut.nbFA = reff.NumeroFA(1); if ((nut.nbElem < 0) || (nut.nbElem > lesMail->Nombre_element(n_mail))) {if (nut.nbElem < 0) { cout << "\n le numero d'element (ici"< lesMail->Nombre_element(n_mail)) { cout << "\n chois non valide, le numero d'element (ici"<Nombre_element(n_mail)<<") !!!"; }; veriflocal = false; } else // sinon c'est ok, on continue au niveau des pti {Element& ele = lesMail->Element_LesMaille(n_mail,nut.nbElem); // par simplification // test si l'élément arête existe if (!ele.SurfExiste(nut.nbFA)) {cout << "\n l'arete "<< nut.nbFA << " n'existe pas pour l'element "<ElementGeometrique().Nbi(); // récup le maxi des num pti de l'arête List_io < TypeQuelconque >& li_quelc = tab_A_element_TypeQuelconque_retenu(n_mail); // on regarde si listes ne sont pas toutes vides if ((li_quelc.empty())&&(li_enu_quelc.empty())) {// toutes les listes sont vides, on ne pourra pas aller plus loin cout << "\n pas encore de grandeurs choisies !! "; veriflocal = false; } else // sinon on peut continuer {nbpti = max_pti;}; }; } }; }; // .. puis on balaie l'ensemble des éléments et l'ensemble des pti if (veriflocal) {List_io ::iterator idl,idlfin= tab_nomDeRef_A_E_SM(n_mail).end(); // --- cas des types quelconques aux arêtes d'éléments {List_io::iterator ite,itefin = li_enu_quelc.end(); // boucle sur les grandeurs retenus for (ite = li_enu_quelc.begin();ite != itefin; ite++) { // recup de la reference correspondant au mot cle const Reference& refi = lesRef->Trouve(nom_ref,n_mail); const ReferenceAF & reff = ((ReferenceAF &) refi); // transfo en ref d'arêtes d'élément int taillen=reff.Taille(); // nombre d'éléments dans la référence for (int ielem=1;ielem<=taillen;ielem++) // on boucle sur les éléments de la référence { nut.nbElem = reff.NumeroElem(ielem); nut.nbFA = reff.NumeroFA(ielem); Element& ele = lesMail->Element_LesMaille(n_mail,nut.nbElem); // par simplification if (!ele.SurfExiste(nut.nbFA)) {cout << "\n l'arete "<< nut.nbFA << " n'existe pas pour l'element "<ElementGeometrique().Nbi(); // récup le maxi des num pti de l'arête // vérification que l'on a le même nombre de pti if (max_pti != nbpti) { cout << "\n ---> traitement de la reference: "<Existe(nom_ref,n_mail))) || (lesRef->Trouve(nom_ref,n_mail).Indic() != 7)) { cout << "\n erreur de nom (** "<< nom_ref << " **) donne ne correspond pas a une reference de point d'integration " << " d'aretes d'element correcte ";} else { // on vérifie que le choix est valide bool veriflocal = true; // --- cas des types quelconques aux éléments {List_io::iterator ite,itefin = li_enu_quelc.end(); // boucle sur les grandeurs retenus for (ite = li_enu_quelc.begin();ite != itefin; ite++) { // recup de la reference correspondant au mot cle const Reference& refi = lesRef->Trouve(nom_ref,n_mail); const ReferencePtiAF & reff = ((ReferencePtiAF &) refi); // transfo en ref de pti d'arêtes d'élément int taillen=reff.Taille(); // nombre d'éléments dans la référence for (int ielem=1;ielem<=taillen;ielem++) // on boucle sur les éléments de la référence { nut.nbElem = reff.NumeroElem(ielem); nut.nbFA = reff.NumeroFA(ielem); nut.nbPtInteg = reff.NumeroPti(ielem); Element& ele = lesMail->Element_LesMaille(n_mail,nut.nbElem); // récup élément if (!ele.SurfExiste(nut.nbFA)) {cout << "\n l'arete "<< nut.nbFA << " n'existe pas pour l'element "<ElementGeometrique().Nbi(); // récup le maxi des num pti de l'arête // vérification que le point d'intégration est possible if ((nut.nbPtInteg > max_pti)||(nut.nbPtInteg < 1)) { cout << "\n le numero de pti " << nut.nbPtInteg << " pour la grandeur " << NomTypeQuelconque((*ite)) << " n'est pas valide " << " pour l'arete " << nut.nbFA << "pour l'element " << nut.nbElem << " du maillage " << n_mail << ", car l'arete ne comporte que " << max_pti << " pti possible(s) " << " !!!! " << flush; veriflocal = false; }; }; }; //-- fin de la boucle sur les éléments de la référence }; //-- fin de la boucle sur les grandeurs retenus }; // on enregistre si la vérification a été ok if (veriflocal) { nomDeRef_A_ptinteg(n_mail).push_back(nom_ref); nomDeRef_A_ptinteg(n_mail).sort(); // on ordonne nomDeRef_A_ptinteg(n_mail).unique();// on supprime les doublons }; }; // fin de la vérification verif = false; // pour ne pas enregistrer de numéro dans la liste directe d'element car ici c'est // la liste de référence de référence d'éléments qui est en cause } else if (rep == "efA") { // on efface les 3 listes (tab_num_A_element(n_mail)).clear(); (tab_num_A(n_mail)).clear(); (tab_num_A_integ(n_mail)).clear(); verif = false; } else if (rep == "efrefA") { // on efface la liste des références d'éléments et la liste de pt d'integ associée (nomDeRef_A_E(n_mail)).clear(); verif = false; } else if (rep == "affrefA") { // affichage de la liste des références d'éléments enregistrées dans les maillages cout << "\n liste des references d'aretes d'element "; if (taille_list_maille > 1) cout << "pour le maillage " << lesMail->NomMaillage(n_mail); const Reference* reff =NULL; bool prempass = true; do { if (prempass) { reff= lesRef->Init_et_Premiere();} // récup de la ref 1 et init else { reff = lesRef->Reference_suivante();} // récup de la ref courante // sortie de la ref si c'est le bon maillage, et si c'est une ref d'arêtes d'élément if (reff != NULL) if ((reff->Nbmaille() == n_mail) && (reff->Indic() == 3)) cout << reff->Nom() << " "; prempass = false; } while (reff != NULL); verif = false; } else if (rep == "efrefApti") { // on efface la liste des références de pt d'integ d'éléments (nomDeRef_A_ptinteg(n_mail)).clear(); verif = false; } else if (rep == "affrefpti") { // affichage de la liste des références de pti enregistrées dans les maillages cout << "\n liste des references de pt integ d'aretes d'elements "; if (taille_list_maille > 1) cout << "pour le maillage " << lesMail->NomMaillage(n_mail); const Reference* reff =NULL; bool prempass = true; do { if (prempass) { reff= lesRef->Init_et_Premiere();} // récup de la ref 1 et init else { reff = lesRef->Reference_suivante();} // récup de la ref courante // sortie de la ref si c'est le bon maillage, et si c'est une ref d'arêtes d'élément if (reff != NULL) if ((reff->Nbmaille() == n_mail) && (reff->Indic() == 7)) cout << reff->Nom() << " "; prempass = false; } while (reff != NULL); verif = false; } else { cout << "\n reponse non valide, recommencez " << endl; }; // enregistrement si tout est ok if ((verif)&&((Minuscules(rep) != "fin") && (Minuscules(rep) != "f"))) { // on balaie les numéros de la liste list ::iterator i_list_nut,i_list_nut_fin = list_nut.end(); for (i_list_nut=list_nut.begin();i_list_nut != i_list_nut_fin;i_list_nut++) { nut = (*i_list_nut); // par simplicité // si le groupe (élément, arête et nb point d'intégration) n'est pas actuellement enregistré, on l'enregistre // on boucle sur les datas déjà enregistrés bool a_enregistrer=true; List_io ::iterator ilelem,iliAre,ilinteg,ilelemfin=tab_num_A_element(n_mail).end(); ilinteg = tab_num_A_integ(n_mail).begin(); iliAre = tab_num_A(n_mail).begin(); for (ilelem=tab_num_A_element(n_mail).begin();ilelem != ilelemfin;ilelem++,iliAre++,ilinteg++) if ((nut.nbElem==(*ilelem))&&(nut.nbFA==(*iliAre))&&(nut.nbPtInteg==(*ilinteg))) a_enregistrer = false; if (a_enregistrer) { tab_num_A_element(n_mail).push_back(nut.nbElem); tab_num_A(n_mail).push_back(nut.nbFA); tab_num_A_integ(n_mail).push_back(nut.nbPtInteg); }; }; }; }; // -- fin boucle choix position sur element }; // choix des noeud void Choix_grandeurs_maple::Choix_noeud_a_retenir(int n_mail,List_io < Ddl_enum_etendu >& li_ddl) { // def de grandeur globale int dim = ParaGlob::Dimension(); string rep=""; while ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) { // choix du ou des noeuds, on affiche la liste actuelle if ((tab_num_noeud(n_mail)).size()) { cout << "\n liste actuelle de noeud: "; List_io ::iterator ieint,ieintfin = tab_num_noeud(n_mail).end(); for (ieint=tab_num_noeud(n_mail).begin();ieint!=ieintfin;ieint++) cout << *ieint << " "; cout << endl; }; if ((nomDeRef(n_mail)).size() != 0) { cout << "\n liste actuelle de reference de noeuds: "; List_io ::iterator ieint1,ieintfin1 = (nomDeRef(n_mail)).end(); for (ieint1=(nomDeRef(n_mail)).begin();ieint1!=ieintfin1;ieint1++) cout << *ieint1 << " "; cout << endl; }; // questions cout << "\n choix du ou des noeuds ou l'on veut la visualisation " << "\n le reperage d'un noeuds peut se faire de differentes manieres :" << "\n par son numero dans le maillage -> (choix : 1)" << "\n par ses coordonnees, meme approximatives -> (choix : 2)" << "\n par une reference de liste de noeuds -> (choix : 3)" << "\n donnez pour chaque noeud le type de choix puis le numero " << "\n ou les cordonnees " << "\n effacer la liste actuelle de noeuds (rep : ef) " << "\n effacer la liste actuelle des references de noeuds (rep : efref) " << "\n afficher la liste des references de noeuds existants (rep : affref) " << "\n (pour finir tapez : fin (ou f))"; rep = ""; cout << "\n choix ? ";rep = lect_return_defaut(false,"f"); bool verif = true; // pour la vérification du numéro du noeud int nu ; // le numéro de noeud if (rep == "1") { cout << " numero ? "; rep = lect_chaine(); nu = ChangeEntier(rep); } else if (rep =="2") { Coordonnee xi(dim); cout << "\n coordonnee ("<> xi(j); std::cin.ignore( std::numeric_limits::max(), '\n' );// purge de cin cout << "\n les coordonnees sont a: t = 0 ou t ou tdt (repondre 0 ou t ou tdt) ?"; rep = lect_chaine(); // recherche du noeud le plus proche if (rep == "0") nu = lesMail->Noeud_le_plus_proche_0(xi,n_mail); else if (rep == "t") nu = lesMail->Noeud_le_plus_proche_t(xi,n_mail); else if (rep == "tdt") nu = lesMail->Noeud_le_plus_proche_tdt(xi,n_mail); else { cout << "\n erreur de syntaxe, on attendait 0 ou t ou tdt ! ";verif = false;}; cout << "\n noeud le plus proche nb= " << nu; verif = true; } else if (rep =="3") { string nom_ref; cout << "\n nom de la reference ? ";nom_ref= lect_chaine(); // vérif que la référence existe if ((!(lesRef->Existe(nom_ref,n_mail))) || (lesRef->Trouve(nom_ref,n_mail).Indic() != 1)) { cout << "\n erreur de nom donne (** "<< nom_ref << " **) ne correspond pas a une reference de noeud correcte ";} else // on enregistre { nomDeRef(n_mail).push_back(nom_ref); nomDeRef(n_mail).sort(); // on ordonne nomDeRef(n_mail).unique();// on supprime les doublons }; verif = false; // pour ne pas enregistrer de numéro dans la liste de noeud car ici c'est // la liste de référence de noeud qui est en cause } else if (rep == "ef") { // on efface la liste des noeuds (tab_num_noeud(n_mail)).clear(); verif = false; } else if (rep == "efref") { // on efface la liste des références de noeuds (nomDeRef(n_mail)).clear(); verif = false; } else if (rep == "affref") { // affichage de la liste des références enregistrées dans les maillages cout << "\n liste des references de noeuds "; cout << "pour le maillage " << lesMail->NomMaillage(n_mail); const Reference* reff =NULL; bool prempass = true; do{ if (prempass) { reff= lesRef->Init_et_Premiere();} // récup de la ref 1 et init else { reff = lesRef->Reference_suivante();} // récup de la ref courante // sortie de la ref si c'est le bon maillage, et si c'est une ref de noeud if (reff != NULL) if ((reff->Nbmaille() == n_mail) && (reff->Indic() == 1)) cout << reff->Nom() << " "; prempass = false; } while (reff != NULL); verif = false; } else if ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) { cout << " erreur de syntaxe on attendait 1 ou 2 ! recommencez ";verif = false;}; // vérif que le numéro est acceptable et enregistrement if ((nu>0)&&(nu<=lesMail->Nombre_noeud(n_mail))) { // on vérifie que les ddls à sortir sont bien présent pour ce noeud List_io::iterator ienu,ienufin=tabnoeud_type_ddl_retenu(n_mail).end(); for (ienu = tabnoeud_type_ddl_retenu(n_mail).begin();ienu!=ienufin;ienu++) {if ( (!(lesMail->Noeud_LesMaille(n_mail,nu).Existe_ici((*ienu).Enum()))) // cas où le ddl principal n'existe pas && (!(lesMail->Noeud_LesMaille(n_mail,nu).Existe_ici_ddlEtendu((*ienu))))) // cas où le ddl étendu n'existe pas {cout << "\n attention le ddl " << Nom_ddl((*ienu).Enum()) << " n'existe pas pour le noeud " << nu << " du maillage " << n_mail << "\n il y aura 0 en sortie ! "; verif = true; } } }; if ((verif)&&((Minuscules(rep) != "fin") && (Minuscules(rep) != "f"))) { // enregistrement tab_num_noeud(n_mail).push_back(nu); tab_num_noeud(n_mail).sort(); // on ordonne tab_num_noeud(n_mail).unique();// on supprime les doublons }; }// -- fin de la boucle infini sur l'entrée de numéro de noeud }; // entrée du choix de grandeurs globals void Choix_grandeurs_maple::Entree_grandeur_gobal(string& rep) { rep = ""; while ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) { if (list_grandeur_global.size() != 0) { // on utilise directement Paraglob ParaGlob::param->Affiche_GrandeurGlobal(cout); // cout << "\n liste des grandeurs globales disponibles en sortie:\n >>> "; // List_io ::iterator jeint,jeintfin = list_grandeur_global.end(); // for (jeint=list_grandeur_global.begin();jeint!=jeintfin;jeint++) // cout << *jeint << " "; // il faut que l'on remette à jour les grandeurs globales car elles peuvent avoir été abondées // pendant le calcul ex: Iteration, compteur divers ... // comme on est en interactif le cout cpu a moins d'importance ParaGlob::param->Recup_list_GrandeurGlobal(list_grandeur_global); if ( list_grand_global_retenu.size() != 0) {cout << "\n liste des grandeurs actuellement a sortir:\n <<<: "; List_io ::iterator jeint,jeintfin = list_grand_global_retenu.end(); jeintfin = list_grand_global_retenu.end(); for (jeint=list_grand_global_retenu.begin();jeint!=jeintfin;jeint++) cout << *jeint << " "; } cout << endl; } cout << "\n grandeurs que vous voulez visualiser (rep grandeurs?)" << "\n toutes les grandeurs (rep par defaut) (rep : to) " << "\n effacer la liste actuelle (rep : ef) " << "\n (pour terminer tapez : fin (ou f) ) "; cout << "\n grandeur ? ";rep = lect_return_defaut(false,"f"); if (rep == "to") // cas de toutes les grandeurs list_grand_global_retenu = list_grandeur_global; // else if (find(list_grandeur_global.begin(),list_grandeur_global.end(),rep) != list_grandeur_global.end()) else if ( (find(list_grandeur_global.begin(),list_grandeur_global.end(),rep) != list_grandeur_global.end()) || (ParaGlob::param->GrandeurGlobal(rep) != NULL) ) list_grand_global_retenu.push_back(rep); else if (rep == "ef") list_grand_global_retenu.erase(list_grand_global_retenu.begin(),list_grand_global_retenu.end()); else if ((Minuscules(rep) == "fin") || (Minuscules(rep) == "f")) {cout << "\n liste des grandeurs enregistrees : "; List_io ::iterator jfint,jfintfin = list_grand_global_retenu.end(); for (jfint=list_grand_global_retenu.begin();jfint!=jfintfin;jfint++) cout << *jfint << " "; cout << "\n"; } else if ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) cout << " erreur de syntaxe dans le ddl! recommencez "; } }; // entrée du choix des torseurs de réaction void Choix_grandeurs_maple::Entree_torseurs_reaction(string& rep) { int nbmail = tab_list_torseur_condLim.Taille(); // on boucle sur les maillages bool aucunesortie = true; // pour mettre un message si aucun torseur n'est dispo for (int imail = 1; imail <= nbmail; imail++) { rep = ""; List_io & list_torseur_condLim = tab_list_torseur_condLim(imail); List_io & list_torseur_condLim_retenu = tab_list_torseur_condLim_retenu(imail); if (list_torseur_condLim.size() != 0) { aucunesortie=false; while ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) { cout << "\n ---- maillage: " << lesMail->NomMaillage(imail); cout << "\n liste des ref de torseur de reaction disponibles:\n >>> "; List_io ::iterator jeint,jeintfin = list_torseur_condLim.end(); for (jeint=list_torseur_condLim.begin();jeint!=jeintfin;jeint++) cout << (*jeint).nom << " "; if ( list_torseur_condLim_retenu.size() != 0) {cout << "\n liste des ref de torseur actuellement a sortir:\n <<<: "; List_io ::iterator intfin = list_torseur_condLim_retenu.end(); for (jeint=list_torseur_condLim_retenu.begin();jeint!=intfin;jeint++) cout << (*jeint).nom << " "; } cout << endl; cout << "\n ref que vous voulez visualiser (rep grandeurs?)" << "\n toutes les ref (rep par defaut) (rep : to) " << "\n effacer la liste actuelle (rep : ef) " << "\n (pour terminer tapez : fin (ou f) ) "; cout << "\n grandeur ? ";rep = lect_return_defaut(false,"f"); // on regarde si la ref est bonne bool choix_valide = false; for (jeint=list_torseur_condLim.begin();jeint!=jeintfin;jeint++) { if ((*jeint).nom == rep) { list_torseur_condLim_retenu.push_back(*jeint); choix_valide = true; break; }; }; if (!choix_valide) {if (rep == "to") // cas de toutes les grandeurs list_torseur_condLim_retenu = list_torseur_condLim; else if (rep == "ef") list_torseur_condLim_retenu.erase(list_torseur_condLim_retenu.begin(),list_torseur_condLim_retenu.end()); else if ((Minuscules(rep) == "fin") || (Minuscules(rep) == "f")) {cout << "\n liste des grandeurs enregistrees : "; List_io ::iterator intfin = list_torseur_condLim_retenu.end(); for (jeint=list_torseur_condLim_retenu.begin();jeint!=intfin;jeint++) cout << (*jeint).nom << " "; cout << "\n"; } else if ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) cout << " erreur de syntaxe dans le ddl! recommencez "; }; // -- fin du test choix_valide }; // -- fin du while }; //-- fin du test sur la taille de la liste }; //-- fin de la boucle sur les maillages // sortie éventuelle d'un message if (aucunesortie) cout << "\n ??? il n'y a aucun torseur de reaction a sortir ???? "; }; // dans le cas d'une animation, il n'y a pas de sortie directe mais la création de listes qui sont transmises // à animation_maple void Choix_grandeurs_maple::Construction_liste_pour_animation (int numMail ,LesMaillages * lesMail,Charge* charge) {List_io liste_sortie; // la liste à sortir // on balaie la liste des grandeurs a visualiser, dans le cas ou l'on trouve la bonne grandeur on // sauvegarde dans la liste à sortir if (type_xi) { // --------- cas des grandeurs aux noeuds ------------ List_io::iterator inoeud,inoeudfin=tab_num_noeud(numMail).end(); // on crée une liste intermédiaire qui contient tous les noeuds à sortir, List_io tab_total_noeud = tab_num_noeud(numMail); // tout d'abord récup de la liste de noeuds // puis les références de listes de noeuds List_io ::iterator idl,idlfin= nomDeRef(numMail).end(); for (idl=nomDeRef(numMail).begin();idl!=idlfin;idl++) { // recup de la reference correspondant au mot cle const Reference& refi = lesRef->Trouve(*idl,numMail); const ReferenceNE & reff = ((ReferenceNE &) refi); // transfo en ref de noeud int taillen=reff.Taille(); for (int inoeu=1;inoeu<=taillen;inoeu++) // on boucle et enregistre les noeuds tab_total_noeud.push_back(reff.Numero(inoeu)); } inoeudfin=tab_total_noeud.end(); // maintenant on affiche les infos pour la liste totale de noeuds for (inoeud = tab_total_noeud.begin();inoeud!=inoeudfin;inoeud++) { // la grandeurs en x1 bool asortir = true; double valx_a_sortir; // on regarde si la grandeur existe if (!lesMail->Noeud_LesMaille(numMail,*inoeud).Existe_ici((x1).Enum())) { asortir=false; #ifdef MISE_AU_POINT cout << "\n attention la grandeur " << Nom_ddl((x1).Enum()) << " n'est pas disponible, on mais 0 a la place"; #endif } if ((asortir) && (!accroi_x1)) // cas où l'on sort la grandeur {if (charge->Temps_courant() == 0.) {valx_a_sortir = lesMail->Noeud_LesMaille(numMail,*inoeud).Valeur_0((x1).Enum());} else {valx_a_sortir = lesMail->Noeud_LesMaille(numMail,*inoeud).Valeur_t((x1).Enum());} } else if ((asortir) && (accroi_x1)) // cas où l'on sort la variation entre 0 et t de la grandeur {if (charge->Temps_courant() == 0.) {valx_a_sortir = 0.;} else { double val_init = lesMail->Noeud_LesMaille(numMail,*inoeud).Valeur_0((x1).Enum()); valx_a_sortir = lesMail->Noeud_LesMaille(numMail,*inoeud).Valeur_t((x1).Enum()) - val_init;} } else {valx_a_sortir = 0.;} // la grandeurs en x2 asortir = true; double valy_a_sortir; // on regarde si la grandeur existe if (!lesMail->Noeud_LesMaille(numMail,*inoeud).Existe_ici((x2).Enum())) { asortir=false; #ifdef MISE_AU_POINT cout << "\n attention la grandeur " << Nom_ddl((x2).Enum()) << " n'est pas disponible, on mais 0 a la place"; #endif }; if ((asortir) && (!accroi_x2)) // cas où l'on sort la grandeur {if (charge->Temps_courant() == 0.) {valy_a_sortir = lesMail->Noeud_LesMaille(numMail,*inoeud).Valeur_0((x2).Enum());} else {valy_a_sortir = lesMail->Noeud_LesMaille(numMail,*inoeud).Valeur_t((x2).Enum());} } else if ((asortir) && (accroi_x2)) // cas où l'on sort la variation entre 0 et t de la grandeur {if (charge->Temps_courant() == 0.) {valy_a_sortir = 0.;} else { double val_init = lesMail->Noeud_LesMaille(numMail,*inoeud).Valeur_0((x2).Enum()); valy_a_sortir = lesMail->Noeud_LesMaille(numMail,*inoeud).Valeur_t((x2).Enum()) - val_init;} } else {valy_a_sortir = 0.;} // enregistrement liste_sortie.push_back(DeuxDoubles(valx_a_sortir,valy_a_sortir)); } } //-- fin des grandeurs pour un noeud else { // --------- cas des grandeurs aux éléments ------------ List_io::iterator ielement,ielementfin=tab_num_element(numMail).end(); // on crée une liste intermédiaire qui contient tous les éléments et point d'integ à sortir, List_io tab_total_elem = tab_num_element(numMail); // tout d'abord récup de la liste des éléments List_io tab_total_ptint = tab_num_integ(numMail); // et les points d'intégration correspondant // puis les références de listes d'éléments {List_io ::iterator idl,idlfin= nomDeRef_E(numMail).end(); for (idl=nomDeRef_E(numMail).begin();idl!=idlfin;idl++) { // recup de la reference correspondant au mot cle const Reference& refi = lesRef->Trouve((*idl).NomRef(),numMail); const ReferenceNE & reff = ((ReferenceNE &) refi); // transfo en ref d'éléments int taillen=reff.Taille(); // nombre d'éléments dans la liste for (int ielem=1;ielem<=taillen;ielem++) // on boucle et enregistre les elements et le point {tab_total_elem.push_back(reff.Numero(ielem)); // d'intégration tab_total_ptint.push_back((int) ((*idl).Val())); // associé (le même pour toute la référence) } }; }; // encapsulage // puis les références de listes de points d'intégration d'éléments {List_io ::iterator ids,idsfin= nomDeRef_ptinteg(numMail).end(); for (ids=nomDeRef_ptinteg(numMail).begin();ids!=idsfin;ids++) { // recup de la reference correspondant au mot cle const Reference& refi = lesRef->Trouve((*ids),numMail); const ReferenceAF & reff = ((ReferenceAF &) refi); // transfo en ref de pt d'integ int taillen=reff.Taille(); // nombre d'éléments dans la liste for (int ielem=1;ielem<=taillen;ielem++) // on boucle et enregistre les elements et le point {tab_total_elem.push_back(reff.NumeroElem(ielem)); // d'intégration tab_total_ptint.push_back(reff.NumeroFA(ielem)); // associé (le même pour toute la référence) } } }; // encapsulé ielementfin=tab_total_elem.end(); // dans le cas où il s'agit de ddl if (ddl_etpas_TQ_1 && ddl_etpas_TQ_2) {// on crée une liste intermédiaire pour stocker x1 et x2 , ceci pour l'appel de "Valeur_a_diff_temps " List_io < Ddl_enum_etendu > x1x2; x1x2.push_back(x1); x1x2.push_back(x2); // maintenant on affiche les infos pour la liste totale d'éléments List_io ::iterator iptinteg = tab_total_ptint.begin(); for (ielement = tab_total_elem.begin();ielement!=ielementfin;ielement++,iptinteg++) { // les grandeurs Tableau tab= lesMail->Element_LesMaille(numMail,*ielement).Valeur_a_diff_temps(absolue,TEMPS_tdt,x1x2,*iptinteg); // enregistrement liste_sortie.push_back(DeuxDoubles(tab(1),tab(2))); } } else // cas où x ou y sont des grandeurs particulières {// on crée une liste intermédiaire pour stocker x1 ou x2 , ceci pour l'appel de "Valeur_a_diff_temps " List_io < Ddl_enum_etendu > x1x2; List_io lix1x2; if (ddl_etpas_TQ_1) {x1x2.push_back(x1);} else {lix1x2.push_back(xx1);}; if (ddl_etpas_TQ_2) {x1x2.push_back(x2);} else {lix1x2.push_back(xx1);}; List_io::iterator ilix1x2 = lix1x2.begin(); List_io::iterator ilix1x2_fin = ilix1x2;ilix1x2_fin++; // maintenant on affiche les infos pour la liste totale d'éléments List_io ::iterator iptinteg = tab_total_ptint.begin(); if ( ddl_etpas_TQ_1 & !ddl_etpas_TQ_2) { // cas où la première grandeur est ddl et la seconde particulière for (ielement = tab_total_elem.begin();ielement!=ielementfin;ielement++,iptinteg++) { // les grandeurs de type enum Tableau tab= lesMail->Element_LesMaille(numMail,*ielement).Valeur_a_diff_temps(absolue,TEMPS_tdt,x1x2,*iptinteg); // les grandeurs particulières lesMail->Element_LesMaille(numMail,*ielement).Grandeur_particuliere(absolue,lix1x2,*iptinteg); // enregistrement double val2= (*ilix1x2).GrandeurNumOrdre(nb_ordre_2); liste_sortie.push_back(DeuxDoubles(tab(1),val2)); } } else if ( !ddl_etpas_TQ_1 & ddl_etpas_TQ_2) { // cas où la première grandeur est particulière et la seconde ddl for (ielement = tab_total_elem.begin();ielement!=ielementfin;ielement++,iptinteg++) { // les grandeurs de type enum Tableau tab= lesMail->Element_LesMaille(numMail,*ielement).Valeur_a_diff_temps(absolue,TEMPS_tdt,x1x2,*iptinteg); // les grandeurs particulières lesMail->Element_LesMaille(numMail,*ielement).Grandeur_particuliere(absolue,lix1x2,*iptinteg); // enregistrement double val1= (*ilix1x2).GrandeurNumOrdre (nb_ordre_1); liste_sortie.push_back(DeuxDoubles(val1,tab(1))); } } else // sinon les deux grandeurs sont particulière { for (ielement = tab_total_elem.begin();ielement!=ielementfin;ielement++,iptinteg++) {// les grandeurs particulières lesMail->Element_LesMaille(numMail,*ielement).Grandeur_particuliere(absolue,lix1x2,*iptinteg); // enregistrement double val1= (*ilix1x2).GrandeurNumOrdre(nb_ordre_1); double val2= (*ilix1x2_fin).GrandeurNumOrdre(nb_ordre_2); liste_sortie.push_back(DeuxDoubles(val1,val2)); } }; }; //-- fin du cas où il y a au moins une grandeur particulière }; // fin du else sur les grandeurs aux éléments // ajout de la courbe à l'animation animation_maple->Ajout_courbe(liste_sortie); }; // entrée du choix de l'utilisation sur le style de sortie void Choix_grandeurs_maple::Style_de_sortie(string& rep) {rep = ""; // init while ((Minuscules(rep) != "fin") && (Minuscules(rep) != "f")) {// on expliques les différentes possibles possibles cout << "\n differents choix possibles " << "\n sortie avec standart automatique (rep : st)" << "\n forcer l'ecriture sur une ligne unix pour chaque increment (rep : ul)" << "\n tenseur en absolue (rep : ab)" << "\n tenseur dans un repere le plus ad hoc (rep : ad)" << "\n aide (rep : ?)" << "\n pas de changement et retour (rep : fin (ou f)) "; cout << "\n ( valeur actuelle du choix: "; if (style_de_sortie==0) {cout << " st )\n";} else {cout << " ul )\n";}; rep = ""; cout << "\n choix ? ";rep = lect_return_defaut(false,"f"); if (rep == "st") { style_de_sortie = 0;} else if (rep == "ul") { style_de_sortie = 1;} else if (rep == "ab") { absolue = 1;} else if (rep == "ad") { absolue = 0;} else if (rep == "?") { cout << "\n dans le cas d'une sortie standart automatique, chaque increment est sortie sur une ligne" << " unix, sauf dans le cas ou un seul increment est en sortie. Dans ce dernier cas," << " les informations sont decoupees par defaut, par exemple selon: une ligne = un noeud , " << " et le temps n'est pas indique. Dans certain cas cette modification automatique de format" << " n'est pas interressante (par exemple pour les sorties au fil du calcul), il est alors possible" << " de forcer une sortie globale de l'increment sur une seule ligne meme dans le cas d'un seul increment" << " c'est l'option ul. " << " \n concernant la sortie des tenseurs: par defaut les tenseurs sont exprimes dans le repere " << " absolu. Dans le cas de coque par exemple, il est plus interessant d'exprimer les tenseurs " << " dans un repere tangent a l'element (repere ad hoc) " ; } else { cout << "\n erreur de syntaxe, recommencez ! ";}; }; }; // vérification des listes de pt d'integ et d'éléments relativement au grandeur à sortir void Choix_grandeurs_maple::VerifListes() { // on vérifie que les grandeurs principale de type enum étendue que l'on veut sortir sont possible // par contre pas de vérif pour les grandeurs quelconques int nb_maillage = tabelement_type_ddl.Taille(); // def d'un conteneur de travail Maillage::NBelemEtptInteg nut; for (int n_mail = 1;n_mail<=nb_maillage;n_mail++) { List_io::iterator ienufin=tabelement_type_ddl_retenu(n_mail).end(); List_io::iterator ienu_deb=tabelement_type_ddl_retenu(n_mail).begin(); List_io::iterator ienu; // 1) liste d'éléments {List_io ::iterator idl,idlfin= nomDeRef_E(n_mail).end(); for (idl=nomDeRef_E(n_mail).begin();idl!=idlfin;idl++) { // recup de la reference correspondant au mot cle const Reference& refi = lesRef->Trouve((*idl).NomRef(),n_mail); const ReferenceNE & reff = ((ReferenceNE &) refi); // transfo en ref d'éléments int taillen=reff.Taille(); // nombre d'éléments dans la liste for (int ielem=1;ielem<=taillen;ielem++) // on boucle et on test { // boucle sur les ddl retenus for (ienu = ienu_deb;ienu != ienufin; ienu++) { nut.nbElem = reff.Numero(ielem); nut.nbPtInteg = (int) ((*idl).Val()); // vérification de l'adéquation numéro de point d'intégration et énumération et élément if (!(lesMail->Element_LesMaille(n_mail,nut.nbElem).Existe_pt_integ(nut.nbPtInteg,(*ienu).Enum()))) { cout << "\n warning : le numero " << nut.nbPtInteg << " de numero d'ordre " << " pour le ddl " << Nom_ddl((*ienu).Enum()) << " n'est pas valide pour l'element " << nut.nbElem << " du maillage " << n_mail << " !!!! "; }; }; // fin de la boucle sur les ddl retenus };//-- fin de la boucle sur les éléments de la référence }; //-- fin de la boucle sur les références d'éléments };// fin encapsulage // 2) liste de points d'intégrations d'éléments {List_io ::iterator idl,idlfin= nomDeRef_ptinteg(n_mail).end(); for (idl=nomDeRef_ptinteg(n_mail).begin();idl!=idlfin;idl++) { // recup de la reference correspondant au mot cle const Reference& refi = lesRef->Trouve((*idl),n_mail); const ReferenceAF & reff = ((ReferenceAF &) refi); // transfo en ref d'éléments int taillen=reff.Taille(); // nombre d'éléments dans la liste for (int ielem=1;ielem<=taillen;ielem++) // on boucle et on test { // boucle sur les ddl retenus for (ienu = ienu_deb;ienu != ienufin; ienu++) { nut.nbElem = reff.NumeroElem(ielem); nut.nbPtInteg = reff.NumeroFA(ielem); // vérification de l'adéquation numéro de point d'intégration et énumération et élément if (!(lesMail->Element_LesMaille(n_mail,nut.nbElem).Existe_pt_integ(nut.nbPtInteg,(*ienu).Enum()))) { cout << "\n warning : le numero " << nut.nbPtInteg << " de numero d'ordre " << " pour le ddl " << Nom_ddl((*ienu).Enum()) << " n'est pas valide pour l'element " << nut.nbElem << " du maillage " << n_mail << " !!!! "; }; }; // fin de la boucle sur les ddl retenus };//-- fin de la boucle sur les éléments de la référence }; //-- fin de la boucle sur les références d'éléments };// fin encapsulage }; // fin de la boucle sur les maillages }; // utilitaire de sortie d'entête pour les noeuds: void Choix_grandeurs_maple::Sortie_entete_noeud_unitaire(list::const_iterator imail,ostream & sort, int& num_col) { // on sort la position des xyz switch (ParaGlob::Dimension()) {case 1: sort << " ["<::iterator ienu,ienufin=tabnoeud_type_ddl_retenu(*imail).end(); for (ienu = tabnoeud_type_ddl_retenu(*imail).begin();ienu!=ienufin;ienu++) { switch (type_sortie_ddl_retenue) { case 0: sort << " ["<::iterator ienu,ienufin=tabnoeud_type_ddlEtendu_retenu(*imail).end(); for (ienu = tabnoeud_type_ddlEtendu_retenu(*imail).begin();ienu!=ienufin;ienu++) { sort << " ["<::iterator iquefin=tabnoeud_TypeQuelconque_retenu(*imail).end(); List_io::iterator ique,ique_deb=tabnoeud_TypeQuelconque_retenu(*imail).begin(); for (ique = ique_deb;ique != iquefin;ique++) {(*ique).Ecriture_entete_grandeur(sort); sort << " ["<::const_iterator imail,ostream & sort, int& num_col, bool & temps_deja_affiche) { // a) les Ddl_enum_etendu List_io::iterator ienu,ienufin=tabelement_type_ddl_retenu(*imail).end(); List_io::iterator ienu_deb=tabelement_type_ddl_retenu(*imail).begin(); if (ienu_deb != ienufin) // c'est a dire: cas où existe une grandeur { // on sort la position des xyz du point d'intégration if (!temps_deja_affiche) num_col++; // on passe l'affichage du temps si besoin temps_deja_affiche=true; switch (ParaGlob::Dimension()) {case 1: sort << " ["<::iterator iquefin=tabelement_typeParti_retenu(*imail).end(); List_io::iterator ique,ique_deb=tabelement_typeParti_retenu(*imail).begin(); if (ique_deb != iquefin) // c'est a dire: cas où existe une grandeur { // on sort la position des xyz du point d'intégration sort << "\n# "; if (!temps_deja_affiche) num_col++; // on passe l'affichage du temps si on ne l'a pas déjà passé switch (ParaGlob::Dimension()) {case 1: sort << " ["<::iterator iquefin=tabelement_evoluee_retenu(*imail).end(); List_io::iterator ique,ique_deb=tabelement_evoluee_retenu(*imail).begin(); if (ique_deb != iquefin) // c'est a dire: cas où existe une grandeur { // on sort la position des xyz du point d'intégration sort << "\n# "; if (!temps_deja_affiche) {num_col++; // on passe l'affichage du temps si on ne l'a pas déjà passé temps_deja_affiche=true; }; switch (ParaGlob::Dimension()) {case 1: sort << " ["<::const_iterator imail,ostream & sort, int& num_col, bool & temps_deja_affiche) { {// cas des grandeurs quelconques List_io::iterator iquefin=tab_F_element_TypeQuelconque_retenu(*imail).end(); List_io::iterator ique,ique_deb=tab_F_element_TypeQuelconque_retenu(*imail).begin(); if (ique_deb != iquefin) // c'est a dire: cas où existe une grandeur { // on sort la position des xyz du point d'intégration sort << "\n# "; if (!temps_deja_affiche) {num_col++; // on passe l'affichage du temps si on ne l'a pas déjà passé temps_deja_affiche=true; }; switch (ParaGlob::Dimension()) {case 1: sort << " ["<::const_iterator imail,ostream & sort, int& num_col, bool & temps_deja_affiche) { {// cas des grandeurs quelconques List_io::iterator iquefin=tab_A_element_TypeQuelconque_retenu(*imail).end(); List_io::iterator ique,ique_deb=tab_A_element_TypeQuelconque_retenu(*imail).begin(); if (ique_deb != iquefin) // c'est a dire: cas où existe une grandeur { // on sort la position des xyz du point d'intégration sort << "\n# "; if (!temps_deja_affiche) {num_col++; // on passe l'affichage du temps si on ne l'a pas déjà passé temps_deja_affiche=true; }; switch (ParaGlob::Dimension()) {case 1: sort << " ["<