2901 lines
178 KiB
C++
Executable file
2901 lines
178 KiB
C++
Executable file
|
|
// 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) <https://www.irdl.fr/>.
|
|
//
|
|
// 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 <https://www.gnu.org/licenses/>.
|
|
//
|
|
// For more information, please consult: <https://herezh.irdl.fr/>.
|
|
|
|
#include "Choix_grandeurs_maple.h"
|
|
#include "CharUtil.h"
|
|
#include "ReferenceNE.h"
|
|
#include "ReferencePtiAF.h"
|
|
|
|
#include <iomanip>
|
|
#include <limits>
|
|
|
|
// ------------------------------------------------ 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 <int>& list_mail = choix_mail->List_choisit();
|
|
list<int>::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<Ddl_enum_etendu>::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<Ddl_enum_etendu>::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 <int>::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 <string >::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 ("<<dim<<" nombre(s)) ? ";
|
|
for(int j=1;j<=dim;j++) cin >> xi(j);
|
|
std::cin.ignore( std::numeric_limits<std::streamsize>::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<Ddl_enum_etendu>::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 <int>& list_mail = choix_mail->List_choisit();
|
|
list<int>::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<Ddl_enum_etendu>::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<Ddl_enum_etendu>::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 <int>& list_mail = choix_mail->List_choisit();
|
|
list<int>::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<TypeQuelconque>& 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<TypeQuelconque>& tpg_ret = (tabnoeud_TypeQuelconque_retenu(n_mail)); // pour simplifier
|
|
List_io<TypeQuelconque>& tpg = (tabnoeud_TypeQuelconque(n_mail)); // pour simplifier
|
|
List_io<TypeQuelconque>::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<TypeQuelconque>& tpg_ret = (tabnoeud_TypeQuelconque_retenu(n_mail)); // pour simplifier
|
|
List_io<TypeQuelconque>& tpg = listeVecGlobbal; // pour simplifier
|
|
List_io<TypeQuelconque>::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<TypeQuelconque>& tpg_ret = (tabnoeud_TypeQuelconque_retenu(n_mail)); // pour simplifier
|
|
List_io<TypeQuelconque>& tpg = (tabnoeud_TypeQuelconque(n_mail)); // pour simplifier
|
|
if (find(tpg.begin(),tpg.end(),a) != tpg.end())
|
|
{ // il existe -> enregistrement
|
|
List_io<TypeQuelconque>::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<TypeQuelconque>& tpg_ret = (tabnoeud_TypeQuelconque_retenu(n_mail)); // pour simplifier
|
|
List_io<TypeQuelconque>& tpg = listeVecGlobbal; // pour simplifier
|
|
if (find(tpg.begin(),tpg.end(),a) != tpg.end())
|
|
{ // il existe -> enregistrement
|
|
List_io<TypeQuelconque>::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 <int>& list_mail = choix_mail->List_choisit();
|
|
list<int>::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 <int>::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<Ddl_enum_etendu>::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 <int>& list_mail = choix_mail->List_choisit();
|
|
list<int>::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 <int>::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<TypeQuelconque>& tpg_ret = (tabelement_typeParti_retenu(n_mail)); // pour simplifier
|
|
List_io<TypeQuelconque>& tpg = (tabelement_typeParti(n_mail)); // pour simplifier
|
|
List_io<TypeQuelconque>::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<TypeQuelconque>& tpg_ret = (tabelement_typeParti_retenu(n_mail)); // pour simplifier
|
|
List_io<TypeQuelconque>& tpg = (tabelement_typeParti(n_mail)); // pour simplifier
|
|
if (find(tpg.begin(),tpg.end(),a) != tpg.end())
|
|
{ // il existe -> enregistrement
|
|
List_io<TypeQuelconque>::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 <int>& list_mail = choix_mail->List_choisit();
|
|
list<int>::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 <int>::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<TypeQuelconque>& tpg_ret = (tabelement_evoluee_retenu(n_mail)); // pour simplifier
|
|
List_io<TypeQuelconque>& tpg = (tabelement_evoluee(n_mail)); // pour simplifier
|
|
List_io<TypeQuelconque>::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<TypeQuelconque>& tpg_ret = (tabelement_evoluee_retenu(n_mail)); // pour simplifier
|
|
List_io<TypeQuelconque>& tpg = (tabelement_evoluee(n_mail)); // pour simplifier
|
|
if (find(tpg.begin(),tpg.end(),a) != tpg.end())
|
|
{ // il existe -> enregistrement
|
|
List_io<TypeQuelconque>::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 <int>& list_mail = choix_mail->List_choisit();
|
|
list<int>::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 <int>::iterator ieint,ieintfin = tab_num_F_element(n_mail).end();
|
|
List_io <int>::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<TypeQuelconque>& tpg_ret = (tab_F_element_TypeQuelconque_retenu(n_mail)); // pour simplifier
|
|
List_io<TypeQuelconque>& tpg = (tab_F_element_TypeQuelconque(n_mail)); // pour simplifier
|
|
List_io<TypeQuelconque>::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<TypeQuelconque>& tpg_ret = (tab_F_element_TypeQuelconque_retenu(n_mail)); // pour simplifier
|
|
List_io<TypeQuelconque>& tpg = (tab_F_element_TypeQuelconque(n_mail)); // pour simplifier
|
|
if (find(tpg.begin(),tpg.end(),a) != tpg.end())
|
|
{ // il existe -> enregistrement
|
|
List_io<TypeQuelconque>::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 <int>& list_mail = choix_mail->List_choisit();
|
|
list<int>::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 <int>::iterator ieint,ieintfin = tab_num_A_element(n_mail).end();
|
|
List_io <int>::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<TypeQuelconque>& tpg_ret = (tab_A_element_TypeQuelconque_retenu(n_mail)); // pour simplifier
|
|
List_io<TypeQuelconque>& tpg = (tab_A_element_TypeQuelconque(n_mail)); // pour simplifier
|
|
List_io<TypeQuelconque>::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<TypeQuelconque>& tpg_ret = (tab_A_element_TypeQuelconque_retenu(n_mail)); // pour simplifier
|
|
List_io<TypeQuelconque>& tpg = (tab_A_element_TypeQuelconque(n_mail)); // pour simplifier
|
|
if (find(tpg.begin(),tpg.end(),a) != tpg.end())
|
|
{ // il existe -> enregistrement
|
|
List_io<TypeQuelconque>::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 <int>& list_mail = choix_mail->List_choisit();
|
|
list<int>::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 <int>::iterator ieint,ieintfin = tab_num_element(n_mail).end();
|
|
for (ieint=tab_num_element(n_mail).begin();ieint!=ieintfin;ieint++)
|
|
cout << *ieint << " ";
|
|
};
|
|
cout <<endl;
|
|
// cas des références d'éléments
|
|
if ((nomDeRef_E(n_mail)).size() != 0)
|
|
{ cout << "\n liste actuelle de reference d'elements: (ref et num integ) ";
|
|
List_io <BlocScal >::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 <string >::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 <Maillage::NBelemEtptInteg> 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<Ddl_enum_etendu>::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 ("<<dim<<" nombre(s)) ? ";
|
|
for(int j=1;j<=dim;j++) cin >> xi(j);
|
|
std::cin.ignore( std::numeric_limits<std::streamsize>::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<Ddl_enum_etendu>::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 <BlocScal >::iterator idl,idlfin= nomDeRef_E(n_mail).end();
|
|
List_io<Ddl_enum_etendu>::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<Ddl_enum_etendu>::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 <BlocScal >::iterator idl,idlfin= nomDeRef_E(n_mail).end();
|
|
List_io<Ddl_enum_etendu>::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 <string >::iterator idl,idlfin= nomDeRef_ptinteg(n_mail).end();
|
|
List_io<Ddl_enum_etendu>::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 <Maillage::NBelemEtptInteg>::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 <Maillage::NBelemEtptInteg>::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 <Maillage::NBelemEtptInteg>::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<Ddl_enum_etendu>::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 <Maillage::NBelemEtptInteg>::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 <int>::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 <int>& list_mail = choix_mail->List_choisit();
|
|
list<int>::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 <int>::iterator ieint,ieintfin = tab_num_F_element(n_mail).end();
|
|
List_io <int>::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 <BlocScal >::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 <string >::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 <Maillage::NBelemFAEtptInteg> 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 "<<nut.nbElem
|
|
<< " du maillage "<< n_mail
|
|
<< " !!!" << flush ;
|
|
verif = false;
|
|
}
|
|
else
|
|
{const ElFrontiere* elf = ele.Frontiere_surfacique(nut.nbFA); // récup num face
|
|
nbpti = elf->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 <BlocScal >::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 "<<nut.nbElem
|
|
<< " du maillage "<< n_mail
|
|
<< " ceci pour la reference " << reff.Nom()
|
|
<< " !!!" << flush ;
|
|
veriflocal = false;
|
|
}
|
|
else
|
|
{const ElFrontiere* elf = ele.Frontiere_surfacique(nut.nbFA); // récup num face
|
|
int max_pti = elf->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"<<nut.nbElem<<") doit etre superieur a 0 !!!";};
|
|
if (nut.nbElem > lesMail->Nombre_element(n_mail))
|
|
{ cout << "\n chois non valide, le numero d'element (ici"<<nut.nbElem<<") doit etre inferieur ou egal "
|
|
<< " au nombre total d'element du maillage ("<<lesMail->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 "<<nut.nbElem
|
|
<< " du maillage "<< n_mail
|
|
<< " ceci pour la reference " << reff.Nom()
|
|
<< " !!!" << flush ;
|
|
veriflocal = false;
|
|
}
|
|
else
|
|
{const ElFrontiere* elf = ele.Frontiere_surfacique(nut.nbFA); // récup num face
|
|
int max_pti = elf->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 <BlocScal >::iterator idl,idlfin= tab_nomDeRef_F_E_SM(n_mail).end();
|
|
|
|
// --- cas des types quelconques aux faces d'éléments
|
|
{List_io<EnumTypeQuelconque>::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 "<<nut.nbElem
|
|
<< " du maillage "<< n_mail
|
|
<< " ceci pour la reference " << reff.Nom()
|
|
<< " !!!" << flush ;
|
|
veriflocal = false;break;
|
|
}
|
|
else
|
|
{const ElFrontiere* elf = ele.Frontiere_surfacique(nut.nbFA); // récup num face
|
|
int max_pti = elf->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: "<<refi.Nom()<<" : ";
|
|
cout << "\n la face "<<nut.nbFA<<" de l'element "<<nut.nbElem << " du maillage " << n_mail
|
|
<< " contient "<<max_pti<< " pti , alors qu'il en faudrait: "<<nbpti
|
|
<< "\n les faces sont donc differentes, on ne peut pas utiliser cette reference !! "
|
|
<< flush;
|
|
veriflocal = false;
|
|
};
|
|
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)
|
|
{ nut.nbPtInteg = -1;
|
|
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
|
|
};
|
|
};
|
|
}; // 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 de faces d'élément 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() != 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<EnumTypeQuelconque>::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 "<<nut.nbElem
|
|
<< " du maillage "<< n_mail
|
|
<< " ceci pour la reference " << reff.Nom()
|
|
<< " !!!" << flush ;
|
|
veriflocal = false;
|
|
}
|
|
else
|
|
{const ElFrontiere* elf = ele.Frontiere_surfacique(nut.nbFA); // récup num face
|
|
int max_pti = elf->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 <Maillage::NBelemFAEtptInteg>::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 <int>::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 <int>& list_mail = choix_mail->List_choisit();
|
|
list<int>::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 <int>::iterator ieint,ieintfin = tab_num_A_element(n_mail).end();
|
|
List_io <int>::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 <BlocScal >::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 <string >::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 <Maillage::NBelemFAEtptInteg> 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 "<<nut.nbElem
|
|
<< " du maillage "<< n_mail
|
|
<< " !!!" << flush ;
|
|
verif = false;
|
|
}
|
|
else
|
|
{const ElFrontiere* elf = ele.Frontiere_lineique(nut.nbFA); // récup num arête
|
|
nbpti = elf->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 <BlocScal >::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 "<<nut.nbElem
|
|
<< " du maillage "<< n_mail
|
|
<< " ceci pour la reference " << reff.Nom()
|
|
<< " !!!" << flush ;
|
|
veriflocal = false;
|
|
}
|
|
else
|
|
{const ElFrontiere* elf = ele.Frontiere_lineique(nut.nbFA); // récup num arête
|
|
int max_pti = elf->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"<<nut.nbElem<<") doit etre superieur a 0 !!!";};
|
|
if (nut.nbElem > lesMail->Nombre_element(n_mail))
|
|
{ cout << "\n chois non valide, le numero d'element (ici"<<nut.nbElem<<") doit etre inferieur ou egal "
|
|
<< " au nombre total d'element du maillage ("<<lesMail->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 "<<nut.nbElem
|
|
<< " du maillage "<< n_mail
|
|
<< " ceci pour la reference " << reff.Nom()
|
|
<< " !!!" << flush ;
|
|
veriflocal = false;
|
|
}
|
|
else
|
|
{const ElFrontiere* elf = ele.Frontiere_lineique(nut.nbFA); // récup num arête
|
|
int max_pti = elf->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 <BlocScal >::iterator idl,idlfin= tab_nomDeRef_A_E_SM(n_mail).end();
|
|
|
|
// --- cas des types quelconques aux arêtes d'éléments
|
|
{List_io<EnumTypeQuelconque>::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 "<<nut.nbElem
|
|
<< " du maillage "<< n_mail
|
|
<< " ceci pour la reference " << reff.Nom()
|
|
<< " !!!" << flush ;
|
|
veriflocal = false;break;
|
|
}
|
|
else
|
|
{const ElFrontiere* elf = ele.Frontiere_lineique(nut.nbFA); // récup num arête
|
|
int max_pti = elf->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: "<<refi.Nom()<<" : ";
|
|
cout << "\n l'arete "<<nut.nbFA<<" de l'element "<<nut.nbElem << " du maillage " << n_mail
|
|
<< " contient "<<max_pti<< " pti , alors qu'il en faudrait: "<<nbpti
|
|
<< "\n les aretes sont donc differentes, on ne peut pas utiliser cette reference !! "
|
|
<< flush;
|
|
veriflocal = false;
|
|
};
|
|
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)
|
|
{ nut.nbPtInteg = -1;
|
|
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
|
|
};
|
|
};
|
|
}; // 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 d'arêtes d'élément 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() != 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<EnumTypeQuelconque>::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 "<<nut.nbElem
|
|
<< " du maillage "<< n_mail
|
|
<< " ceci pour la reference " << reff.Nom()
|
|
<< " !!!" << flush ;
|
|
veriflocal = false;
|
|
}
|
|
else
|
|
{const ElFrontiere* elf = ele.Frontiere_lineique(nut.nbFA); // récup num arête
|
|
int max_pti = elf->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 <Maillage::NBelemFAEtptInteg>::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 <int>::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 <int>::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 <string >::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 ("<<dim<<" nombre(s)) ? ";
|
|
for(int j=1;j<=dim;j++) cin >> xi(j);
|
|
std::cin.ignore( std::numeric_limits<std::streamsize>::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<Ddl_enum_etendu>::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 <string>::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 <string>::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 <string>::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 <String_et_entier >& list_torseur_condLim = tab_list_torseur_condLim(imail);
|
|
List_io <String_et_entier >& 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 <String_et_entier>::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 <String_et_entier>::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 <String_et_entier>::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 <DeuxDoubles> 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<int>::iterator inoeud,inoeudfin=tab_num_noeud(numMail).end();
|
|
// on crée une liste intermédiaire qui contient tous les noeuds à sortir,
|
|
List_io <int> 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 <string >::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<int>::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 <int> tab_total_elem = tab_num_element(numMail); // tout d'abord récup de la liste des éléments
|
|
List_io <int> 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 <BlocScal>::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 <string>::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 <int>::iterator iptinteg = tab_total_ptint.begin();
|
|
for (ielement = tab_total_elem.begin();ielement!=ielementfin;ielement++,iptinteg++)
|
|
{ // les grandeurs
|
|
Tableau <double> 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<TypeQuelconque> 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<TypeQuelconque>::iterator ilix1x2 = lix1x2.begin();
|
|
List_io<TypeQuelconque>::iterator ilix1x2_fin = ilix1x2;ilix1x2_fin++;
|
|
// maintenant on affiche les infos pour la liste totale d'éléments
|
|
List_io <int>::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 <double> 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 <double> 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<Ddl_enum_etendu>::iterator ienufin=tabelement_type_ddl_retenu(n_mail).end();
|
|
List_io<Ddl_enum_etendu>::iterator ienu_deb=tabelement_type_ddl_retenu(n_mail).begin();
|
|
List_io<Ddl_enum_etendu>::iterator ienu;
|
|
|
|
// 1) liste d'éléments
|
|
{List_io <BlocScal>::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 <string>::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<int>::const_iterator imail,ostream & sort, int& num_col)
|
|
{ // on sort la position des xyz
|
|
switch (ParaGlob::Dimension())
|
|
{case 1: sort << " ["<<num_col<<"]X "; num_col++; break;
|
|
case 2: sort << " ["<<num_col<<"]X " << " ["<<num_col+1<<"]Y " ;num_col+=2; break;
|
|
case 3: sort << " ["<<num_col<<"]X " << " ["<<num_col+1<<"]Y "<< " ["<<num_col+2<<"]Z ";num_col+=3; break;
|
|
};
|
|
// les positions de chaque grandeurs
|
|
// --- les ddl principaux ----
|
|
{List_io<Ddl_enum_etendu>::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 << " ["<<num_col<<"]"<< (*ienu).Nom_plein() << " ";num_col++;break;
|
|
case 1: sort << " ["<<num_col<<"]"<< ("delta_0_t_"+string((*ienu).Nom_plein())) << " ";num_col++;break;
|
|
case 2: sort << " ["<<num_col<<"]"<< (string((*ienu).Nom_plein())+"_0")<<" "
|
|
<< " ["<<num_col+1<<"]"<< (*ienu).Nom_plein() << " ";num_col+=2; break;
|
|
};
|
|
|
|
};
|
|
};
|
|
// --- les ddl étendus ----
|
|
{List_io<Ddl_enum_etendu>::iterator ienu,ienufin=tabnoeud_type_ddlEtendu_retenu(*imail).end();
|
|
for (ienu = tabnoeud_type_ddlEtendu_retenu(*imail).begin();ienu!=ienufin;ienu++)
|
|
{ sort << " ["<<num_col<<"]"<< (*ienu).Nom_plein() << " ";num_col++; };
|
|
};
|
|
// --- les grandeurs quelconques ---
|
|
{List_io<TypeQuelconque>::iterator iquefin=tabnoeud_TypeQuelconque_retenu(*imail).end();
|
|
List_io<TypeQuelconque>::iterator ique,ique_deb=tabnoeud_TypeQuelconque_retenu(*imail).begin();
|
|
for (ique = ique_deb;ique != iquefin;ique++)
|
|
{(*ique).Ecriture_entete_grandeur(sort);
|
|
sort << " ["<<num_col << "..." << num_col+(*ique).NbMaxiNumeroOrdre()-1<<"]"; // l'étendue des colonnes
|
|
num_col += (*ique).NbMaxiNumeroOrdre();
|
|
sort << "\n# ";
|
|
};
|
|
};
|
|
|
|
sort << " ;\n# ";
|
|
};
|
|
|
|
// utilitaire de sortie d'entête pour les éléments:
|
|
void Choix_grandeurs_maple::Sortie_entete_element_unitaire(list<int>::const_iterator imail,ostream & sort, int& num_col, bool & temps_deja_affiche)
|
|
{
|
|
// a) les Ddl_enum_etendu
|
|
List_io<Ddl_enum_etendu>::iterator ienu,ienufin=tabelement_type_ddl_retenu(*imail).end();
|
|
List_io<Ddl_enum_etendu>::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 << " ["<<num_col<<"]X "; num_col++; break;
|
|
case 2: sort << " ["<<num_col<<"]X " << " ["<<num_col+1<<"]Y " ;num_col+=2; break;
|
|
case 3: sort << " ["<<num_col<<"]X " << " ["<<num_col+1<<"]Y "<< " ["<<num_col+2<<"]Z ";num_col+=3; break;
|
|
};
|
|
// les positions de chaque grandeurs
|
|
for (ienu = tabelement_type_ddl_retenu(*imail).begin();ienu!=ienufin;ienu++,num_col++)
|
|
sort << " ["<<num_col<<"]"<< (*ienu) << " ";
|
|
};
|
|
{// maintenant les grandeurs particulières
|
|
List_io<TypeQuelconque>::iterator iquefin=tabelement_typeParti_retenu(*imail).end();
|
|
List_io<TypeQuelconque>::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 << " ["<<num_col<<"]X "; num_col++; break;
|
|
case 2: sort << " ["<<num_col<<"]X " << " ["<<num_col+1<<"]Y " ;num_col+=2; break;
|
|
case 3: sort << " ["<<num_col<<"]X " << " ["<<num_col+1<<"]Y "<< " ["<<num_col+2<<"]Z ";num_col+=3; break;
|
|
};
|
|
sort << "\n# ";
|
|
// puis l'intervalle des grandeurs
|
|
for (ique = tabelement_typeParti_retenu(*imail).begin();ique!=iquefin;ique++)
|
|
{(*ique).Ecriture_entete_grandeur(sort);
|
|
sort << " ["<<num_col << "..." << num_col+(*ique).NbMaxiNumeroOrdre()-1<<"]"; // l'étendue des colonnes
|
|
num_col += (*ique).NbMaxiNumeroOrdre();
|
|
sort << "\n# ";
|
|
};
|
|
};
|
|
}; // fin encapsulage pour les grandeurs particulières
|
|
|
|
{// maintenant les grandeurs évoluées
|
|
List_io<TypeQuelconque>::iterator iquefin=tabelement_evoluee_retenu(*imail).end();
|
|
List_io<TypeQuelconque>::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 << " ["<<num_col<<"]X "; num_col++; break;
|
|
case 2: sort << " ["<<num_col<<"]X " << " ["<<num_col+1<<"]Y " ;num_col+=2; break;
|
|
case 3: sort << " ["<<num_col<<"]X " << " ["<<num_col+1<<"]Y "<< " ["<<num_col+2<<"]Z ";num_col+=3; break;
|
|
};
|
|
sort << "\n# ";
|
|
// puis l'intervalle des grandeurs
|
|
for (ique = tabelement_evoluee_retenu(*imail).begin();ique!=iquefin;ique++)
|
|
{(*ique).Ecriture_entete_grandeur(sort);
|
|
sort << " ["<<num_col << "..." << num_col+(*ique).NbMaxiNumeroOrdre()-1<<"]"; // l'étendue des colonnes
|
|
num_col += (*ique).NbMaxiNumeroOrdre();
|
|
sort << "\n# ";
|
|
};
|
|
};
|
|
}; // fin encapsulage pour les grandeurs évoluées
|
|
sort << "\n# ";
|
|
};
|
|
|
|
// utilitaire de sortie d'entête pour les faces d'élément:
|
|
void Choix_grandeurs_maple::Sortie_entete_face_element_unitaire(list<int>::const_iterator imail,ostream & sort, int& num_col, bool & temps_deja_affiche)
|
|
{
|
|
{// cas des grandeurs quelconques
|
|
List_io<TypeQuelconque>::iterator iquefin=tab_F_element_TypeQuelconque_retenu(*imail).end();
|
|
List_io<TypeQuelconque>::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 << " ["<<num_col<<"]X "; num_col++; break;
|
|
case 2: sort << " ["<<num_col<<"]X " << " ["<<num_col+1<<"]Y " ;num_col+=2; break;
|
|
case 3: sort << " ["<<num_col<<"]X " << " ["<<num_col+1<<"]Y "<< " ["<<num_col+2<<"]Z ";num_col+=3; break;
|
|
};
|
|
sort << "\n# ";
|
|
// puis l'intervalle des grandeurs
|
|
for (ique = tab_F_element_TypeQuelconque_retenu(*imail).begin();ique!=iquefin;ique++)
|
|
{(*ique).Ecriture_entete_grandeur(sort);
|
|
sort << " ["<<num_col << "..." << num_col+(*ique).NbMaxiNumeroOrdre()-1<<"]"; // l'étendue des colonnes
|
|
num_col += (*ique).NbMaxiNumeroOrdre();
|
|
sort << "\n# ";
|
|
};
|
|
};
|
|
}; // fin encapsulage pour les grandeurs quelconques
|
|
sort << "\n# ";
|
|
};
|
|
// utilitaire de sortie d'entête pour les arêtes d'élément:
|
|
void Choix_grandeurs_maple::Sortie_entete_arete_element_unitaire(list<int>::const_iterator imail,ostream & sort, int& num_col, bool & temps_deja_affiche)
|
|
{
|
|
{// cas des grandeurs quelconques
|
|
List_io<TypeQuelconque>::iterator iquefin=tab_A_element_TypeQuelconque_retenu(*imail).end();
|
|
List_io<TypeQuelconque>::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 << " ["<<num_col<<"]X "; num_col++; break;
|
|
case 2: sort << " ["<<num_col<<"]X " << " ["<<num_col+1<<"]Y " ;num_col+=2; break;
|
|
case 3: sort << " ["<<num_col<<"]X " << " ["<<num_col+1<<"]Y "<< " ["<<num_col+2<<"]Z ";num_col+=3; break;
|
|
};
|
|
sort << "\n# ";
|
|
// puis l'intervalle des grandeurs
|
|
for (ique = tab_A_element_TypeQuelconque_retenu(*imail).begin();ique!=iquefin;ique++)
|
|
{(*ique).Ecriture_entete_grandeur(sort);
|
|
sort << " ["<<num_col << "..." << num_col+(*ique).NbMaxiNumeroOrdre()-1<<"]"; // l'étendue des colonnes
|
|
num_col += (*ique).NbMaxiNumeroOrdre();
|
|
sort << "\n# ";
|
|
};
|
|
};
|
|
}; // fin encapsulage pour les grandeurs quelconques
|
|
sort << "\n# ";
|
|
};
|
|
|