Herezh_dev/Resultats/Gid/Isovaleurs_Gid2.cc

986 lines
54 KiB
C++
Raw Normal View History

// This file is part of the Herezh++ application.
//
// The finite element software Herezh++ is dedicated to the field
// of mechanics for large transformations of solid structures.
// It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600)
// INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) <https://www.irdl.fr/>.
//
// Herezh++ is distributed under GPL 3 license ou ultérieure.
//
2023-05-03 17:23:49 +02:00
// Copyright (C) 1997-2022 Université Bretagne Sud (France)
// AUTHOR : Gérard Rio
// E-MAIL : gerardrio56@free.fr
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License,
// or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
// For more information, please consult: <https://herezh.irdl.fr/>.
#include "Isovaleurs_Gid.h"
#include <iomanip>
#include <algorithm>
#include "CharUtil.h"
#include "Coordonnee2.h"
#include "ConstMath.h"
#include "MathUtil.h"
#include "Banniere.h"
#include "TypeQuelconqueParticulier.h"
// choix de l'isovaleur à visualiser calculée à partir des grandeurs évoluées aux points d'intégrations
void Isovaleurs_Gid::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; // pour les autres cas, 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) aux pt 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; // pour les autres cas, 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<TypeQuelconque>& tpg_ret = (tabelement_evoluee_retenu(imail)); // pour simplifier
List_io<TypeQuelconque>& tpg = (tabelement_evoluee(imail)); // pour simplifier
if (find(tpg.begin(),tpg.end(),a) != tpg.end())
{ // il existe -> enregistrement
List_io<TypeQuelconque>::iterator il = find(tpg.begin(),tpg.end(),a); // récup du réel type
// s'il n'existe pas déjà on l'enregistre vraiment
if (find(tpg_ret.begin(),tpg_ret.end(),a) == tpg_ret.end())
tpg_ret.push_back(*il);
}
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_Gid::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 aux pt 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 visulaliser "
<< "\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<TypeQuelconque>& tpg_ret = (tabelement_typeParti_retenu(imail)); // pour simplifier
List_io<TypeQuelconque>& tpg = (tabelement_typeParti(imail)); // pour simplifier
if (find(tpg.begin(),tpg.end(),a) != tpg.end())
{ // il existe -> enregistrement
List_io<TypeQuelconque>::iterator il = find(tpg.begin(),tpg.end(),a); // récup du réel type
// s'il n'existe pas déjà on l'enregistre vraiment
if (find(tpg_ret.begin(),tpg_ret.end(),a) == tpg_ret.end())
tpg_ret.push_back(*il);
}
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
};
// choix de grandeur existantes aux points d'intégrations et à ramener aux noeuds
// pour préparer une visualisation d'isovaleurs
void Isovaleurs_Gid::TransfertGrandeursPtIntegAuNoeud()
{ cout << "\n transfert aux noeuds (rep o ou n) ";
string rep; rep = lect_o_n(false);
if (rep == "o")
{ transfert_au_noeud = true; cout << "\n transfert aux noeuds enregistre ";}
else
{ transfert_au_noeud = false; cout << "\n transfert aux noeuds desactives ";};
/* // on signale que les ddl étendues autres que pur ne seront pas transférés
// on boucle sur les maillages
int nb_mail=lesMail->NbMaillage();
for (int imail=1;imail<=nb_mail;imail++)
{ // pour les ddl on crée soit une liste de ddl pur soit un type quelconque scalaire
// seul le premier cas peut-être traité directement, sinon il faut utiliser un type interne
// ce choix est fait pour éviter de multiplier les types de stockage au niveau des noeuds
// on ne veut pas de type Ddl_enum_etendu qui nécessitera un indressage indirecte très couteux
List_io < Ddl_enum_etendu >& element_type_ddl_retenu = tabelement_type_ddl_retenu(imail);
List_io < Ddl_enum_etendu >::iterator ilddl,ilddlfin=element_type_ddl_retenu.end();
List_io < Enum_ddl > lienu;
for (ilddl=element_type_ddl_retenu.begin(); ilddl != ilddlfin; ilddl++)
{ if (!(*ilddl).Nom_vide())
// c'est un ddl non pur
{ cout << "\n ** attention, le ddl " << (*ilddl).Nom()
<< " ne sera pas transfere aux noeuds, si l'on veut cette grandeur, il faut la definir "
<< " aux niveaux des grandeurs tensorielles ou particulieres !! ";
};
};
}; */
};
// initialisation de l'exécution du transferts
void Isovaleurs_Gid::InitPremierIncrExecutionTransfertAuxNoeuds()
{ if (transfert_au_noeud)
{// 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_Gid::ParametresGeneraux(const string& choix)
{ // tout d'abord on traite le cas de tous les isovaleurs
if (choix=="to")
{ ddlSurY_1D = true;
return;
};
// maintenant on traite le cas interactif
bool choix_valide = false;
cout << "\n parametre par defaut ? : dans le cas d'element 1D, ddl sortie en y,"
<< "\n composantes des tenseurs dans le repere absolu,"
<< " (rep 'o') pour accepter ces parametres sinon autre ";
string rep;
cout << "\n reponse ? "; rep = lect_return_defaut(true,"o");
if (rep != "o")
{// cas d'un choix autre que standart
while (!choix_valide)
{
try
{cout
<< "\n (0) (ou f ou fin) fin modif "
<< "\n (1) ddl selon y dans le cas 1D "
<< "\n (2) sortie des tenseurs dans le repere absolu (par defaut) "
<< "\n (3) sortie des tenseurs dans un repere ad hoc, qui depend du type d'element ";
cout << "\n \n reponse ? ";
rep = lect_return_defaut(false,"f");
if (rep == "fin_prog") Sortie(1);
if ((rep == "0")||(rep == "f")||(rep == "fin"))
{ choix_valide = true;}
// sinon
else
{int num = ChangeEntier(rep);
if (num == 0) {choix_valide=true;}
else if ((num >= 1)&&(num<=3))
{ choix_valide=false;
switch (num)
{ case 1: //ddl selon y dans le cas 1D
{ cout << "\n sortie ddl selon y ? (rep o ou n) ";
rep = lect_o_n(false);
if (rep == "o") {ddlSurY_1D=true; cout << "\n enregistrement sortie selon y ";}
else {ddlSurY_1D=false; cout << "\n enregistrement sortie selon x ";};
break;
}
case 2: //en absolue
{ absolue = true;
break;
}
case 3: // repère ad hoc
{ absolue = false;
break;
}
}
}
else { cout << "\n Erreur on attendait un entier entre 0 et 3 !!, "
<< "\n redonnez une bonne valeur"
<< "\n ou taper fin_prog pour arreter le programme";
choix_valide=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
{ 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";
choix_valide=false;
}
} //-- fin du while
}
};
// sortie de l'entête des isovaleurs de grandeurs definis aux pt integ pour des grandeurs quelconques
// et également tout simplement aux noeuds
// sert pour les sorties aux pt integ et aux noeuds
// -- 1) le programme général quelque soit la structure (simple, tableau, list ... ) de la grandeur quelconque
// drap_noeud = false ---> sortie aux pt integ, =true ---> sortie aux noeuds
void Isovaleurs_Gid::EnteteSortieIsovaleurs_G_Quelconque(ostream & sort,TypeQuelconque& typ,bool drap_noeud)
{ EnumTypeGrandeur enugrandeur = typ.EnuTypeGrandeur();
// maintenant on regarde s'il s'agit d'une seule grandeur ou d'un tableau
EnumType2Niveau enuStructure = typ.Const_Grandeur_pointee()->Type_structure_grandeurAssocie();
switch (enuStructure)
{ case TYPE_SIMPLE:
{ int dima = 0;
switch (enugrandeur)
{ case TENSEURBB:
{ dima= Abs(((Grandeur_TenseurBB*) typ.Grandeur_pointee())->ConteneurTenseur()->Dimension());break; }
case TENSEURHH:
{ dima= Abs(((Grandeur_TenseurHH*) typ.Grandeur_pointee())->ConteneurTenseur()->Dimension());break; }
case COORDONNEE:
{ dima= Abs(((Grandeur_coordonnee*) typ.Grandeur_pointee())->ConteneurCoordonnee()->Dimension());break; }
case SCALAIRE: case SCALAIRE_ENTIER: case SCALAIRE_DOUBLE:
{ dima = 1; break;}
// le cas par défaut sera géré dans EnteteSortieIsovaleurs_G_Quelconque_TYPE_SIMPLE
default: break;
};//-- fin du switch (enugrandeur)
string nom_typeQuelconque((typ.EnuTypeQuelconque().NomPlein()));
if (drap_noeud) nom_typeQuelconque += "_N";
EnteteSortieIsovaleurs_G_Quelconque_TYPE_SIMPLE(sort,*(typ.Grandeur_pointee()),nom_typeQuelconque,dima);
break;
}
case TABLEAU_T:
{ switch (enugrandeur)
{ case TENSEURHH:
{ Tab_Grandeur_TenseurHH& tab_tensHH = *((Tab_Grandeur_TenseurHH*) typ.Grandeur_pointee());
int taille = tab_tensHH.Taille();
// on boucle, et on sort une entête pour chaque tenseur
for (int i=1;i<=taille;i++)
{ int dima = Abs(tab_tensHH(i).Dimension());
string nom_typeQuelconque=(typ.EnuTypeQuelconque().NomPlein())+ChangeEntierSTring(i);
if (drap_noeud) nom_typeQuelconque += "_N";
EnteteSortieIsovaleurs_G_Quelconque_TYPE_SIMPLE(sort,*(typ.Grandeur_pointee()),nom_typeQuelconque,dima);
};
break;
}
case SCALAIRE: case SCALAIRE_ENTIER: case SCALAIRE_DOUBLE:
{ // dans ce cas EnteteSortieIsovaleurs_G_Quelconque_TYPE_SIMPLE est conçu pour
// pour sortir directement l'entête des n scalaires
// !!! non ça ne marche pas on modifie
//int dima = 1;
//string nom_typeQuelconque=NomTypeQuelconque_court(typ.EnuTypeQuelconque());
//if (drap_noeud) nom_typeQuelconque += "_N";
//EnteteSortieIsovaleurs_G_Quelconque_TYPE_SIMPLE(sort,*(typ.Grandeur_pointee()),nom_typeQuelconque,dima);
Tab_Grandeur_scalaire_double& tab_scal = *((Tab_Grandeur_scalaire_double*) typ.Grandeur_pointee());
int taille = tab_scal.Taille();
// on boucle, et on sort une entête pour chaque scalaire
for (int i=1;i<=taille;i++)
{ int dima = 1;
string nom_typeQuelconque=(typ.EnuTypeQuelconque().NomPlein())+ChangeEntierSTring(i);
if (drap_noeud) nom_typeQuelconque += "_N";
EnteteSortieIsovaleurs_G_Quelconque_TYPE_SIMPLE(sort,*(typ.Grandeur_pointee()),nom_typeQuelconque,dima);
};
break;
}
case COORDONNEE:
{ Tab_Grandeur_Coordonnee& tab_coor = *((Tab_Grandeur_Coordonnee*) typ.Grandeur_pointee());
int taille = tab_coor.Taille();
// on boucle, et on sort une entête pour chaque coordonnée
for (int i=1;i<=taille;i++)
{ int dima = tab_coor(i).Dimension();
string nom_typeQuelconque=(typ.EnuTypeQuelconque().NomPlein())+ChangeEntierSTring(i);
if (drap_noeud) nom_typeQuelconque += "_N";
EnteteSortieIsovaleurs_G_Quelconque_TYPE_SIMPLE(sort,*(typ.Grandeur_pointee()),nom_typeQuelconque,dima);
};
break;
}
default:
cout << "\n attention : cas de sortie de grandeur tableau non implantee (mais il suffit de le demander !!) ";
typ.Grandeur_pointee()->Ecriture_grandeur(sort);
cout << "\n Isovaleurs_Gid::EnteteSortieIsovaleurs_G_Quelconque(... ";
};//-- 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.Grandeur_pointee()->Ecriture_grandeur(sort);
cout << "\n Isovaleurs_Gid::EnteteSortieIsovaleurs_G_Quelconque(... ";
};
};
// -- 2) le programme spécifique pour "une" grandeur de base (utilisé en 1))
void Isovaleurs_Gid::EnteteSortieIsovaleurs_G_Quelconque_TYPE_SIMPLE
(ostream & sort,const TypeQuelconque::Grandeur& grandeur,const string nom_typeQuelconque, int dima)
{ EnumTypeGrandeur enugrandeur = grandeur.Type_grandeurAssocie();
sort << "\n ResultDescription \"";
switch (enugrandeur)
{ case TENSEURBB:
{switch (dima)
{case 3:{sort << nom_typeQuelconque << "\" Matrix ";
sort << "\n ComponentNames \"A11\", \"A22\", \"A33\", \"A12\", \"A23\", \"A13\" ";
break;}
case 2:
{sort << nom_typeQuelconque << "\" PlainDeformationMatrix ";
sort << "\n ComponentNames \"A11\", \"A22\", \"A12\", \"A33\" "; break;}
case 1:
{sort << nom_typeQuelconque << "\" Scalar "; break;}
default: { cout << "\n dimension inconsistante de tenseurBB = " << dima
<< " la sortie sera inexploitable sur Gid ";
if (ParaGlob::NiveauImpression() > 5) cout << "\n Isovaleurs_Gid::ExeOrdre(...";
};
}
break;
}
case TENSEURHH:
{switch (dima)
{case 3:{sort << nom_typeQuelconque << "\" Matrix ";
sort << "\n ComponentNames \"A11\", \"A22\", \"A33\", \"A12\", \"A23\", \"A13\" ";
break;}
case 2:
{sort << nom_typeQuelconque << "\" PlainDeformationMatrix ";
sort << "\n ComponentNames \"A11\", \"A22\", \"A12\", \"A33\" "; break;}
case 1:
{sort << nom_typeQuelconque << "\" Scalar "; break;}
default: { cout << "\n dimension inconsistante de tenseurHH = " << dima
<< " la sortie sera inexploitable sur Gid ";
if (ParaGlob::NiveauImpression() > 5)
cout << "\n Isovaleurs_Gid::EnteteSortieIsovaleurs_G_Quelconque(...";
};
}
break;
}
case COORDONNEE:
{switch (dima)
{case 3: case 2: // dans le cas dim 2 on rajoute un 0
{sort << nom_typeQuelconque << "\" Vector ";
sort << "\n ComponentNames \"U1\", \"U2\", \"U3\" "; break;}
case 1: {sort << nom_typeQuelconque << "\" Scalar "; break;}
default: { cout << "\n dimension inconsistante de Coordonnee = " << dima
<< " la sortie sera inexploitable sur Gid ";
if (ParaGlob::NiveauImpression() > 5)
cout << "\n Isovaleurs_Gid::EnteteSortieIsovaleurs_G_Quelconque(...";
};
};
break;
}
case SCALAIRE: case SCALAIRE_ENTIER: case SCALAIRE_DOUBLE:
{ sort << nom_typeQuelconque << "\" Scalar "; break;}
default :
{// sinon on sort n scalaires correspondant aux n scalaires composants la grandeur
int nbmax = grandeur.NbMaxiNumeroOrdre();
if (nbmax != 0)
sort << nom_typeQuelconque +ChangeEntierSTring(1) << "\" Scalar ";
for (int i=2;i<=nbmax;i++)
{ sort << "\n ResultDescription \"";
sort << nom_typeQuelconque+ChangeEntierSTring(i)<< "\" Scalar ";
};
}
};//-- fin du switch (enugrandeur)
};
// sortie d'une grandeurs quelconque aux pt integ
// -- a) le programme général quelque soit la structure (simple, tableau, list ... ) de la grandeur quelconque
void Isovaleurs_Gid::SortieGrandeursQuelconque(ostream & sort,const TypeQuelconque& typ)
{ // on regarde s'il s'agit d'une seule grandeur ou d'un tableau
EnumType2Niveau enuStructure = typ.Const_Grandeur_pointee()->Type_structure_grandeurAssocie();
switch (enuStructure)
{ case TYPE_SIMPLE:
{ int dima = 0;
switch (typ.EnuTypeGrandeur())
{ case TENSEURBB:
{ dima= Abs(((Grandeur_TenseurBB*) typ.Const_Grandeur_pointee())->RefConteneurTenseur().Dimension());break; }
case TENSEURHH:
{ dima= Abs(((Grandeur_TenseurHH*) typ.Const_Grandeur_pointee())->RefConteneurTenseur().Dimension());break; }
case COORDONNEE:
{ dima= Abs(((Grandeur_coordonnee*) typ.Const_Grandeur_pointee())->ConteneurCoordonnee()->Dimension());break; }
case SCALAIRE: case SCALAIRE_ENTIER: case SCALAIRE_DOUBLE:
{ dima = 1; break;}
// le cas par défaut sera géré dans SortieGrandeursQuelconque_TYPE_SIMPLE
default: break;
};//-- fin du switch (enugrandeur)
SortieGrandeursQuelconque_TYPE_SIMPLE(sort,*(typ.Const_Grandeur_pointee()),dima);
break;
}
case TABLEAU_T:
{ switch (typ.EnuTypeGrandeur())
{ 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++)
{ int dima = Abs(tab_tensHH(i).Dimension());
SortieGrandeursQuelconque_TYPE_SIMPLE(sort,tab_tensHH.Grandeur_TenseurHH_associee(i),dima);
};
break;
}
case SCALAIRE: case SCALAIRE_ENTIER: case SCALAIRE_DOUBLE:
{ int dima = 1;
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 tenseur
for (int i=1;i<=taille;i++)
SortieGrandeursQuelconque_TYPE_SIMPLE(sort,tab_Gdouble.Grandeur_scalaire_associee(i),dima);
break;
}
case COORDONNEE:
{ Tab_Grandeur_Coordonnee& tab_coor = *((Tab_Grandeur_Coordonnee*) typ.Const_Grandeur_pointee());
int taille = tab_coor.Taille();
// on boucle, et on sort chaque coordonnée
for (int i=1;i<=taille;i++)
{ int dima = tab_coor(i).Dimension();
SortieGrandeursQuelconque_TYPE_SIMPLE(sort,tab_coor.Grandeur_Coordonnee_associee(i),dima);
};
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_Gid::EnteteSortieIsovaleurs_G_Quelconque(... ";
};//-- 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_Gid::EnteteSortieIsovaleurs_G_Quelconque(... ";
};
};
// -- b) le programme spécifique pour "une" grandeur de base (utilisé en a))
void Isovaleurs_Gid::SortieGrandeursQuelconque_TYPE_SIMPLE(ostream & sort,const TypeQuelconque::Grandeur& grandeur,int dima)
{
switch (grandeur.Type_grandeurAssocie())
{ case TENSEURBB:
{ const TenseurBB& t_BB = ((Grandeur_TenseurBB*) &grandeur)->RefConteneurTenseur();
switch (dima)
{case 1: sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,1) << " "; break;
case 2: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,1) << " ";
sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,2) << " ";
sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,2) << " "
<< " 0. "; break;
};
case 3: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,1) << " ";
sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,2) << " ";
sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(3,3) << " ";
sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,2) << " ";
sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,3) << " ";
sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,3) << " "; break;
};
default: cout << "\n erreur !! Isovaleurs_Gid::SortieGrandeursQuelconque_TYPE_SIMPLE(.."; Sortie(1);
};
break;
}
case TENSEURHH:
{ const TenseurHH& t_BB = ((Grandeur_TenseurHH*) &grandeur)->RefConteneurTenseur();
switch (dima)
{case 1: sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,1) << " "; break;
case 2: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,1) << " ";
sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,2) << " ";
sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,2) << " "
<< " 0. "; break;
};
case 3: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,1) << " ";
sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,2) << " ";
sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(3,3) << " ";
sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,2) << " ";
sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,3) << " ";
sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,3) << " "; break;
};
default: cout << "\n erreur !! Isovaleurs_Gid::SortieGrandeursQuelconque_TYPE_SIMPLE(.."; Sortie(1);
};
break;
}
case COORDONNEE:
{grandeur.Grandeur_brut(sort,ParaGlob::NbdigdoGR());
if (dima==2) sort << " 0. ";
break;
}
case SCALAIRE: case SCALAIRE_ENTIER: case SCALAIRE_DOUBLE:
{ double vale = grandeur.GrandeurNumOrdre(1); // récup du scalaire
sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << vale << " ";
break;}
default:
cout << "\n erreur !! Isovaleurs_Gid::SortieGrandeursQuelconque_TYPE_SIMPLE(.."
<< "\n le type de grandeur " << NomTypeGrandeur(grandeur.Type_grandeurAssocie())
<< " n'est pas pris en compte!! " << flush ;
Sortie(1);
};//-- fin du switch (enugrandeur)
};
// initialisation les différentes listes internes qui globalisent tous les maillages
void Isovaleurs_Gid::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));
glob_noeud_evol_retenu.merge(internoeudevolretenu);
tabelement_type_ddl_retenu(imail).sort();
List_io < Ddl_enum_etendu > 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();
};
// on met à jour le tableau de pointeur global
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 initiaux n'existent pas pour le maillage considéré
else {g_noeud_type_ddl_asortir.push_back(true);}; // cas où le ddl initiaux existent é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)
// c'est un cas particulier où on veut aux noeuds, les grandeurs déjà définies au pti d'élément: normalement
// ce n'est pas courant avec gid, car gid le fait tout seul... mais c'est possible,
// du coup, on utilise la même procédure de vérification que gmsh
void Isovaleurs_Gid::VerificationTransfertPossible()
{ // 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 peu 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);
};
};
};
};