// This file is part of the Herezh++ application. // // The finite element software Herezh++ is dedicated to the field // of mechanics for large transformations of solid structures. // It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600) // INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) . // // Herezh++ is distributed under GPL 3 license ou ultérieure. // // Copyright (C) 1997-2021 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // For more information, please consult: . #include "Isovaleurs_Gmsh.h" #include #include #include "CharUtil.h" #include "Coordonnee2.h" #include "ConstMath.h" #include "MathUtil.h" #include "Banniere.h" #include "TypeQuelconqueParticulier.h" #include "Visualisation_Gmsh.h" // choix de l'isovaleur à visualiser calculée à partir des grandeurs évoluées aux points d'intégrations void Isovaleurs_Gmsh::ChoixIsovaleur_tensorielle_ptinteg(const string& choix) { // tout d'abord on traite le cas de tous les isovaleurs if (choix=="to") { tabelement_evoluee_retenu = tabelement_evoluee; return; } else if (choix=="de") { // on prend le premier élément de chaque maillage et on statut en fonction de son type int nbmail = tabelement_evoluee.Taille(); for (int imail = 1;imail<=nbmail;imail++) {List_io < TypeQuelconque >& element_evoluee = tabelement_evoluee(imail); // pour simplifier List_io < TypeQuelconque >& element_evoluee_retenu = tabelement_evoluee_retenu(imail); // pour simplifier List_io < TypeQuelconque >::iterator iq,iqfin=element_evoluee.end(); List_io < TypeQuelconque >::iterator iqev,iqevfin; Element& ele = lesMail->Element_LesMaille(imail,1); Element::Signature signa = ele.Signature_element(); switch (signa.id_problem) {case MECA_SOLIDE_DEFORMABLE: {// c'est avec les types évoluées que l'on travaille, on sort la contrainte et la déformation courante // tout d'abord les grandeurs communes: // a) on sort les contraintes for (iq=element_evoluee.begin();iq!=iqfin;iq++) {if ((*iq).EnuTypeQuelconque()== CONTRAINTE_COURANTE) break;}; if (iq != iqfin) { // on enregistre s'il n'existe pas déjà iqevfin=element_evoluee_retenu.end(); for (iqev=element_evoluee_retenu.begin();iqev!=iqevfin;iqev++) {if ((*iqev).EnuTypeQuelconque()== CONTRAINTE_COURANTE) break;}; if (iqev == iqevfin)element_evoluee_retenu.push_back(*iq); }; // b) et les déformations for (iq=element_evoluee.begin();iq!=iqfin;iq++) {if ((*iq).EnuTypeQuelconque()== DEFORMATION_COURANTE) break;}; if (iq != iqfin) { // on enregistre s'il n'existe pas déjà iqevfin=element_evoluee_retenu.end(); for (iqev=element_evoluee_retenu.begin();iqev!=iqevfin;iqev++) {if ((*iqev).EnuTypeQuelconque()== DEFORMATION_COURANTE) break;}; if (iqev == iqevfin) element_evoluee_retenu.push_back(*iq); }; // puis choix en fonction de l'évolution temporelle switch (Evolution_temporelle_du_calcul(ParaGlob::param->TypeCalcul_maitre())) { case DYNAMIQUE: { // on sort les vitesses de déformation for (iq=element_evoluee.begin();iq!=iqfin;iq++) {if ((*iq).EnuTypeQuelconque()== VITESSE_DEFORMATION_COURANTE) break;}; if (iq != iqfin) { // on enregistre s'il n'existe pas déjà iqevfin=element_evoluee_retenu.end(); for (iqev=element_evoluee_retenu.begin();iqev!=iqevfin;iqev++) {if ((*iqev).EnuTypeQuelconque()== VITESSE_DEFORMATION_COURANTE) break;}; if (iqev == iqevfin) element_evoluee_retenu.push_back(*iq); }; break; } default: break; // sinon pour l'instant on ne fait rien }; break; } //-- fin du cas MECA_SOLIDE_DEFORMABLE default: cout << "\n pour l'instant pas de parametre par defaut pour les pt integ !! " << "\n pour le type de problem : " << NomElemTypeProblem(signa.id_problem) << "\n on continue sur le cas general "; }; }; //-- fin de la boucle sur les maillages return; }; // maintenant on traite le cas interactif string rep; bool choix_valide = false; cout << "\n choix d'isovaleur (grandeurs evoluees) venant des pts d'integ a visualiser "; int nbmail = tabelement_evoluee.Taille(); // update du tableau evolues à visualiser si nécessaire if (tabelement_evoluee_retenu.Taille() != nbmail) tabelement_evoluee_retenu.Change_taille(nbmail); for (int imail = 1;imail<=nbmail;imail++) {// on ne traite que s'il y a des grandeurs disponibles if (tabelement_evoluee(imail).size() != 0 ) {choix_valide=false; while (!choix_valide) // premier while {try { cout << "\n (0 ou f ou fin) fin choix grandeurs tensorielles "; cout << "\n listes de type de grandeur tensorielles a visualiser "; // affichage des grandeurs retenues si la liste n'est pas vide if ((tabelement_evoluee_retenu(imail)).size()) { cout << "\n Maillage nb: " << imail << "\n liste des types de grandeurs enregistres: "; List_io < TypeQuelconque >::iterator iet,ietfin = (tabelement_evoluee_retenu(imail)).end(); for (iet=(tabelement_evoluee_retenu(imail)).begin();iet!=ietfin;iet++) cout << ((*iet).EnuTypeQuelconque().NomPlein()) << " " ; cout << endl; }; cout << "\n Maillage nb: " << imail << " liste des types de grandeurs tensorielles disponibles "; List_io < TypeQuelconque >::iterator iet,ietfin = (tabelement_evoluee(imail)).end(); for (iet=(tabelement_evoluee(imail)).begin();iet!=ietfin;iet++) cout << "\n " << ((*iet).EnuTypeQuelconque().NomPlein()) ; // le menu cout << "\n donner la grandeur a visulaliser " << "\n (to) toutes les grandeurs " << "\n (de) les grandeurs par defaut" << "\n (une liste de grandeurs tensorielles) " << "\n (ef) pour effacer la liste " << "\n (0 ou f ou fin) fin choix grandeur tensorielle " << "\n reponse ? "; rep = lect_return_defaut(false,"f"); if (rep == "fin_prog") Sortie(1); if (rep == "to") {// cas de toutes les grandeurs tabelement_evoluee_retenu(imail) = tabelement_evoluee(imail); choix_valide=false; }; // sinon if ((rep == "0") || (rep == "f") || (rep == "fin")) {choix_valide=true;} else if (rep=="ef") { tabelement_evoluee_retenu(imail).erase(tabelement_evoluee_retenu(imail).begin(), tabelement_evoluee_retenu(imail).end()); } else if (rep=="de") {List_io < TypeQuelconque >& element_evoluee = tabelement_evoluee(imail); // pour simplifier List_io < TypeQuelconque >& element_evoluee_retenu = tabelement_evoluee_retenu(imail); // pour simplifier List_io < TypeQuelconque >::iterator iq,iqfin=element_evoluee.end(); List_io < TypeQuelconque >::iterator iqev,iqevfin; Element& ele = lesMail->Element_LesMaille(imail,1); Element::Signature signa = ele.Signature_element(); switch (signa.id_problem) {case MECA_SOLIDE_DEFORMABLE: {// c'est avec les types évoluées que l'on travaille, on sort la contrainte et la déformation courante // tout d'abord les grandeurs communes: // a) on sort les contraintes for (iq=element_evoluee.begin();iq!=iqfin;iq++) {if ((*iq).EnuTypeQuelconque()== CONTRAINTE_COURANTE) break;}; if (iq != iqfin) { // on enregistre s'il n'existe pas déjà iqevfin=element_evoluee_retenu.end(); for (iqev=element_evoluee_retenu.begin();iqev!=iqevfin;iqev++) {if ((*iqev).EnuTypeQuelconque()== CONTRAINTE_COURANTE) break;}; if (iqev == iqevfin)element_evoluee_retenu.push_back(*iq); }; // b) et les déformations for (iq=element_evoluee.begin();iq!=iqfin;iq++) {if ((*iq).EnuTypeQuelconque()== DEFORMATION_COURANTE) break;}; if (iq != iqfin) { // on enregistre s'il n'existe pas déjà iqevfin=element_evoluee_retenu.end(); for (iqev=element_evoluee_retenu.begin();iqev!=iqevfin;iqev++) {if ((*iqev).EnuTypeQuelconque()== DEFORMATION_COURANTE) break;}; if (iqev == iqevfin) element_evoluee_retenu.push_back(*iq); }; // puis choix en fonction de l'évolution temporelle switch (Evolution_temporelle_du_calcul(ParaGlob::param->TypeCalcul_maitre())) { case DYNAMIQUE: { // on sort les vitesses de déformation for (iq=element_evoluee.begin();iq!=iqfin;iq++) {if ((*iq).EnuTypeQuelconque()== VITESSE_DEFORMATION_COURANTE) break;}; if (iq != iqfin) { // on enregistre s'il n'existe pas déjà iqevfin=element_evoluee_retenu.end(); for (iqev=element_evoluee_retenu.begin();iqev!=iqevfin;iqev++) {if ((*iqev).EnuTypeQuelconque()== VITESSE_DEFORMATION_COURANTE) break;}; if (iqev == iqevfin) element_evoluee_retenu.push_back(*iq); }; break; } default: break; // sinon pour l'instant on ne fait rien }; break; } //-- fin du cas MECA_SOLIDE_DEFORMABLE default: cout << "\n pour l'instant pas de parametre par defaut pour les pt integ !! " << "\n pour le type de problem : " << NomElemTypeProblem(signa.id_problem) << "\n on continue sur le cas general "; }; } else if (TypeQuelconque_enum_etendu::VerifExistence(rep) ) // vérif que c'est une grandeur possible { // maintenant on vérifie qu'elle appartient à la liste des grandeurs disponibles TypeQuelconque a(TypeQuelconque_enum_etendu::RecupTypeQuelconque_enum_etendu(rep)); // création d'un type quelconque sans grandeur List_io& tpg_ret = (tabelement_evoluee_retenu(imail)); // pour simplifier List_io& tpg = (tabelement_evoluee(imail)); // pour simplifier if (find(tpg.begin(),tpg.end(),a) != tpg.end()) { // il existe -> enregistrement List_io::iterator il = find(tpg.begin(),tpg.end(),a); // récup du réel type // s'il n'existe pas déjà on l'enregistre vraiment if (find(tpg_ret.begin(),tpg_ret.end(),a) == tpg_ret.end()) tpg_ret.push_back(*il); } else { cout << "\n erreur, grandeur non disponible !, recommencez ";}; }; } catch (ErrSortieFinale) // cas d'une direction voulue vers la sortie // on relance l'interuption pour le niveau supérieur { ErrSortieFinale toto; throw (toto); } catch (...)// erreur en lecture { cout << "\n Erreur dans la lecture evolues !!, " << "\n redonnez une bonne valeur" << "\n ou taper fin_prog pour arreter le programme"; choix_valide=false; }; }; //-- fin du premier while tabelement_evoluee_retenu(imail).sort(); // on ordonne tabelement_evoluee_retenu(imail).unique();// on supprime les doublons }; //-- fin de if (tabelement_typeParti(imail).size() != 0 ) };//-- fin de la boucle sur les maillages }; // choix de l'isovaleur à visualiser calculée à partir des grandeurs quelconques aux points d'intégrations void Isovaleurs_Gmsh::ChoixIsovaleur_quelc_ptinteg(const string& choix) { // tout d'abord on traite le cas de tous les isovaleurs if (choix=="to") { tabelement_typeParti_retenu = tabelement_typeParti; return; } else if (choix=="de") { // pour l'instant aucun éléments par défaut return; }; // maintenant on traite le cas interactif bool choix_valide = false; string rep; cout << "\n choix d'isovaleur venant des pts d'integ a visualiser (de type grandeurs particulieres) "; int nbmail = tabelement_typeParti.Taille(); // update du tableau de ddl à visualiser si nécessaire if (tabelement_typeParti_retenu.Taille() != nbmail) tabelement_typeParti_retenu.Change_taille(nbmail); for (int imail = 1;imail<=nbmail;imail++) {// on ne traite que s'il y a des grandeurs disponibles if (tabelement_typeParti(imail).size() != 0 ) {choix_valide=false; while (!choix_valide) // premier while {try { cout << "\n (0 ou f ou fin) fin choix grandeurs particulieres "; cout << "\n listes de type de grandeur particuliere a visualiser "; // affichage des ddl retenues si la liste n'est pas vide if ((tabelement_typeParti_retenu(imail)).size()) { cout << "\n Maillage nb: " << imail << "\n liste des types de grandeurs enregistres: "; List_io < TypeQuelconque >::iterator iet,ietfin = (tabelement_typeParti_retenu(imail)).end(); for (iet=(tabelement_typeParti_retenu(imail)).begin();iet!=ietfin;iet++) {cout << ((*iet).EnuTypeQuelconque().NomPlein()) << " " ; }; cout << endl; }; cout << "\n Maillage nb: " << imail << " liste des types de grandeur particuliere disponibles "; List_io < TypeQuelconque >::iterator iet,ietfin = (tabelement_typeParti(imail)).end(); for (iet=(tabelement_typeParti(imail)).begin();iet!=ietfin;iet++) cout << "\n " << ((*iet).EnuTypeQuelconque().NomPlein()) ; cout << "\n donner la grandeur particuliere a visualiser " << "\n (to) tous les grandeurs particulieres " << "\n ou une liste de grandeurs particulieres " << "\n (0 ou f ou fin) fin choix de grandeurs particulieres " << "\n reponse ? "; rep = lect_return_defaut(false,"f"); if (rep == "fin_prog") Sortie(1); if (rep == "to") {// cas de tous les ddl tabelement_typeParti_retenu(imail) = tabelement_typeParti(imail); choix_valide=false; }; // sinon if ((rep == "0") || (rep == "f") || (rep == "fin")) {choix_valide=true;} else if (TypeQuelconque_enum_etendu::VerifExistence(rep) ) // vérif que c'est une grandeur possible { // maintenant on vérifie qu'elle appartient à la liste des grandeurs disponibles TypeQuelconque a(TypeQuelconque_enum_etendu::RecupTypeQuelconque_enum_etendu(rep)); // création d'un type quelconque sans grandeur List_io& tpg_ret = (tabelement_typeParti_retenu(imail)); // pour simplifier List_io& tpg = (tabelement_typeParti(imail)); // pour simplifier if (find(tpg.begin(),tpg.end(),a) != tpg.end()) { // il existe -> enregistrement List_io::iterator il = find(tpg.begin(),tpg.end(),a); // récup du réel type // s'il n'existe pas déjà on l'enregistre vraiment if (find(tpg_ret.begin(),tpg_ret.end(),a) == tpg_ret.end()) tpg_ret.push_back(*il); } else { cout << "\n erreur, grandeur non disponible !, recommencez ";}; } } catch (ErrSortieFinale) // cas d'une direction voulue vers la sortie // on relance l'interuption pour le niveau supérieur { ErrSortieFinale toto; throw (toto); } catch (...)// erreur en lecture { cout << "\n Erreur dans la lecture de grandeur particuliere !!, " << "\n redonnez une bonne valeur" << "\n ou taper fin_prog pour arreter le programme"; choix_valide=false; } } //-- fin du premier while tabelement_typeParti_retenu(imail).sort(); // on ordonne tabelement_typeParti_retenu(imail).unique();// on supprime les doublons }; //-- fin de if (tabelement_typeParti(imail).size() != 0 ) }//-- fin de la boucle sur les maillages }; // initialisation de l'exécution du transferts void Isovaleurs_Gmsh::InitPremierIncrExecutionTransfertAuxNoeuds() { // cas du premier incrément et que l'on veut un transfert // l'objectif est d'initialiser de manière a doc les noeuds (introduire les grandeurs) // on boucle sur les maillages int nb_mail=lesMail->NbMaillage(); for (int imail=1;imail<=nb_mail;imail++) { lesMail->AjoutConteneurAuNoeud(imail,glob_elem_ddl_retenu,tab_quelconque); }; }; // définition interactives des paramètres généraux des isovaleurs void Isovaleurs_Gmsh::ParametresGeneraux(const string& ) { bool choix_val = false; bool fr = ParaGlob::Francais(); if (fr) {cout << "\n -- parametres generaux pour la sortie des isovaleurs ";} else {cout << "\n -- definition of the main parameters for the isovalues ";} string rep; while (!choix_val) {try {if (fr) {cout << "\n (0 ou f ou fin) fin modif" << "\n (1) sortie des tenseurs dans le repere absolu (par defaut) " << "\n (2) sortie des tenseurs dans un repere ad hoc, qui depend du type d'element "; cout << "\n \n reponse ? "; } else {cout << "\n (0 or f or end) end of modif" << "\n (1) output of the tensor componants in the global frame (default) " << "\n (2) output of the tensor componants in a specific local frame, depending of the element "; cout << "\n \n answers ? "; }; rep = lect_return_defaut(false,"f"); // sinon int num = ChangeEntier(rep); if ((rep == "0")||(rep == "f")||(rep == "end")) { choix_val=true; } else { // def du type de sortie if (num == 1) { absolue = true;} else if (num == 2) { absolue = false;} else { if (fr) {cout << "\n Erreur on attendait un entier entre 0 et 1 ou 2!!, " << "\n redonnez une bonne valeur"; } else {cout << "\n Error the answers is an int in the range of 0..2 !!, " << "\n try again "; }; choix_val=false; }; }; } catch (ErrSortieFinale) // cas d'une direction voulue vers la sortie // on relance l'interuption pour le niveau supérieur { ErrSortieFinale toto; throw (toto); } catch (...)// erreur de lecture {if (fr) {cout << "\n Erreur on attendait un des mots cles proposés !!, " << "\n redonnez une bonne valeur" << "\n ou taper fin_prog pour arreter le programme"; } else {cout << "\n error, we expect one of the proposed keywords !!, " << "\n try again to give a right answer " << "\n or write 'f' in order to stop this menu "; }; choix_val=false; }; }; //-- fin du while return; }; // ---- cas de l'ancien format --------- // sortie d'une view pour un type quelconque simple !!, c'est-à-dire pas un tableau par exemple // en fait ne concerne que les types scalaires, vectoriels, ou tensoriels // dans le cas où le type simple provient d'un tableau // numero donne un numéro de l'élément à sortir dans l'entête de la view si diff de 0 void Isovaleurs_Gmsh::SortirUneViewTypeQuelconque_old_format(ostream & sort,TypeQuelconque_enum_etendu enu ,EnumType2Niveau enuStructure, int numero ,Tableau ::iterator >& t_indic_sortie,int nbmail ,const Tableau & tab_mail,EnumTypeGrandeur enugrandeur,LesMaillages * lesMail,const int& incre) { // def de l'entete string nom((enu.NomPlein())); EnteteView(sort,incre,nom,numero); // ramène le tableau t_Egmsh // t_Egmsh(im)(ie): donne pour le maillage im, et pour l'élément ie, le numéro gmsh de l'élément const Tableau < Tableau < int > >& t_Egmsh = mailInitial->TabEgmsh(); // récup de la connection herezh->gmsh // t_GmshHer(i)(j) : donne pour le noeud j de l'élément i de gmsh, le numéro d'herezh const Tableau < Tableau < int > >& tGmshHer = Visualisation_Gmsh::Tab_GmshHer(); // on définit un cas du type de celui géré par gmsh int castype = 0; switch (enugrandeur) { case SCALAIRE: case SCALAIRE_ENTIER: case SCALAIRE_DOUBLE: {castype=1;break;} case COORDONNEE: case COORDONNEEB: case COORDONNEEH: {castype=2;break;} case TENSEURBB: case TENSEURHH: {castype=3;break;} // case CHAINE_CAR: // pour l'instant on n'a pas de type quelconque pour le type caractère donc on ne met rien // {castype=4;break;} default: cout << "\n ***** erreur en sortie de la grandeur quelconque " << (enu.NomPlein()) << " le type " << NomType2Niveau(enuStructure) << "n'est pas gere par gmsh, le fichier resultat " << " ne sera donc pas exploitable !! on continue quand meme !!"; return; }; for (int im =1; im <= nbmail; im++) {// on ne continue que si la grandeur quelconque est à sortir if (*(t_indic_sortie(im))) {int numMail = tab_mail(im); int nbmaxelem = lesMail->Nombre_element(numMail); int dcaN = mailInitial->DecalNumNoeud(numMail); for (int numElem = 1; numElem <= nbmaxelem; numElem++) {Element& elem = lesMail->Element_LesMaille(numMail,numElem); // récup de l'élément Tableau& t_n = elem.Tab_noeud(); int num_elem_gmsh = t_Egmsh(im)(numElem); // numéro de classement du type d'élément gmsh // -- sortie du type de valeur: scalaire, vecteur ou tenseur // ***** a complèter pour les éléments quadratiques incomplet et les autres non possibles ***** switch (castype) { case 1: {sort << "\n" << tabScalVecTensGmsh.scalar_pourView(num_elem_gmsh)<< "(";break;} case 2: {sort << "\n" << tabScalVecTensGmsh.vector_pourView(num_elem_gmsh)<< "(";break;} case 3: {sort << "\n" << tabScalVecTensGmsh.tensor_pourView(num_elem_gmsh)<< "(";break;} case 4: {sort << "\n" << tabScalVecTensGmsh.text_pourView(num_elem_gmsh)<< "(";break;} }; // -- sortie des coordonnées // on considère le nombre de noeuds de la sortie gmsh, et non celui de l'élément (qui peut-être // plus grand dans le cas d'un sfe, ou plus petit dans le cas d'un quadratique incomplet !) int nbNmax = tGmshHer(num_elem_gmsh).Taille(); //t_n.Taille(); for (int ino=1;ino<=nbNmax;ino++) // ino = numéro gmsh { int num_her = tGmshHer(num_elem_gmsh)(ino); // --> num HZpp int num_N = t_n(num_her)->Num_noeud()+dcaN; // num global SortieUseUneCoordonnee(incre,sort,(ino == nbNmax),num_N); }; // -- sortie des grandeurs for (int ino=1;ino<=nbNmax;ino++) {int num_her = tGmshHer(num_elem_gmsh)(ino); // --> num HZpp const TypeQuelconque& tyret = t_n(num_her)->Grandeur_quelconque(enu); // récup de la grandeur switch (castype) { case 1: // cas d'une grandeur scalaire (mais qui peut venir d'un tableau) { switch (enuStructure) {case TYPE_SIMPLE:{tyret.Const_Grandeur_pointee()->Grandeur_brut(sort,ParaGlob::NbdigdoGR()); break;}; case TABLEAU_T: {Tab_Grandeur_scalaire_double* t_grandeur = ((Tab_Grandeur_scalaire_double*) tyret.Const_Grandeur_pointee()); Grandeur_scalaire_double& grandeur =t_grandeur->Grandeur_scalaire_associee(numero); grandeur.Grandeur_brut(sort,ParaGlob::NbdigdoGR()); break;}; default: cout << "\n -1- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type " << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour " << " la sortie gmsh le fichier resultat ne sera donc pas exploitable !! on continue quand meme !!" << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque_old_format(..."; }; break; } case 2: // cas d'une grandeur vectorielle à trois coordonnées, si il y en a moins, il y a des 0 à la place { const TypeQuelconque::Grandeur& grandeur=*(tyret.Const_Grandeur_pointee()); // pour simplifier switch (enuStructure) {case TYPE_SIMPLE:{sort << setprecision(ParaGlob::NbdigdoGR()) << grandeur.GrandeurNumOrdre(1) <<", "<Taille(); // on boucle, et on sort chaque coordonnée for (int i=1;i<=taille;i++) { const Grandeur_coordonnee& coor = tab_coor->Grandeur_Coordonnee_associee(i); sort << setprecision(ParaGlob::NbdigdoGR()) << coor.GrandeurNumOrdre(1) <<", "<RefConteneurTenseur(); Isovaleurs_Gmsh::SortieTenseurBB_ancien_format(sort,t_BB); break; } case TENSEURHH: { const TenseurHH& t_HH = ((Grandeur_TenseurHH*) &grandeur)->RefConteneurTenseur(); Isovaleurs_Gmsh::SortieTenseurHH_ancien_format(sort,t_HH); break; } default: cout << "\n -3- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type " << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour " << " la sortie gmsh le fichier resultat ne sera donc pas exploitable !! on continue quand meme !!" << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque_old_format(..."; }; break; } case TABLEAU_T: {switch (grandeur.Type_grandeurAssocie()) {case TENSEURHH: { const Tab_Grandeur_TenseurHH* g_t_t_HH = ((Tab_Grandeur_TenseurHH*) &grandeur); const Grandeur_TenseurHH& g_t_HH = g_t_t_HH->Grandeur_TenseurHH_associee(numero); const TenseurHH& t_HH = g_t_HH.RefConteneurTenseur(); Isovaleurs_Gmsh::SortieTenseurHH_ancien_format(sort,t_HH); break; } // pour l'instant il n'y a que les tableaux de tenseurHH qui existent default: cout << "\n -4- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type " << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour " << " la sortie gmsh le fichier resultat ne sera donc pas exploitable !! on continue quand meme !!" << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque_old_format(..."; }; break; } // pour l'instant il n'y a que les types simples et les tableaux qui sont pris en compte pour les tenseurs default: cout << "\n -5- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type " << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour " << " la sortie gmsh le fichier resultat ne sera donc pas exploitable !! on continue quand meme !!" << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque_old_format(..."; }; // fin du switch (enuStructure) pour les tenseurs break; } //-- fin du cas castype = 3 c-a-d des cas relatifs aux tenseurs }; //-- fin du switch (castype) // gestion des fins de ligne if (ino != nbNmax) {sort <<", ";} else {sort <<"};";}; }; //-- fin de la boucle sur les noeuds de l'éléments }; //-- fin de la boucle sur les éléments }; //-- fin du test if (*(t_indic_sortie(im))) }; //-- fin de la boucle sur les maillage // fin de la view sort << "\n }; "; }; // sortie d'une view pour un type quelconque simple !!, c'est-à-dire pas un tableau par exemple // en fait ne concerne que les types scalaires, vectoriels, ou tensoriels // dans le cas où le type simple provient d'un tableau // numero donne un numéro de l'élément à sortir dans l'entête de la view si diff de 0 void Isovaleurs_Gmsh::SortirUneViewTypeQuelconque(ostream & sort,TypeQuelconque& typ ,EnumType2Niveau enuStructure, int numero ,Tableau ::iterator >& t_indic_sortie,int nbmail ,const Tableau & tab_mail,EnumTypeGrandeur enugrandeur,LesMaillages * lesMail,const int& incre) { // récup du temps actuel double temps_actuel = ParaGlob::Variables_de_temps().TempsCourant(); TypeQuelconque_enum_etendu enu = typ.EnuTypeQuelconque(); EnuTypeQuelParticulier enu_particulier = typ.Const_Grandeur_pointee()->Type_enumGrandeurParticuliere(); // on définit un cas du type de celui géré par gmsh int castype = 0;int NB_val = 0; switch (enugrandeur) {case SCALAIRE: case SCALAIRE_ENTIER: case SCALAIRE_DOUBLE: {castype=1;NB_val=1;break;} case COORDONNEE: case COORDONNEEB: case COORDONNEEH: {castype=2;NB_val=3; break;} case BASE__H: // en fait une base est traite comme un ensemble de une grandeur // COORDONNEE par axe de la base // donc arrivée ici on sort une grandeur COORDONNEE de numéro i {castype=5;NB_val=3; break; } case TENSEURBB: case TENSEURHH: {castype=3;NB_val=9;break;} case VECTEUR: // pas géré par gmsh directement {int nb_double = 0; switch (enuStructure) { case TYPE_SIMPLE: { if (enu_particulier == PARTICULIER_VECTEUR_NOMMER) {Grandeur_Vecteur_Nommer* t_grandeur = ((Grandeur_Vecteur_Nommer*) typ.Const_Grandeur_pointee()); nb_double = t_grandeur->ConteneurVecteur().Taille(); castype=4; } else if (enu_particulier == PARTICULIER_VECTEUR) {Grandeur_Vecteur* t_grandeur = ((Grandeur_Vecteur*) typ.Const_Grandeur_pointee()); nb_double = t_grandeur->ConteneurVecteur()->Taille(); castype=6; } break; }; case TABLEAU_T: { if (enu_particulier == PARTICULIER_TABLEAU_VECTEUR_NOMMER) {Tab_Grandeur_Vecteur_Nommer* t_grandeur = ((Tab_Grandeur_Vecteur_Nommer*) typ.Const_Grandeur_pointee()); Grandeur_Vecteur_Nommer& grn = (*t_grandeur)(numero); nb_double = grn.ConteneurVecteur().Taille(); castype=4; } else if (enu_particulier == PARTICULIER_TABLEAU_VECTEUR) {Tab_Grandeur_Vecteur* t_grandeur = ((Tab_Grandeur_Vecteur*) typ.Const_Grandeur_pointee()); const Grandeur_Vecteur& grn = (*t_grandeur)(numero); nb_double = grn.ConteneurVecteur_const().Taille(); castype=6; } break; } default: cout << "\n ***** erreur en sortie de la grandeur quelconque " << (enu.NomPlein() ) << " le type " << NomType2Niveau(enuStructure) << "n'est pas gere par gmsh, le fichier resultat " << " ne sera donc pas exploitable !! on continue quand meme !!"; return; }; switch (nb_double) { case 1: NB_val=1; break; case 2: case 3: NB_val=3; break; case 4: case 5: case 6: NB_val=6; break; default: // cas non prévu pour l'instant dans gmsh cout << "\n ***** erreur en sortie de la grandeur quelconque " << enu.NomPlein() << " le type " << NomType2Niveau(enuStructure) << "n'est pas gere par gmsh, le fichier resultat " << " ne sera donc pas exploitable !! on continue quand meme !!"; return; }; break; } // case CHAINE_CAR: // pour l'instant on n'a pas de type quelconque pour le type caractère donc on ne met rien // {castype=4;break;} default: cout << "\n ***** erreur en sortie de la grandeur quelconque " << enu.NomPlein() << " le type " << NomType2Niveau(enuStructure) << "n'est pas gere par gmsh, le fichier resultat " << " ne sera donc pas exploitable !! on continue quand meme !!"; return; }; // def de l'entete string nom(enu.NomPlein()); if (numero != 0) nom = nom + "_" + ChangeEntierSTring(numero); EnteteNodeData(sort,incre,temps_actuel,nom,NB_val); // s'il faut sortir une grandeur nulle on la définie: a priori c'est une opération // qui est faite uniquement une fois pour chaque // type donc pas couteuse TypeQuelconque type_null(typ); // on initialise la grandeur par défaut type_null.Grandeur_pointee()->InitParDefaut(); // -- sortie des grandeurs // on balaie les maillages for (int im =1; im <= nbmail; im++) { // on ne continue que si le maillage est à sortir // !!! en fait avec gmsh, et le nouveau format, il faut que l'on sorte toujours quelque chose, car le nombre de noeuds // est celui de l'ensemble des maillages présents, à moins que le maillage ne soit pas actif, là il n'y a pas de pb, mais // dans les autres cas, il faut que le nombre de valeurs = le nombre de noeuds, quelque soit les grandeurs. Donc l'idée // est de sortir une grandeur nulle, lorsque la grandeur n'est pas prévue pour ce maillage bool grandeur_prevu_en_sortie = (*(t_indic_sortie(im))); // drapeau utilisé en sortie // if (*(t_indic_sortie(im))) // première version {int numMail = tab_mail(im); int decal_noe = mailInitial->DecalNumNoeud(numMail); Tableau& t_n = lesMail->Tab_noeud(numMail); int nbmaxinoeud = t_n.Taille(); for (int numNoeud=1; numNoeud<= nbmaxinoeud;numNoeud++) { // recup du noeud Noeud & noe = lesMail->Noeud_LesMaille(numMail,numNoeud); sort << "\n" << noe.Num_noeud()+decal_noe << " " ; //-- les grandeurs // ici on va choisir entre le cas normal et le cas d'une grandeur nulle TypeQuelconque const * typ_en_sortie = &type_null; // init à la valeur par défaut if (grandeur_prevu_en_sortie) typ_en_sortie = &(noe.Grandeur_quelconque(enu)); // puis on sort la grandeur switch (castype) { case 1: // cas d'une grandeur scalaire (mais qui peut venir d'un tableau) { switch (enuStructure) { case TYPE_SIMPLE:{typ_en_sortie->Const_Grandeur_pointee()->Grandeur_brut(sort,ParaGlob::NbdigdoGR()); break;}; case TABLEAU_T: {Tab_Grandeur_scalaire_double* t_grandeur = ((Tab_Grandeur_scalaire_double*) typ_en_sortie->Const_Grandeur_pointee()); Grandeur_scalaire_double& grandeur =t_grandeur->Grandeur_scalaire_associee(numero); grandeur.Grandeur_brut(sort,ParaGlob::NbdigdoGR()); break;}; default: cout << "\n -1- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type " << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour " << " la sortie gmsh le fichier resultat ne sera donc pas exploitable !! on continue quand meme !!" << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque(..."; }; break; } case 2: // cas d'une grandeur vectorielle à trois coordonnées, si il y en a moins, il y a des 0 à la place { const TypeQuelconque::Grandeur& grandeur=*(typ_en_sortie->Const_Grandeur_pointee()); // pour simplifier switch (enuStructure) {case TYPE_SIMPLE:{sort << setprecision(ParaGlob::NbdigdoGR()) << grandeur.GrandeurNumOrdre(1) <<" "<Const_Grandeur_pointee()); // on sort les coordonnées pour numéro const Grandeur_coordonnee& coor = tab_coor->Grandeur_Coordonnee_associee(numero); sort << setprecision(ParaGlob::NbdigdoGR()) << coor.GrandeurNumOrdre(1) <<" "<Const_Grandeur_pointee()); // pour simplifier switch (enuStructure) {case TYPE_SIMPLE: { switch (grandeur.Type_grandeurAssocie()) { case TENSEURBB: { const TenseurBB& t_BB = ((Grandeur_TenseurBB*) &grandeur)->RefConteneurTenseur(); Isovaleurs_Gmsh::SortieTenseurBB(sort,t_BB); break; } case TENSEURHH: { const TenseurHH& t_HH = ((Grandeur_TenseurHH*) &grandeur)->RefConteneurTenseur(); Isovaleurs_Gmsh::SortieTenseurHH(sort,t_HH); break; } default: cout << "\n -3- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type " << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour " << " la sortie gmsh le fichier resultat ne sera donc pas exploitable !! on continue quand meme !!" << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque(..."; }; break; } case TABLEAU_T: {switch (grandeur.Type_grandeurAssocie()) {case TENSEURHH: { const Tab_Grandeur_TenseurHH* g_t_t_HH = ((Tab_Grandeur_TenseurHH*) &grandeur); const Grandeur_TenseurHH& g_t_HH = g_t_t_HH->Grandeur_TenseurHH_associee(numero); const TenseurHH& t_HH = g_t_HH.RefConteneurTenseur(); Isovaleurs_Gmsh::SortieTenseurHH(sort,t_HH); break; } case TENSEURBB: { const Tab_Grandeur_TenseurBB* g_t_t_BB = ((Tab_Grandeur_TenseurBB*) &grandeur); const Grandeur_TenseurBB& g_t_BB = g_t_t_BB->Grandeur_TenseurBB_associee(numero); const TenseurBB& t_BB = g_t_BB.RefConteneurTenseur(); Isovaleurs_Gmsh::SortieTenseurBB(sort,t_BB); break; } // pour l'instant il n'y a que les tableaux de tenseurHH qui existent default: cout << "\n -4- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type " << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour " << " la sortie gmsh le fichier resultat ne sera donc pas exploitable !! on continue quand meme !!" << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque(..."; }; break; } // pour l'instant il n'y a que les types simples et les tableaux qui sont pris en compte pour les tenseurs default: cout << "\n -5- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type " << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour " << " la sortie gmsh le fichier resultat ne sera donc pas exploitable !! on continue quand meme !!" << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque(..."; }; // fin du switch (enuStructure) pour les tenseurs break; } //-- fin du cas castype = 3 c-a-d des cas relatifs aux tenseurs case 4: // cas d'une grandeur VECTEUR nommé que l'on gère comme un tableau de scalaires { switch (enuStructure) { case TYPE_SIMPLE: {Grandeur_Vecteur_Nommer* t_grandeur = ((Grandeur_Vecteur_Nommer*) typ_en_sortie->Const_Grandeur_pointee()); Vecteur& vec = *((Vecteur*) &t_grandeur->ConteneurVecteur()); Isovaleurs_Gmsh::SortieVecteur(sort,vec); break; }; case TABLEAU_T: {Tab_Grandeur_Vecteur_Nommer* t_grandeur = ((Tab_Grandeur_Vecteur_Nommer*) typ_en_sortie->Const_Grandeur_pointee()); Grandeur_Vecteur_Nommer& grn = (*t_grandeur)(numero); const Vecteur& vec = *((const Vecteur*) &(grn.ConteneurVecteur())); Isovaleurs_Gmsh::SortieVecteur(sort,vec); break; } default: cout << "\n -1- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type " << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour " << " la sortie gmsh le fichier resultat ne sera donc pas exploitable !! on continue quand meme !!" << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque(..."; }; break; } case 5: // cas d'une grandeur de type BaseH // c'est géré comme une succession de vecteur à trois coordonnées, si il y en a moins, il y a des 0 à la place { const TypeQuelconque::Grandeur& grandeur=*(typ_en_sortie->Const_Grandeur_pointee()); // pour simplifier switch (enuStructure) {case TYPE_SIMPLE: { Grandeur_BaseH* base = ((Grandeur_BaseH*) typ_en_sortie->Const_Grandeur_pointee()); // le numéro de sortie correspond au numéro de vecteur de base const BaseH& baH1 = base->RefConteneurBaseH(); const Coordonnee& V = baH1.Coordo(numero); V.Affiche(sort,ParaGlob::NbdigdoGR()); // sur gmsh, il faut des vecteurs à 3 composantes switch (3 - V.Dimension()) {case 0: // on ne fait rien break; case 1: // cas où il manque une composante sort << " 0 "; break; case 2: // il manque 2 composantes sort << " 0 0 "; break; case 3: // il manque 3 composantes... un peu étrange !! sort << " 0 0 0 "; break; default: cout << "\n *** erreur en sortie d'une grandeur Grandeur_BaseH " << " la dimension du vecteur de la base = " << V.Dimension() << " le resultat ne sera pas exploitable par gmsh !"; break; }; break; }; case TABLEAU_T: {Tab_Grandeur_BaseH* tab_base = ((Tab_Grandeur_BaseH*) typ_en_sortie->Const_Grandeur_pointee()); // on va considérer que toutes les bases ont le même nombre de vecteur // correspondant à la dimension de l'espace de travail int nb_vect = ParaGlob::Dimension(); // récup du numéro de l'axe int N_a = ((numero-1) % nb_vect) + 1 ; // récup du numéro dans le tableau de la base int n_dans_tab = ((numero-1) / nb_vect) + 1 ; // récup de la base Grandeur_BaseH& gr = (*tab_base)(n_dans_tab); const BaseH& baH1 = gr.RefConteneurBaseH(); // récup des coordonnées du vecteur N_a const Coordonnee& V = baH1.Coordo(N_a); V.Affiche(sort,ParaGlob::NbdigdoGR()); // sur gmsh, il faut des vecteurs à 3 composantes switch (3 - V.Dimension()) {case 0: // on ne fait rien break; case 1: // cas où il manque une composante sort << " 0 "; break; case 2: // il manque 2 composantes sort << " 0 0 "; break; case 3: // il manque 3 composantes... un peu étrange !! sort << " 0 0 0 "; break; default: cout << "\n *** erreur en sortie d'une grandeur Grandeur_BaseH " << " provenant d'un element de tableau: "<Const_Grandeur_pointee()); const Vecteur& vec = *((Vecteur*) t_grandeur->ConteneurVecteur()); Isovaleurs_Gmsh::SortieVecteur(sort,vec); break; }; case TABLEAU_T: {Tab_Grandeur_Vecteur* t_grandeur = ((Tab_Grandeur_Vecteur*) typ_en_sortie->Const_Grandeur_pointee()); Vecteur& vec = *((Vecteur*) &(*t_grandeur)(numero)); Isovaleurs_Gmsh::SortieVecteur(sort,vec); break; } default: cout << "\n -1- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type " << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour " << " la sortie gmsh le fichier resultat ne sera donc pas exploitable !! on continue quand meme !!" << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque(..."; }; break; } }; //-- fin du switch (castype) }; }; }; // fin de la view sort << "\n$EndNodeData \n"; }; //--ancien format --// utilitaire pour la sortie d'un tenseur HH // bool: indique s'il faut une virgule ou non après le dernier enreg void Isovaleurs_Gmsh::SortieTenseurHH_ancien_format(ostream & sort,const TenseurHH& t_HH) { switch (Abs(t_HH.Dimension())) {case 1: { sort << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,1) << ", "; for (int i=2;i<=9;i++) sort << " 0., "; // le reste en 0 break; } case 2: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,1) << ", "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,2) << ", 0., "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,2) << ", " ; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(2,2) << ", "; sort << " 0., 0., 0., 0. "; break; }; case 3: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,1) << ", "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,2) << ", "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,3) << ", "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(2,1) << ", "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(2,2) << ", "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(2,3) << ", "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(3,1) << ", "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(3,2) << ", "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(3,3) ; break; }; default: cout << "\n erreur !! Isovaleurs_Gmsh::SortieTenseurHH(.."; Sortie(1); }; }; //-- ancien format // utilitaire pour la sortie d'un tenseur BB // bool: indique s'il faut une virgule ou non après le dernier enreg void Isovaleurs_Gmsh::SortieTenseurBB_ancien_format(ostream & sort,const TenseurBB& t_BB) { switch (Abs(t_BB.Dimension())) {case 1: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,1) << ", "; for (int i=2;i<=9;i++) sort << " 0., "; // le reste en 0 break; } case 2: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,1) << ", "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,2) << ", 0., "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,2) << ", " ; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,2) << ", "; sort << " 0., 0., 0., 0. "; break; }; case 3: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,1) << ", "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,2) << ", "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,3) << ", "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,1) << ", "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,2) << ", "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,3) << ", "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(3,1) << ", "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(3,2) << ", "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(3,3) ; break; }; default: cout << "\n erreur !! Isovaleurs_Gmsh::SortieTenseurBB(.."; Sortie(1); }; }; // utilitaire pour la sortie d'un tenseur HH // bool: indique s'il faut une virgule ou non après le dernier enreg void Isovaleurs_Gmsh::SortieTenseurHH(ostream & sort,const TenseurHH& t_HH) { switch (Abs(t_HH.Dimension())) {case 1: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,1) << " "; for (int i=2;i<=9;i++) sort << " 0. "; // le reste en 0 break; } case 2: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,1) << " "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,2) << " 0. "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,2) << " " ; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(2,2) << " "; sort << " 0. 0. 0. 0. "; break; }; case 3: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,1) << " "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,2) << " "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,3) << " "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(2,1) << " "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(2,2) << " "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(2,3) << " "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(3,1) << " "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(3,2) << " "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(3,3) ; break; }; default: cout << "\n erreur !! Isovaleurs_Gmsh::SortieTenseurHH(.."; Sortie(1); }; }; // utilitaire pour la sortie d'un tenseur BB // bool: indique s'il faut une virgule ou non après le dernier enreg void Isovaleurs_Gmsh::SortieTenseurBB(ostream & sort,const TenseurBB& t_BB) { switch (Abs(t_BB.Dimension())) {case 1: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,1) << " "; for (int i=2;i<=9;i++) sort << " 0. "; // le reste en 0 break; } case 2: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,1) << " "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,2) << " 0. "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,2) << " " ; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,2) << " "; sort << " 0. 0. 0. 0. "; break; }; case 3: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,1) << " "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,2) << " "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,3) << " "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,1) << " "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,2) << " "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,3) << " "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(3,1) << " "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(3,2) << " "; sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(3,3) ; break; }; default: cout << "\n erreur !! Isovaleurs_Gmsh::SortieTenseurBB(.."; Sortie(1); }; }; // utilitaire pour une sortie de type Vecteur void Isovaleurs_Gmsh::SortieVecteur(ostream & sort,const Vecteur& vec) { switch (vec.Taille()) {case 1: // cas d'un équivalent scalaire sort << setprecision(ParaGlob::NbdigdoGR()) << vec(1) << " ";break; case 2: // là on fait un équivalent Coordonnees sort << setprecision(ParaGlob::NbdigdoGR()) << vec(1) << " "<< vec(2) << " 0. ";break; case 3: // là on fait un équivalent Coordonnees sort << setprecision(ParaGlob::NbdigdoGR()) << vec(1) << " "<< vec(2) << " "<< vec(3)<< " ";break; case 4: // là on fait un équivalent tenseur sort << setprecision(ParaGlob::NbdigdoGR()) << vec(1) << " "<< vec(2) << " "<< vec(3)<< " "<< vec(4) << " 0 0 ";break; case 5: // là on fait un équivalent tenseur sort << setprecision(ParaGlob::NbdigdoGR()) << vec(1) << " "<< vec(2) << " "<< vec(3)<< " "<< vec(4) << vec(5) << " 0 ";break; case 6: // là on fait un équivalent tenseur sort << setprecision(ParaGlob::NbdigdoGR()) << vec(1) << " "<< vec(2) << " "<< vec(3)<< " "<< vec(4) << vec(5) << " "<< vec(6) << " ";break; default: cout << "\n nombre de composante du vecteur superieur a 6 " << " aucune sortie possible avec gmsh " ; }; }; // initialisation les différentes listes internes qui globalisent tous les maillages void Isovaleurs_Gmsh::GlobalisationListSurTousLesMaillagesPourLesNoeuds() { // on initialise toutes les listes globales glob_noe_ddl_retenu.clear(); glob_noeud_ddl_etendu_retenu.clear(); glob_noeud_evol_retenu.clear(); glob_elem_ddl_retenu.clear(); glob_elem_evol_retenu.clear(); glob_elem_Parti_retenu.clear(); // on passe en revue tous les maillages pour crées les listes globales des grandeurs int nb_mail = tabnoeud_type_ddl_retenu.Taille(); // dim des maillages, via un tableau arbitraire for (int imail=1;imail<= nb_mail;imail++) { // on merge les listes (il faut qu'avant chaque merge, les listes soient ordonnées) // comme l'ordre merge ajoute les listes mais en détruisant la liste initiale, on crée une liste intermédiaire tabnoeud_type_ddl_retenu(imail).sort(); List_io < Ddl_enum_etendu > interDddlenumetendu(tabnoeud_type_ddl_retenu(imail)); glob_noe_ddl_retenu.merge(interDddlenumetendu); tabnoeud_type_ddlEtendu_retenu(imail).sort(); List_io < Ddl_enum_etendu > inter2Dddlenumetendu(tabnoeud_type_ddlEtendu_retenu(imail)); glob_noeud_ddl_etendu_retenu.merge(inter2Dddlenumetendu); tabnoeud_evoluee_retenu(imail).sort(); List_io < TypeQuelconque > internoeudevolretenu(tabnoeud_evoluee_retenu(imail)); //debug //cout << "\n debug: Isovaleurs_Gmsh::GlobalisationListSurTousLesMaillagesPourLesNoeuds() "; //cout << "\n list tabnoeud_evoluee_retenu("< interelemDddlenumetendu(tabelement_type_ddl_retenu(imail)); glob_elem_ddl_retenu.merge(interelemDddlenumetendu); tabelement_evoluee_retenu(imail).sort(); List_io < TypeQuelconque > interelemevolretenu(tabelement_evoluee_retenu(imail)); glob_elem_evol_retenu.merge(interelemevolretenu); tabelement_typeParti_retenu(imail).sort(); List_io < TypeQuelconque > interelempartiretenu(tabelement_typeParti_retenu(imail)); glob_elem_Parti_retenu.merge(interelempartiretenu); // on ordonne glob_noe_ddl_retenu.sort(); glob_noeud_ddl_etendu_retenu.sort(); glob_noeud_evol_retenu.sort(); glob_elem_ddl_retenu.sort(); glob_elem_evol_retenu.sort(); glob_elem_Parti_retenu.sort(); // on supprime les doublons glob_noe_ddl_retenu.unique(); glob_noeud_ddl_etendu_retenu.unique(); glob_noeud_evol_retenu.unique(); glob_elem_ddl_retenu.unique(); glob_elem_evol_retenu.unique(); glob_elem_Parti_retenu.unique(); }; // pour le transfert des points d'intégration aux noeuds, on met à jour le tableau de pointeur global // ne concerne donc que les grandeurs quelconques définis aux noeuds if (glob_elem_evol_retenu.size()!=0) {tab_quelconque(1)= &glob_elem_evol_retenu;} else {tab_quelconque(1)= NULL;}; if (glob_elem_Parti_retenu.size()!=0){tab_quelconque(2)= &glob_elem_Parti_retenu;} else {tab_quelconque(2)= NULL;}; // on définit les tableaux d'indicateurs de sortie de grandeurs for (int imai=1;imai<= nb_mail;imai++) { // initialisation des tableaux d'indicateurs List_io < bool >& g_noeud_type_ddl_asortir = t_g_noeud_ddl_asortir(imai); // pour simplifier g_noeud_type_ddl_asortir.clear(); List_io < bool >& g_noeud_ddl_etendu_asortir = t_g_noeud_ddl_etendu_asortir(imai); // pour simplifier g_noeud_ddl_etendu_asortir.clear(); List_io < bool >& g_noeud_evoluee_asortir = t_g_noeud_evoluee_asortir(imai); // pour simplifier g_noeud_evoluee_asortir.clear(); List_io < bool >& g_element_ddl_asortir = t_g_elem_ddl_asortir(imai); // pour simplifier g_element_ddl_asortir.clear(); List_io < bool >& g_element_evoluee_asortir = t_g_elem_evoluee_asortir(imai); // pour simplifier g_element_evoluee_asortir.clear(); List_io < bool >& g_element_typeParti_asortir = t_g_elem_typeParti_asortir(imai); // pour simplifier g_element_typeParti_asortir.clear(); // on passe en revue les grandeurs à sortir et on met à jour les indicateurs en conséquence // .. pour les ddl aux noeuds {List_io < Ddl_enum_etendu >& noeud_type_ddl_retenu = tabnoeud_type_ddl_retenu(imai); // pour simplifier List_io < Ddl_enum_etendu >::iterator i1,i1fin=glob_noe_ddl_retenu.end(); for (i1=glob_noe_ddl_retenu.begin();i1!=i1fin;i1++) if (find(noeud_type_ddl_retenu.begin(),noeud_type_ddl_retenu.end(),(*i1)) == noeud_type_ddl_retenu.end()) {g_noeud_type_ddl_asortir.push_back(false);} // cas où le ddl initial n'existe pas pour le maillage considéré else {g_noeud_type_ddl_asortir.push_back(true);}; // cas où le ddl initial existe également pour le maillage considéré }; {// .. pour les ddl étendues définis aux noeuds List_io < Ddl_enum_etendu >& noeud_type_ddlEtendu_retenu = tabnoeud_type_ddlEtendu_retenu(imai); // pour simplifier List_io < Ddl_enum_etendu >::iterator i1,i1fin=glob_noeud_ddl_etendu_retenu.end(); for (i1=glob_noeud_ddl_etendu_retenu.begin();i1!=i1fin;i1++) if (find(noeud_type_ddlEtendu_retenu.begin(),noeud_type_ddlEtendu_retenu.end(),(*i1)) == noeud_type_ddlEtendu_retenu.end()) {g_noeud_ddl_etendu_asortir.push_back(false);} // cas où le ddl étendu n'existe pas pour le maillage considéré else {g_noeud_ddl_etendu_asortir.push_back(true);}; // cas où le ddl étendu existe également pour le maillage considéré }; {// .. pour les types évoluées définis aux noeuds List_io < TypeQuelconque >& noeud_evoluee_retenu = tabnoeud_evoluee_retenu(imai); // pour simplifier List_io < TypeQuelconque >::iterator i1,i1fin=glob_noeud_evol_retenu.end(); for (i1=glob_noeud_evol_retenu.begin();i1!=i1fin;i1++) if (find(noeud_evoluee_retenu.begin(),noeud_evoluee_retenu.end(),(*i1)) == noeud_evoluee_retenu.end()) {g_noeud_evoluee_asortir.push_back(false);} // cas où le type évolué n'existe pas pour le maillage considéré else {g_noeud_evoluee_asortir.push_back(true);}; // cas où le type évolué existe également pour le maillage considéré }; // .. pour les ddl venant d'un transfert aux noeuds des grandeurs aux pt d'integ List_io < Ddl_enum_etendu >& element_type_ddl_retenu = tabelement_type_ddl_retenu(imai); // pour simplifier List_io < Ddl_enum_etendu >::iterator j1,j1fin=glob_elem_ddl_retenu.end(); for (j1=glob_elem_ddl_retenu.begin();j1!=j1fin;j1++) if (find(element_type_ddl_retenu.begin(),element_type_ddl_retenu.end(),(*j1))== element_type_ddl_retenu.end()) {g_element_ddl_asortir.push_back(false);} // cas où le ddl global n'existe pas pour le maillage considéré else {g_element_ddl_asortir.push_back(true);}; // cas où le ddl global existe également pour le maillage considéré // .. pour les types évolulées venant d'un transfert aux noeuds des grandeurs aux pt d'integ List_io < TypeQuelconque >& element_evoluee_retenu = tabelement_evoluee_retenu(imai); // pour simplifier List_io < TypeQuelconque >::iterator k1,k1fin=glob_elem_evol_retenu.end(); for (k1=glob_elem_evol_retenu.begin();k1!=k1fin;k1++) if (find(element_evoluee_retenu.begin(),element_evoluee_retenu.end(),(*k1))== element_evoluee_retenu.end()) {g_element_evoluee_asortir.push_back(false);} // cas où le ddl évolué global n'existe pas pour le maillage considéré else {g_element_evoluee_asortir.push_back(true);}; // cas où le ddl évolué global existe également pour le maillage considéré // .. pour les types particuliers aux elements venant d'un transfert aux noeuds List_io < TypeQuelconque >& element_typeParti_retenu = tabelement_typeParti_retenu(imai); // pour simplifier List_io < TypeQuelconque >::iterator m1,m1fin=glob_elem_Parti_retenu.end(); for (m1=glob_elem_Parti_retenu.begin();m1!=m1fin;m1++) if (find(element_typeParti_retenu.begin(),element_typeParti_retenu.end(),(*m1))== element_typeParti_retenu.end()) {g_element_typeParti_asortir.push_back(false);} // cas où le ddl évolué global n'existe pas pour le maillage considéré else {g_element_typeParti_asortir.push_back(true);}; // cas où le ddl évolué global existe également pour le maillage considéré }; }; // vérification que le transfert peut se faire (pas de doublon de grandeurs) void Isovaleurs_Gmsh::VerificationTransfertPossible_et_doublon() { // l'objectif est de vérifier qu'il n'y a pas deux grandeurs identiques au niveau des types quelconques et évoluées // (ce qui posera des pb au niveau des moyennes aux noeuds) int nb_mail = tabnoeud_type_ddl_retenu.Taille(); // dim des maillages, via un tableau arbitraire for (int imail=1;imail<= nb_mail;imail++) { List_io < TypeQuelconque >& element_evoluee_retenu = tabelement_evoluee_retenu(imail); List_io < TypeQuelconque >& element_typeParti_retenu = tabelement_typeParti_retenu(imail); List_io < TypeQuelconque >& noe_typeParti_retenu = tabnoeud_evoluee_retenu(imail); // on ordonne element_evoluee_retenu.sort(); element_typeParti_retenu.sort(); noe_typeParti_retenu.sort(); // a priori il y a peut d'éléments donc on compare List_io < TypeQuelconque >::iterator i1,i1end = element_evoluee_retenu.end(); i1=element_evoluee_retenu.begin(); List_io < TypeQuelconque >::iterator j1,j1end = element_typeParti_retenu.end(); j1=element_typeParti_retenu.begin(); List_io < TypeQuelconque >::iterator k1,k1end = noe_typeParti_retenu.end(); k1=noe_typeParti_retenu.begin(); for (i1=element_evoluee_retenu.begin(); i1 != i1end; i1++) for (j1=element_typeParti_retenu.begin();j1 != j1end; j1++) for (k1=noe_typeParti_retenu.begin();k1 != k1end; k1++) { if ((*i1)==(*j1)) {cout << "\n attention *** probleme concernant le transfert aux noeuds il ne faut pas avoir deux grandeurs identiques, or ici " << "\n on a la grandeurs : " << ((*i1).EnuTypeQuelconque().NomPlein()) << " en double !! " << "\n on supprime l'un d'eux "; element_typeParti_retenu.erase(j1); }; if ((*i1)==(*k1)) {cout << "\n attention *** probleme concernant le transfert aux noeuds il ne faut pas avoir deux grandeurs identiques, or ici " << "\n on a la grandeurs : " << ((*i1).EnuTypeQuelconque().NomPlein()) << " en double !! " << "\n on supprime l'un d'eux "; noe_typeParti_retenu.erase(k1); }; if ((*j1)==(*k1)) {cout << "\n attention *** probleme concernant le transfert aux noeuds il ne faut pas avoir deux grandeurs identiques, or ici " << "\n on a la grandeurs : " << ((*j1).EnuTypeQuelconque().NomPlein()) << " en double !! " << "\n on supprime l'un d'eux "; noe_typeParti_retenu.erase(k1); }; }; }; // de plus, il ne faut pas qu'il y ait la même grandeur de type évoluées définis aux noeuds, qui soit également définit pour le transfert // des pti aux noeud, ou en ddl pur // (cela posera des pb au niveau des moyennes aux noeuds, et de nom de fichier de sortie) for (int imail=1;imail<= nb_mail;imail++) { List_io < Ddl_enum_etendu >& noe_ddl_retenu = tabnoeud_type_ddl_retenu(imail); List_io < Ddl_enum_etendu >& noe_ddlEtendu_retenu = tabnoeud_type_ddlEtendu_retenu(imail); List_io < Ddl_enum_etendu >& element_type_ddl_retenu = tabelement_type_ddl_retenu(imail); // on ordonne noe_ddl_retenu.sort(); noe_ddlEtendu_retenu.sort(); element_type_ddl_retenu.sort(); // a priori il y a peu d'éléments donc on compare List_io < Ddl_enum_etendu >::iterator i1,i1end = noe_ddl_retenu.end(); i1=noe_ddl_retenu.begin(); List_io < Ddl_enum_etendu >::iterator j1,j1end = noe_ddlEtendu_retenu.end(); j1=noe_ddlEtendu_retenu.begin(); List_io < Ddl_enum_etendu >::iterator k1,k1end = element_type_ddl_retenu.end(); k1=element_type_ddl_retenu.begin(); for (i1=noe_ddl_retenu.begin(); i1 != i1end; i1++) for (j1=noe_ddlEtendu_retenu.begin();j1 != j1end; j1++) for (k1=element_type_ddl_retenu.begin();k1 != k1end; k1++) { if ((*i1)==(*j1)) {cout << "\n attention *** probleme concernant le transfert aux noeuds il ne faut pas avoir deux grandeurs identiques, or ici " << "\n on a la grandeurs : " << (((*i1).Nom_vide()) ? Nom_ddl((*i1).Enum()) : (*i1).Nom() ) << " en double !! " << "\n on supprime l'un d'eux "; noe_ddlEtendu_retenu.erase(j1); }; if ((*i1)==(*k1)) {cout << "\n attention *** probleme concernant le transfert aux noeuds il ne faut pas avoir deux grandeurs identiques, or ici " << "\n on a la grandeurs : " << (((*i1).Nom_vide()) ? Nom_ddl((*i1).Enum()) : (*i1).Nom() ) << " en double !! " << "\n on supprime l'un d'eux "; element_type_ddl_retenu.erase(k1); }; if ((*j1)==(*k1)) {cout << "\n attention *** probleme concernant le transfert aux noeuds il ne faut pas avoir deux grandeurs identiques, or ici " << "\n on a la grandeurs : " << (((*j1).Nom_vide()) ? Nom_ddl((*j1).Enum()) : (*j1).Nom() ) << " en double !! " << "\n on supprime l'un d'eux "; element_type_ddl_retenu.erase(k1); }; }; }; }; //------------ méthodes utilitaires qui sont également utilisées par d'autres classes---- // numero: dans le cas où c'est une view pour un élément de tableau, donc de numéro numero void Isovaleurs_Gmsh::EnteteView(ostream & sort,const int & incre, const string& nom,const int & numero ) const { // def de l'entete sort << "\n\n View \""<< nom << " incre= " << incre ; if (numero != 0) sort << ", NB tab " << numero; sort <<"\" { "; }; // utilitaire pour la sortie de l'entête d'un bloc NodeData utilisé avec le nouveau format gmsh // numero: dans le cas où c'est une view pour un élément de tableau, donc de numéro numero void Isovaleurs_Gmsh::EnteteNodeData(ostream & sort,const int & incre, const double& temps ,const string& nom,const int & nb_composante ) const { // dans le cas où l'incrément est supérieur à 1000000, on est dans un cas spécial de mode débug, pour lequel // le temps ne veut rien dire donc on a un traitement spécial if (incre < 1000000) // cas normal {sort << "\n\n$NodeData \n1 \n\""<< nom << "\"\n1 \n"<< temps << "\n3 \n"<< incre <<"\n"<< nb_composante <<"\n" << mailInitial->Nb_total_noeud(); } else // cas particulier début {int compteur = incre % 1000000; sort << "\n\n$NodeData \n1 \n\""<< nom << "\"\n1 \n"<< compteur << "\n3 \n"<< compteur <<"\n"<< nb_composante <<"\n" << mailInitial->Nb_total_noeud(); }; }; // sortie de la def des coordonnées pour une view void Isovaleurs_Gmsh::SortieDefCoordonnees_old_format(ostream & sort,const int & incre ,int nbmail, const Tableau & tab_mail,LesMaillages * lesMail) const { int dim = ParaGlob::Dimension(); for (int im =1; im <= nbmail; im++) {int numMail = tab_mail(im); int nbmaxnoeud = lesMail->Nombre_noeud(numMail); int decalnoeud = mailInitial->DecalNumNoeud(numMail); // deux cas soit on applique une pseudo-homothetie ou non if (!((mailInitial->Considerer_homothetie()) && ((mailInitial->T_homothetie())(numMail)))) {// cas sans homothetie : cas classique for (int ino = 1; ino <= nbmaxnoeud; ino++) {Noeud& noe = lesMail->Noeud_LesMaille(numMail, ino); // pour simplifier int num_noeud = ino + decalnoeud; const Coordonnee& co = noe.Coord2(); sort << "\n"; switch (dim) { case 3: sort << "Z" << num_noeud <<"i"<T_orig())(numMail); // pour simplifier Coordonnee& fact_mult = (mailInitial->T_fact_mult())(numMail); // pour simplifier for (int ino = 1; ino <= nbmaxnoeud; ino++) { Noeud& noe = lesMail->Noeud_LesMaille(numMail, ino); // pour simplifier int num_noeud = ino + decalnoeud; const Coordonnee& co = noe.Coord2(); const Coordonnee& co_0 = noe.Coord0(); Coordonnee delta_co = co-co_0; // calcul du déplacement // on calcul les coordonnées initiale avec homothetie Coordonnee A(co_0-orig); int dim = A.Dimension(); switch (dim) // dans le cas d'une dimension diff de 3, on complète avec des 0 { case 3: A(3) *= fact_mult(3); case 2: A(2) *= fact_mult(2); case 1: A(1) *= fact_mult(1); }; A +=orig; // on rajoute le déplacement A += delta_co; sort << "\n"; switch (dim) { case 3: sort << "Z" << num_noeud <<"i"<::iterator ili,ilifin= glob_noe_ddl_retenu.end(); for (ili=glob_noe_ddl_retenu.begin();ili != ilifin; ili++) nomsGrandeursSortie.push_back(((*ili).Nom_plein()+"_ddl_noe")); }; // .. pour les ddl étendues définis aux noeuds {List_io < Ddl_enum_etendu >::iterator ili,ilifin= glob_noeud_ddl_etendu_retenu.end(); for (ili=glob_noeud_ddl_etendu_retenu.begin();ili != ilifin; ili++) nomsGrandeursSortie.push_back(((*ili).Nom_plein()+"_ddl_etendu_noe")); }; // .. pour les types évoluées définis aux noeuds {List_io < TypeQuelconque >::iterator ili,ilifin= glob_noeud_evol_retenu.end(); for (ili=glob_noeud_evol_retenu.begin();ili != ilifin; ili++) nomsGrandeursSortie.push_back( string(((*ili).EnuTypeQuelconque().NomPlein())+"_evolue_noe" )); }; // .. pour les ddl venant d'un transfert aux noeuds des grandeurs aux pt d'integ {List_io < Ddl_enum_etendu >::iterator ili,ilifin = glob_elem_ddl_retenu.end(); for (ili=glob_elem_ddl_retenu.begin();ili != ilifin; ili++) nomsGrandeursSortie.push_back(((*ili).Nom_plein()+"_pti")); }; // .. pour les types évoluées venant d'un transfert aux noeuds des grandeurs aux pt d'integ {List_io < TypeQuelconque >::iterator ipi,ipifin=glob_elem_evol_retenu.end(); for (ipi=glob_elem_evol_retenu.begin();ipi != ipifin; ipi++) nomsGrandeursSortie.push_back( string(((*ipi).EnuTypeQuelconque().NomPlein())+"_evolue_pti" )); // .. pour les types particuliers aux elements venant d'un transfert aux noeuds ipifin= glob_elem_Parti_retenu.end(); for (ipi=glob_elem_Parti_retenu.begin();ipi != ipifin; ipi++) { // on traite le cas VECTEUR nommé d'une manière particulière TypeQuelconque& typ = (*ipi); // pour simplifier EnumTypeGrandeur enugrandeur = typ.EnuTypeGrandeur(); EnumType2Niveau enuStructure = typ.Const_Grandeur_pointee()->Type_structure_grandeurAssocie(); // string sup="";// un string vide // if ((enuStructure == TYPE_SIMPLE) && (enugrandeur == VECTEUR)) // {Grandeur_Vecteur_Nommer& t_grandeur = // *((Grandeur_Vecteur_Nommer*) typ.Const_Grandeur_pointee()); // sup += *(t_grandeur.Nom_ref()); // }; // string nom_s(typ.EnuTypeQuelconque().NomPlein()); // nomsGrandeursSortie.push_back( string(((*ipi).EnuTypeQuelconque().NomPlein())+"_particulier_pti" )); }; }; //----- debug //list ::iterator iti,itifin=nomsGrandeursSortie.end(); //cout << "\n la liste des noms "; //for (iti=nomsGrandeursSortie.begin();iti != itifin;iti++) // cout << (*iti) << " "; //cout << endl; // //----- fin debug }; // écriture des grandeurs aux noeuds au nouveau format void Isovaleurs_Gmsh::EcritureAuxNoeuds(const Tableau & tab_mail,LesMaillages * lesMail ,int incre,UtilLecture & entreePrinc) { // pour simplifier int nbmail = tab_mail.Taille(); // ici l'objectif est de tout mettre dans un seul groupe de résultat de manière à pouvoir tout // visualiser en même temps // on ne traite que s'il y a des ddl bool atraiter = false; {if ( (glob_noe_ddl_retenu.size() != 0) || (glob_noeud_ddl_etendu_retenu.size() != 0) || (glob_noeud_evol_retenu.size() != 0) || (glob_elem_ddl_retenu.size() != 0) || (glob_elem_evol_retenu.size() != 0) || (glob_elem_Parti_retenu.size() != 0) ) atraiter = true; }; if (atraiter) { // ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: double temps_actuel = ParaGlob::Variables_de_temps().TempsCourant(); // a) cas des ddl initiaux définis aux noeuds // **(3mars2016) je retire l'incrément 0 qui est bancal, car ne représente pas l'état initial de la structure if ((glob_noe_ddl_retenu.size() != 0)&& (incre != 0)) {// on utilise la liste globale car la boucle la plus grande est sur les ddl et non sur les // maillage, ceci de manière à avoir (éventuellement) une seule view qui rassemble plusieurs maillages List_io < Ddl_enum_etendu >::iterator il,ilfin=glob_noe_ddl_retenu.end(); Tableau ::iterator > t_indic_sortie(nbmail); Tableau ::iterator > t_choix_var_ddl(nbmail); for (int im =1; im <= nbmail; im++) {t_indic_sortie(im)=t_g_noeud_ddl_asortir(im).begin(); t_choix_var_ddl(im)=choix_var_ddl(im).begin(); }; for (il=glob_noe_ddl_retenu.begin();il != ilfin;il++) { Enum_ddl ddl = (*il).Enum(); // récup du ddl de base Ddl_enum_etendu ddl_etendu = (*il); // le ddl étendue associé bool ddl_basique = (*il).Nom_vide(); ostream &sort = entreePrinc.Sort_resultat_Gmsh(ddl_etendu.Nom_plein()+"_ddl_noe"); // def de l'entete EnteteNodeData(sort,incre,temps_actuel,ddl_etendu.Nom_plein(),1); // -- sortie des grandeurs // on balaie les maillages for (int im =1; im <= nbmail; im++) {// on ne continue que si le maillage est à sortir // !!! en fait avec gmsh, et le nouveau format, il faut que l'on sorte toujours quelque chose, car le nombre de noeuds // est celui de l'ensemble des maillages présents, bool grandeur_prevu_en_sortie = (*(t_indic_sortie(im))); // drapeau utilisé en sortie //if (*(t_indic_sortie(im))) {int numMail = tab_mail(im); int decal_noe = mailInitial->DecalNumNoeud(numMail); Tableau& t_n = lesMail->Tab_noeud(im); int nbmaxinoeud = t_n.Taille(); for (int numNoeud=1; numNoeud<= nbmaxinoeud;numNoeud++) { // recup du noeud Noeud & noe = lesMail->Noeud_LesMaille(numMail,numNoeud); sort << "\n" << noe.Num_noeud()+decal_noe << " " ; //-- les grandeurs if (grandeur_prevu_en_sortie) {bool varddl = *(t_choix_var_ddl(im)); // variation ou pas // il y a un choix suivant que c'est un ddl de base ou un ddl étendu if (ddl_basique) { if (noe.Existe_ici(ddl)) { if (varddl) // cas de la variation {sort << setprecision(ParaGlob::NbdigdoGR()) << (noe.Valeur_tdt(ddl)-noe.Valeur_0(ddl));} else { sort << setprecision(ParaGlob::NbdigdoGR()) << noe.Valeur_tdt(ddl) ;}; } else // si la valeur n'existe pas on sort 0 {sort << 0. ;}; } else // sinon c'est un ddl étendue { if (noe.Existe_ici_ddlEtendu(ddl_etendu)) { sort << setprecision(ParaGlob::NbdigdoGR()) << (noe.DdlEtendue(ddl_etendu).ConstValeur()) ;} else // si la valeur n'existe pas on sort 0 {sort << 0 ;}; }; } else // cas d'une sortie non prévue, on sort quand même 0. {sort << 0 ;}; }; }; }; // fin de la view sort << "\n$EndNodeData \n"; // mise à jour des pointeurs de choix for (int im =1; im <= nbmail; im++) {t_indic_sortie(im)++;t_choix_var_ddl(im)++;} }; //-- fin de la boucle sur les enum aux noeud }; //--// fin du test s'il y a des enum à sortir ou nom // a-1) cas des ddl étendues définis aux noeuds // **(3mars2016) je retire l'incrément 0 qui est bancal, car ne représente pas l'état initial de la structure if ((glob_noeud_ddl_etendu_retenu.size() != 0) && (incre != 0)) {// on utilise la liste globale car la boucle la plus grande est sur les ddl et non sur les // maillage, ceci de manière à avoir (éventuellement) une seule view qui rassemble plusieurs maillages List_io < Ddl_enum_etendu >::iterator il,ilfin=glob_noeud_ddl_etendu_retenu.end(); Tableau ::iterator > t_indic_sortie(nbmail); for (int im =1; im <= nbmail; im++) {t_indic_sortie(im)=t_g_noeud_ddl_etendu_asortir(im).begin(); }; for (il=glob_noeud_ddl_etendu_retenu.begin();il != ilfin;il++) { Enum_ddl ddl = (*il).Enum(); // récup du ddl de base Ddl_enum_etendu ddl_etendu = (*il); // le ddl étendue associé bool ddl_basique = (*il).Nom_vide(); ostream &sort = entreePrinc.Sort_resultat_Gmsh((*il).Nom_plein()+"_ddl_etendu_noe"); // def de l'entete EnteteNodeData(sort,incre,temps_actuel,(*il).Nom_plein(),1); // -- sortie des grandeurs // on balaie les maillages for (int im =1; im <= nbmail; im++) {// on ne continue que si le maillage est à sortir // !!! en fait avec gmsh, et le nouveau format, il faut que l'on sorte toujours quelque chose, car le nombre de noeuds // est celui de l'ensemble des maillages présents, bool grandeur_prevu_en_sortie = (*(t_indic_sortie(im))); // drapeau utilisé en sortie //if (*(t_indic_sortie(im))) {int numMail = tab_mail(im); int decal_noe = mailInitial->DecalNumNoeud(numMail); Tableau& t_n = lesMail->Tab_noeud(im); int nbmaxinoeud = t_n.Taille(); for (int numNoeud=1; numNoeud<= nbmaxinoeud;numNoeud++) { // recup du noeud Noeud & noe = lesMail->Noeud_LesMaille(numMail,numNoeud); sort << "\n" << noe.Num_noeud()+decal_noe << " " ; //-- les grandeurs if (grandeur_prevu_en_sortie) {// il y a un choix suivant que c'est un ddl de base ou un ddl étendu if (ddl_basique) { if (noe.Existe_ici(ddl)) { sort << setprecision(ParaGlob::NbdigdoGR()) << noe.Valeur_tdt(ddl) ;} else // si la valeur n'existe pas on sort 0 {sort << 0. ;}; } else // sinon c'est un ddl étendue { if (noe.Existe_ici_ddlEtendu(ddl_etendu)) { sort << setprecision(ParaGlob::NbdigdoGR()) << (noe.DdlEtendue(ddl_etendu).ConstValeur()) ;} else // si la valeur n'existe pas on sort 0 {sort << 0 ;}; }; } else // cas d'une sortie non prévue, on sort quand même 0. {sort << 0 ;}; }; }; }; // fin de la view sort << "\n$EndNodeData \n"; // mise à jour des pointeurs de choix for (int im =1; im <= nbmail; im++) {t_indic_sortie(im)++;} }; //-- fin de la boucle sur les enum aux noeud }; //--// fin du test s'il y a des enum à sortir ou nom // a-2) cas des types évoluées définis aux noeuds // **(3mars2016) je retire l'incrément 0 qui est bancal, car ne représente pas l'état initial de la structure if ((glob_noeud_evol_retenu.size() != 0) && (incre != 0)) {// on utilise la liste globale car la boucle la plus grande est sur les ddl et non sur les // maillage, ceci de manière à avoir (éventuellement) une seule view qui rassemble plusieurs maillages List_io < TypeQuelconque >::iterator il,ilfin=glob_noeud_evol_retenu.end(); Tableau ::iterator > t_indic_sortie(nbmail); for (int im =1; im <= nbmail; im++) {t_indic_sortie(im)=t_g_noeud_evoluee_asortir(im).begin(); }; //debug //cout << "\n debug Isovaleurs_Gmsh::EcritureAuxNoeuds " // << "\n glob_noeud_evol_retenu "<< glob_noeud_evol_retenu << endl; //fin debug for (il=glob_noeud_evol_retenu.begin();il != ilfin;il++) {TypeQuelconque& typ = (*il); // pour simplifier ostream &sort = entreePrinc.Sort_resultat_Gmsh((typ.EnuTypeQuelconque().NomPlein())+"_evolue_noe"); // -- choix entre grandeur simple ou complexe EnumTypeGrandeur enugrandeur = typ.EnuTypeGrandeur(); EnumType2Niveau enuStructure = typ.Const_Grandeur_pointee()->Type_structure_grandeurAssocie(); switch (enuStructure) { case TYPE_SIMPLE: { // appel directe de la routine adoc int numero = 0; SortirUneViewTypeQuelconque(sort,typ,enuStructure,numero ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); break; } case TABLEAU_T: { // dans le cas d'un tableau on boucle sur les éléments du tableau switch (enugrandeur) { case TENSEURHH: {Tab_Grandeur_TenseurHH& tab_tensHH = *((Tab_Grandeur_TenseurHH*) typ.Const_Grandeur_pointee()); int taille = tab_tensHH.Taille(); // on boucle, et on sort chaque tenseur for (int i=1;i<=taille;i++) SortirUneViewTypeQuelconque(sort,typ,enuStructure,i ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); break; } case TENSEURBB: {Tab_Grandeur_TenseurBB& tab_tensBB = *((Tab_Grandeur_TenseurBB*) typ.Const_Grandeur_pointee()); int taille = tab_tensBB.Taille(); // on boucle, et on sort chaque tenseur for (int i=1;i<=taille;i++) SortirUneViewTypeQuelconque(sort,typ,enuStructure,i ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); break; } case SCALAIRE: case SCALAIRE_ENTIER: case SCALAIRE_DOUBLE: {Tab_Grandeur_scalaire_double& tab_Gdouble = *((Tab_Grandeur_scalaire_double*) typ.Const_Grandeur_pointee()); int taille = tab_Gdouble.Taille(); // on boucle, et on sort chaque scalaire for (int i=1;i<=taille;i++) SortirUneViewTypeQuelconque(sort,typ,enuStructure,i ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); break; } case COORDONNEE: {Tab_Grandeur_Coordonnee& tab_coordonnee = *((Tab_Grandeur_Coordonnee*) typ.Const_Grandeur_pointee()); int taille = tab_coordonnee.Taille(); // on boucle, et on sort chaque coordonnée for (int i=1;i<=taille;i++) SortirUneViewTypeQuelconque(sort,typ,enuStructure,i ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); break; } case VECTEUR: {Tab_Grandeur_Vecteur& tab_vecteur = *((Tab_Grandeur_Vecteur*) typ.Const_Grandeur_pointee()); int taille = tab_vecteur.Taille(); // on boucle, et on sort chaque vecteur for (int i=1;i<=taille;i++) SortirUneViewTypeQuelconque(sort,typ,enuStructure,i ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); break; } default: cout << "\n attention : cas de sortie de grandeur tableau non implantee (mais il suffit de le demander !!) "; typ.Const_Grandeur_pointee()->Ecriture_grandeur(sort); cout << "\n Isovaleurs_Gmsh::EcritureAuxNoeuds(... 4 "; };//-- fin du switch (enugrandeur) break; } default: cout << "\n attention : cas de sortie de grandeur de type secondaire " << NomType2Niveau(enuStructure) << " non implantee (mais il suffit de le demander !!) "; typ.Const_Grandeur_pointee()->Ecriture_grandeur(sort); cout << "\n Isovaleurs_Gmsh::EcritureAuxNoeuds(... 3 "; }; // mise à jour des pointeurs de choix for (int im =1; im <= nbmail; im++) t_indic_sortie(im)++; }; //--// fin de la boucle sur les enum }; //--// fin du test s'il y a des enum à sortir ou nom // ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // b) cas des ddl de base (simple) venant d'un transfert aux noeuds des grandeurs aux pt d'integ // on ne sort que les incréments différents de 0, car pour l'incrément 0 pas de grandeurs licites aux pt integ //debug //cout << "\n debug Isovaleurs_Gmsh::EcritureAuxNoeuds " // << "\n glob_elem_ddl_retenu "<< glob_elem_ddl_retenu << endl; //fin debug if ((glob_elem_ddl_retenu.size() != 0) && (incre != 0)) {// on utilise la liste globale car la boucle la plus grande est sur les ddl et non sur les // maillage, ceci de manière à avoir (éventuellement) une seule view qui rassemble plusieurs maillages List_io < Ddl_enum_etendu >::iterator il,ilfin=glob_elem_ddl_retenu.end(); Tableau ::iterator > t_indic_sortie(nbmail); for (int im =1; im <= nbmail; im++) t_indic_sortie(im)=t_g_elem_ddl_asortir(im).begin(); for (il=glob_elem_ddl_retenu.begin();il != ilfin;il++) {Ddl_enum_etendu& ddlEtendu = (*il); // pour simplifier ostream *sorti; // def de l'entete sorti = &(entreePrinc.Sort_resultat_Gmsh(ddlEtendu.Nom_plein()+"_pti")); EnteteNodeData(*sorti,incre,temps_actuel,ddlEtendu.Nom_plein(),1); ostream& sort = *sorti; // -- sortie des grandeurs // on balaie les maillages for (int im =1; im <= nbmail; im++) {// on ne continue que si le ddl est à sortir // !!! en fait avec gmsh, et le nouveau format, il faut que l'on sorte toujours quelque chose, car le nombre de noeuds // est celui de l'ensemble des maillages présents, bool grandeur_prevu_en_sortie = (*(t_indic_sortie(im))); // drapeau utilisé en sortie //if (*(t_indic_sortie(im))) {int numMail = tab_mail(im); int decal_noe = mailInitial->DecalNumNoeud(numMail); Tableau& t_n = lesMail->Tab_noeud(numMail); int nbmaxinoeud = t_n.Taille(); for (int numNoeud=1; numNoeud<= nbmaxinoeud;numNoeud++) { // recup du noeud Noeud & noe = lesMail->Noeud_LesMaille(numMail,numNoeud); sort << "\n" << noe.Num_noeud()+decal_noe << " " ; //-- les grandeurs if (grandeur_prevu_en_sortie) {if (noe.Existe_ici_ddlEtendu(ddlEtendu)) { sort << setprecision(ParaGlob::NbdigdoGR()) << (noe.DdlEtendue(ddlEtendu).ConstValeur());} else // si la valeur n'existe pas on sort 0 {sort << 0. ;}; } else // cas d'une sortie non prévue, on sort quand même 0. {sort << 0 ;}; }; }; }; // fin de la view sort << "\n$EndNodeData \n"; // mise à jour des pointeurs de choix for (int im =1; im <= nbmail; im++) t_indic_sortie(im)++; }; //--// fin de la boucle sur les enum }; //--// fin du test d'existance d'énum à sortir venant d'un transfert aux noeuds des grandeurs aux pt d'integ // ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // c) cas des types évoluées venant d'un transfert aux noeuds des grandeurs aux pt d'integ // on ne sort que les incréments différents de 0, car pour l'incrément 0 pas de grandeurs licites aux pt integ if ((glob_elem_evol_retenu.size() != 0) && (incre != 0)) {// on utilise la liste globale car la boucle la plus grande est sur les ddl et non sur les // maillage, ceci de manière à avoir (éventuellement) une seule view qui rassemble plusieurs maillages List_io < TypeQuelconque >::iterator il,ilfin=glob_elem_evol_retenu.end(); Tableau ::iterator > t_indic_sortie(nbmail); for (int im =1; im <= nbmail; im++) t_indic_sortie(im)=t_g_elem_evoluee_asortir(im).begin(); for (il=glob_elem_evol_retenu.begin();il != ilfin;il++) {TypeQuelconque& typ = (*il); // pour simplifier ostream &sort = entreePrinc.Sort_resultat_Gmsh((typ.EnuTypeQuelconque().NomPlein())+"_evolue_pti"); // -- choix entre grandeur simple ou complexe EnumTypeGrandeur enugrandeur = typ.EnuTypeGrandeur(); EnumType2Niveau enuStructure = typ.Const_Grandeur_pointee()->Type_structure_grandeurAssocie(); switch (enuStructure) { case TYPE_SIMPLE: { // appel directe de la routine adoc int numero = 0; SortirUneViewTypeQuelconque(sort,typ,enuStructure,numero ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); break; } case TABLEAU_T: { // dans le cas d'un tableau on boucle sur les éléments du tableau switch (enugrandeur) { case TENSEURHH: {Tab_Grandeur_TenseurHH& tab_tensHH = *((Tab_Grandeur_TenseurHH*) typ.Const_Grandeur_pointee()); int taille = tab_tensHH.Taille(); // on boucle, et on sort chaque tenseur for (int i=1;i<=taille;i++) SortirUneViewTypeQuelconque(sort,typ,enuStructure,i ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); break; } case TENSEURBB: {Tab_Grandeur_TenseurBB& tab_tensBB = *((Tab_Grandeur_TenseurBB*) typ.Const_Grandeur_pointee()); int taille = tab_tensBB.Taille(); // on boucle, et on sort chaque tenseur for (int i=1;i<=taille;i++) SortirUneViewTypeQuelconque(sort,typ,enuStructure,i ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); break; } case SCALAIRE: case SCALAIRE_ENTIER: case SCALAIRE_DOUBLE: {Tab_Grandeur_scalaire_double& tab_Gdouble = *((Tab_Grandeur_scalaire_double*) typ.Const_Grandeur_pointee()); int taille = tab_Gdouble.Taille(); // on boucle, et on sort chaque scalaire for (int i=1;i<=taille;i++) SortirUneViewTypeQuelconque(sort,typ,enuStructure,i ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); break; } case COORDONNEE: {Tab_Grandeur_Coordonnee& tab_coordonnee = *((Tab_Grandeur_Coordonnee*) typ.Const_Grandeur_pointee()); int taille = tab_coordonnee.Taille(); // on boucle, et on sort chaque scalaire for (int i=1;i<=taille;i++) SortirUneViewTypeQuelconque(sort,typ,enuStructure,i ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); break; } case VECTEUR: {Tab_Grandeur_Vecteur& tab_vecteur = *((Tab_Grandeur_Vecteur*) typ.Const_Grandeur_pointee()); int taille = tab_vecteur.Taille(); // on boucle, et on sort chaque scalaire for (int i=1;i<=taille;i++) SortirUneViewTypeQuelconque(sort,typ,enuStructure,i ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); break; } default: cout << "\n attention : cas de sortie de grandeur tableau non implantee (mais il suffit de le demander !!) "; typ.Const_Grandeur_pointee()->Ecriture_grandeur(sort); cout << "\n Isovaleurs_Gmsh::EcritureAuxNoeuds(... 4 "; };//-- fin du switch (enugrandeur) break; } default: cout << "\n attention : cas de sortie de grandeur de type secondaire " << NomType2Niveau(enuStructure) << " non implantee (mais il suffit de le demander !!) "; typ.Const_Grandeur_pointee()->Ecriture_grandeur(sort); cout << "\n Isovaleurs_Gmsh::EcritureAuxNoeuds(... 3 "; }; // mise à jour des pointeurs de choix for (int im =1; im <= nbmail; im++) t_indic_sortie(im)++; }; //--// fin de la boucle sur les enum }; //--// fin du test d'existance de type évolué venant d'un transfert aux noeuds des grandeurs aux pt d'integ // ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // d) cas des types particuliers aux elements venant d'un transfert aux noeuds // on ne sort que les incréments différents de 0, car pour l'incrément 0 pas de grandeurs licites aux pt integ if ((glob_elem_Parti_retenu.size() != 0) && (incre != 0)) {// on utilise la liste globale car la boucle la plus grande est sur les ddl et non sur les // maillage, ceci de manière à avoir (éventuellement) une seule view qui rassemble plusieurs maillages List_io < TypeQuelconque >::iterator il,ilfin=glob_elem_Parti_retenu.end(); Tableau ::iterator > t_indic_sortie(nbmail); for (int im =1; im <= nbmail; im++) t_indic_sortie(im)=t_g_elem_typeParti_asortir(im).begin(); for (il=glob_elem_Parti_retenu.begin();il != ilfin;il++) {TypeQuelconque& typ = (*il); // pour simplifier // -- choix entre grandeur simple ou complexe EnumTypeGrandeur enugrandeur = typ.EnuTypeGrandeur(); EnumType2Niveau enuStructure = typ.Const_Grandeur_pointee()->Type_structure_grandeurAssocie(); // // traitement particulier pour VECTEUR // string sup="";// un string vide // if ((enuStructure == TYPE_SIMPLE) && (enugrandeur == VECTEUR)) // {Grandeur_Vecteur_Nommer& t_grandeur = // *((Grandeur_Vecteur_Nommer*) typ.Const_Grandeur_pointee()); // sup += *(t_grandeur.Nom_ref()); // }; // ostream &sort = entreePrinc.Sort_resultat_Gmsh((typ.EnuTypeQuelconque().NomPlein())+sup+"_particulier_pti"); ostream &sort = entreePrinc.Sort_resultat_Gmsh((typ.EnuTypeQuelconque().NomPlein())+"_particulier_pti"); // il faut combiner les deux types d'enu // compte tenu du fait que VECTEUR et TABLEAU_T sont traité de la même manière switch (enuStructure) { case TYPE_SIMPLE: { if (enugrandeur != VECTEUR) {// appel directe de la routine adoc int numero = 0; SortirUneViewTypeQuelconque(sort,typ,enuStructure,numero ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); } // sinon c'est un VECTEUR, on traite comme un tableau_T, donc on ne met pas de break; else {Grandeur_Vecteur_Nommer& t_grandeur = *((Grandeur_Vecteur_Nommer*) typ.Const_Grandeur_pointee()); Vecteur& vi = t_grandeur.ConteneurVecteur(); int taille = vi.Taille(); // on boucle, et on sort chaque valeur for (int i=1;i<=taille;i++) SortirUneViewTypeQuelconque(sort,typ,enuStructure,i ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); }; break; } case TABLEAU_T: { // dans le cas d'un tableau (ou d'un VECTEUR) on boucle sur les éléments du tableau switch (enugrandeur) { case TENSEURHH: {Tab_Grandeur_TenseurHH& tab_tensHH = *((Tab_Grandeur_TenseurHH*) typ.Const_Grandeur_pointee()); int taille = tab_tensHH.Taille(); // on boucle, et on sort chaque tenseur for (int i=1;i<=taille;i++) SortirUneViewTypeQuelconque(sort,typ,enuStructure,i ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); break; } case TENSEURBB: {Tab_Grandeur_TenseurBB& tab_tensBB = *((Tab_Grandeur_TenseurBB*) typ.Const_Grandeur_pointee()); int taille = tab_tensBB.Taille(); // on boucle, et on sort chaque tenseur for (int i=1;i<=taille;i++) SortirUneViewTypeQuelconque(sort,typ,enuStructure,i ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); break; } case SCALAIRE: case SCALAIRE_ENTIER: case SCALAIRE_DOUBLE: {Tab_Grandeur_scalaire_double& tab_Gdouble = *((Tab_Grandeur_scalaire_double*) typ.Const_Grandeur_pointee()); int taille = tab_Gdouble.Taille(); // on boucle, et on sort chaque scalaire for (int i=1;i<=taille;i++) SortirUneViewTypeQuelconque(sort,typ,enuStructure,i ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); break; } case COORDONNEE: {Tab_Grandeur_Coordonnee& tab_coordonnee = *((Tab_Grandeur_Coordonnee*) typ.Const_Grandeur_pointee()); int taille = tab_coordonnee.Taille(); // on boucle, et on sort chaque scalaire for (int i=1;i<=taille;i++) SortirUneViewTypeQuelconque(sort,typ,enuStructure,i ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); break; } case VECTEUR: {Tab_Grandeur_Vecteur& tab_vecteur = *((Tab_Grandeur_Vecteur*) typ.Const_Grandeur_pointee()); int taille = tab_vecteur.Taille(); // on boucle, et on sort chaque scalaire for (int i=1;i<=taille;i++) SortirUneViewTypeQuelconque(sort,typ,enuStructure,i ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); break; } case BASE__H: {Tab_Grandeur_BaseH& tab_base = *((Tab_Grandeur_BaseH*) typ.Const_Grandeur_pointee()); int taille = tab_base.Taille(); if (taille > 0) {// on va considérer que toutes les bases ont le même nombre de vecteur Grandeur_BaseH& gr = tab_base(1); const BaseH& baH1 = gr.RefConteneurBaseH(); int nb_vect = baH1.NbVecteur(); // on va traiter chaque vecteur de base comme une grandeur coordonnée // on boucle, et on sort chaque base H int indice_vecteur = 1; // le numéro du vecteur à sortir // par exemple si la base comporte 3 vecteurs, et qu'il y a 2 bases // a sortir cela fera au total 6 vecteurs : les 3 premiers pour la base1 // les 3 suivants pour la base 2 for (int i=1;i<=taille;i++) // le compteur de base for (int num_vec = 1; num_vec <= nb_vect; num_vec++,indice_vecteur++) SortirUneViewTypeQuelconque(sort,typ,enuStructure,indice_vecteur ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre); }; break; } default: cout << "\n attention : cas de sortie de grandeur tableau non implantee (mais il suffit de le demander !!) "; typ.Const_Grandeur_pointee()->Ecriture_grandeur(sort); cout << "\n Isovaleurs_Gmsh::EcritureAuxNoeuds(... 1 "; };//-- fin du switch (enugrandeur) break; } default: cout << "\n attention : cas de sortie de grandeur de type secondaire " << NomType2Niveau(enuStructure) << " non implantee (mais il suffit de le demander !!) "; typ.Const_Grandeur_pointee()->Ecriture_grandeur(sort); cout << "\n Isovaleurs_Gmsh::EcritureAuxNoeuds(... 2 "; }; // mise à jour des pointeurs de choix for (int im =1; im <= nbmail; im++) t_indic_sortie(im)++; }; //--// fin de la boucle sur les enum }; //--// fin du test d'existance de type évolué venant d'un transfert aux noeuds des grandeurs aux pt d'integ }; //-- fin du cas if (atraiter) }; // gestion de l'accumulation due au passage des grandeurs choisies venant des éléments, aux noeuds, lorsque ces grandeurs sont // directement diponibles aux noeuds void Isovaleurs_Gmsh::Passage_grandeursRetenuesAuxNoeuds_elementsVersNoeuds() { int nb_maillage = tabnoeud_type_ddl.Taille();// def du nombre de maillage avec un tableau quelconque // dans le cas où les ddl récupérés des éléments sont visibles directement aux noeuds on les bascule // sur les noeuds, car il ne faut pas faire de transfert particulier for (int imail=1;imail<=nb_maillage;imail++) { // on fait l'optimisation et le rangement tabnoeud_evoluee_retenu(imail).sort();tabnoeud_evoluee_retenu(imail).unique(); // on construit les tableaux a accumuler {List_io& aaccum_ret = a_accumuler_tabnoeud_type_ddlEtendu_retenu(imail); // pour simplifier List_io& aaccum = a_accumuler_tabnoeud_type_ddlEtendu(imail); // pour simplifier aaccum_ret.clear(); List_io& tpg_ret = (tabnoeud_type_ddlEtendu_retenu(imail)); // pour simplifier List_io < Ddl_enum_etendu >::iterator iq,iqfin=tpg_ret.end(); for (iq=tpg_ret.begin();iq!=iqfin;iq++)// on parcours la liste // si l'élément doit-être accumulé, on l'indique if (find(aaccum.begin(),aaccum.end(),(*iq)) != aaccum.end()) aaccum_ret.push_back(*iq);// accumulation simple //on ordonne et supprime les doublons aaccum_ret.sort();aaccum_ret.unique(); }; {List_io& aaccum_ret = (a_accumuler_tabnoeud_evoluee_retenu(imail)); // pour simplifier List_io& aaccum = (a_accumuler_tabnoeud_evoluee(imail)); // pour simplifier aaccum_ret.clear(); List_io& tpg_ret = (tabnoeud_evoluee_retenu(imail)); // pour simplifier List_io < TypeQuelconque >::iterator iq,iqfin=tpg_ret.end(); for (iq=tpg_ret.begin();iq!=iqfin;iq++)// on parcours la liste // si l'élément doit-être accumulé, on l'indique if (find(aaccum.begin(),aaccum.end(),(*iq)) != aaccum.end()) aaccum_ret.push_back(*iq);// accumulation simple //on ordonne et supprime les doublons aaccum_ret.sort();aaccum_ret.unique(); }; ////debug //cout << "\n debug Isovaleurs_Gmsh::Passage_grandeursRetenuesAuxNoeuds_elementsVersNoeuds() " // << "\n 2: tabnoeud_type_ddlEtendu_retenu(imail) " << tabnoeud_type_ddlEtendu_retenu(imail) // << "\n 3: tabnoeud_evoluee_retenu(imail) "< litq; // une autre pour les quelconques Tableau * > tabQ(2); tabQ(1)= &tabnoeud_evoluee_retenu(imail);tabQ(2)=&litq; // on est obligé d'utiliser un tableau dont le second terme est nul, // ceci pour pouvoir utiliser "AjoutConteneurAuNoeud" tel quel lesMail->AjoutConteneurAuNoeud(imail,tabnoeud_type_ddlEtendu_retenu(imail),tabQ); }; }; // passage des grandeurs disponibles venant des éléments, aux noeuds, lorsque ces grandeurs sont // directement diponibles aux noeuds void Isovaleurs_Gmsh::Passage_grandeursDisponiblesAuxNoeuds_elementsVersNoeuds() { int nb_maillage = tabnoeud_type_ddl.Taille();// def du nombre de maillage avec un tableau quelconque // dans le cas où les ddl récupérés des éléments sont visibles directement aux noeuds on les bascule // sur les noeuds, car il ne faut pas faire de transfert particulier for (int imail=1;imail<=nb_maillage;imail++) { {List_io & lis_sor = tabelement_type_ddl(imail); // pour simplifier //debug //cout << "\n debug Isovaleurs_Gmsh::Passage_grandeursDisponiblesAuxNoeuds_elementsVersNoeuds() " // << "\n tabelement_type_ddl_retenu(imail) " << tabelement_type_ddl_retenu(imail) << endl; //fin debug List_io ::iterator ili,ilifin = lis_sor.end(); List_io ::iterator> inter; // pour stocker les grandeurs à déplacer // on parcours d'abord la liste venant des éléments for (ili=lis_sor.begin();ili != ilifin;ili++) { //debug //if ((*ili).Nom() == "pression_ext") // cout << "\n debug Isovaleurs_Gmsh::Passage_grandeursDisponiblesAuxNoeuds_elementsVersNoeuds() " // << "\n tabelement_type_ddl_retenu(imail) " << tabelement_type_ddl_retenu(imail) << endl; //fin debug if ((Meme_famille((*ili).Enum(),X1)) // X1 est un ddl définit aux noeuds || ((*ili).Nom() == "pression_ext") // cas particuliers : def au pti, mais dispo tel quel au noeud ) {inter.push_back(ili);tabnoeud_type_ddlEtendu(imail).push_back(*ili); // les grandeurs qui viennent des éléments sont visible par moyenne aux noeuds a_accumuler_tabnoeud_type_ddlEtendu(imail).push_back(*ili); }; }; // on supprime List_io ::iterator>::iterator ik,ikfin = inter.end(); for (ik = inter.begin();ik!=ikfin;ik++) lis_sor.erase(*ik); tabnoeud_type_ddlEtendu_retenu(imail).sort();tabnoeud_type_ddlEtendu(imail).unique(); a_accumuler_tabnoeud_type_ddlEtendu(imail).sort(); a_accumuler_tabnoeud_type_ddlEtendu(imail).unique(); }; //.. idem pour les grandeurs évoluées ... {List_io & lis_sor = tabelement_evoluee(imail); // pour simplifier List_io ::iterator ili,ilifin = lis_sor.end(); List_io ::iterator> inter; // pour stocker les grandeurs à déplacer // on parcours d'abord la liste venant des éléments for (ili=lis_sor.begin();ili != ilifin;ili++) if (Meme_famille((*ili).Enum(),X1)) // X1 est un ddl définit aux noeuds {inter.push_back(ili);tabnoeud_evoluee(imail).push_back(*ili); // les grandeurs qui viennent des éléments sont visible par moyenne aux noeuds a_accumuler_tabnoeud_evoluee(imail).push_back(*ili); }; // on supprime List_io ::iterator>::iterator ik,ikfin = inter.end(); for (ik = inter.begin();ik!=ikfin;ik++) lis_sor.erase(*ik); }; //.. idem pour les grandeurs particulières ... {List_io & lis_sor = tabelement_typeParti(imail); // pour simplifier List_io ::iterator ili,ilifin = lis_sor.end(); List_io ::iterator> inter; // pour stocker les grandeurs à déplacer // on parcours d'abord la liste venant des éléments for (ili=lis_sor.begin();ili != ilifin;ili++) if (Meme_famille((*ili).Enum(),X1)) // X1 est un ddl définit aux noeuds {inter.push_back(ili);tabnoeud_evoluee(imail).push_back(*ili); // les grandeurs qui viennent des éléments sont visible par moyenne aux noeuds a_accumuler_tabnoeud_evoluee(imail).push_back(*ili); }; // on supprime List_io ::iterator>::iterator ik,ikfin = inter.end(); for (ik = inter.begin();ik!=ikfin;ik++) lis_sor.erase(*ik); }; // comme tabnoeud_evoluee est utilisé pour les éléments par les grandeurs évoluées et particulières // on fait l'optimisation et le rangement une seule fois à la fin tabnoeud_evoluee(imail).sort();tabnoeud_evoluee(imail).unique(); a_accumuler_tabnoeud_evoluee(imail).sort(); a_accumuler_tabnoeud_evoluee(imail).unique(); //debug //cout << "\n debug Isovaleurs_Gmsh::Passage_grandeursDisponiblesAuxNoeuds_elementsVersNoeuds() " // << "\n 2: tabelement_type_ddl(imail) " << tabelement_type_ddl(imail) // << "\n 3: a_accumuler_tabnoeud_evoluee(imail) "<& tab_mail,LesMaillages * lesMail) { // .. on initialise les conteneurs .. int nbmail = tab_mail.Taille(); int cas=1; // par défaut on cumul et on moyenne simplement // pour utiliser la méthode InitUpdateAuNoeud, on doit construire tabQ a deux dim List_io < TypeQuelconque > litq; // une autre pour les quelconques Tableau * > tabQ(2); tabQ(2)=&litq; ////debug //cout << "\n debug Isovaleurs_Gmsh::CalculAuxElemAuxNoeuds(...) " // << "\n a_accumuler_tabnoeud_evoluee_retenu(1) " << a_accumuler_tabnoeud_evoluee_retenu(1) // << "\n a_accumuler_tabnoeud_type_ddlEtendu_retenu(1) "<InitUpdateAuNoeud(imail,a_accumuler_tabnoeud_type_ddlEtendu_retenu(imail),tabQ,cas); }; // accumulation aux noeuds de grandeurs venant de l'éléments vers ses noeuds (exemple la pression appliquée) // autres que celles aux pti classiques, mais directements disponibles for (int imail=1;imail<=nbmail;imail++) lesMail->Accumul_aux_noeuds(imail,a_accumuler_tabnoeud_type_ddlEtendu_retenu(imail) ,a_accumuler_tabnoeud_evoluee_retenu(imail),cas); // calcul des moyennes en chaque noeuds) tabQ.Change_taille(1); for (int imail=1;imail<=nbmail;imail++) { tabQ(1) = &a_accumuler_tabnoeud_evoluee_retenu(imail); lesMail->FinTransfertPtIntegAuNoeud(imail,a_accumuler_tabnoeud_type_ddlEtendu_retenu(imail),tabQ,cas); }; };