// This file is part of the Herezh++ application.
//
// The finite element software Herezh++ is dedicated to the field
// of mechanics for large transformations of solid structures.
// It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600)
// INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) .
//
// Herezh++ is distributed under GPL 3 license ou ultérieure.
//
// Copyright (C) 1997-2022 Université Bretagne Sud (France)
// AUTHOR : Gérard Rio
// E-MAIL : gerardrio56@free.fr
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License,
// or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
//
// For more information, please consult: .
#include "Resultats.h"
#include "LectBlocMot.h"
#include "CharUtil.h"
#include "MathUtil.h"
#include
#include "ElemMeca.h"
#include "ElFrontiere.h"
#include "ReferenceNE.h"
#include "ReferenceAF.h"
#include "TypeConsTens.h"
// CONSTRUCTEURS :
// entreePrinc gere les entrees sorties
Resultats::Resultats(UtilLecture* ent) :
lesValVecPropres(),tabRegion(),pas_de_sortie(false)
{ entreePrinc = ent;
// parametres par defaut
copie = 1; // recopie de la lecture
};
// DESTRUCTEUR :
Resultats::~Resultats()
{ };
// METHODES PUBLIQUES :
// lecture des parametres de gestions de la sortie des resultats
void Resultats::Lecture(LesReferences* lesRef)
{try
{
if (ParaGlob::NiveauImpression() >= 4)
cout << " debut de la lecture de la sortie automatique de resultats " << endl;
MotCle motCle; // ref aux mots cle
{ // on se positionne sur un mot cle
while ( !motCle.SimotCle(entreePrinc->tablcar))
entreePrinc->NouvelleDonnee();
if (strstr(entreePrinc->tablcar,"resultats")!=NULL)
{ // on regarde si l'utilisateur éventuellement ne veut aucune sortie
if (strstr(entreePrinc->tablcar,"pas_de_sortie_finale_")!=NULL)
{pas_de_sortie = true;
entreePrinc->NouvelleDonnee();
if (strstr(entreePrinc->tablcar,"COPIE")!=NULL)
{string nom;*(entreePrinc->entree) >> nom;
if (nom == "COPIE")
{ *(entreePrinc->entree) >> copie;
entreePrinc->NouvelleDonnee();
}
}
else
{copie=0;};
}
else
{// on lit jusqu'au prochain mot cle
string nom;
entreePrinc->NouvelleDonnee();
// definition d'un tableau de sous mot cle permettant
// l'arret a chaque sous mot cle dans les procedures specifiques
// de lecture
Tableau tsousMot(5);
tsousMot(1) = "COPIE";tsousMot(2) = "POINTS_INTEGRATION";
tsousMot(3) = "REACTIONS";tsousMot(4) = "DEGRE_DE_LIBERTE";
tsousMot(5) = "DEFORMEE";
// lecture
while ( !motCle.SimotCle(entreePrinc->tablcar))
{ *(entreePrinc->entree) >> nom;
if (nom == "COPIE")
{ *(entreePrinc->entree) >> copie;
entreePrinc->NouvelleDonnee();
}
else if (nom == "POINTS_INTEGRATION")
// cas des sorties au points d'integrations
{ReadPtInteg(lesRef,tsousMot);}
else if (nom == "REACTIONS")
{ReadReac(lesRef);}
else if (nom == "DEGRE_DE_LIBERTE")
{ReadNoeuds(lesRef);}
else if (nom == "DEFORMEE")
{ ReadDeformee(lesRef);
entreePrinc->NouvelleDonnee();
}
else
{ cout << "\n ** erreur en lecture des parametre de gestion des resultats"
<< " , nom lu : "<< nom;
entreePrinc->MessageBuffer
("** lecture des parametres de gestion des resultats **");
Affiche();
throw (UtilLecture::ErrNouvelleDonnee(-1));
Sortie (1);
};
}; // fin du while
}; // fin du if sur pas de sortie finale
}
else
{ cout << "\n lecture des parametres de gestion des resultats : pas d'informations particulières";
cout << "\n **** d'où : utilisation de TOUS les parametres par defaut !! ";
cout << endl;
};
};// fin d'un bloc
if (ParaGlob::NiveauImpression() >= 4)
cout << " fin de la lecture de la sortie automatique de resultats " << endl;
}
catch (UtilLecture::ErrNouvelleDonnee erreur)
{ if ( erreur.lecture == 1)
{ // fin de fichier atteind, ce n'est peut-être pas une erreur,
cout << "\n --- fin de fichier atteind sans mot cle ??? --- "
<< " \n (return pour continuer !) "<< flush;
// -------- utilitaire pour lire une chaine de caractères:
// si retour chariot, retourne la valeur par défaut passée en paramètre
// sinon retourne le string lue au clavier
// gestion d'erreur si lecture non correcte
// si avec_ecriture = true: on écrit "--> valeur par defaut : n " val_defaut
lect_return_defaut(false,"");
return;
}
else
{cout << "\n ===============================================\n" ;
// on signale l'erreur
cout << "\n **** bizarre, erreur inconnue en lecture des parametres de sortie de 'resultats' ( fin du .info ) ";
throw (erreur);
};
}
catch (ErrSortieFinale)
// cas d'une direction voulue vers la sortie
// on relance l'interuption pour le niveau supérieur
{ ErrSortieFinale toto;
throw (toto);
}
catch ( ... )
{ // on signale l'erreur
cout << "\n **** bizarre, erreur inconnue en lecture des parametres de sortie de resultats ";
throw (UtilLecture::ErrNouvelleDonnee(-1));
};
};
// affichage des parametres de gestions de la sortie des resultats
void Resultats::Affiche() const
{ cout << "\n parametres de gestion des resultats \n";
cout << "recopie de la lecture ? = " << copie << '\n';
};
// def interactive des parametres de gestion de la sortie des resultats
void Resultats::Info_commande_Resultats()
{ofstream & sort = *(entreePrinc->Commande_pointInfo()); // pour simplifier
string rep = " ";
while (Minuscules(rep) != "f")
{ cout << "\n\n sortie standard ? (rep o) ";
cout << "\n infos fichiers speciaux (rep ?) ";
cout << "\n sorte fichiers speciaux (rep s) ";
cout << "\n fin (rep f) ";
rep = lect_return_defaut(false,"f");
if ((rep == "o") || (rep == "O") || (rep == "0"))
{ sort << "\n# ------------------------------------------------------------------------------------ "
<< "\n resultats pas_de_sortie_finale_ "
<< "\n COPIE 0 "
<< "\n#";
}
else if (rep == "?")
{ cout << "\n Il s'agit uniquement des sorties automatiques effectuees a la fin de l'execution "
<< "\n donc des infos sur l'etat final en fin de calcul "
<< "\n fichiers: "
<< "\n .res (grandeurs aux pti) ; _cab.isoe (tableau des contraintes)"
<< "\n .ddl (les ddl aux noeuds) ; .reac (les reactions due aux blocages divers)"
<< "\n .cont (les reactions de contact) ; _dpl.points (tableau des deplacements des noeuds)"
<< "\n L'eventail de choix est restreint, si l'on veut plus de choix il faut utiliser la sortie interactive "
<< "\n et construire un fichier .CVisu "
<< "\n ce qui est automatique: .ddl, .reac, _cab.isoe, .cont, _dpl.points "
<< "\n ce qui peut etre modifie sont les grandeurs pour le .res "
<< "\n on indique les ref d elements ou l'on veut les sorties, puis la liste des grandeurs ";
}
else if (rep == "s")
{ cout << "\n -- constitution de la liste des references ---";
// -- construction de la liste de ref
string rop = " ";
list list_ref;
while (Minuscules(rop) != "f" )
{ cout << "\n non d'une ref existante -> (rep : nf) "
<< "\n effacer la liste a sortir -> (rep : ef) "
<< "\n la ref tout et un seul maillage(par defaut) -> (rep : to) "
<< "\n fin -> (rep : f) ";
rop = lect_return_defaut(false,"f");
if (rop == "nf")
{ string nom_ref;
cout << "\n nom de la reference ? ";nom_ref=lect_chaine();
string nom_mail; // par defaut
cout << "\n nom du maillage (ou _ si un seul maillage) ? "; nom_mail=lect_chaine();
list_ref.push_back(Deux_String(nom_mail,nom_ref));
}
else if (rop == "ef")
{ // on efface la liste des références d'éléments et la liste de pt d'integ associée
list_ref.clear();
}
else if (rop == "to")
{ list_ref.push_back(Deux_String("_","E_tout"));
};
// visualisation de la liste actuelle
if (list_ref.size() != 0)
{ list ::iterator ili,ilifin = list_ref.end();
cout << "\n liste actuelle de ref : ";
for (ili=list_ref.begin();ili != ilifin;ili++)
cout << "\n maillage: "<< (*ili).nom1 << " ref: "<< (*ili).nom2 <<" ";
cout << "\n ";
};
};
// -- construction de la liste des grandeurs à sortir
list list_grandeurs;
rop = " ";
while (Minuscules(rop) != "f" )
{ Tableau tsousMotref(9);
tsousMotref(1) = "Green-Lagrange";tsousMotref(2) = "Almansi";
tsousMotref(3) = "Cauchy_global";tsousMotref(4) = "Def_mixte_local";
tsousMotref(5) = "Sigma_mixte_local";tsousMotref(6) = "Sigma_principale";
tsousMotref(7) = "Def_principale";tsousMotref(8) = "Resultat_loi";
tsousMotref(9) = "logarithmique";
int pair=0;
for (int i=1;i<= 9; i++)
{if (pair == 0) {cout << "\n"< (rep : gr) "
<< "\n effacer la liste a sortir -> (rep : ef) "
<< "\n toutes les grandeurs (par defaut) -> (rep : to) "
<< "\n fin -> (rep : f) ";
rop = lect_return_defaut(false,"f");
if (rop == "gr")
{ string nom_ref;
cout << "\n nom de la grandeurs ? ";nom_ref=lect_chaine();
// vérif que la grandeur existe
bool existe=false;
for (int i=1;i<=9;i++)
if (tsousMotref(i)==nom_ref)
{existe = true;break;}
if (existe)
{ list_grandeurs.push_back(nom_ref);}
else
{ cout << "\n erreur la grandeur (** "<< nom_ref << " **) donnee ne correspond pas a une grandeur acceptable ";};
}
else if (rop == "ef")
{ // on efface la liste des grandeurs
list_grandeurs.clear();
}
else if (rop == "to")
{ for (int i=1;i<= 9; i++)
list_grandeurs.push_back(tsousMotref(i));
};
// visualisation de la liste actuelle
if (list_grandeurs.size() != 0)
{ list ::iterator ili,ilifin = list_grandeurs.end();
cout << "\n liste actuelle de grandeurs : ";
for (ili=list_grandeurs.begin();ili != ilifin;ili++)
cout << (*ili) << " ";
cout << "\n ";
};
};
// -- on sort les infos
sort << "\n# ---------------- resultats sur des fichiers particuliers -----------";
sort << "\n resultats #----------- "
<< "\n COPIE 0 "
<< "\n ";
list ::iterator im,imfin= list_grandeurs.end();
list ::const_iterator il,ilfin=list_ref.end();
for (il=list_ref.begin();il != ilfin;il++)
{sort << "\nPOINTS_INTEGRATION ";
if ((*il).nom1 != "_")
{ sort << "nom_mail= "<<(*il).nom1 << " ";};
sort << (*il).nom2 << "\n";
for (im = list_grandeurs.begin();im != imfin;im++)
sort << (*im) << " ";
};
sort << "\n ";
};
};
sort << flush;
/*
sort << "\n# Il s'agit uniquement des sorties automatiques effectuees a la fin de l'execution" //
<< "\n# Le choix est limite, si l'on veut plus de choix il faut utiliser la sortie interactive " //
<< "\n# et construire un fichier .CVisu " //
<< "\n# ------------------------------------------------------------------------------------ "; //
sort << "\n resultats #-----------mot cle " //
<< "\n# (( si le mot cle resultats est absent : utilisation de tous les parametres par defauts )) "
<< "\n#------------------------------------puis par exemple----------------------------------- "
<< "\nCOPIE 0 # =0 par defaut, si = 1: il y a recopie a l'ecran de tout ce qui a ete lue jusqu'ici "
<< "\nPOINTS_INTEGRATION E_tout "
<< "\nGreen-Lagrange Almansi Cauchy_global Def_mixte_local Sigma_mixte_local"
<< "\n#................................................................................"
<< "\n# explication: POINTS_INTEGRATION signifie que l'on veut une sortie aux points d'integration "
<< "\n# E_tout est la reference pour laquelle on veut les infos "
<< "\n# puis on definit certaines grandeurs que l'on veut sortir aux points d'integrations "
<< "\n# qui sont a choisir entre: "
<< "\n# Green-Lagrange Almansi Cauchy_global Def_mixte_local Sigma_mixte_local Sigma_principale"
<< "\n# Def_principale Resultat_loi logarithmique "
<< "\n#................................................................................."
<< "\n# ********* dans le cas particulier ou l'on veut aucun resultat on indique au debut "
<< "\n# resultats pas_de_sortie_finale_ "
<< "\n#";*/
};
// sortie des resultats suivant les infos stockee durant la lecture du fichier d'entree
void Resultats::SortieInfo
(ParaGlob * paraGlob,LesMaillages* lesMail,LesReferences* lesRef,
LesCondLim * lesCondLim,LesContacts* lescontacts)
{ // sortie des frontières dans le cas ou le calcul a été demandé
if ((paraGlob->TypeCalcul_principal(INFORMATIONS)) &&
(paraGlob->SousTypeCalcul(frontieres)))
SortieFrontieres(lesMail);
else if (!pas_de_sortie)
{ // sortie des grandeurs duales aux points d'integration
// sous une forme texte lisible
PointsDintegration(lesMail,lesRef);
// sortie des contraintes aux éléments en texte peu lisible mais condensé
SortieElemenContrainte(lesMail,paraGlob);
// sortie des ddls et grandeurs aux noeuds
SortieNoeuds(lesMail,lesRef);
// sortie des reactions
SortieReactions(lesMail,lesRef,lesCondLim);
// sortie d'information concernant le contact
if (lescontacts != NULL)
// appel d'une routine specifique
SortieContacts(lescontacts);
// cas d'un calcul de flambement
if (paraGlob->TypeCalcul_principal(FLAMB_LINEAIRE))
SortieFlamb();
// sortie des deformees pour livan
SortieDeformee(lesMail,lesRef,paraGlob);
// dans le cas ou l'on a une remontée aux contraintes, sortie d'isovaleurs
// de contraintes.
// récup de la liste des sous types
list const & lis_sous = paraGlob->LesSousTypesDeCalcul();
list ::const_iterator ik,ikfin; // iterators
ikfin = lis_sous.end();
for (ik= lis_sous.begin();ik!=ikfin;ik++)
if ( (Remonte_in(*ik)) && paraGlob->SousTypeCalcul(*ik))
SortieNoeudContaintes(lesMail,lesRef,paraGlob);
// dans le cas ou l'on a une remontée aux erreurs, sortie d'isovaleurs
// d'erreurs.
for (ik= lis_sous.begin();ik!=ikfin;ik++)
if (Erreur_in(*ik) && paraGlob->SousTypeCalcul(*ik))
{SortieNoeudErreur(lesMail,lesRef,paraGlob);
// idem mais aux éléments
SortieElemErreur(lesMail,lesRef,paraGlob);
}
// sortie des frontières dans le cas ou le calcul a été demandé
if ((paraGlob->TypeCalcul_principal(INFORMATIONS) ) &&
(paraGlob->SousTypeCalcul(frontieres)))
SortieFrontieres(lesMail);
};
// sortie de la deformee du maillage pour l'article
// tirer les commentaires !!!!!!!!
// DeformeeArticle(lesMail);
};
//----- lecture écriture base info -----
// lecture base info
void Resultats::Lect_result_base_info(istream& ent,const int cas)
{ if (cas == 1)
{ string toto;
// lecture de l'entête et vérification
ent >> toto ;
if (toto != "****Resultats")
Sortie(1);
ent >> pas_de_sortie ; // lecture de l'indication éventuelle de aucune sortie
// entrée des tableau des regions
// tout d'abord le nombre d'élément
int tabRegion_taille;
ent >> toto >> tabRegion_taille ;
// on boucle sur le nombre
BlocGen interne;
for (int i=1;i<= tabRegion_taille;i++)
{ ent >> interne; // lecture
// intégration dans la liste
tabRegion.push_back(interne);
}
// parametres de gestion
ent >> toto >> copie ;
}
};
// écriture base info
void Resultats::Ecri_result_base_info(ostream& sort,const int cas)
{ if (cas == 1)
{ sort << "\n ****Resultats "<< pas_de_sortie <<" \n";
// sortie des tableau des regions
// tout d'abord le nombre d'élément et un identificateur
sort << "liste_region:_nb= " << tabRegion.size() << "\n";
// on balaie la liste
list >::const_iterator i;
for (i=tabRegion.begin() ; i != tabRegion.end(); i++)
sort << (*i) ;
sort << "\n";
// parametres de gestion
sort << "copie: " << copie << " ";
};
sort << "\n\n" << endl; // pour passer une ligne et avoir une séparation plus claireflush;
};
// =============================== fonctions privates ==============
// lecture concernant les sorties aux points d'integration
void Resultats::ReadPtInteg(LesReferences* lesRef,Tableau& TsousMot)
{ // definition de la liste de mot specifique acceptable
Tableau tsousMotref(9);
tsousMotref(1) = "Green-Lagrange";tsousMotref(2) = "Almansi";
tsousMotref(3) = "Cauchy_global";tsousMotref(4) = "Def_mixte_local";
tsousMotref(5) = "Sigma_mixte_local";tsousMotref(6) = "Sigma_principale";
tsousMotref(7) = "Def_principale";tsousMotref(8) = "Resultat_loi";
tsousMotref(9) = "logarithmique";
string message =
" *** lecture des conditions de sortie des variables duales au points d\'integration";
// lecture
// on commence par passer le mot cle
string nom;
LectBlocmot lectBlocmot;
BlocDdlLim< BlocGen> blocMot = lectBlocmot.Lecture
(*entreePrinc,*lesRef,message,tsousMotref,TsousMot);
// stockage
tabRegion.push_back(blocMot);
};
// Lectures concernant les sorties aux noeuds
void Resultats::ReadNoeuds(LesReferences* )
{
};
// lectures concernant les reactions
void Resultats::ReadReac(LesReferences* )
{
};
// lectures concernant les deformees
void Resultats::ReadDeformee(LesReferences* )
{
};
// sortie des grandeurs duales aux points d'integration
void Resultats::PointsDintegration(LesMaillages* lesMail,LesReferences* lesRef)
{ // ouverture du fichier de resultats
char nomm[132];
char*fileName = nomm;
strcpy(fileName,entreePrinc->RacineNom());
ofstream sort(strcat(fileName,".res"));
if(!(sort.is_open()))
{ cout << "\n erreur en ouverture du fichier " << fileName
<< ", Resultats::PointsDintegration(etc..." << endl;
Sortie(1);
};
// cas ou la liste est vide, on sort toutes les informations
if (tabRegion.size() == 0)
{ for (int numMail=1;numMail<= lesMail->NbMaillage();numMail++)
for (int numElem=1; numElem<= lesMail->Nombre_element(numMail);numElem++)
{ // recup de l'element
Element & elem = lesMail->Element_LesMaille(numMail,numElem);
sort << "\n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&" ;
sort << "\n element " << numElem << " du maillage " << numMail;
sort << "\n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&" ;
Tableau tab; // tableau vide
elem.AfficheVarDual(sort,tab);
}
}
// sinon on balaie la liste de reference d'element a sortir
list >::iterator ibloc; // def d'un iterator adoc
for (ibloc=tabRegion.begin(); ibloc != tabRegion.end(); ibloc++)
{ // recup de la reference correspondant au mot cle
const ReferenceNE & ref
= ((ReferenceNE &)lesRef->Trouve((*ibloc).NomRef(),(*ibloc).NomMaillage()));
if (ref.Indic() != 2)
// cas autre que des elements
{ cout << "\n sortie de resultats aux points d\'integration "
<< "autre que sur des elements pas d\'action implentee a ce sujet !!";
cout << "\nResultats::PointsDintegration(etc... " << endl;
Sortie(1);
}
else
{
// cas des elements
Tableau tab;
if ((*ibloc).DimNom() > 1)
// cas ou des noms de variable duale sont specifies
{ tab.Change_taille((*ibloc).DimNom() -1);
for (int nbnom=2; nbnom<= (*ibloc).DimNom(); nbnom++)
tab (nbnom-1) = (*ibloc).Nom(nbnom);
}
for (int nn =1; nn<= ref.Taille();nn++)
{ // recup de l'element
Element & elem = lesMail->Element_LesMaille(ref.Nbmaille(),ref.Numero(nn));
sort << "\n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&" ;
sort << "\n element " << ref.Numero(nn) << " du maillage " << ref.Nbmaille();
sort << "\n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&" ;
elem.AfficheVarDual(sort,tab);
}
}
}
// on vide le buffer de sortie
sort << endl;
};
// sortie des ddls et grandeurs aux noeuds
void Resultats::SortieNoeuds(LesMaillages* lesMail,LesReferences* )
{ // ouverture du fichier de resultats
char nomm[132];
char*fileName = nomm;
strcpy(fileName,entreePrinc->RacineNom());
ofstream sort(strcat(fileName,".ddl"));
if(!(sort.is_open()))
{ cout << "\n erreur en ouverture du fichier " << fileName
<< ", Resultats::SortieNoeuds(etc..." << endl;
Sortie(1);
};
// on balaie tous les noeuds de tous les maillages
int nbmaximaillage = lesMail->NbMaillage();
for (int numMail=1;numMail<= nbmaximaillage;numMail++)
{ int nbmaxinoeud = lesMail->Nombre_noeud(numMail);
for (int numNoeud=1; numNoeud<= nbmaxinoeud;numNoeud++)
{ // recup du noeud
Noeud & noe = lesMail->Noeud_LesMaille(numMail,numNoeud);
noe.Affiche(sort);
}
}
// on vide le buffer de sortie
sort << endl;
};
// sortie des reactions
void Resultats::SortieReactions
(LesMaillages* lesMail,LesReferences* ,LesCondLim * lesCondLim)
{ // ouverture du fichier de resultats
char nomm[132];
char*fileName = nomm;
strcpy(fileName,entreePrinc->RacineNom());
ofstream sort(strcat(fileName,".reac"));
if(!(sort.is_open()))
{ cout << "\n erreur en ouverture du fichier " << fileName
<< ", Resultats::SortieNoeuds(etc..." << endl;
Sortie(1);
};
// affichage
lesCondLim->Affiche_reaction(sort,lesMail);
// on vide le buffer de sortie
sort << endl;
};
// sortie du contact
void Resultats::SortieContacts(LesContacts* lescontacts)
{ // ouverture du fichier de resultats
char nomm[132];
char*fileName = nomm;
strcpy(fileName,entreePrinc->RacineNom());
ofstream sort(strcat(fileName,".cont"));
if(!(sort.is_open()))
{ cout << "\n erreur en ouverture du fichier " << fileName
<< ", Resultats::SortieNoeuds(etc..." << endl;
Sortie(1);
};
// affichage
sort << "#=====================================================\n";
sort << "# Reactions de contact \n";
sort << "#=====================================================\n";
lescontacts->Affiche(sort);
// on vide le buffer de sortie
sort << endl;
};
// sortie pour le flambement
void Resultats::SortieFlamb()
{ // ouverture du fichier de resultats
char nomm[132];
char*fileName = nomm;
strcpy(fileName,entreePrinc->RacineNom());
ofstream sort(strcat(fileName,".flamb"));
if(!(sort.is_open()))
{ cout << "\n erreur en ouverture du fichier " << fileName
<< ", Resultats::SortieFlamb()" << endl;
Sortie(1);
};
// affichage
sort << "#=====================================================\n";
sort << "# cas d'un calcul de flambement \n";
sort << "#=====================================================\n";
lesValVecPropres.Affiche(sort);
// on vide le buffer de sortie
sort << endl;
};
// sortie des deformees
void Resultats::SortieDeformee(LesMaillages* lesMail,LesReferences*,ParaGlob * paraGlob )
{ // on veut sortir une deforme pour chaque maillage
int nbmaximaillage = lesMail->NbMaillage();
for (int numMail=1;numMail<= nbmaximaillage;numMail++)
{ // ouverture du fichier pour ecrire la deformee
char nomm[132];
char*fileName = nomm;
// transformation du nb de maillage en char*
string toto = ChangeEntierSTring(numMail );
char* cnbmaille = (char *) toto.c_str();
strcpy(fileName,entreePrinc->RacineNom());
ofstream sort(strcat(strcat(fileName,cnbmaille),"_dpl.points"));
if(!(sort.is_open()))
{ cout << "\n erreur en ouverture du fichier " << fileName
<< ", Resultats::SortieDeformee(etc..." << endl;
Sortie(1);
}
// on balaie tous les noeuds du maillage
int nbmaxinoeud = lesMail->Nombre_noeud(numMail);
sort << nbmaxinoeud << "\n ";
Coordonnee coor_zero(paraGlob->Dimension ()); // coordonnées nulles
for (int numNoeud=1; numNoeud<= nbmaxinoeud;numNoeud++)
{ // recup du noeud
Noeud & noe = lesMail->Noeud_LesMaille(numMail,numNoeud);
if (noe.ExisteCoord1())
{ // ecriture de la difference de coordonnee entre 0 et t
sort << setw (16); (noe.Coord1() - noe.Coord0() ).Affiche(sort,16);
}
else
{ // cas où le noeud n'a pas bougé
// ecriture de la difference de coordonnee entre 0 et t
sort << setw (16); coor_zero.Affiche(sort,16);
}
// si l'on n'est pas en dimension 3 on complete avec des zeros
if (paraGlob->Dimension () == 2)
{ sort << setw (16) << 0 <<" ";
}
else if (paraGlob->Dimension () == 1)
{ sort << setw (16) << 0 <<" " << setw (16) << 0 <<" ";
}
sort << setw (16) << 0 << "\n ";
}
// on vide le buffer de sortie
sort << endl;
};
};
// dans le cas ou l'on a une remontée aux contraintes, sortie d'isovaleurs
// de contraintes.
void Resultats::SortieNoeudContaintes
(LesMaillages* lesMail,LesReferences* ,ParaGlob * paraGlob)
{ // on sort les contraintes aux noeuds dans le cas où a priori elles ont
// ete calculées
// récup de la liste des sous types
list const & lis_sous = paraGlob->LesSousTypesDeCalcul();
list ::const_iterator ik,ikfin; // iterators
ikfin = lis_sous.end();
for (ik= lis_sous.begin();ik!=ikfin;ik++)
if ( (Remonte_in(*ik)) && paraGlob->SousTypeCalcul(*ik))
{
// on veut sortir des isovaleurs pour chaque maillage
int nbmaximaillage = lesMail->NbMaillage();
for (int numMail=1;numMail<= nbmaximaillage;numMail++)
{ // ouverture du fichier pour ecrire contraintes aux noeuds
char nomm[132];
char*fileName = nomm;
// transformation du nb de maillage en char*
string toto = ChangeEntierSTring(numMail );
char* cnbmaille = (char *) toto.c_str();
strcpy(fileName,entreePrinc->RacineNom());
ofstream sort(strcat(strcat(fileName,cnbmaille),"_cab.ison"));
if(!(sort.is_open()))
{ cout << "\n erreur en ouverture du fichier " << fileName
<< ", Resultats::SortieNoeudContaintes(etc..." << endl;
Sortie(1);
}
int dim = paraGlob->Dimension ();
// on balaie tous les noeuds du maillage
int nbmaxinoeud = lesMail->Nombre_noeud(numMail);
// écriture de l'entête
sort << nbmaxinoeud << " 0 \n";
int nbcomposante; // nombre de composante du tenseur des contraintes
sort << " ";
switch (dim)
{ case 1 : sort << " Sig11 SigI Mises "
<< " Tresca" ; nbcomposante= 1; break;
case 2 : sort << " Sig11 Sig22 Sig12 "
<< " SigI SigII Mises "
<< " Tresca" ; nbcomposante= 3; break;
case 3 : sort << " Sig11 Sig22 Sig33 "
<< " Sig12 Sig13 Sig23 "
<< " SigI SigII SigIII "
<< " Mises Tresca"; nbcomposante= 6; break;
};
sort << '\n';
// def d'un vecteur contenant les coordonnées du tenseur
Vecteur Sig; // dimension par défaut
Coordonnee valPropreSig;
for (int numNoeud=1; numNoeud<= nbmaxinoeud;numNoeud++)
{ // recup du noeud
Noeud & noe = lesMail->Noeud_LesMaille(numMail,numNoeud);
bool retour = noe.Contrainte(Sig); // recup des contraintes
// écriture
sort << setw (5) << "-1";
if (retour)
{ // sortie des contraintes
for (int i=1;i<= nbcomposante;i++)
sort << setw (16) << Sig(i) << " " ;
// ---- sortie des contraintes principales ---
// 1) reconstitution du tenseur
TenseurHB* sigHB;
switch (dim)
{ case 1 : sigHB = new Tenseur1HB(Sig(1)); break;
case 2 : sigHB = new Tenseur2HB(Sig(1),Sig(2),Sig(3),Sig(3)); break;
case 3 : sigHB = new Tenseur3HB(Sig(1),Sig(4),Sig(5),
Sig(4),Sig(2),Sig(6),
Sig(5),Sig(6),Sig(3)); break;
};
// 2) calcul des valeurs propres
int cas;
valPropreSig = sigHB->ValPropre(cas);
if (cas == -1)
{ cout << "\n warning *** erreur dans le calcul des valeurs propres de la contrainte";
if (ParaGlob::NiveauImpression() >= 7)
{sigHB->Ecriture(cout); cout << "\nResultats::SortieNoeudContaintes(...";};
cout << endl;
};
// 3) sortie des contraintes principales
int nval = valPropreSig.Dimension();
for (int i=1;i<= nval;i++)
sort << setw (16) << valPropreSig(i) << " " ;
// 4) def de la contrainte de Mises et de Tresca
Coordonnee& vv = valPropreSig; // pour condenser l'écriture
double Mises = 0.; double Tresca = 0.;
if (dim ==1) { Mises = Dabs(vv(1)); Tresca = Mises/2.;}
else if (dim ==2) { Mises = Dabs(vv(1)-vv(2));Tresca = Mises/2.;}
else {Mises = sqrt( ((vv(1)-vv(2))*(vv(1)-vv(2)) + (vv(1)-vv(3))*(vv(1)-vv(3))
+ (vv(3)-vv(2))*(vv(3)-vv(2))) * 0.5);;
Tresca = 0.5* MaX( MaX(Dabs(vv(1)-vv(2)),Dabs(vv(1)-vv(3))), Dabs(vv(2)-vv(3)));
}
// 5) Sortie de Mises et Tresca
sort << setw (16) << Mises << " " << setw (16) << Tresca << " " ;
sort << '\n';
}
}
// on vide le buffer de sortie
sort << endl;
};
};
};
// dans le cas ou l'on a une remontée aux erreurs, sortie d'isovaleurs
// d'erreur aux noeuds.
void Resultats::SortieNoeudErreur
(LesMaillages* lesMail,LesReferences* ,ParaGlob * paraGlob)
{ // on sort les erreurs aux noeuds dans le cas où a priori elles ont
// ete calculées
// récup de la liste des sous types
list const & lis_sous = paraGlob->LesSousTypesDeCalcul();
list ::const_iterator ik,ikfin; // iterators
ikfin = lis_sous.end();
for (ik= lis_sous.begin();ik!=ikfin;ik++)
if (Erreur_in(*ik) && paraGlob->SousTypeCalcul(*ik))
{
// on veut sortir des isovaleurs pour chaque maillage
int nbmaximaillage = lesMail->NbMaillage();
for (int numMail=1;numMail<= nbmaximaillage;numMail++)
{ // ouverture du fichier pour ecrire contraintes aux noeuds
char nomm[132];
char*fileName = nomm;
// transformation du nb de maillage en char*
string toto = ChangeEntierSTring(numMail );
char* cnbmaille = (char *) toto.c_str();
strcpy(fileName,entreePrinc->RacineNom());
ofstream sort(strcat(strcat(fileName,cnbmaille),"_err.ison"));
if(!(sort.is_open()))
{ cout << "\n erreur en ouverture du fichier " << fileName
<< ", Resultats::SortieNoeudErreur(etc..." << endl;
Sortie(1);
}
//int dim = paraGlob->Dimension ();
// on balaie tous les noeuds du maillage
int nbmaxinoeud = lesMail->Nombre_noeud(numMail);
// écriture de l'entête
sort << nbmaxinoeud << " 0 \n";
sort << " ERREUR \n";
// tout d'abord on fait un premier passage pour déterminer le
// minimum de l'erreur
double miniErreur =0.;
for (int numNoeud=1; numNoeud<= nbmaxinoeud;numNoeud++)
{ // recup du noeud
Noeud & noe = lesMail->Noeud_LesMaille(numMail,numNoeud);
miniErreur = MiN(noe.Valeur_t(ERREUR),miniErreur);
}
// sortie des erreurs traités avec les log pour augmenter
// la plage de concentration
for (int numNoeud=1; numNoeud<= nbmaxinoeud;numNoeud++)
{ // recup du noeud
Noeud & noe = lesMail->Noeud_LesMaille(numMail,numNoeud);
// écriture conditionnelle
if (noe.Existe_ici(ERREUR))
{ sort << setw (5) << "-1";
double erreur = noe.Valeur_t(ERREUR); // l'erreur
// finalement on sort une grandeur régulée par le log
// avec un décalage sur 1 pour le mini, d'où un log nul
sort << setw (16) << (log(erreur-miniErreur+1.)) << " " ;
// sort << setw (16) << erreur << " " ;
sort << '\n';
}
}
// on vide le buffer de sortie
sort << endl;
};
};
};
// dans le cas ou l'on a une remontée aux erreurs, sortie des valeurs d'erreur
// aux éléments.
void Resultats::SortieElemErreur
(LesMaillages* lesMail,LesReferences* ,ParaGlob * paraGlob)
{ // on sort les erreurs aux éléments dans le cas où a priori elles ont
// ete calculées
// récup de la liste des sous types
list const & lis_sous = paraGlob->LesSousTypesDeCalcul();
list ::const_iterator ik,ikfin; // iterators
ikfin = lis_sous.end();
for (ik= lis_sous.begin();ik!=ikfin;ik++)
if (Erreur_in(*ik) && paraGlob->SousTypeCalcul(*ik))
{
// on veut sortir les valeurs pour chaque maillage
int nbmaximaillage = lesMail->NbMaillage();
for (int numMail=1;numMail<= nbmaximaillage;numMail++)
{ // ouverture du fichier pour ecrire aux éléments
char nomm[132];
char*fileName = nomm;
// transformation du nb de maillage en char*
string toto = ChangeEntierSTring(numMail );
char* cnbmaille = (char *) toto.c_str();
strcpy(fileName,entreePrinc->RacineNom());
ofstream sort(strcat(strcat(fileName,cnbmaille),"_err.isoe"));
if(!(sort.is_open()))
{ cout << "\n erreur en ouverture du fichier " << fileName
<< ", Resultats::SortieElemErreur(etc..." << endl;
Sortie(1);
}
//int dim = paraGlob->Dimension ();
// on balaie tous les éléments du maillage
int nbmaxiElement = lesMail->Nombre_element(numMail);
// écriture de l'entête
sort << nbmaxiElement << " 0 \n";
sort << " ERREUR \n";
for (int numElem=1; numElem<= nbmaxiElement;numElem++)
{ // recup de l'élément
Element & noel = lesMail->Element_LesMaille(numMail,numElem);
// écriture conditionnelle au cas mécanique et au cas ou l'erreur a été
// calculée
if (noel.Id_TypeProblem() == MECA_SOLIDE_DEFORMABLE)
if (((ElemMeca&) noel).ErreurDejaCalculee())
{sort << setw (5) << "-1";
double erreur = noel.Erreur(); // l'erreur
// l'erreur doit être forcément supérieur à 0
// dans le cas où elle est négative, on la met à 0
if(erreur < 0.)
erreur = 0.;
sort << setw (16) << erreur << " " ;
sort << '\n';
}
}
// on vide le buffer de sortie
sort << endl;
};
};
};
// sortie des contraintes aux éléments en texte peu lisible mais condensé
void Resultats::SortieElemenContrainte
(LesMaillages* lesMail,ParaGlob * paraGlob)
{ // on veut sortir les valeurs pour chaque maillage
int nbmaximaillage = lesMail->NbMaillage();
for (int numMail=1;numMail<= nbmaximaillage;numMail++)
{ // ouverture du fichier pour ecrire aux éléments
char nomm[132];
char*fileName = nomm;
// transformation du nb de maillage en char*
string toto = ChangeEntierSTring(numMail );
char* cnbmaille = (char *) toto.c_str();
strcpy(fileName,entreePrinc->RacineNom());
ofstream sort(strcat(strcat(fileName,cnbmaille),"_cab.isoe"));
if(!(sort.is_open()))
{ cout << "\n erreur en ouverture du fichier " << fileName
<< ", Resultats::SortieElemenContrainte(etc..." << endl;
Sortie(1);
}
int dim = paraGlob->Dimension ();
// on balaie tous les éléments du maillage
int nbmaxiElement = lesMail->Nombre_element(numMail);
// écriture de l'entête
sort << " 0 " << nbmaxiElement << " \n";
int nbcomposante; // nombre de composante du tenseur des contraintes
sort << " ";
switch (dim)
{ case 1 : sort << " Sig11 "; nbcomposante= 1; break;
case 2 : sort << " Sig11 Sig22 Sig12"; nbcomposante= 3; break;
case 3 : sort << " Sig11 Sig22 Sig33 "
<< " Sig12 Sig23 Sig13"; nbcomposante= 6; break;
};
sort << '\n';
// def d'un tableau de vecteur contenant les coordonnées du tenseur
Tableau tabSig; // dimension par défaut
// il est redimensionné dans l'élément si nécessaire
// on regarde sur le premier élément qui doit être de type mécanique
// du maillage si le calcul de contrainte
// est possible si oui on continu et on considère que c'est possible pour
// tous les autres sinon arrêt pour ce maillage
Element & elem = lesMail->Element_LesMaille(numMail,1);
bool possible;
if (elem.Id_TypeProblem() == MECA_SOLIDE_DEFORMABLE)
possible = ((ElemMeca&) elem).ContrainteAbsoluePossible();
else
possible = false;
if (possible)
for (int numElem=1; numElem<= nbmaxiElement;numElem++)
{ // recup de l'élément
Element & elem = lesMail->Element_LesMaille(numMail,numElem);
// on regarde si c'est un élément de mécanique
// si oui on récupère le tableau des tenseurs en absolu
bool retour = false;
if (elem.Id_TypeProblem() == MECA_SOLIDE_DEFORMABLE)
retour =((ElemMeca&) elem).ContraintesAbsolues(tabSig);
else
retour = false;
// écriture
if (retour)
{
sort << setw (5) << "-1 " ;
int taille = tabSig.Taille();
for (int ni = 1; ni<= taille; ni++)
for (int i=1;i<= nbcomposante;i++)
sort << setw (16) << tabSig(ni)(i) << " " ;
sort << '\n';
}
}
// on vide le buffer de sortie
sort << endl;
};
};
// sortie des frontières
void Resultats::SortieFrontieres (LesMaillages* lesMail)
{ //récupération de la liste de frontière
Tableau *>& tablist = lesMail->ListFrontiere();
// on veut sortir les valeurs pour chaque maillage
int nbmaximaillage = lesMail->NbMaillage();
for (int numMail=1;numMail<= nbmaximaillage;numMail++)
{ // ouverture du fichier d'écriture
char nomm[132];
char*fileName = nomm;
// transformation du nb de maillage en char*
string toto = ChangeEntierSTring(numMail );
char* cnbmaille = (char *) toto.c_str();
strcpy(fileName,entreePrinc->RacineNom());
// le .faces
ofstream sort(strcat(strcat(fileName,cnbmaille),"_front.faces"));
if(!(sort.is_open()))
{ cout << "\n erreur en ouverture du fichier .faces" << fileName
<< ", Resultats::SortieFrontieres (LesMaillages* lesMail)" << endl;
Sortie(1);
};
//récupération de la liste de frontière
LaLIST & listfront = *(tablist(numMail)); // pour simplifier
int nbmaxiElement = (int) listfront.size();
// écriture de l'entête
sort << " elements \n \n" << nbmaxiElement << " ELEMENTS \n \n";
sort << "#-----------------------------------------------------------------------\n";
sort << "# NO Type Noeuds |\n";
sort << "#-----------------------------------------------------------------------\n \n";
LaLIST ::iterator ip;int ne;
for (ne=1,ip = listfront.begin();ip != listfront.end(); ip++,ne++)
{ // écriture de l'élément courant
sort << ne << " " ; // le numéro
const ElemGeomC0 & geom = (*ip).Eleme()->ElementGeometrique();
sort << Nom_geom(geom.TypeGeometrie()) << " " ; // la géométrie
sort << Nom_interpol(geom.TypeInterpolation()) << " " ; // l'interpolation
// les noeuds
Tableau tabnoeud = (*ip).Eleme()->TabNoeud();
int taille = tabnoeud.Taille();
for (int ine = 1; ine<=taille; ine++)
sort << tabnoeud(ine)->Num_noeud() << " ";
sort << "\n";
}
// on vide le buffer de sortie
sort << endl;
// on ne continue que s'il y a des éléments frontières
if (listfront.size() != 0)
{// dans le cas d'un maillage 2D donc d'une frontière 1D on essaie de sortir
// la frontière ordonnée
// le .faces
ip = listfront.begin() ; // on prend le premier pour tester
if ((*ip).Eleme()->ElementGeometrique().Dimension() == 1)
{ char nomm2[132];
char*file2Name = nomm2;
strcpy(file2Name,entreePrinc->RacineNom());
ofstream sirt(strcat(strcat(file2Name,cnbmaille),"_frOrdre.faces"));
if(!(sirt.is_open()))
{ cout << "\n erreur en ouverture du fichier .faces" << fileName
<< ", Resultats::SortieFrontieres (LesMaillages* lesMail)" << endl;
Sortie(1);
}
// écriture de l'entête
sirt << " elements \n \n" << nbmaxiElement << " ELEMENTS \n \n";
sirt << "#-----------------------------------------------------------------------\n";
sirt << "# NO Type Noeuds |\n";
sirt << "#-----------------------------------------------------------------------\n \n";
int ne = 1;
Front * precedent = NULL;
Front * debut = &(*ip);
Front* elfront = &(*ip);
while(ne <= nbmaxiElement)
{ // écriture de l'élément courant
sirt << ne << " " ; // le numéro
const ElemGeomC0 & geom = elfront->Eleme()->ElementGeometrique();
sirt << Nom_geom(geom.TypeGeometrie()) << " " ; // la géométrie
sirt << Nom_interpol(geom.TypeInterpolation()) << " " ; // l'interpolation
// les noeuds
Tableau tabnoeud = elfront->Eleme()->TabNoeud();
int taille = tabnoeud.Taille();
for (int ine = 1; ine<=taille; ine++)
sirt << tabnoeud(ine)->Num_noeud() << " ";
sirt << "\n";
ne++;
// récupération de l'élément frontière suivant
const Tableau * tabmitoyen=elfront->TabMitoyen();
if (tabmitoyen != NULL)
{for (int i=1;i<=tabmitoyen->Taille();i++)
if ((*tabmitoyen)(i) != precedent)
{ elfront = &(*(*tabmitoyen)(i));
break;
}
};
// si l'on a rejoint le début on s'arrête
if ( elfront == debut) break;
};
ne--;
if (ne != nbmaxiElement)
// cas où l'on n'a pas parcouru toute la liste
cout << " \n Resultats::SortieFrontieres (LesMaillages* lesMail)"
<< "\n pour la sortie ordonnée, "
<< " toutes les frontières n'ont pas été copiées !!"
<< "\n sans doute parce que les frontières sont "
<< " constituées de plusieurs boucles \n";
// on vide le buffer de sortie
sirt << endl;
}
};
};
};
// sortie de la deformee du maillage pour l'article
void Resultats::DeformeeArticle(LesMaillages* lesmail)
{// ouverture du fichier de resultats
char nomm[132];
char*fileName = nomm;
strcpy(fileName,entreePrinc->RacineNom());
ofstream sort(strcat(fileName,".def"));
if(!(sort.is_open()))
{ cout << "\n erreur en ouverture du fichier " << fileName
<< ", Resultats::SortieNoeuds(etc..." << endl;
Sortie(1);
};
// on divise les faces des cubes en n*n petites facettes
int n = 4 ; // 4 par defaut
// question sur le cas
int cas;
cout << " cas 1cube seule (3), avec biellette (1) , 2 cube (2) ou autre pour arreter?\n"
<< " (un nombre negatif pour avoir les ligne du cube initial) "
<< " un cube et une biellette lies (4), deux cubes lies (5)";
cas=(int)lect_double();
cout << "\n valeur de n ? ";
n = (int) lect_double();
if ((cas!=1) && (cas!=2) && (cas!=3)&&(cas!=-1) && (cas!=-2)
&& (cas!=-3) && (Dabs(cas) != 4) && (Dabs(cas) != 5) ) return;
// si cas = 1 -> 1 cube sinon 2 cubes
int nbface; //nb face
int nbnoe; // nb de noeud
int nbface0 = 0; //nb face a t= 0
int nbnoe0 = 0; // nb de noeud a t = 0
Tableau tabCgen; // tableau general des noeuds
Tableau < Tableau > tabFgen; // tableau general des faces
if (cas < 0)
{ nbface0 = 12;
nbnoe0 = 8;
}
Tableau tabc; // tableau inter
Tableau < Tableau > tabF;// " "
int inNoe =1; // indice de noeud
int inFace =1; // indice de face
int decalNoe = 0; // decalage sur les noeuds
if (Dabs(cas) == 3)
{ nbface = 6*n*n + nbface0;
nbnoe = 8 + (n-1)*12 + (n-1)*(n-1)*6 + nbnoe0 ;
tabCgen.Change_taille(nbnoe);
tabFgen.Change_taille(nbface);
// premier maillage -> le cube
Tableau& t1 = lesmail->Element_LesMaille(1,1).Tab_noeud();
ZoomElem(t1,n,tabc,tabF);
for (int i=1;i<=tabc.Taille();i++,inNoe++)
tabCgen(inNoe) = tabc(i);
for (int i=1;i<=tabF.Taille();i++,inFace++)
tabFgen(inFace) = tabF(i);
decalNoe += tabc.Taille();
// second maillage le cube initial
if (cas < 0)
{ InitialC(t1,n,tabc,tabF);
for (int i=1;i<=tabc.Taille();i++,inNoe++)
tabCgen(inNoe) = tabc(i);
for (int i=1;i<=tabF.Taille();i++,inFace++)
{ tabFgen(inFace).Change_taille(4);
for (int j=1;j<=4;j++)
tabFgen(inFace)(j) = tabF(i)(j)+decalNoe;
}
}
}
else if (Dabs(cas) == 1)
{ nbface = 6*n*n + 1 + nbface0;
nbnoe = 8 + (n-1)*12 + (n-1)*(n-1)*6 + 2 + nbnoe0;
tabCgen.Change_taille(nbnoe);
tabFgen.Change_taille(nbface);
// 1er maillage -> la biellete
Tableau& t1 = lesmail->Element_LesMaille(1,1).Tab_noeud();
tabFgen(1).Change_taille(4);
tabFgen(1)(1) = 1;tabFgen(1)(2) = 2;
tabFgen(1)(3) = 1;tabFgen(1)(4) = 1;
tabCgen(1) = t1(1)->Coord2();tabCgen(2) = t1(2)->Coord2();
inNoe = 3; inFace = 2; decalNoe += 2;
// second maillage -> le cube deforme
Tableau& t2 = lesmail->Element_LesMaille(2,1).Tab_noeud();
ZoomElem(t2,n,tabc,tabF);
for (int i=1;i<=tabc.Taille();i++,inNoe++)
tabCgen(inNoe) = tabc(i);
for (int i=1;i<=tabF.Taille();i++,inFace++)
{ tabFgen(inFace).Change_taille(4);
for (int j=1;j<=4;j++)
tabFgen(inFace)(j) = tabF(i)(j)+decalNoe;
}
decalNoe += tabc.Taille();
// troisieme maillage le cube initial
if (cas < 0)
{ InitialC(t2,n,tabc,tabF);
for (int i=1;i<=tabc.Taille();i++,inNoe++)
tabCgen(inNoe) = tabc(i);
for (int i=1;i<=nbface0;i++,inFace++)
{ tabFgen(inFace).Change_taille(4);
for (int j=1;j<=4;j++)
tabFgen(inFace)(j) = tabF(i)(j)+decalNoe;
}
}
}
else if (Dabs(cas) == 4)
{ nbface = 6*n*n + 1 + nbface0;
nbnoe = 8 + (n-1)*12 + (n-1)*(n-1)*6 + 2 + nbnoe0;
tabCgen.Change_taille(nbnoe);
tabFgen.Change_taille(nbface);
// 1er maillage -> la biellete -> second element
Tableau& t1 = lesmail->Element_LesMaille(1,2).Tab_noeud();
tabFgen(1).Change_taille(4);
tabFgen(1)(1) = 1;tabFgen(1)(2) = 2;
tabFgen(1)(3) = 1;tabFgen(1)(4) = 1;
tabCgen(1) = t1(1)->Coord2();tabCgen(2) = t1(2)->Coord2();
inNoe = 3; inFace = 2; decalNoe += 2;
// second maillage -> le cube deforme -> le premier element
Tableau& t2 = lesmail->Element_LesMaille(1,1).Tab_noeud();
ZoomElem(t2,n,tabc,tabF);
for (int i=1;i<=tabc.Taille();i++,inNoe++)
tabCgen(inNoe) = tabc(i);
for (int i=1;i<=tabF.Taille();i++,inFace++)
{ tabFgen(inFace).Change_taille(4);
for (int j=1;j<=4;j++)
tabFgen(inFace)(j) = tabF(i)(j)+decalNoe;
}
decalNoe += tabc.Taille();
// troisieme maillage le cube initial
if (cas < 0)
{ InitialC(t2,n,tabc,tabF);
for (int i=1;i<=tabc.Taille();i++,inNoe++)
tabCgen(inNoe) = tabc(i);
for (int i=1;i<=nbface0;i++,inFace++)
{ tabFgen(inFace).Change_taille(4);
for (int j=1;j<=4;j++)
tabFgen(inFace)(j) = tabF(i)(j)+decalNoe;
}
}
}
else if (Dabs(cas) == 2)
{ nbface = 12*n*n + 2*nbface0;
nbnoe = 2*(8 + (n-1)*12 + (n-1)*(n-1)*6) + 2*nbnoe0;
tabCgen.Change_taille(nbnoe);
tabFgen.Change_taille(nbface);
// 1er maillage -> le premier cube deforme
Tableau& t1 = lesmail->Element_LesMaille(1,1).Tab_noeud();
ZoomElem(t1,n,tabc,tabF);
for (int i=1;i<=tabc.Taille();i++,inNoe++)
tabCgen(inNoe) = tabc(i);
for (int i=1;i<=tabF.Taille();i++,inFace++)
{ tabFgen(inFace).Change_taille(4);
for (int j=1;j<=4;j++)
tabFgen(inFace)(j) = tabF(i)(j)+decalNoe;
}
decalNoe += tabc.Taille();
// 2ieme maillage le 1er cube initial
if (cas < 0)
{ InitialC(t1,n,tabc,tabF);
for (int i=1;i<=tabc.Taille();i++,inNoe++)
tabCgen(inNoe) = tabc(i);
for (int i=1;i<=nbface0;i++,inFace++)
{ tabFgen(inFace).Change_taille(4);
for (int j=1;j<=4;j++)
tabFgen(inFace)(j) = tabF(i)(j)+decalNoe;
}
decalNoe += tabc.Taille();
}
// 3ieme maillage -> le second cube deforme
Tableau& t2 = lesmail->Element_LesMaille(2,1).Tab_noeud();
ZoomElem(t2,n,tabc,tabF);
for (int i=1;i<=tabc.Taille();i++,inNoe++)
tabCgen(inNoe) = tabc(i);
for (int i=1;i<=tabF.Taille();i++,inFace++)
{ tabFgen(inFace).Change_taille(4);
for (int j=1;j<=4;j++)
tabFgen(inFace)(j) = tabF(i)(j)+decalNoe;
}
decalNoe += tabc.Taille();
// 4ieme maillage le 2er cube initial
if (cas < 0)
{ InitialC(t2,n,tabc,tabF);
for (int i=1;i<=tabc.Taille();i++,inNoe++)
tabCgen(inNoe) = tabc(i);
for (int i=1;i<=nbface0;i++,inFace++)
{ tabFgen(inFace).Change_taille(4);
for (int j=1;j<=4;j++)
tabFgen(inFace)(j) = tabF(i)(j)+decalNoe;
}
decalNoe += tabc.Taille();
}
}
else if (Dabs(cas) == 5)
{ nbface = 12*n*n + 2*nbface0;
nbnoe = 2*(8 + (n-1)*12 + (n-1)*(n-1)*6) + 2*nbnoe0;
tabCgen.Change_taille(nbnoe);
tabFgen.Change_taille(nbface);
// 1er maillage -> le premier cube deforme
Tableau& t1 = lesmail->Element_LesMaille(1,1).Tab_noeud();
ZoomElem(t1,n,tabc,tabF);
for (int i=1;i<=tabc.Taille();i++,inNoe++)
tabCgen(inNoe) = tabc(i);
for (int i=1;i<=tabF.Taille();i++,inFace++)
{ tabFgen(inFace).Change_taille(4);
for (int j=1;j<=4;j++)
tabFgen(inFace)(j) = tabF(i)(j)+decalNoe;
}
decalNoe += tabc.Taille();
// 2ieme maillage le 1er cube initial
if (cas < 0)
{ InitialC(t1,n,tabc,tabF);
for (int i=1;i<=tabc.Taille();i++,inNoe++)
tabCgen(inNoe) = tabc(i);
for (int i=1;i<=nbface0;i++,inFace++)
{ tabFgen(inFace).Change_taille(4);
for (int j=1;j<=4;j++)
tabFgen(inFace)(j) = tabF(i)(j)+decalNoe;
}
decalNoe += tabc.Taille();
}
// 3ieme maillage -> le second cube deforme
Tableau& t2 = lesmail->Element_LesMaille(1,2).Tab_noeud();
ZoomElem(t2,n,tabc,tabF);
for (int i=1;i<=tabc.Taille();i++,inNoe++)
tabCgen(inNoe) = tabc(i);
for (int i=1;i<=tabF.Taille();i++,inFace++)
{ tabFgen(inFace).Change_taille(4);
for (int j=1;j<=4;j++)
tabFgen(inFace)(j) = tabF(i)(j)+decalNoe;
}
decalNoe += tabc.Taille();
// 4ieme maillage le 2er cube initial
if (cas < 0)
{ InitialC(t2,n,tabc,tabF);
for (int i=1;i<=tabc.Taille();i++,inNoe++)
tabCgen(inNoe) = tabc(i);
for (int i=1;i<=nbface0;i++,inFace++)
{ tabFgen(inFace).Change_taille(4);
for (int j=1;j<=4;j++)
tabFgen(inFace)(j) = tabF(i)(j)+decalNoe;
}
decalNoe += tabc.Taille();
}
}
// on ecrit l'entete
sort << " dataset type = fe Ngp = " << nbnoe << ", nE = " << nbface
<< ", ns = 4" << '\n';
// ecriture des noeuds
for (int in=1;in<=nbnoe;in++)
sort << tabCgen(in)(1) << " " << tabCgen(in)(2) << " " << tabCgen(in)(3) << '\n';
// ecriture des connections des elements
for (int iff=1;iff<=nbface;iff++)
sort << tabFgen(iff)(1) << " "<< tabFgen(iff)(2) << " "
<< tabFgen(iff)(3) << " "<< tabFgen(iff)(4) << '\n';
// vide le buffer
sort << endl;
};
//++++++++++++++++++++++++++++
// pour un cube, creation de noeuds intermediaires et de faces pour la visualisation
void Resultats::ZoomElem
(Tableau & tabN, int n, Tableau & tabc,
Tableau < Tableau >& tabF)
{ //dimensionnement des tableaux de sortie
int nbface = 6*n*n;
int nbnoe = 8 + (n-1)*12 + (n-1)*(n-1)*6;
tabc.Change_taille(nbnoe);
tabF.Change_taille(nbface);
for (int i=1;i<=nbface;i++)
tabF(i).Change_taille(4);
// indice de noeud utilise pour reperer les nouveaus noeud cree
int inoe =1;
// def des sommets principaux
for (int i=1;i<=8;i++,inoe++) tabc(inoe) = tabN(i)->Coord2();
// constitution des grandes faces
Tableau < Tableau > tab4N(6);
for (int i=1;i<=6;i++)
tab4N(i).Change_taille(4);
tab4N(1)(1) = 4;tab4N(1)(2) = 1;tab4N(1)(3) = 5;tab4N(1)(4) = 8;
tab4N(2)(1) = 3;tab4N(2)(2) = 7;tab4N(2)(3) = 6;tab4N(2)(4) = 2;
tab4N(3)(1) = 8;tab4N(3)(2) = 5;tab4N(3)(3) = 6;tab4N(3)(4) = 7;
tab4N(4)(1) = 1;tab4N(4)(2) = 2;tab4N(4)(3) = 6;tab4N(4)(4) = 5;
tab4N(5)(1) = 4;tab4N(5)(2) = 3;tab4N(5)(3) = 2;tab4N(5)(4) = 1;
tab4N(6)(1) = 4;tab4N(6)(2) = 8;tab4N(6)(3) = 7;tab4N(6)(4) = 3;
// def des arretes et def des coordonnees des noeuds intermediaires sur les arretes
Tableau < Tableau > tabAr(12);
for (int i=1;i<=12;i++)
tabAr(i).Change_taille(n-1); // on ne met pas les noeuds extremes
int iAr = 1; // numero d'arrete
Tableau < Tableau > tabEx(2); // tableau intermediaires des extremites des arretes
for (int i=1;i<=2;i++)
tabEx(i).Change_taille(2);
for (int nf=1;nf<=6;nf++)
// pour chaque grande face on defini deux aretes, les deux premieres
// ce qui permet de definir toutes les aretes
{ tabEx(1)(1) = tab4N(nf)(1);tabEx(1)(2) = tab4N(nf)(2);
tabEx(2)(1) = tab4N(nf)(2);tabEx(2)(2) = tab4N(nf)(3);
for (int ia=1;ia<=2;ia++,iAr++) // pour chaque arrete
{ Coordonnee dxxy = (tabc(tabEx(ia)(2)) - tabc(tabEx(ia)(1)))/n; // delta coord
for (int j=1;j<=n-1;j++,inoe++)
{ tabc(inoe) = tabc(tabEx(ia)(1)) + dxxy * j;
tabAr(iAr)(j) = inoe;
}
}
}
// on attache a chaque grande face 4 numero d'arretes ordonnees la verticale a gauche
// puis a droite, ce qui servira a calculer les noeuds inter, puis l'horizontale du bas
// et enfin horizontale du haut
Tableau < Tableau > tArF(6);
for (int i=1;i<=6;i++)
tArF(i).Change_taille(4);
tArF(1)(1) = 1;tArF(1)(2) = 5;tArF(1)(3) = 2;tArF(1)(4) = 11;
tArF(2)(1) = 3;tArF(2)(2) = 8;tArF(2)(3) = 4;tArF(2)(4) = 10;
tArF(3)(1) = 5;tArF(3)(2) = 4;tArF(3)(3) = 6;tArF(3)(4) = 12;
tArF(4)(1) = 7;tArF(4)(2) = 6;tArF(4)(3) = 8;tArF(4)(4) = 2;
tArF(5)(1) = 9;tArF(5)(2) = 7;tArF(5)(3) = 10;tArF(5)(4) = 1;
tArF(6)(1) = 11;tArF(6)(2) = 3;tArF(6)(3) = 12;tArF(6)(4) = 9;
// calcul des noeuds et faces
int ifac =1; // indice de face
for (int nf=1;nf<=6;nf++) // boucle sur les 6 faces
// pour chaque grande face
{ // creation des lignes horizontales complete (avec les extremites)
Tableau < Tableau > tintAr(n+1);
for (int i=1;i<=n+1;i++)
tintAr(i).Change_taille(n+1);
// cas des extremitees, la premiere ligne et la derniere
tintAr(1)(1) = tab4N(nf)(2) ;tintAr(1)(n+1) = tab4N(nf)(3) ; // les sommets
tintAr(n+1)(1) = tab4N(nf)(1) ;tintAr(n+1)(n+1) = tab4N(nf)(4) ; // "
for (int i=1;i<= n-1;i++)
{ tintAr(1)(i+1) = tabAr(tArF(nf)(3))(i); // arete du bas
tintAr(n+1)(i+1) = tabAr(tArF(nf)(4))(i); // arete du haut
tintAr(i+1)(1) = tabAr(tArF(nf)(1))(n-i) ; // verticale gauche
tintAr(i+1)(n+1) = tabAr(tArF(nf)(2))(n-i) ; // verticale droite
}
// cas des lignes intermediaires
for (int iL=1;iL<=n-1;iL++)
{// le delta longueur
Coordonnee dxxy = (tabc(tintAr(iL+1)(n+1)) - tabc(tintAr(iL+1)(1)))/n;
for (int j=1;j<=n-1;j++,inoe++)
{ tabc(inoe) = tabc(tintAr(iL+1)(1)) + dxxy * j; // le noeud sup
tintAr(iL+1)(j+1) = inoe;
}
}
// creation des petites faces
for (int iL=1;iL<=n;iL++)
for (int iC=1;iC<=n;iC++,ifac++)
{ tabF(ifac)(1) = tintAr(iL)(iC); tabF(ifac)(2) = tintAr(iL+1)(iC);
tabF(ifac)(3) = tintAr(iL+1)(iC+1); tabF(ifac)(4) = tintAr(iL)(iC+1);
}
}
};
// dessin d'un cube initial
void Resultats::InitialC
(Tableau & tabN, int , Tableau & tabc,
Tableau < Tableau >& tabF)
{ //dimensionnement des tableaux de sortie
int nbface = 12; // chaque face represente une arete
int nbnoe = 8; // les sommets
tabc.Change_taille(nbnoe);
tabF.Change_taille(nbface);
for (int i=1;i<=nbface;i++)
tabF(i).Change_taille(4);
// indice de noeud utilise pour reperer les nouveaus noeud cree
int inoe =1;
// def des sommets principaux
for (int i=1;i<=8;i++,inoe++) tabc(inoe) = tabN(i)->Coord0();
// constitution des faces
tabF(1)(1) = 1;tabF(1)(2) = 4;tabF(1)(3) = 1;tabF(1)(4) = 1;
tabF(2)(1) = 1;tabF(2)(2) = 5;tabF(2)(3) = 1;tabF(2)(4) = 1;
tabF(3)(1) = 3;tabF(3)(2) = 7;tabF(3)(3) = 3;tabF(3)(4) = 3;
tabF(4)(1) = 7;tabF(4)(2) = 6;tabF(4)(3) = 7;tabF(4)(4) = 7;
tabF(5)(1) = 5;tabF(5)(2) = 8;tabF(5)(3) = 5;tabF(5)(4) = 5;
tabF(6)(1) = 5;tabF(6)(2) = 6;tabF(6)(3) = 5;tabF(6)(4) = 5;
tabF(7)(1) = 1;tabF(7)(2) = 2;tabF(7)(3) = 1;tabF(7)(4) = 1;
tabF(8)(1) = 2;tabF(8)(2) = 6;tabF(8)(3) = 2;tabF(8)(4) = 2;
tabF(9)(1) = 3;tabF(9)(2) = 4;tabF(9)(3) = 3;tabF(9)(4) = 3;
tabF(10)(1) = 2;tabF(10)(2) = 3;tabF(10)(3) = 2;tabF(10)(4) = 2;
tabF(11)(1) = 4;tabF(11)(2) = 8;tabF(11)(3) = 4;tabF(11)(4) = 4;
tabF(12)(1) = 8;tabF(12)(2) = 7;tabF(12)(3) = 8;tabF(12)(4) = 8;
};