// 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 "LesMaillages.h" #include "ElemMeca.h" #include "ReferenceNE.h" #include "ReferenceAF.h" #include "MathUtil.h" #include "ConstMath.h" #include "LaList.h" #include "CharUtil.h" #include "TypeQuelconqueParticulier.h" //#ifndef SYSTEM_MAC_OS_X_unix // #include "Frontier.h" //#endif // Constructeur // constructeur par défaut LesMaillages::LesMaillages(): tabMaillage(0),listFrontiere(),t_i_n(0) ,tab_nb_assemb(0),tt_noeud_front(),tous_indices() ,nbEnreg(0),nbMaillageTotal(0),nbPortion(0),entreePrinc(NULL),paraGlob(NULL) ,lesRef(NULL),domEsclave(0),mapNomMail() ,ddl_representatifs_des_physiques(),types_de_problemes() ,integ_vol_typeQuel(),integ_vol_typeQuel_t(),ref_integ_vol() ,integ_vol_t_typeQuel(),integ_vol_t_typeQuel_t(),ref_integ_vol_t() ,statistique_typeQuel(),statistique_typeQuel_t(),ref_statistique() ,pour_statistique_de_ddl() ,statistique_t_typeQuel(),statistique_t_typeQuel_t(),ref_statistique_t() ,pour_statistique_t_de_ddl() { cout << "\n erreur: ce constructeur ne doit pas etre utilise !!" << "\n LesMaillages::LesMaillages()"; Sortie(1); }; LesMaillages::LesMaillages(UtilLecture * ent,ParaGlob * para,LesReferences* Ref) : /* nbEnreg(para->NombreMaillage()), // Nombre initial de maillage est determine // dans les parametres globaux tabMaillage(nbEnreg) // def du tableau de maillage */ tabMaillage(5),listFrontiere(),t_i_n() ,tab_nb_assemb(0),tt_noeud_front(),tous_indices() ,mapNomMail() ,ddl_representatifs_des_physiques(),types_de_problemes() ,integ_vol_typeQuel(),integ_vol_typeQuel_t(),ref_integ_vol() ,integ_vol_t_typeQuel(),integ_vol_t_typeQuel_t(),ref_integ_vol_t() ,statistique_typeQuel(),statistique_typeQuel_t(),ref_statistique() ,pour_statistique_de_ddl() ,statistique_t_typeQuel(),statistique_t_typeQuel_t(),ref_statistique_t() ,pour_statistique_t_de_ddl() { lesRef = Ref; // mise à jour de la map qui fait la liaison nom de maillage <=> numéro de maillage lesRef->MiseAJourMap(mapNomMail); entreePrinc = ent; nbEnreg = 5; nbMaillageTotal = 0 ; // pour l'instant pas de maillage nbPortion = nbEnreg ; paraGlob = para; domEsclave = 0; // a priori pas de maillage esclave }; //constructeur de copie LesMaillages::LesMaillages(const LesMaillages& a) { cout << "\n erreur: pour l'instant ce constructeur ne doit pas etre utilise !!" << "\n LesMaillages::LesMaillages(const LesMaillages& a)"; Sortie(1); }; // Destructeur LesMaillages::~LesMaillages() { int tabMaillage_Taille=tabMaillage.Taille(); if (tabMaillage_Taille>=1) for (int i=1;i<= tabMaillage_Taille;i++) if (tabMaillage(i)!=NULL) {delete tabMaillage(i);tabMaillage(i)=NULL;} }; // METHODES PUBLIQUES : // lecture des maillages et des references s'y rapportant void LesMaillages::LectureLesMaillages() { if (ParaGlob::NiveauImpression() >= 4) cout << " debut de la lecture des maillages " << endl; // --- rechercher d'un premier maillage maillage int lectureEnCour = 0; // lecture du premier maillage obligatoire if ((strstr(entreePrinc->tablcar,"noeuds")!=NULL) || (strstr(entreePrinc->tablcar,"nom_maillage")!=NULL)) { if (ParaGlob::NiveauImpression() >= 5) cout << " lecture du premier maillage " << endl; tabMaillage(1) = new Maillage (mapNomMail,1,paraGlob->Dimension()); // indique que les prochaines references seront pour le maillage 1 lesRef->NbMaille(1); tabMaillage(1)->LectureMaillage(entreePrinc,*lesRef); // opération d'affinage tabMaillage(1)->LectureEtApplicationAffinage(entreePrinc,*lesRef); // init du nombre de maillage nbMaillageTotal = 1 ; /*////------- debug //cout << "\n debug1 LesMaillages::LectureLesMaillages "; //{ // map < string, int , std::less >::iterator id1, idfin=mapNomMail.end(); // for (id1=mapNomMail.begin();id1!=idfin;id1++) // cout << "\n "<<(*id1).first << " , " << (*id1).second ; // cout << endl; //// mapNomMail; // //};*/ } else { cout << " *** erreur dans la lecture du premier maillage " << '\n'; cout << " un premier maillage est obligatoire !!! " << '\n'; Sortie(1); }; // --- recherche s'il y a d'autres maillages // tout d'abord on passe le numéro de version si besoin est: if (strstr(entreePrinc->tablcar,"version:")!=NULL) entreePrinc->NouvelleDonnee(); if ((strstr(entreePrinc->tablcar,"noeuds")!=NULL) || (strstr(entreePrinc->tablcar,"nom_maillage")!=NULL)) do { nbMaillageTotal++; #ifdef ETUDIANT_LIMITATION if (nbMaillageTotal > nb_maxi_maillage) { cout << "\n nombre maxi de maillage autorisé atteind " << nb_maxi_maillage; Sortie(1); } #endif if (nbMaillageTotal > nbPortion) // il faut agrandir le tableau de maillage { nbPortion = nbPortion+nbEnreg; tabMaillage.Change_taille(nbPortion); }; tabMaillage(nbMaillageTotal) = new Maillage (mapNomMail,nbMaillageTotal,paraGlob->Dimension()); // indique le nb de maillage pour l'enregistrement des prochaines references lesRef->NbMaille(nbMaillageTotal); //lect des autres MAILlages if (ParaGlob::NiveauImpression() >= 5) cout << " lecture du maillage nb: " << nbMaillageTotal << endl; tabMaillage(nbMaillageTotal)->LectureMaillage(entreePrinc,*lesRef); /*////------- debug //cout << "\n debug2 LesMaillages::LectureLesMaillages "; //{ // map < string, int , std::less >::iterator id1, idfin=mapNomMail.end(); // for (id1=mapNomMail.begin();id1!=idfin;id1++) // cout << "\n "<<(*id1).first << " , " << (*id1).second ; // cout << endl; //// mapNomMail; // //};*/ // on demande au maillage de lire éventuellement des rotation, collapse etc. // --> opération d'affinage, juste pour ce maillage tabMaillage(nbMaillageTotal)->LectureEtApplicationAffinage(entreePrinc,*lesRef); // maintenant on regarde si l'on veut une fusion avec le maillage précédent if (strstr(entreePrinc->tablcar,"fusion_avec_le_maillage_precedent_")!=NULL) {// si oui on appel la méthode de fusion pour le maillage précédent List_io < string > nom_mails_a_fusionner; // on crée une liste qui sert pour l'appel général nom_mails_a_fusionner.push_back(tabMaillage(nbMaillageTotal)->NomDuMaillage()); int nbMaillageTotal_save = nbMaillageTotal; Fusion_maillages(nom_mails_a_fusionner,tabMaillage(nbMaillageTotal-1)->NomDuMaillage(),lesRef); // on vérifie qu'il n'y a pas eu de nouveau maillage créé durant la fusion if (nbMaillageTotal != nbMaillageTotal_save) { cout << "\n erreur, il y a eu un nouveau maillage cree, ce n'est pas normal, la suite est impossible " << "\n LesMaillages::LectureLesMaillages() " << endl ; Sortie(1); }; ////------- debug //cout << "\n debug LesMaillages::LectureLesMaillages : avant le delete"; //lesRef->Affiche(2,0); ////----- fin debug //{ // map < string, int , std::less >::iterator id1, idfin=mapNomMail.end(); // for (id1=mapNomMail.begin();id1!=idfin;id1++) // cout << "\n "<<(*id1).first << " , " << (*id1).second ; // cout << endl; //// mapNomMail; // //}; // maintenant on va supprimer le maillage que l'on vient de lire Suppression_maillage(tabMaillage(nbMaillageTotal)->NomDuMaillage()); ////------- debug //cout << "\n debug LesMaillages::LectureLesMaillages : après le delete "; //lesRef->Affiche(2,0); //{ // map < string, int , std::less >::iterator id1, idfin=mapNomMail.end(); // for (id1=mapNomMail.begin();id1!=idfin;id1++) // cout << "\n "<<(*id1).first << " , " << (*id1).second ; // cout << endl; //// mapNomMail; // //}; entreePrinc->NouvelleDonnee(); // on prépare la nouvelle lecture // après la fusion, on peut encore avoir de l'affinage // on demande au maillage de lire éventuellement des rotation, collapse etc. // --> opération d'affinage tabMaillage(nbMaillageTotal)->LectureEtApplicationAffinage(entreePrinc,*lesRef); }; /*////------- debug //cout << "\n debug LesMaillages::LectureLesMaillages après LectureEtApplicationAffinage "; //{ // map < string, int , std::less >::iterator id1, idfin=mapNomMail.end(); // for (id1=mapNomMail.begin();id1!=idfin;id1++) // cout << "\n "<<(*id1).first << " , " << (*id1).second ; // cout << endl; //// mapNomMail; // //};*/ if ((strstr(entreePrinc->tablcar,"noeuds")!=NULL) || (strstr(entreePrinc->tablcar,"nom_maillage")!=NULL)) {lectureEnCour = 1;} else {lectureEnCour = 0;}; } while (lectureEnCour == 1); // fin de la lecture des maillages les uns après les autres //---- essai d'une renumérotation globale //--- on regarde si l'on demande une renumérotation globale de tous les maillages // n'est actif que s'il y a plusieurs maillages, if (strstr(entreePrinc->tablcar,"renumerotation_tous_maillages_")!=NULL) // if (nbMaillageTotal != 1) { if (ParaGlob::NiveauImpression() >= 5) cout << " renumerotation globale de tous les noeuds de tous les maillages " << endl; // on définit un tableau vide de conditions linéaires (ne sert pas ici) Tableau > condCLL; // appel de l'utilitaire dans lesMaillages avec les conditions linéaire éventuelles TroisEntiers nouvelles_largeur_en_ddl; this->Renumerotation(*lesRef,condCLL,nouvelles_largeur_en_ddl); entreePrinc->NouvelleDonnee(); // positionnement sur une nouvelle info }; // else // { if (ParaGlob::NiveauImpression() >= 5) // cout << " il n'y a qu'un seul maillage, doncrenumerotation globale de tous les noeuds de tous les maillages " << endl; // // --- on examine le cas où il y a une distinction domaine esclave/ou non // if ((strstr(entreePrinc->tablcar,"domaine_esclave")!=NULL) && (nbMaillageTotal != 1)) if (strstr(entreePrinc->tablcar,"domaine_esclave")!=NULL) // cas ou l'on a des domaines esclaves, lecture du nombre { entreePrinc->NouvelleDonnee(); if (ParaGlob::NiveauImpression() >= 5) cout << " lecture du nombre de domaines esclaves " << endl; *(entreePrinc->entree) >> domEsclave; // lecture du nombre if (ParaGlob::NiveauImpression() >= 5) cout << domEsclave << endl; if ((domEsclave <1) || (domEsclave > nbMaillageTotal)) // domEsclave doit etre > 0 et < nbMaillageTotal, s'il = nbMaillageTotal // on n'a aucun maillage maitre -> pb, sauf s'il y a de l'auto contact, c'est géré par le contact { cout << "\n le nombre de maillage esclave lu : " << domEsclave << ", n\'est pas acceptable, (nbMaillageTotal = " << nbMaillageTotal << " )" << endl; entreePrinc->MessageBuffer("** lecture des domaines esclaves **"); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie(1); }; entreePrinc->NouvelleDonnee(); // positionnement sur une nouvelle info }; // // --- vérification obsolète mais que l'on conserve pour l'instant // if ((paraGlob->TypeCalcul() == NON_DYNA_CONT) && (domEsclave < 1)) // { cout << "\n erreur, le type de calcul : NON_DYNA_CONT necessite d\'avoir plusieurs" // << " maillages et de savoir le nombre de domaine esclave !! " // << "\n LesMaillages::LectureLesMaillages() " << endl; // entreePrinc->MessageBuffer("** lecture des domaines esclaves **"); // throw (UtilLecture::ErrNouvelleDonnee(-1)); // Sortie(1); // }; // --- on vérifie que les références sont correctes const Reference* refG = lesRef->Init_et_Premiere(); while (refG != NULL) { // on définit la référence réelle // et on voit s'il n'y a pas d'erreur lorsque l'on essaie d'utiliser la référence // 1- cas des noeuds if ( refG->Indic() == 1) { const ReferenceNE & ref = (ReferenceNE &) (*refG); int ref_Taille=ref.Taille(); for (int j= 1; j<= ref_Taille; j++) {int nb = ref.Numero(j) ; // le numero du dans le maillage int nn = ref.Nbmaille(); // le numero du maillage // on tente de récupérer le noeud, ce qui permet de vérifier son existence try {Noeud& toto = Noeud_LesMaille(nn,nb);} // si le noeud n'existe pas il y a une erreur qui est récupérer catch (ErrSortie erreur) { // cas d'un noeud n'existant pas cout << "\n erreur dans la verification de la liste : " ; ref.Affiche(); cout << "\n peut-etre que le noeud nb : " << nb << " du maillage : " << nn << " n'existe pas ? " << endl; Sortie(-1); // on force la sortie }; }; }; // 2- cas des éléments if ( refG->Indic() == 2) { const ReferenceNE & ref = (ReferenceNE &) (*refG); int ref_Taille=ref.Taille(); for (int j= 1; j<= ref_Taille; j++) {int nb = ref.Numero(j) ; // le numero de l'element dans le maillage int nn = ref.Nbmaille(); // le numero du maillage // on tente de récupérer l'élément, ce qui permet de vérifier son existence try {Element& toto = Element_LesMaille(nn,nb);} // si l'élément n'existe pas il y a une erreur qui est récupérer catch (ErrSortie erreur) { // cas d'un élément n'existant pas cout << "\n erreur dans la verification de la liste : " ; ref.Affiche(); cout << "\n peut-etre que l'element nb : " << nb << " du maillage : " << nn << " n'existe pas ? " << endl; Sortie(-1); // on force la sortie }; }; }; // 3- cas des faces ou des arrêtes if (( refG->Indic() == 3) || ( refG->Indic() == 4)) { const ReferenceAF & ref = (ReferenceAF &) (*refG); int ref_Taille=ref.Taille(); for (int j= 1; j<= ref_Taille; j++) {int nb = ref.NumeroElem(j) ; // le numero de l'element dans le maillage int nn = ref.Nbmaille(); // le numero du maillage // on tente de récupérer l'élément, ce qui permet de vérifier son existence try {Element& toto = Element_LesMaille(nn,nb);} // si l'élément n'existe pas il y a une erreur qui est récupérer catch (ErrSortie erreur) { // cas d'un élément n'existant pas cout << "\n erreur dans la verification de la liste : " ; ref.Affiche(); cout << "\n peut-etre que l'element nb : " << nb << " du maillage : " << nn << " n'existe pas ? " << endl; Sortie(-1); // on force la sortie }; }; }; refG = lesRef->Reference_suivante(); }; // on s'occupe de mettre à jour les types de pb et les ddl types associés Mise_a_jour_type_pb_type_associe_ddl(); if (ParaGlob::NiveauImpression() >= 4) cout << " fin de la lecture des maillages " << endl; }; // affichage et definition interactive des commandes void LesMaillages::Info_commande_lesMaillages() { // def des maillages // int lectureEnCour = 0; // def d'un premier maillage tabMaillage(1) = new Maillage (mapNomMail,1,paraGlob->Dimension()); cout << "\n# ----- definition des maillages ----- "; cout << "\n# def des fichiers de maillage "; string rep="_"; if (rep != "f") {ofstream & sort = *(entreePrinc->Commande_pointInfo()); // pour simplifier sort << "\n#--------------------------------------" << "\n#| definition du (ou des) maillage(s) |" << "\n#--------------------------------------"; cout << "\n dans le fichier de commande final, on utilisera de preference une inclusion " << "\n d'un fichier qui contiendra le maillage (ou plusieurs fichiers pour plusieurs maillages\n"; while ((Minuscules(rep) != "f")&&(Minuscules(rep) != "0")) { try { cout << "\n (0 ou f) (fin) " << "\n (1) (defaut) inclusion de fichier et affinage " << "\n (2) fusion des deux precedents maillages " // << "\n (3) renumerotation de tous les maillages " // << "\n (4 ou ? ) exemple - informations sur fichier ! " << "\n (3 ou ? ) exemple - informations sur fichier ! " << "\n "; if (rep != "f") rep = lect_return_defaut(false,"1"); if ((Minuscules(rep) == "f") || (Minuscules(rep) == "0"))// sortie directe break; int num = ChangeEntier(rep); if (Minuscules(rep) == "?") num = 3; //4; bool choix_valide=false; if ((num >= 0)&&(num<=3)) { choix_valide=true; } else { cout << "\n Erreur on attendait un entier entre 0 et 3 !!, " << "\n redonnez une bonne valeur" << "\n ou taper f ou 0 pour arreter le programme"; choix_valide=false; } switch (num) { case 0: // sortie { break;} // normalement cela a déjà été filtré avant case 1: // inclusion de fichier et affinage { string repi; while (Minuscules(repi) != "f") {// indique que les prochaines references seront pour le maillage 1, systématiquement lesRef->NbMaille(1); int cas = 1; tabMaillage(1)->Info_commande_Maillages(entreePrinc,*lesRef, cas); nbMaillageTotal = 1 ; cout << "\n autre fichier ou fin (rep o ou f) "; repi = lect_return_defaut(false,"f"); }; sort << "\n \n "; break; } case 2: // fusion des deux precedents maillages { sort << "\n fusion_avec_le_maillage_precedent_ "; int cas = 3; // on rappelle l'affinage en fin de maillage tabMaillage(1)->Info_commande_Maillages(entreePrinc,*lesRef, cas); break;} // case 3: // renumerotation de tous les maillages // { sort << "\n renumerotation_tous_maillages_ "; // break;} case 3: // exemple - informations sur fichier { cout << "\n on se reportera a la documentation pour une information precise " << " ici il y a sortie sur le fichier .info d'exemple et d'infos succintes "; sort << "\n# exemples: tout d'abord l'inclusion, " << "\n# 2 solutions equivalentes : soit deux fichiers par maillage -> exemple" << "\n# < nom_de_maillage.her # fichier qui contiend le maillage" << "\n# < nom_de_maillage.lis # fichier qui contiend les references " << "\n# soit un seul fichier par maillage -> exemple" << "\n# < nom_de_maillage.her # fichier qui contiend le maillage" << "\n \n# maintenant on presente un exemple de contenu de mailage correspondant aux choix propose" << "\n#------------------------------ exemple de contenu maillage -----------------"; // indique que les prochaines references seront pour le maillage 1 lesRef->NbMaille(1);int cas = 2; tabMaillage(1)->Info_commande_Maillages(entreePrinc,*lesRef, cas); nbMaillageTotal = 1 ; sort << "\n#-------------------------- fin exemple de contenu maillage -----------------\n \n "; break; }; default: cout << "\n le cas "< complet // = false -> incomplet bool LesMaillages::Complet() { bool res = true; for ( int i=1; i<= nbMaillageTotal;i++) res = res && tabMaillage(i)->Complet(); return res; }; // introduction des lois de comportement dans les elements qui le necessite // des sections pour les poutres etc c-a-d , completer les elements // avec les donnees qui ont ete acquises apres la lecture du maillage // def des tableaux de ddl dans les noeuds // def des pointeurs d'assemblage dans les noeuds void LesMaillages::Completer(DiversStockage* divers,LesLoisDeComp* lesLois ,LesFonctions_nD* lesFonctionsnD ) { // cas des dilatations thermiques int divers_TabDila_Taille=divers->TabCoefDila().Taille(); for (int ii=1;ii<= divers_TabDila_Taille;ii++) { string nomDila = (divers->TabCoefDila())(ii).NomRef(); // recup du nom de la ref const BlocDdlLim& div_Dila = (divers->TabCoefDila())(ii); // soit c'est une valeur fixe soit une fonction nD double val = 0; // init par défaut string nom_fct_nD("_"); // "" if (div_Dila.Val() != NULL) // cas d'une valeur fixe { val = *(div_Dila.Val());} // recup de la valeur else if (div_Dila.Fct_nD() != NULL) // cas d'une fonction nD { nom_fct_nD = *(div_Dila.Fct_nD());} else // sinon il y a un pb { cout << "\n *** erreur de definition de la dilatation les infos lues ne sont pas correctes: "; div_Dila.Affiche(); Sortie(1); }; const Reference & refG = lesRef->Trouve(nomDila,div_Dila.NomMaillage()); // recup de la reference // vérif que la référence s'adresse à des éléments if ( refG.Indic() != 2) { // erreur la référence ne concerne pas des éléments cout << "\n erreur la reference " << refG.Nom() << " ne concerne pas des elements "; cout << " \n cas des donnees relatives aux masses volumiques "; cout << "\n LesMaillages::Completer( .... "; Sortie(1); }; const ReferenceNE & ref = (ReferenceNE &) refG; int ref_Taille=ref.Taille(); for (int jj= 1; jj<= ref_Taille; jj++) {int nbb = ref.Numero(jj) ; // le numero de l'element dans le maillage int nnn = ref.Nbmaille(); // le numero du maillage // recup de l'element Element * poi = & Element_LesMaille(nnn,nbb); // creation d'un bloc general contenant des informations BlocGen bloc(2,1); bloc.Change_nom(1,"dilatation_thermique"); bloc.Change_nom(2,nom_fct_nD); // s'il contient "_" cela veut dire : pas de fctnD bloc.Change_val(1, val); // demande a l'element de se completer poi = poi->Complete(bloc,lesFonctionsnD); if (poi == NULL) { // cas d'un probleme cout << "\n erreur la dilatation thermique n'est pas adapte a l\'element "; poi = & Element_LesMaille(nnn,nbb); cout << "\n element " << poi->Geometrie() << poi->Interpolation(); cout << "\n LesMaillages::Completer( etc ... " << endl; Sortie(1); }; } }; // cas des lois de comportement int lesLois_TabRefLoi_Taille = lesLois->TabRefLoi().Taille(); for (int i=1;i<= lesLois_TabRefLoi_Taille;i++) { string nomLoi = (lesLois->TabRefLoi())(i).st2; // recup de la reference const LesLoisDeComp::RefLoi & refloi = (lesLois->TabRefLoi())(i); // ref de loi const Reference& refG = lesRef->Trouve(refloi.st1,(refloi.nom_maillage)); // vérif que la référence s'adresse à des éléments if ( refG.Indic() != 2) { // erreur la référence ne concerne pas des éléments cout << "\n erreur la reference " << refG.Nom() << " ne concerne pas des elements "; cout << " \n cas des donnees relatives aux lois de comportement "; cout << "\n LesMaillages::Completer( .... "; Sortie(1); }; const ReferenceNE & ref = (ReferenceNE &) refG; int ref_Taille=ref.Taille(); for (int j= 1; j<= ref_Taille; j++) {int nb = ref.Numero(j) ; // le numero de l'element dans le maillage int nn = ref.Nbmaille(); // le numero du maillage // le pointeur le loi LoiAbstraiteGeneral * pt = lesLois->PtLoi_abstraite(nomLoi); if (pt == NULL) { // cas d'un pointeur en retour null, la loi n'existe pas cout << "\n *** erreur en lecture: la loi de nom : " << nomLoi << " n'existe pas !! revoyez vos donnees "; if (ParaGlob::NiveauImpression() > 5) cout << "\n LesMaillages::Completer( ... "; Sortie(1); } // attribution du pointeur Element_LesMaille(nn,nb).DefLoi(pt); } } // cas des sections d' elements int divers_TabSect_Taille=divers->TabSect().Taille(); for (int ii=1;ii<= divers_TabSect_Taille;ii++) { //string nomSect = (divers->TabSect())(ii).nomref; // recup du nom de la ref string nomSect = (divers->TabSect())(ii).NomRef(); // recup du nom de la ref //double val = (divers->TabSect())(ii).val; // recup de la valeur const BlocDdlLim& div_sect = (divers->TabSect())(ii); // soit c'est une valeur fixe soit une fonction nD double val = 0; // init par défaut string nom_fct_nD("_"); // "" if (div_sect.Val() != NULL) // cas d'une valeur fixe { val = *(div_sect.Val());} // recup de la valeur else if (div_sect.Fct_nD() != NULL) // cas d'une fonction nD { nom_fct_nD = *(div_sect.Fct_nD());} else // sinon il y a un pb { cout << "\n *** erreur de definition de la section les infos lues ne sont pas correctes: "; div_sect.Affiche(); Sortie(1); }; const Reference & refG = lesRef->Trouve(nomSect,div_sect.NomMaillage()); // recup de la reference // vérif que la référence s'adresse à des éléments if ( refG.Indic() != 2) { // erreur la référence ne concerne pas des éléments cout << "\n erreur la reference " << refG.Nom() << " ne concerne pas des elements "; cout << " \n cas des donnees relatives aux sections "; cout << "\n LesMaillages::Completer( .... "; Sortie(1); }; const ReferenceNE & ref = (ReferenceNE &) refG; int ref_Taille=ref.Taille(); for (int jj= 1; jj<= ref_Taille; jj++) {int nbb = ref.Numero(jj) ; // le numero de l'element dans le maillage int nnn = ref.Nbmaille(); // le numero du maillage // recup de l'element Element * poi = & Element_LesMaille(nnn,nbb); // creation d'un bloc general contenant des informations BlocGen bloc(2,1); bloc.Change_nom(1,"sections"); bloc.Change_nom(2,nom_fct_nD); // s'il contient "_" cela veut dire : pas de fctnD bloc.Change_val(1, val); // demande a l'element de se completer poi = poi->Complete(bloc,lesFonctionsnD); if (poi == NULL) { // cas d'un probleme cout << "\n erreur la section n'est pas adapte a l\'element "; poi = & Element_LesMaille(nnn,nbb); cout << "\n element " << poi->Geometrie() << poi->Interpolation(); cout << "\n LesMaillages::Completer( etc ... " << endl; Sortie(1); }; } } // cas des variation de section d' elements int divers_TabVarSect_Taille=divers->TabVarSect().Taille(); for (int ii=1;ii<= divers_TabVarSect_Taille;ii++) { string nomVarSect = (divers->TabVarSect())(ii).NomRef(); // recup du nom de la ref const BlocDdlLim& div_varsect = (divers->TabVarSect())(ii); double val = div_varsect.Val(); // recup de la valeur const Reference & refG = lesRef->Trouve(nomVarSect,div_varsect.NomMaillage()); // recup de la reference // vérif que la référence s'adresse à des éléments if ( refG.Indic() != 2) { // erreur la référence ne concerne pas des éléments cout << "\n erreur la reference " << refG.Nom() << " ne concerne pas des elements "; cout << " \n cas des donnees relatives aux variations de sections "; cout << "\n LesMaillages::Completer( .... "; Sortie(1); }; const ReferenceNE & ref = (ReferenceNE &) refG; int ref_Taille=ref.Taille(); for (int jj= 1; jj<= ref_Taille; jj++) {int nbb = ref.Numero(jj) ; // le numero de l'element dans le maillage int nnn = ref.Nbmaille(); // le numero du maillage // recup de l'element Element * poi = & Element_LesMaille(nnn,nbb); // creation d'un bloc general contenant des informations BlocGen bloc(1,1); bloc.Change_nom(1,"variation_section"); bloc.Change_val(1, val); // demande a l'element de se completer poi = poi->Complete(bloc,lesFonctionsnD); if (poi == NULL) { // cas d'un probleme cout << "\n erreur la variation de section n'est pas adapte a l\'element "; poi = & Element_LesMaille(nnn,nbb); cout << "\n element " << poi->Geometrie() <<" "<< poi->Interpolation()<<" "<TypeProblem(); cout << "\n LesMaillages::Completer( etc ... " << endl; Sortie(1); } } }; // cas des epaisseurs d' elements int divers_TabEpaiss_Taille=divers->TabEpaiss().Taille(); for (int ii=1;ii<= divers_TabEpaiss_Taille;ii++) { string nomSect = (divers->TabEpaiss())(ii).NomRef(); // recup du nom de la ref const BlocDdlLim& div_epai = (divers->TabEpaiss())(ii); // soit c'est une valeur fixe soit une fonction nD double val = 0; // init par défaut string nom_fct_nD("_"); // "" if (div_epai.Val() != NULL) // cas d'une valeur fixe { val = *(div_epai.Val());} // recup de la valeur else if (div_epai.Fct_nD() != NULL) // cas d'une fonction nD { nom_fct_nD = *(div_epai.Fct_nD());} else // sinon il y a un pb { cout << "\n *** erreur de definition de l'epaisseur les infos lues ne sont pas correctes: "; div_epai.Affiche(); Sortie(1); }; const Reference& refG = lesRef->Trouve(nomSect,div_epai.NomMaillage()); // recup de la reference // vérif que la référence s'adresse à des éléments if ( refG.Indic() != 2) { // erreur la référence ne concerne pas des éléments cout << "\n erreur la référence " << refG.Nom() << " ne concerne pas des éléments "; cout << " \n cas des données relatives aux épaisseurs d'éléments "; cout << "\n LesMaillages::Completer( .... "; Sortie(1); }; const ReferenceNE & ref = (ReferenceNE &) refG; int ref_Taille=ref.Taille(); for (int jj= 1; jj<= ref_Taille; jj++) {int nbb = ref.Numero(jj) ; // le numero de l'element dans le maillage int nnn = ref.Nbmaille(); // le numero du maillage // recup de l'element Element * poi = & Element_LesMaille(nnn,nbb); // creation d'un bloc general contenant des informations BlocGen bloc(2,1); bloc.Change_nom(1,"epaisseurs"); bloc.Change_nom(2,nom_fct_nD); // s'il contient "_" cela veut dire : pas de fctnD bloc.Change_val(1, val); // demande a l'element de se completer poi = poi->Complete(bloc,lesFonctionsnD); if (poi == NULL) { // cas d'un probleme cout << "\n erreur l\'epaisseur n'est pas adapte a l\'element "; poi = & Element_LesMaille(nnn,nbb); cout << "\n element " << poi->Geometrie() << poi->Interpolation(); cout << "\n LesMaillages::Completer( etc ... " << endl; Sortie(1); }; } } // cas des largeurs d' elements int divers_TabLargeurs_Taille=divers->TabLargeurs().Taille(); for (int ii=1;ii<= divers_TabLargeurs_Taille;ii++) { string nomSect = (divers->TabLargeurs())(ii).NomRef(); // recup du nom de la ref const BlocDdlLim& div_larg = (divers->TabLargeurs())(ii); // soit c'est une valeur fixe soit une fonction nD double val = 0; // init par défaut string nom_fct_nD("_"); // "" if (div_larg.Val() != NULL) // cas d'une valeur fixe { val = *(div_larg.Val());} // recup de la valeur else if (div_larg.Fct_nD() != NULL) // cas d'une fonction nD { nom_fct_nD = *(div_larg.Fct_nD());} else // sinon il y a un pb { cout << "\n *** erreur de definition de la largeur les infos lues ne sont pas correctes: "; div_larg.Affiche(); Sortie(1); }; const Reference& refG = lesRef->Trouve(nomSect,div_larg.NomMaillage()); // recup de la reference // vérif que la référence s'adresse à des éléments if ( refG.Indic() != 2) { // erreur la référence ne concerne pas des éléments cout << "\n erreur la référence " << refG.Nom() << " ne concerne pas des éléments "; cout << " \n cas des données relatives aux largeurs d'éléments "; cout << "\n LesMaillages::Completer( .... "; Sortie(1); }; const ReferenceNE & ref = (ReferenceNE &) refG; int ref_Taille=ref.Taille(); for (int jj= 1; jj<= ref_Taille; jj++) {int nbb = ref.Numero(jj) ; // le numero de l'element dans le maillage int nnn = ref.Nbmaille(); // le numero du maillage // recup de l'element Element * poi = & Element_LesMaille(nnn,nbb); // creation d'un bloc general contenant des informations BlocGen bloc(2,1); bloc.Change_nom(2,nom_fct_nD); // s'il contient "_" cela veut dire : pas de fctnD bloc.Change_nom(1,"largeurs"); bloc.Change_val(1, val); // demande a l'element de se completer poi = poi->Complete(bloc,lesFonctionsnD); if (poi == NULL) { // cas d'un probleme cout << "\n erreur la largeur n'est pas adapte a l\'element "; poi = & Element_LesMaille(nnn,nbb); cout << "\n element " << poi->Geometrie() << poi->Interpolation(); cout << "\n LesMaillages::Completer( etc ... " << endl; Sortie(1); }; } } // cas des masses volumique d' elements int divers_TabMasseVolu_Taille=divers->TabMasseVolu().Taille(); for (int ii=1;ii<= divers_TabMasseVolu_Taille;ii++) { string nomMasseVol = (divers->TabMasseVolu())(ii).NomRef(); // recup du nom de la ref const BlocDdlLim& div_massevolu = (divers->TabMasseVolu())(ii); // soit c'est une valeur fixe soit une fonction nD double val = 0; // init par défaut string nom_fct_nD("_"); // "" if (div_massevolu.Val() != NULL) // cas d'une valeur fixe { val = *(div_massevolu.Val());} // recup de la valeur else if (div_massevolu.Fct_nD() != NULL) // cas d'une fonction nD { nom_fct_nD = *(div_massevolu.Fct_nD());} else // sinon il y a un pb { cout << "\n *** erreur de definition de la masse volumique les infos lues ne sont pas correctes: "; div_massevolu.Affiche(); Sortie(1); }; const Reference & refG = lesRef->Trouve(nomMasseVol,div_massevolu.NomMaillage()); // recup de la reference // vérif que la référence s'adresse à des éléments if ( refG.Indic() != 2) { // erreur la référence ne concerne pas des éléments cout << "\n erreur la référence " << refG.Nom() << " ne concerne pas des éléments "; cout << " \n cas des données relatives aux masses volumiques "; cout << "\n LesMaillages::Completer( .... "; Sortie(1); }; const ReferenceNE & ref = (ReferenceNE &) refG; int ref_Taille=ref.Taille(); for (int jj= 1; jj<= ref_Taille; jj++) {int nbb = ref.Numero(jj) ; // le numero de l'element dans le maillage int nnn = ref.Nbmaille(); // le numero du maillage // recup de l'element Element * poi = & Element_LesMaille(nnn,nbb); // creation d'un bloc general contenant des informations BlocGen bloc(2,1); bloc.Change_nom(1,"masse_volumique"); bloc.Change_nom(2,nom_fct_nD); // s'il contient "_" cela veut dire : pas de fctnD bloc.Change_val(1, val); // demande a l'element de se completer poi = poi->Complete(bloc,lesFonctionsnD); if (poi == NULL) { // cas d'un probleme cout << "\n erreur la masse volumique n'est pas adapte a l\'element "; poi = & Element_LesMaille(nnn,nbb); cout << "\n element " << poi->Geometrie() << poi->Interpolation(); cout << "\n LesMaillages::Completer( etc ... " << endl; Sortie(1); }; } } // cas des gestions d'hourglass d'elements int divers_TabGesHourglass_Taille=divers->TabGesHourglass().Taille(); for (int ii=1;ii<= divers_TabGesHourglass_Taille;ii++) { string nomGesHourglass = (divers->TabGesHourglass())(ii).NomRef(); // recup du nom de la ref const BlocDdlLim& div_GesHourglass = (divers->TabGesHourglass())(ii); // double val = div_GesHourglass.Val(); // recup de la valeur const Reference & refG = lesRef->Trouve(nomGesHourglass,div_GesHourglass.NomMaillage()); // recup de la reference // vérif que la référence s'adresse à des éléments if ( refG.Indic() != 2) { // erreur la référence ne concerne pas des éléments cout << "\n erreur la référence " << refG.Nom() << " ne concerne pas des éléments "; cout << " \n cas des données relatives aux gestions des modes d'hourglass "; cout << "\n LesMaillages::Completer( .... "; Sortie(1); }; const ReferenceNE & ref = (ReferenceNE &) refG; int ref_Taille=ref.Taille(); for (int jj= 1; jj<= ref_Taille; jj++) {int nbb = ref.Numero(jj) ; // le numero de l'element dans le maillage int nnn = ref.Nbmaille(); // le numero du maillage // recup de l'element Element * poi = & Element_LesMaille(nnn,nbb); // creation d'un bloc general contenant des informations BlocGen bloc(1,2); bloc.Change_nom(1,div_GesHourglass.Nom(2)); bloc.Change_val(1, div_GesHourglass.Val(1)); // récupération éventuelle de la loi si besoin LoiAbstraiteGeneral * loiHourglass = NULL; if ( (Id_Nom_StabHourglass(div_GesHourglass.Nom(2).c_str()) == STABHOURGLASS_PAR_COMPORTEMENT) || (Id_Nom_StabHourglass(div_GesHourglass.Nom(2).c_str()) == STABHOURGLASS_PAR_COMPORTEMENT_REDUIT)) // le pointeur le loi { loiHourglass = lesLois->PtLoi_abstraite(div_GesHourglass.Nom(3));}; // demande a l'element de se completer poi = poi->Complet_Hourglass(loiHourglass,bloc); if (poi == NULL) { // cas d'un probleme cout << "\n erreur la gestion d'hourglass: " << div_GesHourglass << " n'est pas adapte a l\'element "; poi = & Element_LesMaille(nnn,nbb); cout << "\n element " << poi->Geometrie() << poi->Interpolation(); cout << "\n LesMaillages::Completer( etc ... " << endl; Sortie(1); } }; }; // cas des intégrales sur le volume int divers_TabIntegVol_Taille=divers->TabIntegVol().Taille(); // on redimentionne les tableaux de sauvegardes integ_vol_typeQuel.Change_taille(divers_TabIntegVol_Taille); integ_vol_typeQuel_t.Change_taille(divers_TabIntegVol_Taille); ref_integ_vol.Change_taille(divers_TabIntegVol_Taille); for (int ii=1;ii<= divers_TabIntegVol_Taille;ii++) { string nomIntegVol = (divers->TabIntegVol())(ii).NomRef(); // recup du nom de la ref const BlocDdlLim& div_IntegVol = (divers->TabIntegVol())(ii); const Reference & refG = lesRef->Trouve(nomIntegVol,div_IntegVol.NomMaillage()); // recup de la reference // vérif que la référence s'adresse à des éléments if ( refG.Indic() != 2) { // erreur la référence ne concerne pas des éléments cout << "\n erreur la référence " << refG.Nom() << " ne concerne pas des éléments "; cout << " \n cas des données relatives aux integrations sur le volume "; cout << "\n LesMaillages::Completer( .... "; Sortie(1); }; const ReferenceNE & ref = (ReferenceNE &) refG; // creation d'un bloc general contenant des informations // n= nombre de string, m nombre de double BlocGen bloc(4,1) ; // par defaut ////--- debug //cout << "\n -- debug LesMaillages::Completer( "; //div_IntegVol.Affiche(); cout << endl; ////--- fin debug string nom_inter("integrale_sur_volume_"); bloc.Change_nom(1,nom_inter); // le type d'intégrale: de volume ici bloc.Change_nom(2,div_IntegVol.Nom(2)); // mot clé : ex: un_ddl_etendu_ bloc.Change_nom(3,div_IntegVol.Nom(3)); // ex: le nom du ddl : ex UX // construction d'un nom qui servira à discriminer les différents conteneurs string nom_ref("int_vol_");// init if ((div_IntegVol.NomMaillage() == NULL) // cas d'un seule maillage && (nbMaillageTotal==1)) // enregistré {nom_ref +=(refG.Nom());} else if (div_IntegVol.NomMaillage() != NULL) // cas de plusieurs maillages {nom_ref += (*div_IntegVol.NomMaillage())+"_"+(refG.Nom());} else // sinon pb { cout << "\n erreur il manque le nom de maillage alors qu'il y a plusieurs maillages en cours "; cout << " \n cas des données relatives aux integrations sur le volume "; cout << "\n LesMaillages::Completer( .... "; Sortie(1); }; bloc.Change_val(1,ii); // on indique le numéro du stockage global // on commence par définir le conteneur global qui sera stocké dans LesMaillages ref_integ_vol(ii) = &refG; if (bloc.Nom(2) == "un_ddl_etendu_") { // il s'agit d'une intégrale d'un ddl étendu de nom: bloc.Nom(3) nom_ref += "_ddl_etendu_"+bloc.Nom(3); Ddl_etendu ddl(Ddl_enum_etendu(bloc.Nom(3))) ;// on crée un ddl ad hoc Grandeur_Ddl_etendu grand_courant(ddl,nom_ref);// le conteneur ad hoc // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas // et on récupère un exemplaire TypeQuelconque_enum_etendu enuType = TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu (INTEG_SUR_VOLUME,nom_ref,SCALAIRE_DOUBLE); // TypeQuelconque typQ(INTEG_SUR_VOLUME,EPS11,grand_courant); TypeQuelconque typQ(enuType,EPS11,grand_courant); integ_vol_typeQuel(ii) = (typQ); // et on ajoute une grandeur globale qui sera indexée par le nom de référence ParaGlob::param->Ajout_grandeur_consultable(&typQ,nom_ref); // idem pour la grandeur à t string nom_ref_t = nom_ref + "_t_"; Ddl_etendu ddl_t(Ddl_enum_etendu(bloc.Nom(3))) ;// on crée un ddl ad hoc Grandeur_Ddl_etendu grand_courant_t(ddl_t,nom_ref_t);// le conteneur ad hoc // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas // et on récupère un exemplaire TypeQuelconque_enum_etendu enuType_t = TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu (INTEG_SUR_VOLUME,nom_ref_t,SCALAIRE_DOUBLE); // TypeQuelconque typQ_t(INTEG_SUR_VOLUME,EPS11,grand_courant_t); TypeQuelconque typQ_t(enuType_t,EPS11,grand_courant_t); integ_vol_typeQuel_t(ii) = (typQ_t); // et on ajoute une grandeur globale qui sera indexée par le nom de référence ParaGlob::param->Ajout_grandeur_consultable(&typQ_t,nom_ref_t); } else if (bloc.Nom(2) == "une_fonction_nD_") { // il s'agit d'une intégrale d'une fonction nD de nom: bloc.Nom(3) nom_ref += "_fct_nD_"+bloc.Nom(3); // on récupère le pointeur de fonction correspondant: Fonction_nD * fct = lesFonctionsnD->Trouve(bloc.Nom(3)); int nb_composante = fct->NbComposante(); Grandeur_Vecteur_Nommer grand_courant(nom_ref,nb_composante,fct); // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas // et on récupère un exemplaire TypeQuelconque_enum_etendu enuType = TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu (INTEG_SUR_VOLUME,nom_ref,VECTEUR); // TypeQuelconque typQ(INTEG_SUR_VOLUME,EPS11,grand_courant); TypeQuelconque typQ(enuType,EPS11,grand_courant); integ_vol_typeQuel(ii) = (typQ); // et on ajoute une grandeur globale qui sera indexée par le nom de référence ParaGlob::param->Ajout_grandeur_consultable(&typQ,nom_ref); // idem pour la grandeur à t string nom_ref_t = nom_ref + "_t_"; Grandeur_Vecteur_Nommer grand_courant_t(nom_ref_t,nb_composante,fct); // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas // et on récupère un exemplaire TypeQuelconque_enum_etendu enuType_t = TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu (INTEG_SUR_VOLUME,nom_ref_t,VECTEUR); // TypeQuelconque typQ_t(INTEG_SUR_VOLUME,EPS11,grand_courant_t); TypeQuelconque typQ_t(enuType_t,EPS11,grand_courant_t); integ_vol_typeQuel_t(ii) = (typQ_t); // et on ajoute une grandeur globale qui sera indexée par le nom de référence ParaGlob::param->Ajout_grandeur_consultable(&typQ_t,nom_ref_t); ////--- debug //cout << "\n -- debug LesMaillages::Completer( "; //if (nom_ref_t == "int_vol_E_tout_fct_nD_fct1_t_") // { const void* pointe = (ParaGlob::param->GrandeurGlobal(nom_ref_t)); // TypeQuelconque* gr_quelc = (TypeQuelconque*) (pointe); // cout << "\n gr_quelc= "<< (*gr_quelc) << endl; // Grandeur_Vecteur_Nommer& gr = *((Grandeur_Vecteur_Nommer*) gr_quelc->Grandeur_pointee()); // pour simplifier // cout << "\n gr.NbMaxiNumeroOrdre()= "<Complete(bloc,lesFonctionsnD); if (poi == NULL) { // cas d'un probleme cout << "\n erreur l'integration de ";bloc.Affiche(); cout << " n'est pas adapte a l\'element "; poi = & Element_LesMaille(nnn,nbb); cout << "\n element " << poi->Geometrie() << poi->Interpolation(); cout << "\n LesMaillages::Completer( etc ... " << endl; Sortie(1); }; }; ref_integ_vol(ii)= &refG; // sauvegarde }; // cas des intégrales sur le volume et le temps int divers_TtabIntegVol_et_temps_Taille=divers->TtabIntegVol_et_temps().Taille(); // on redimentionne les tableaux de sauvegardes integ_vol_t_typeQuel.Change_taille(divers_TtabIntegVol_et_temps_Taille); integ_vol_t_typeQuel_t.Change_taille(divers_TtabIntegVol_et_temps_Taille); ref_integ_vol_t.Change_taille(divers_TtabIntegVol_et_temps_Taille); for (int ii=1;ii<= divers_TtabIntegVol_et_temps_Taille;ii++) { string nomIntegVol = (divers->TtabIntegVol_et_temps())(ii).NomRef(); // recup du nom de la ref const BlocDdlLim& div_IntegVol = (divers->TtabIntegVol_et_temps())(ii); const Reference & refG = lesRef->Trouve(nomIntegVol,div_IntegVol.NomMaillage()); // recup de la reference // vérif que la référence s'adresse à des éléments if ( refG.Indic() != 2) { // erreur la référence ne concerne pas des éléments cout << "\n erreur la référence " << refG.Nom() << " ne concerne pas des éléments "; cout << " \n cas des données relatives aux integrations sur le volume et le temps "; cout << "\n LesMaillages::Completer( .... "; Sortie(1); }; const ReferenceNE & ref = (ReferenceNE &) refG; int ref_Taille=ref.Taille(); // creation d'un bloc general contenant des informations // n= nombre de string, m nombre de double BlocGen bloc(4,1) ; // par defaut string nom_inter("integrale_sur_vol_et_temps_"); bloc.Change_nom(1,nom_inter); // le type d'intégrale: de volume ici bloc.Change_nom(2,div_IntegVol.Nom(2)); bloc.Change_nom(3,div_IntegVol.Nom(3)); // construction d'un nom qui servira à discriminer les différents conteneurs string nom_ref("int_vol_temps_");// init if ((div_IntegVol.NomMaillage() == NULL) // cas d'un seule maillage && (nbMaillageTotal==1)) // enregistré {nom_ref +=(refG.Nom());} else if (div_IntegVol.NomMaillage() != NULL) // cas de plusieurs maillages {nom_ref += (*div_IntegVol.NomMaillage())+"_"+(refG.Nom());} else // sinon pb { cout << "\n erreur il manque le nom de maillage alors qu'il y a plusieurs maillages en cours "; cout << " \n cas des données relatives aux integrations sur le volume et le temps "; cout << "\n LesMaillages::Completer( .... "; Sortie(1); }; bloc.Change_val(1,ii); // on indique le numéro du stockage global // on commence par définir le conteneur global qui sera stocké dans LesMaillages ref_integ_vol_t(ii) = &refG; if (bloc.Nom(2) == "un_ddl_etendu_") { // il s'agit d'une intégrale d'un ddl étendu de nom: bloc.Nom(3) nom_ref += "_ddl_etendu_"+bloc.Nom(3); Ddl_etendu ddl(Ddl_enum_etendu(bloc.Nom(3))) ;// on crée un ddl ad hoc Grandeur_Ddl_etendu grand_courant(ddl,nom_ref);// le conteneur ad hoc // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas // et on récupère un exemplaire TypeQuelconque_enum_etendu enuType = TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu (INTEG_SUR_VOLUME_ET_TEMPS,nom_ref,SCALAIRE_DOUBLE); // TypeQuelconque typQ(INTEG_SUR_VOLUME_ET_TEMPS,EPS11,grand_courant); TypeQuelconque typQ(enuType,EPS11,grand_courant); integ_vol_t_typeQuel(ii) = (typQ); // et on ajoute une grandeur globale qui sera indexée par le nom de référence ParaGlob::param->Ajout_grandeur_consultable(&typQ,nom_ref); // idem pour la grandeur à t string nom_ref_t = nom_ref + "_t_"; Ddl_etendu ddl_t(Ddl_enum_etendu(bloc.Nom(3))) ;// on crée un ddl ad hoc Grandeur_Ddl_etendu grand_courant_t(ddl,nom_ref_t);// le conteneur ad hoc // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas // et on récupère un exemplaire TypeQuelconque_enum_etendu enuType_t = TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu (INTEG_SUR_VOLUME_ET_TEMPS,nom_ref_t,SCALAIRE_DOUBLE); // TypeQuelconque typQ_t(INTEG_SUR_VOLUME_ET_TEMPS,EPS11,grand_courant_t); TypeQuelconque typQ_t(enuType_t,EPS11,grand_courant_t); integ_vol_t_typeQuel_t(ii) = (typQ_t); // et on ajoute une grandeur globale qui sera indexée par le nom de référence ParaGlob::param->Ajout_grandeur_consultable(&typQ_t,nom_ref_t); } else if (bloc.Nom(2) == "une_fonction_nD_") { // il s'agit d'une intégrale d'une fonction nD de nom: bloc.Nom(3) nom_ref += "_fct_nD_"+bloc.Nom(3); // on récupère le pointeur de fonction correspondant: Fonction_nD * fct = lesFonctionsnD->Trouve(bloc.Nom(3)); int nb_composante = fct->NbComposante(); Grandeur_Vecteur_Nommer grand_courant(nom_ref,nb_composante,fct); // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas // et on récupère un exemplaire TypeQuelconque_enum_etendu enuType = TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu (INTEG_SUR_VOLUME_ET_TEMPS,nom_ref,VECTEUR); // TypeQuelconque typQ(INTEG_SUR_VOLUME_ET_TEMPS,EPS11,grand_courant); TypeQuelconque typQ(enuType,EPS11,grand_courant); integ_vol_t_typeQuel(ii) = (typQ); // et on ajoute une grandeur globale qui sera indexée par le nom de référence ParaGlob::param->Ajout_grandeur_consultable(&typQ,nom_ref); // idem pour la grandeur à t string nom_ref_t = nom_ref + "_t_"; Grandeur_Vecteur_Nommer grand_courant_t(nom_ref_t,nb_composante,fct); // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas // et on récupère un exemplaire TypeQuelconque_enum_etendu enuType_t = TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu (INTEG_SUR_VOLUME_ET_TEMPS,nom_ref_t,VECTEUR); // TypeQuelconque typQ_t(INTEG_SUR_VOLUME_ET_TEMPS,EPS11,grand_courant_t); TypeQuelconque typQ_t(enuType_t,EPS11,grand_courant_t); integ_vol_t_typeQuel_t(ii) = (typQ_t); // et on ajoute une grandeur globale qui sera indexée par le nom de référence ParaGlob::param->Ajout_grandeur_consultable(&typQ_t,nom_ref_t); }; bloc.Change_nom(4,nom_ref); // on indique le nom de référencement global // puis on alimente les éléments concernés par ces calculs ////--- debug //cout << "\n -- debug LesMaillages::Completer( "; //bloc.Affiche(); cout << endl; ////--- fin debug for (int jj= 1; jj<= ref_Taille; jj++) {int nbb = ref.Numero(jj) ; // le numero de l'element dans le maillage int nnn = ref.Nbmaille(); // le numero du maillage // recup de l'element Element * poi = & Element_LesMaille(nnn,nbb); // demande a l'element de se completer poi = poi->Complete(bloc,lesFonctionsnD); if (poi == NULL) { // cas d'un probleme cout << "\n erreur l'integration de ";bloc.Affiche(); cout << " n'est pas adapte a l\'element "; poi = & Element_LesMaille(nnn,nbb); cout << "\n element " << poi->Geometrie() << poi->Interpolation(); cout << "\n LesMaillages::Completer( etc ... " << endl; Sortie(1); }; }; }; // cas de la stabilisation transversale de membrane et ou de biel int divers_TabStabMembBiel_Taille=divers->TabStabMembBiel().Taille(); // on redimentionne les tableaux de sauvegardes for (int ii=1;ii<= divers_TabStabMembBiel_Taille;ii++) { string nomStabMembBiel = (divers->TabStabMembBiel())(ii).NomRef(); // recup du nom de la ref // on récupère la taille réel du conteneur int nb_info = (divers->TabStabMembBiel())(ii).DimNom(); // creation d'un bloc general contenant des informations // n= nombre de string, m nombre de double BlocGen bloc(nb_info,0) ; // par defaut // on récupère le bloc gen qui est par défaut de type 4,0 mais en fait est peut-être différent // via la lecture. Comme on ramène un pointeur, on récupère le vrai bloc lu, modifié éventuellement en taille const BlocDdlLim& div_TabStabMembBiel = (divers->TabStabMembBiel())(ii); const Reference & refG = lesRef->Trouve(nomStabMembBiel,div_TabStabMembBiel.NomMaillage()); // recup de la reference // vérif que la référence s'adresse à des éléments if ( refG.Indic() != 2) { // erreur la référence ne concerne pas des éléments cout << "\n erreur la référence " << refG.Nom() << " ne concerne pas des éléments "; cout << " \n cas des données relatives a la stabilisation transversale de membrane ou de biel "; cout << "\n LesMaillages::Completer( .... "; Sortie(1); }; const ReferenceNE & ref = (ReferenceNE &) refG; int ref_Taille=ref.Taille(); string nom_inter("stabilisation_transvers_membrane_biel_"); bloc.Change_nom(1,nom_inter); // le mot clé // ensuite le type de stabilisation bloc.Change_nom(2,div_TabStabMembBiel.Nom(2)); // puis un des deux mots clés : "une_valeur_numerique_" ou "une_fonction_nD_" bloc.Change_nom(3,div_TabStabMembBiel.Nom(3)); // un string qui contient: soit la valeur numérique, soit le nom de la fonction nD bloc.Change_nom(4,div_TabStabMembBiel.Nom(4)); // s'il y a des infos supplémentaires, on les recopie if (nb_info > 4) for (int i=4;i<=nb_info;i++) bloc.Change_nom(i,div_TabStabMembBiel.Nom(i)); // puis on alimente les éléments concernés par ces calculs ////--- debug //cout << "\n -- debug LesMaillages::Completer( "; //bloc.Affiche(); cout << endl; ////--- fin debug for (int jj= 1; jj<= ref_Taille; jj++) {int nbb = ref.Numero(jj) ; // le numero de l'element dans le maillage int nnn = ref.Nbmaille(); // le numero du maillage // recup de l'element Element * poi = & Element_LesMaille(nnn,nbb); // demande a l'element de se completer poi = poi->Complete(bloc,lesFonctionsnD); }; }; // // retourne le tableau sur la définition d'un repère d'anisotropie aux éléments // const Tableau < BlocDdlLim >& TabRepAnisotrope() const {return tabRepAnisotrope;}; // cas de la définition de repère d'anisotropie int divers_TabRepAnisotrope_Taille=divers->TabRepAnisotrope().Taille(); // on redimentionne les tableaux de sauvegardes for (int ii=1;ii<= divers_TabRepAnisotrope_Taille;ii++) { string nomRepAnisotrope = (divers->TabRepAnisotrope())(ii).NomRef(); // recup du nom de la ref const BlocDdlLim& div_TabRepAnisotrope = (divers->TabRepAnisotrope())(ii); const Reference & refG = lesRef->Trouve(nomRepAnisotrope,div_TabRepAnisotrope.NomMaillage()); // recup de la reference // vérif que la référence s'adresse à des éléments if ( refG.Indic() != 2) { // erreur la référence ne concerne pas des éléments cout << "\n erreur la reference " << refG.Nom() << " ne concerne pas des elements "; cout << " \n cas des donnees relatives a la definition de repere d'anisotropie "; cout << "\n LesMaillages::Completer( .... "; Sortie(1); }; const ReferenceNE & ref = (ReferenceNE &) refG; int ref_Taille=ref.Taille(); // creation d'un bloc general contenant des informations // n= nombre de string, m nombre de double BlocGen bloc(5,0) ; // par defaut string nom_inter("repere_anisotropie_"); bloc.Change_nom(1,nom_inter); // le mot clé // ensuite le type l'identificateur de repere bloc.Change_nom(2,div_TabRepAnisotrope.Nom(2)); // ensuite le type de repere bloc.Change_nom(3,div_TabRepAnisotrope.Nom(3)); // puis la méthode de définition du repère bloc.Change_nom(4,div_TabRepAnisotrope.Nom(4)); // un string qui contient le nom de la fonction nD bloc.Change_nom(5,div_TabRepAnisotrope.Nom(6)); // puis on alimente les éléments concernés par ces calculs ////--- debug //cout << "\n -- debug LesMaillages::Completer( "; //bloc.Affiche(); cout << endl; ////--- fin debug for (int jj= 1; jj<= ref_Taille; jj++) {int nbb = ref.Numero(jj) ; // le numero de l'element dans le maillage int nnn = ref.Nbmaille(); // le numero du maillage // recup de l'element Element * poi = & Element_LesMaille(nnn,nbb); // demande a l'element de se completer poi = poi->Complete(bloc,lesFonctionsnD); }; }; // cas de statistique d'une ref de noeuds pour une grandeur quelconque int divers_TabStatistique_Taille=divers->TabStatistique().Taille(); // on redimentionne les tableaux de sauvegardes statistique_typeQuel.Change_taille(divers_TabStatistique_Taille); statistique_typeQuel_t.Change_taille(divers_TabStatistique_Taille); ref_statistique.Change_taille(divers_TabStatistique_Taille); pour_statistique_de_ddl.Change_taille(divers_TabStatistique_Taille); for (int ii=1;ii<= divers_TabStatistique_Taille;ii++) { string nomStatistique = (divers->TabStatistique())(ii).NomRef(); // recup du nom de la ref const BlocDdlLim& div_Statistique = (divers->TabStatistique())(ii); const Reference & refG = lesRef->Trouve(nomStatistique,div_Statistique.NomMaillage()); // recup de la reference // vérif que la référence s'adresse à des noeuds if ( refG.Indic() != 1) { // erreur la référence ne concerne pas des éléments cout << "\n erreur la reference " << refG.Nom() << " ne concerne pas des Noeuds "; cout << " \n cas des donnees relatives aux statistiques "; cout << "\n LesMaillages::Completer( .... "; Sortie(1); }; const ReferenceNE & ref = (ReferenceNE &) refG; // creation d'un bloc general contenant des informations // n= nombre de string, m nombre de double BlocGen bloc(4,1) ; // par defaut ////--- debug //cout << "\n -- debug LesMaillages::Completer( "; //div_Statistique.Affiche(); cout << endl; ////--- fin debug string nom_inter("statistique_"); bloc.Change_nom(1,nom_inter); // le type de statistique bloc.Change_nom(2,div_Statistique.Nom(2)); // mot clé : ex: un_ddl_etendu_ bloc.Change_nom(3,div_Statistique.Nom(3)); // ex: le nom du ddl : ex UX // construction d'un nom qui servira à discriminer les différents conteneurs string nom_ref("statistique_");// init if ((div_Statistique.NomMaillage() == NULL) // cas d'un seule maillage && (nbMaillageTotal==1)) // enregistré {nom_ref +=(refG.Nom());} else if (div_Statistique.NomMaillage() != NULL) // cas de plusieurs maillages {nom_ref += (*div_Statistique.NomMaillage())+"_"+(refG.Nom());} else // sinon pb { cout << "\n erreur il manque le nom de maillage alors qu'il y a plusieurs maillages en cours "; cout << " \n cas des donnees relatives aux statistiques sur ref de noeuds "; cout << "\n LesMaillages::Completer( .... "; Sortie(1); }; bloc.Change_val(1,ii); // on indique le numéro du stockage global // on commence par définir le conteneur global qui sera stocké dans LesMaillages ref_statistique(ii) = &refG; if (bloc.Nom(2) == "un_ddl_etendu_") { // il s'agit d'une statistique d'un ddl étendu de nom: bloc.Nom(3) nom_ref += "_ddl_etendu_"+bloc.Nom(3); // on sauvegarde le Ddl_enum_etendu associé pour_statistique_de_ddl(ii) = Ddl_enum_etendu(bloc.Nom(3)); // on définit le conteneur résultat: on stocke un vecteur, car pour un ddl -> 10 valeurs Grandeur_Vecteur_Nommer gvec_courant(nom_ref,10); // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas // et on récupère un exemplaire TypeQuelconque_enum_etendu enuType = TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu (STATISTIQUE,nom_ref,VECTEUR); TypeQuelconque typQ(enuType,X1,gvec_courant); statistique_typeQuel(ii) = (typQ); // stockage interne à LesMaillages // et on ajoute une grandeur globale qui sera indexée par le nom de référence ParaGlob::param->Ajout_grandeur_consultable(&typQ,nom_ref); // idem pour la grandeur à t string nom_ref_t = nom_ref + "__t_"; // on définit le conteneur résultat: on stocke un vecteur, car pour un ddl -> 10 valeurs Grandeur_Vecteur_Nommer gvec_courant_t(nom_ref_t,10); // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas // et on récupère un exemplaire TypeQuelconque_enum_etendu enuType_t = TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu (STATISTIQUE,nom_ref_t,VECTEUR); TypeQuelconque typQ_t(enuType_t,X1,gvec_courant_t); statistique_typeQuel_t(ii) = (typQ_t); // stockage interne à LesMaillages // et on ajoute une grandeur globale qui sera indexée par le nom de référence ParaGlob::param->Ajout_grandeur_consultable(&typQ_t,nom_ref_t); } else if (bloc.Nom(2) == "une_fonction_nD_") { // il s'agit d'une statistique d'une fonction nD de nom: bloc.Nom(3) nom_ref += "_fct_nD_"+bloc.Nom(3); // on récupère le pointeur de fonction correspondant: Fonction_nD * fct = lesFonctionsnD->Trouve(bloc.Nom(3)); int nb_composante = fct->NbComposante(); int dim_necessaire = (6*nb_composante + 4); // cf. la méthode CalStatistique() Grandeur_Vecteur_Nommer grand_courant(nom_ref,dim_necessaire,fct); // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas // et on récupère un exemplaire TypeQuelconque_enum_etendu enuType = TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu (STATISTIQUE,nom_ref,VECTEUR); TypeQuelconque typQ(enuType,X1,grand_courant); statistique_typeQuel(ii) = (typQ); // et on ajoute une grandeur globale qui sera indexée par le nom de référence ParaGlob::param->Ajout_grandeur_consultable(&typQ,nom_ref); // idem pour la grandeur à t string nom_ref_t = nom_ref + "__t_"; Grandeur_Vecteur_Nommer grand_courant_t(nom_ref_t,dim_necessaire,fct); // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas // et on récupère un exemplaire TypeQuelconque_enum_etendu enuType_t = TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu (STATISTIQUE,nom_ref_t,VECTEUR); TypeQuelconque typQ_t(enuType_t,X1,grand_courant_t); statistique_typeQuel_t(ii) = (typQ_t); // stockage interne à LesMaillages // et on ajoute une grandeur globale qui sera indexée par le nom de référence ParaGlob::param->Ajout_grandeur_consultable(&typQ_t,nom_ref_t); ////--- debug //cout << "\n -- debug LesMaillages::Completer( "; //if (nom_ref_t == "int_vol_E_tout_fct_nD_fct1_t_") // { const void* pointe = (ParaGlob::param->GrandeurGlobal(nom_ref_t)); // TypeQuelconque* gr_quelc = (TypeQuelconque*) (pointe); // cout << "\n gr_quelc= "<< (*gr_quelc) << endl; // Grandeur_Vecteur_Nommer& gr = *((Grandeur_Vecteur_Nommer*) gr_quelc->Grandeur_pointee()); // pour simplifier // cout << "\n gr.NbMaxiNumeroOrdre()= "<Complete(bloc,lesFonctionsnD); // if (poi == NULL) // { // cas d'un probleme // cout << "\n erreur l'integration de ";bloc.Affiche(); // cout << " n'est pas adapte a l\'element "; // poi = & Element_LesMaille(nnn,nbb); // cout << "\n element " << poi->Geometrie() << poi->Interpolation(); // cout << "\n LesMaillages::Completer( etc ... " << endl; // Sortie(1); // }; // }; }; // cas des statistiques sur des ref de noeuds avec cumul en temps int divers_TabStatistique_et_temps_Taille=divers->TabStatistique_et_temps().Taille(); // on redimentionne les tableaux de sauvegardes statistique_t_typeQuel.Change_taille(divers_TabStatistique_et_temps_Taille); statistique_t_typeQuel_t.Change_taille(divers_TabStatistique_et_temps_Taille); ref_statistique_t.Change_taille(divers_TabStatistique_et_temps_Taille); pour_statistique_t_de_ddl.Change_taille(divers_TabStatistique_et_temps_Taille,NU_DDL); for (int ii=1;ii<= divers_TabStatistique_et_temps_Taille;ii++) { string nomStatistique = (divers->TabStatistique_et_temps())(ii).NomRef(); // recup du nom de la ref const BlocDdlLim& div_Statistique = (divers->TabStatistique_et_temps())(ii); const Reference & refG = lesRef->Trouve(nomStatistique,div_Statistique.NomMaillage()); // recup de la reference // vérif que la référence s'adresse à des noeuds if ( refG.Indic() != 1) { // erreur la référence ne concerne pas des noeuds cout << "\n erreur la reference " << refG.Nom() << " ne concerne pas des noeuds "; cout << " \n cas des donnees relatives aux statistiques de ref de noeuds avec cumul en temps "; cout << "\n LesMaillages::Completer( .... "; Sortie(1); }; const ReferenceNE & ref = (ReferenceNE &) refG; int ref_Taille=ref.Taille(); // creation d'un bloc general contenant des informations // n= nombre de string, m nombre de double BlocGen bloc(4,1) ; // par defaut string nom_inter("statistique_et_temps_"); bloc.Change_nom(1,nom_inter); // le type de statistique bloc.Change_nom(2,div_Statistique.Nom(2)); bloc.Change_nom(3,div_Statistique.Nom(3)); // construction d'un nom qui servira à discriminer les différents conteneurs string nom_ref("statistique_temps_");// init if ((div_Statistique.NomMaillage() == NULL) // cas d'un seule maillage && (nbMaillageTotal==1)) // enregistré {nom_ref +=(refG.Nom());} else if (div_Statistique.NomMaillage() != NULL) // cas de plusieurs maillages {nom_ref += (*div_Statistique.NomMaillage())+"_"+(refG.Nom());} else // sinon pb { cout << "\n erreur il manque le nom de maillage alors qu'il y a plusieurs maillages en cours "; cout << " \n cas des données relatives aux statistiques sur des ref de noeuds avec cumul en temps "; cout << "\n LesMaillages::Completer( .... "; Sortie(1); }; bloc.Change_val(1,ii); // on indique le numéro du stockage global // on commence par définir le conteneur global qui sera stocké dans LesMaillages ref_statistique_t(ii) = &refG; if (bloc.Nom(2) == "un_ddl_etendu_") { // il s'agit d'une statistique d'un ddl étendu de nom: bloc.Nom(3) nom_ref += "_ddl_etendu_"+bloc.Nom(3); // on sauvegarde le Ddl_enum_etendu associé pour_statistique_t_de_ddl(ii) = Ddl_enum_etendu(bloc.Nom(3)); // on définit le conteneur résultat: on stocke un vecteur, car pour un ddl -> 10 valeurs Grandeur_Vecteur_Nommer gvec_courant(nom_ref,10); // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas // et on récupère un exemplaire TypeQuelconque_enum_etendu enuType = TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu (STATISTIQUE_ET_TEMPS,nom_ref,VECTEUR); TypeQuelconque typQ(enuType,X1,gvec_courant); statistique_t_typeQuel(ii) = (typQ); // stockage interne à LesMaillages // et on ajoute une grandeur globale qui sera indexée par le nom de référence ParaGlob::param->Ajout_grandeur_consultable(&typQ,nom_ref); // idem pour la grandeur à t string nom_ref_t = nom_ref + "__t_"; // on définit le conteneur résultat: on stocke un vecteur, car pour un ddl -> 10 valeurs Grandeur_Vecteur_Nommer gvec_courant_t(nom_ref_t,10); // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas // et on récupère un exemplaire TypeQuelconque_enum_etendu enuType_t = TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu (STATISTIQUE_ET_TEMPS,nom_ref_t,VECTEUR); TypeQuelconque typQ_t(enuType_t,X1,gvec_courant_t); statistique_t_typeQuel_t(ii) = (typQ_t); // stockage interne à LesMaillages // et on ajoute une grandeur globale qui sera indexée par le nom de référence ParaGlob::param->Ajout_grandeur_consultable(&typQ_t,nom_ref_t); } else if (bloc.Nom(2) == "une_fonction_nD_") { // il s'agit d'une statistique d'une fonction nD de nom: bloc.Nom(3) nom_ref += "_fct_nD_"+bloc.Nom(3); // on récupère le pointeur de fonction correspondant: Fonction_nD * fct = lesFonctionsnD->Trouve(bloc.Nom(3)); int nb_composante = fct->NbComposante(); int dim_necessaire = (6*nb_composante + 4); // cf. la méthode CalStatistique() Grandeur_Vecteur_Nommer grand_courant(nom_ref,dim_necessaire,fct); // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas // et on récupère un exemplaire TypeQuelconque_enum_etendu enuType = TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu (STATISTIQUE_ET_TEMPS,nom_ref,VECTEUR); TypeQuelconque typQ(enuType,X1,grand_courant); statistique_t_typeQuel(ii) = (typQ); // et on ajoute une grandeur globale qui sera indexée par le nom de référence ParaGlob::param->Ajout_grandeur_consultable(&typQ,nom_ref); // idem pour la grandeur à t string nom_ref_t = nom_ref + "__t_"; Grandeur_Vecteur_Nommer grand_courant_t(nom_ref_t,dim_necessaire,fct); // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas // et on récupère un exemplaire TypeQuelconque_enum_etendu enuType_t = TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu (STATISTIQUE_ET_TEMPS,nom_ref_t,VECTEUR); TypeQuelconque typQ_t(enuType_t,X1,grand_courant_t); statistique_t_typeQuel_t(ii) = (typQ_t); // stockage interne à LesMaillages // et on ajoute une grandeur globale qui sera indexée par le nom de référence ParaGlob::param->Ajout_grandeur_consultable(&typQ_t,nom_ref_t); }; bloc.Change_nom(4,nom_ref); // on indique le nom de référencement global // // puis on alimente les éléments concernés par ces calculs // ////--- debug // //cout << "\n -- debug LesMaillages::Completer( "; // //bloc.Affiche(); cout << endl; // ////--- fin debug // for (int jj= 1; jj<= ref_Taille; jj++) // {int nbb = ref.Numero(jj) ; // le numero de l'element dans le maillage // int nnn = ref.Nbmaille(); // le numero du maillage // // recup de l'element // Element * poi = & Element_LesMaille(nnn,nbb); // // demande a l'element de se completer // poi = poi->Complete(bloc,lesFonctionsnD); // if (poi == NULL) // { // cas d'un probleme // cout << "\n erreur l'integration de ";bloc.Affiche(); // cout << " n'est pas adapte a l\'element "; // poi = & Element_LesMaille(nnn,nbb); // cout << "\n element " << poi->Geometrie() << poi->Interpolation(); // cout << "\n LesMaillages::Completer( etc ... " << endl; // Sortie(1); // }; // }; }; // cas des tableaux de ddl pour les noeuds // InitPositionAssemblage(nb_assemb); }; // ramene le nombre total de ddl du pb int LesMaillages::NbTotalDdlActifs() const { // init du nombre de ddl actifs du pb int nb = 0; // puis boucle sur les maillages et les noeuds for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) nb += Noeud_LesMaille(i1,i2).Nombre_var_ddl_actives(); } return nb; }; // ramene le nombre total de ddl actifs du pb // pour un type de ddl donné, dans le cas de type // vectoriel on cumule les ddl de l'ensemble de la dimension int LesMaillages::NbTotalDdlActifs(Enum_ddl enum_ddl) const { // init du nombre de ddl actifs du pb int nb = 0; // puis boucle sur les maillages et les noeuds for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) nb += Noeud_LesMaille(i1,i2).Nombre_var_ddl_actives(enum_ddl); } return nb; }; // ramene le nombre total de points d'intégration correspondant à un ddl donné int LesMaillages::NbTotalPtInteg(Enum_ddl enum_ddl) const { // init du nombre de points d'intégration int nb = 0; // puis boucle sur les maillages et les éléments for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbelmax = tabMaillage(i1)->Nombre_element(); for (int i2 = 1; i2 <= nbelmax; i2++) nb += Element_LesMaille_const(i1,i2).NbPtInteg(enum_ddl); } return nb; }; // ramene le nombre total de grandeurs génératrices, calculées aux points d'intégrations, // correspondant à un ddl donné. int LesMaillages::NbTotalGrandeursGeneratrices(Enum_ddl enum_ddl) const { // init du nombre de grandeurs génératrices int nb = 0; // puis boucle sur les maillages et les éléments for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbelmax = tabMaillage(i1)->Nombre_element(); for (int i2 = 1; i2 <= nbelmax; i2++) { // on récupère le nombre de points d'intégrations int nbptinteg = Element_LesMaille_const(i1,i2).NbPtInteg(enum_ddl); // on récupère le nombre de grandeurs génératrices pour le ddl int nbGG = Element_LesMaille_const(i1,i2).NbGrandeurGene(enum_ddl); // calcul nb += nbptinteg * nbGG; } } return nb; }; //récupération d'une grandeur vectoriel de dimension, la dimension // de l'espace, défini au noeud et transféré dans un vecteur global // qui cumule de manière séquentielle toutes les grandeurs // en entrée : enum_ddl donne le type de la grandeur à récupérer // en fait de la première composante // duree : indique à quel temps doit s'effectuer le transfert, t=0 ou t ou tdt // enum_actif : le transfert s'effectue que si le ddl enum_actif est actif // ce qui permet la différentiation entre les différents ddl // vect : est le vecteur global de stockage qui normalement a été // au préalable dimensionné avec NbTotalDdlActifs(Enum_ddl enum_ddl) // Important: pour chaque famille de ddl, les ddl sont classés de manière croissante, ce qui signifie // que c'est l'ordre des pointeurs d'assemblage si et seulement si, ces ddl ont été rangés dans les noeuds // au préalable // en retour : une référence sur vect Vecteur & LesMaillages::Vect_loc_vers_glob(Enum_dure duree,Enum_ddl enum_actif ,Vecteur& vect,Enum_ddl enum_ddl) { // recup de la dimension int dimen = ParaGlob::Dimension(); // dans le cas axisymétrique il n'y a pas de variation suivant le dernier axe if (ParaGlob::AxiSymetrie()) dimen--; int ivect = 1; // position global // maintenant on passe en revue les noeuds for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // on regarde si le ddl existe et que le ddl actif est actif if ((noo->Existe_ici(enum_ddl)) && (noo->En_service(enum_actif)) && (noo->UneVariable(enum_actif))) // dans le cas où enum_ddl == X1, on regarde s'il ne faut pas associer l'épaisseur // l'épaisseur n'est associée que si elle est une variable switch (duree) { case TEMPS_0 : { for (int ii=1; ii<= dimen; ii++,ivect++) vect(ivect) = noo->Valeur_0(Enum_ddl(ii-1 + enum_ddl) ); if ((enum_ddl == X1) && noo->Existe_ici(EPAIS) && (noo->UneVariable(EPAIS))) {vect(ivect) = noo->Valeur_0(EPAIS);ivect++;}; break; } case TEMPS_t : { for (int ii=1; ii<= dimen; ii++,ivect++) vect(ivect) = noo->Valeur_t(Enum_ddl(enum_ddl + ii-1)); if ((enum_ddl == X1) && noo->Existe_ici(EPAIS) && (noo->UneVariable(EPAIS))) {vect(ivect) = noo->Valeur_t(EPAIS);ivect++;}; break; } case TEMPS_tdt : { for (int ii=1; ii<= dimen; ii++,ivect++) vect(ivect) = noo->Valeur_tdt(Enum_ddl(enum_ddl + ii-1)); if ((enum_ddl == X1) && noo->Existe_ici(EPAIS) && (noo->UneVariable(EPAIS))) {vect(ivect) = noo->Valeur_tdt(EPAIS);ivect++;}; break; } default : cout << "\nErreur : valeur incorrecte du type Enum_dure !\n"; cout << "LesMaillages::Vect_loc_vers_glob(Enum_dure... \n"; Sortie(1); } } } return vect; }; // fonction inverse de Vect_loc_vers_glob, il s'agit ici de passer // de la grandeur globale aux grandeurs locale void LesMaillages::Vect_glob_vers_local(Enum_dure duree,Enum_ddl enum_actif ,const Vecteur& vect,Enum_ddl enum_ddl) { // recup de la dimension int dimen = ParaGlob::Dimension(); // dans le cas axisymétrique il n'y a pas de variation suivant le dernier axe if (ParaGlob::AxiSymetrie()) dimen--; int ivect = 1; // position global // maintenant on passe en revu les noeuds for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // on regarde si le ddl existe et que le ddl actif est actif if ((noo->Existe_ici(enum_ddl)) && (noo->En_service(enum_actif)) && (noo->UneVariable(enum_actif))) // dans le cas où enum_ddl == X1, on regarde s'il ne faut pas associer l'épaisseur // l'épaisseur n'est associée que si elle est une variable switch (duree) { case TEMPS_0 : { for (int ii=1; ii<= dimen; ii++,ivect++) noo->Change_val_0(Enum_ddl(ii-1 + enum_ddl),vect(ivect)); if ((enum_ddl == X1) && noo->Existe_ici(EPAIS) && (noo->UneVariable(EPAIS))) {noo->Change_val_0(EPAIS,vect(ivect));ivect++;}; break; } case TEMPS_t : { for (int ii=1; ii<= dimen; ii++,ivect++) noo->Change_val_t(Enum_ddl(ii-1 + enum_ddl),vect(ivect)); if ((enum_ddl == X1) && noo->Existe_ici(EPAIS) && (noo->UneVariable(EPAIS))) {noo->Change_val_t(EPAIS,vect(ivect));ivect++;}; break; } case TEMPS_tdt : { for (int ii=1; ii<= dimen; ii++,ivect++) noo->Change_val_tdt(Enum_ddl(ii-1 + enum_ddl),vect(ivect)); if ((enum_ddl == X1) && noo->Existe_ici(EPAIS) && (noo->UneVariable(EPAIS))) {noo->Change_val_tdt(EPAIS,vect(ivect));ivect++;}; break; } default : cout << "\nErreur : valeur incorrecte du type Enum_dure !\n"; cout << "LesMaillages::Vect_glob_vers_local(Enum_dure... \n"; Sortie(1); } } } }; //récupération d'une grandeur vectoriel de dimension, la dimension // de l'espace, défini au noeud et transféré dans un vecteur global // qui cumule de manière séquentielle toutes les grandeurs // en entrée : tab_enum_ddl donne le tableau des type de la grandeur à récupérer // en fait de la première composante // duree : indique à quel temps doit s'effectuer le transfert, t=0 ou t ou tdt // tab_enum_actif : pour chaque élément tab_enum_ddl(i), le transfert s'effectue que si // le ddl tab_enum_actif(i) est actif // ce qui permet la différentiation entre les différents ddl // vect : est le vecteur global de stockage qui normalement a été // au préalable dimensionné avec somme des NbTotalDdlActifs(Enum_ddl enum_ddl), avec enum_ddl // qui balaie l'ensemble des éléments de tab_enum_ddl // Important: pour chaque famille de ddl, les ddl sont classés de manière croissante, ce qui signifie // que c'est l'ordre des pointeurs d'assemblage si et seulement si, ces ddl ont été rangés dans les noeuds // au préalable // en retour : une référence sur vect Vecteur & LesMaillages::Vect_loc_vers_glob(Enum_dure duree,const Tableau & tab_enum_actif ,Vecteur& vect,const Tableau & tab_enum_ddl) { // recup de la dimension int dimen = ParaGlob::Dimension(); // dans le cas axisymétrique il n'y a pas de variation suivant le dernier axe if (ParaGlob::AxiSymetrie()) dimen--; int ivect = 1; // position global int taill_tab = tab_enum_ddl.Taille(); #ifdef MISE_AU_POINT if (taill_tab != tab_enum_actif.Taille()) {cout << "\n *** erreur , la dimension: "< tab_enum_actif est differente " << " de la taille: "< tab_enum_ddl " << "\n LesMaillages::Vect_loc_vers_glob( ..."<Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // on boucle sur les ddl for (int i=1;i<= taill_tab;i++) {Enum_ddl enum_actif=tab_enum_actif(i); Enum_ddl enum_ddl = tab_enum_ddl(i); // on regarde si le ddl existe et que le ddl actif est actif if ((noo->Existe_ici(enum_ddl)) && (noo->En_service(enum_actif)) && (noo->UneVariable(enum_actif))) // dans le cas où enum_ddl == X1, on regarde s'il ne faut pas associer l'épaisseur // l'épaisseur n'est associée que si elle est une variable switch (duree) { case TEMPS_0 : { for (int ii=1; ii<= dimen; ii++,ivect++) vect(ivect) = noo->Valeur_0(Enum_ddl(ii-1 + enum_ddl) ); if ((enum_ddl == X1) && noo->Existe_ici(EPAIS) && (noo->UneVariable(EPAIS))) {vect(ivect) = noo->Valeur_0(EPAIS);ivect++;}; break; } case TEMPS_t : { for (int ii=1; ii<= dimen; ii++,ivect++) vect(ivect) = noo->Valeur_t(Enum_ddl(enum_ddl + ii-1)); if ((enum_ddl == X1) && noo->Existe_ici(EPAIS) && (noo->UneVariable(EPAIS))) {vect(ivect) = noo->Valeur_t(EPAIS);ivect++;}; break; } case TEMPS_tdt : { for (int ii=1; ii<= dimen; ii++,ivect++) vect(ivect) = noo->Valeur_tdt(Enum_ddl(enum_ddl + ii-1)); if ((enum_ddl == X1) && noo->Existe_ici(EPAIS) && (noo->UneVariable(EPAIS))) {vect(ivect) = noo->Valeur_tdt(EPAIS);ivect++;}; break; } default : cout << "\nErreur : valeur incorrecte du type Enum_dure !\n"; cout << "LesMaillages::Vect_loc_vers_glob(Enum_dure... \n"; Sortie(1); }; }; }; } return vect; }; // fonction inverse de Vect_loc_vers_glob, il s'agit ici de passer // de la grandeur globale aux grandeurs locale void LesMaillages::Vect_glob_vers_local(Enum_dure duree,const Tableau & tab_enum_actif ,const Vecteur& vect,const Tableau & tab_enum_ddl) { // recup de la dimension int dimen = ParaGlob::Dimension(); // dans le cas axisymétrique il n'y a pas de variation suivant le dernier axe if (ParaGlob::AxiSymetrie()) dimen--; int ivect = 1; // position global int taill_tab = tab_enum_ddl.Taille(); #ifdef MISE_AU_POINT if (taill_tab != tab_enum_actif.Taille()) {cout << "\n *** erreur , la dimension: "< tab_enum_actif est differente " << " de la taille: "< tab_enum_ddl " << "\n LesMaillages::Vect_glob_vers_local( ..."<Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // on boucle sur les ddl for (int i=1;i<= taill_tab;i++) {Enum_ddl enum_actif=tab_enum_actif(i); Enum_ddl enum_ddl = tab_enum_ddl(i); // on regarde si le ddl existe et que le ddl actif est actif if ((noo->Existe_ici(enum_ddl)) && (noo->En_service(enum_actif)) && (noo->UneVariable(enum_actif))) // dans le cas où enum_ddl == X1, on regarde s'il ne faut pas associer l'épaisseur // l'épaisseur n'est associée que si elle est une variable switch (duree) { case TEMPS_0 : { for (int ii=1; ii<= dimen; ii++,ivect++) noo->Change_val_0(Enum_ddl(ii-1 + enum_ddl),vect(ivect)); if ((enum_ddl == X1) && noo->Existe_ici(EPAIS) && (noo->UneVariable(EPAIS))) {noo->Change_val_0(EPAIS,vect(ivect));ivect++;}; break; } case TEMPS_t : { for (int ii=1; ii<= dimen; ii++,ivect++) noo->Change_val_t(Enum_ddl(ii-1 + enum_ddl),vect(ivect)); if ((enum_ddl == X1) && noo->Existe_ici(EPAIS) && (noo->UneVariable(EPAIS))) {noo->Change_val_t(EPAIS,vect(ivect));ivect++;}; break; } case TEMPS_tdt : { for (int ii=1; ii<= dimen; ii++,ivect++) noo->Change_val_tdt(Enum_ddl(ii-1 + enum_ddl),vect(ivect)); if ((enum_ddl == X1) && noo->Existe_ici(EPAIS) && (noo->UneVariable(EPAIS))) {noo->Change_val_tdt(EPAIS,vect(ivect));ivect++;}; break; } default : cout << "\nErreur : valeur incorrecte du type Enum_dure !\n"; cout << "LesMaillages::Vect_glob_vers_local(Enum_dure... \n"; Sortie(1); }; }; }; }; }; //récupération d'une grandeur scalaire // défini au noeud et transféré dans un vecteur global // qui cumule de manière séquentielle toutes les grandeurs // en entrée : enum_ddl donne le type de la grandeur à récupérer // duree : indique à quel temps doit s'effectuer le transfert, t=0 ou t ou tdt // enum_actif : le transfert s'effectue que si le ddl enum_actif est actif // ce qui permet la différentiation entre les différents ddl // vect : est le vecteur global de stockage qui normalement a été // au préalable dimensionné avec NbTotalDdlActifs(Enum_ddl enum_ddl) // en retour : une référence sur vect Vecteur & LesMaillages::Scalaire_loc_vers_glob(Enum_dure duree,Enum_ddl enum_actif ,Vecteur& vect,Enum_ddl enum_ddl) { int ivect = 1; // position global // maintenant on passe en revu les noeuds for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++,ivect++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); if (noo->Existe_ici(enum_actif)) // ellimine les noeuds non concernés {// on regarde si le ddl existe et que le ddl actif est actif if ((noo->Existe_ici(enum_ddl)) && (noo->En_service(enum_actif)) && (noo->UneVariable(enum_actif))) switch (duree) { case TEMPS_0 : {vect(ivect) = noo->Valeur_0(enum_ddl); break;} case TEMPS_t : {vect(ivect) = noo->Valeur_t(enum_ddl); break;} case TEMPS_tdt : {vect(ivect) = noo->Valeur_tdt(enum_ddl); break;} default : cout << "\nErreur : valeur incorrecte du type Enum_dure !\n"; cout << "LesMaillages::Scalaire_loc_vers_glob(Enum_dure... \n"; Sortie(1); } } } } return vect; }; // fonction inverse de Scalaire_loc_vers_glob, il s'agit ici de passer // de la grandeur globale à la grandeur locale void LesMaillages::Scalaire_glob_vers_local(Enum_dure duree,Enum_ddl enum_actif ,Vecteur& vect,Enum_ddl enum_ddl) { int ivect = 1; // position global // maintenant on passe en revu les noeuds for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++,ivect++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); if (noo->Existe_ici(enum_actif)) // élimine les noeuds non concernés {// on regarde si le ddl existe et que le ddl actif est actif if ((noo->Existe_ici(enum_ddl)) && (noo->En_service(enum_actif)) && (noo->UneVariable(enum_actif))) switch (duree) { case TEMPS_0 : {noo->Change_val_0(enum_ddl,vect(ivect)); break;} case TEMPS_t : {noo->Change_val_t(enum_ddl,vect(ivect)); break;} case TEMPS_tdt : {noo->Change_val_tdt(enum_ddl,vect(ivect)); break;} default : cout << "\nErreur : valeur incorrecte du type Enum_dure !\n"; cout << "LesMaillages::Scalaire_glob_vers_local(Enum_dure... \n"; Sortie(1); }; } } } }; // fonctions idem que pour les ddl : mais pour un Ddl_etendu Vecteur & LesMaillages::Scalaire_loc_vers_glob(Enum_ddl enum_actif ,Vecteur& vect,const Ddl_enum_etendu& enum_ddl_etend) { int ivect = 1; // position global // maintenant on passe en revu les noeuds for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++,ivect++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); if (noo->Existe_ici(enum_actif)) // ellimine les noeuds non concernés // on regarde si le ddl existe et que le ddl actif est actif {if ((noo->Existe_ici_ddlEtendu(enum_ddl_etend)) && (noo->En_service(enum_actif))) vect(ivect) = (noo->DdlEtendue(enum_ddl_etend)).ConstValeur(); } } } return vect; }; // fonctions idem que pour les ddl : mais pour un Ddl_etendu void LesMaillages::Scalaire_glob_vers_local(Enum_ddl enum_actif ,Vecteur& vect,const Ddl_enum_etendu& enum_ddl_etend) { int ivect = 1; // position global #ifdef MISE_AU_POINT // on vérifie qu'il y a le bon nombre d'informations int nb_info = 0; for (int i1 = 1; i1<= nbMaillageTotal; i1++) nb_info += tabMaillage(i1)->Nombre_noeud(); if (vect.Taille() != nb_info) {cout << "\nerreur en affectation de grandeurs vers les maillages: vecteur globale "; cout << " dim vecteur = " << vect.Taille() << " alorq qu'il faut " << nb_info <<'\n'; cout << "\n LesMaillages::Scalaire_glob_vers_local(Enum_ddl enum_actif" << endl; Sortie(1); }; #endif // maintenant on passe en revu les noeuds for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++,ivect++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); if ((noo->Existe_ici_ddlEtendu(enum_ddl_etend)) && (noo->En_service(enum_actif))) // on récupère le ddl étendu pour le modifier (noo->ModifDdl_etendu(enum_ddl_etend)).Valeur() = vect(ivect); } } }; // fonctions idem que pour les ddl_etendu : mais pour une grandeur quelconque Vecteur & LesMaillages::Quelconque_loc_vers_glob(Enum_ddl enum_actif,Vecteur& vect,const TypeQuelconque& type_generique) //Vecteur & LesMaillages::Scalaire_loc_vers_glob(Enum_ddl enum_actif // ,Vecteur& vect,const Ddl_enum_etendu& enum_ddl_etend) { int ivect = 1; // position global int dim = ParaGlob::Dimension(); // dimension du pb // maintenant on passe en revue les noeuds for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++,ivect++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // on regarde si le conteneur existe, si oui on transfert, si non, on passe les valeurs TypeQuelconque_enum_etendu enuq = type_generique.EnuTypeQuelconque(); if (noo->Existe_ici(enum_actif)) // ellimine les noeuds non concernés {if ((noo->Existe_ici(enuq)) && (noo->En_service(enum_actif))) {// dépend du type de grandeur EnumTypeGrandeur enuGrandeur = type_generique.EnuTypeGrandeur(); switch (enuGrandeur) {case COORDONNEE: {TypeQuelconque& typQ = noo->ModifGrandeur_quelconque(enuq); // récup du conteneur du noeud // récup de la grandeur Grandeur_coordonnee* gcoor = (Grandeur_coordonnee*) typQ.Grandeur_pointee(); Coordonnee& conoe = *(gcoor->ConteneurCoordonnee()); // les coordonnées switch (dim) // on rempli le vecteur { case 3: vect(ivect)=conoe(3);ivect++; case 2: vect(ivect)=conoe(2);ivect++; case 1: vect(ivect)=conoe(1);ivect++; }; } default: cout << "\n ** erreur, pour l'instant le transfert depuis les noeuds de " << (enuq.NomPlein()) << " n'est pas implante ... le demander !! " << "\n LesMaillages::Quelconque_loc_vers_glob(..."<Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // on regarde si le conteneur existe, si oui on transfert, si non, on passe les valeurs TypeQuelconque_enum_etendu enuq = type_generique.EnuTypeQuelconque(); if (noo->Existe_ici(enum_actif)) // ellimine les noeuds non concernés { ////-------- debug //if (!((noo->Existe_ici(enuq)) && (noo->En_service(enum_actif)))) // {cout << "\n debug LesMaillages::Quelconque_glob_vers_local( "; // cout << "\n enuq: " << enuq.NomPlein()<< " noo->Existe_ici(enuq) "<< (noo->Existe_ici(enuq)) // << "\n enum_actif: " << Nom_ddl(enum_actif) << " noo->En_service(enum_actif) " << noo->En_service(enum_actif) // << flush; // }; ////-------- fin debug if ((noo->Existe_ici(enuq)) && (noo->En_service(enum_actif))) {// dépend du type de grandeur EnumTypeGrandeur enuGrandeur = type_generique.EnuTypeGrandeur(); switch (enuGrandeur) {case COORDONNEE: {TypeQuelconque& typQ = noo->ModifGrandeur_quelconque(enuq); // récup du conteneur du noeud // récup de la grandeur Grandeur_coordonnee* gcoor = (Grandeur_coordonnee*) typQ.Grandeur_pointee(); Coordonnee& conoe = *(gcoor->ConteneurCoordonnee()); // les coordonnées switch (dim) // on rempli les coordonnées { case 3: conoe(3)=vect(ivect+2); case 2: conoe(2)=vect(ivect+1); case 1: conoe(1)=vect(ivect); }; ivect +=dim; break; } default: cout << "\n ** erreur, pour l'instant le transfert vers les noeuds de " << (enuq.NomPlein()) << " n'est pas implante ... le demander !! " << "\n LesMaillages::Quelconque_glob_vers_local(..."< > LesMaillages::Les_type_de_ddl_par_noeud(bool absolue) { // def de la liste de retour Tableau > tab_ret_enum(nbMaillageTotal); // on boucle sur les maillages for (int i1 = 1; i1<= nbMaillageTotal; i1++) { // vecteur intermédiaire dont la taille peut augmenter List_io tab_enu_final; // on boucle sur les noeuds int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // recup du tableau de type de ddl associé List_io tab_enum_ddl(noo->Les_type_de_ddl(absolue)); tab_enum_ddl.sort(); // ordonne la liste tab_enu_final.merge(tab_enum_ddl); // ajout de la liste tab_enu_final.unique(); // supprime les doublons }; // mise à jour du tableau global List_io tab_enu_etendu_final; List_io tab_inter = Ddl_enum_etendu::TransfoList_io(tab_enu_final); tab_inter.sort(); tab_enu_etendu_final.merge(tab_inter);tab_enu_etendu_final.unique(); tab_ret_enum(i1) = tab_enu_etendu_final; } return tab_ret_enum; // retour du tableau }; // retourne la liste des types de ddl étendu actuellement utilisé // aux noeuds pour chaque maillage, la liste est exhaustive // elle contiend tous les types au moins une fois utilisée // cela ne signifie pas que le ddl en question soit présent // pour tous les noeud du maillage considéré // - le tableau de retour est indicé par le numéro de maillage correspondant // - il y a une liste par maillage Tableau > LesMaillages::Les_type_de_ddl_etendu_par_noeud(bool absolue) { // def de la liste de retour Tableau > tab_ret_enum(nbMaillageTotal); // on boucle sur les maillages for (int i1 = 1; i1<= nbMaillageTotal; i1++) { // vecteur intermédiaire dont la taille peut augmenter pour les ddl étendus List_io tab_enu_etendu_final; // on boucle sur les noeuds int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // recup du tableau de type de ddl étendues List_io tab_enum_etendu_ddl(noo->Les_type_de_ddl_etendu( absolue)); tab_enum_etendu_ddl.sort(); // ordonne la liste tab_enu_etendu_final.merge(tab_enum_etendu_ddl); // ajout de la liste tab_enu_etendu_final.unique(); // supprime les doublons }; // mise à jour du tableau global tab_ret_enum(i1) = tab_enu_etendu_final; } return tab_ret_enum; // retour du tableau }; // retourne la liste des types quelconque actuellement utilisé // aux noeuds pour chaque maillage, la liste est exhaustive // elle contiend tous les types au moins une fois utilisée // cela ne signifie pas que le ddl en question soit présent // pour tous les noeud du maillage considéré // - le tableau de retour est indicé par le numéro de maillage correspondant // - il y a une liste par maillage Tableau > LesMaillages::Les_type_de_TypeQuelconque_par_noeud(bool absolue) { // def de la liste de retour Tableau > tab_ret_enum(nbMaillageTotal); // grandeurs de travail int dim = ParaGlob::Dimension(); Coordonnee coor(dim); // un type coordonnee typique // maintenant on définit une grandeur typique de type Grandeur_coordonnee Grandeur_coordonnee gt(coor); TypeQuelconque typQ(VECT_REAC_N,X1,gt); // // idem pour la variation de position entre t et t+dt // TypeQuelconque typQ2(DELTA_XI,X1,gt); // on boucle sur les maillages for (int i1 = 1; i1<= nbMaillageTotal; i1++) { // vecteur intermédiaire dont la taille peut augmenter pour les ddl étendus List_io tab_enu_etendu_final; // on boucle sur les noeuds int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // recup du tableau de tous les TypeQuelconque disponibles au noeud List_io tab_enum_etendu_ddl(noo->Les_TypeQuelconque(absolue)); // --- on rajoute les réactions par défaut // sous forme d'un vecteur tab_enum_etendu_ddl.push_back(typQ); // Pour l'instant ce n'est pas fini donc on met en commentaire, sinon c'est pas clair // pour l'utilisateur !! // // --- on ajoute le delta des positions // tab_enum_etendu_ddl.push_back(typQ2); // -- on traite tab_enum_etendu_ddl.sort(); // ordonne la liste tab_enu_etendu_final.merge(tab_enum_etendu_ddl); // ajout de la liste tab_enu_etendu_final.unique(); // supprime les doublons }; // mise à jour du tableau global tab_ret_enum(i1) = tab_enu_etendu_final; } return tab_ret_enum; // retour du tableau }; // intro de certains conteneurs internes en relation par exemple avec les demandes de visualisation // ou autre // exemple: si VECT_REAC_N qui est un type quelconque, a été choisit // il faut qu'il soit présent aux noeuds, alors qu'il est alimenter par les ddl pur ... // on introduit donc le type quelconque associé // NB: le conteneur passé en paramètre ne sert que pour localiser les grandeurs void LesMaillages::Intro_Conteneurs_internes_noeud_relier_auto_autres_grandeur ( const List_io < TypeQuelconque > & glob_noeud_evol_retenu) { // grandeurs de travail int dim = ParaGlob::Dimension(); Coordonnee coor(dim); // un type coordonnee typique // maintenant on définit une grandeur typique de type Grandeur_coordonnee Grandeur_coordonnee gt(coor); TypeQuelconque typQ2(VECT_REAC_N,X1,gt); List_io ::const_iterator il,ilfin=glob_noeud_evol_retenu.end(); for (int i= 1;i<= nbMaillageTotal; i++) {for (il=glob_noeud_evol_retenu.begin();il != ilfin; il++) { TypeQuelconque_enum_etendu enuQ = (*il).EnuTypeQuelconque(); // on passe en revue les types concernés if (enuQ == VECT_REAC_N) // il faut alors vérifier que le conteneur existe aux noeuds {// on boucle sur les noeuds int nbnoeudmax = tabMaillage(i)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i,i2); if (!(noo->Existe_ici(enuQ))) // cas où on n'a pas le type présent, on l'introduit {noo->AjoutUnTypeQuelconque(typQ2);}; }; }; }; }; }; // idem que Intro_Conteneurs_internes_noeud_relier_auto_autres_grandeur // mais ciblé en fonction d'un tableau indicé sur les maillages void LesMaillages::Intro_Conteneurs_internes_noeud_relier_auto_autres_grandeur ( const Tableau < List_io < TypeQuelconque > > & tab_noeud_evol_retenu) { // grandeurs de travail int dim = ParaGlob::Dimension(); Coordonnee coor(dim); // un type coordonnee typique // maintenant on définit une grandeur typique de type Grandeur_coordonnee Grandeur_coordonnee gt(coor); TypeQuelconque typQ2(VECT_REAC_N,X1,gt); for (int i= 1;i<= nbMaillageTotal; i++) {List_io ::const_iterator il,ilfin=tab_noeud_evol_retenu(i).end(); for (il=tab_noeud_evol_retenu(i).begin();il != ilfin; il++) {TypeQuelconque_enum_etendu enuQ = (*il).EnuTypeQuelconque(); // on passe en revue les types concernés if (enuQ == VECT_REAC_N) // il faut alors vérifier que le conteneur existe aux noeuds {// on boucle sur les noeuds int nbnoeudmax = tabMaillage(i)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i,i2); if (!(noo->Existe_ici(enuQ))) // cas où on n'a pas le type présent, on l'introduit {noo->AjoutUnTypeQuelconque(typQ2);}; }; }; }; }; }; // retourne la liste des types de ddl actuellement utilisé // aux éléments pour chaque maillage, la liste est exhaustive // elle contiend tous les types au moins une fois utilisée // cela ne signifie pas que le ddl en question soit présent // pour tous les éléments du maillage considéré // - le tableau de retour est indicé par le numéro de maillage correspondant // - il y a une liste par maillage // absolue: indique si oui ou non on sort les tenseurs dans la base absolue ou une base particulière Tableau > LesMaillages::Les_type_de_ddl_par_element(bool absolue) { // def de la liste de retour Tableau > tab_ret_enum(nbMaillageTotal); // on boucle sur les maillages for (int i1 = 1; i1<= nbMaillageTotal; i1++) { // vecteur intermédiaire dont la taille peut augmenter List_io tab_enu_final; // on définit une liste de signature d'élément, ce qui permet de tester que les types d'éléments différents list list_signature_elem; // on boucle sur les elements int nbelementmax = tabMaillage(i1)->Nombre_element(); for (int i2 = 1; i2 <= nbelementmax; i2++) { // recup du element Element * nee = & Element_LesMaille(i1,i2); // recup du tableau de type de ddl associé // on regarde si un élément de même type n'a pas déjà été considéré if (find(list_signature_elem.begin(),list_signature_elem.end(),nee->Signature_element())==list_signature_elem.end()) { // nouveau type d'élément , on récupère les données particulières List_io tab_enum_ddl(nee->Les_type_de_ddl_internes(absolue)); tab_enu_final.sort(); // ordonne la liste tab_enu_final.merge(tab_enum_ddl); // ajout de la liste tab_enu_final.unique(); // supprime les doublons // on ajoute la signature list_signature_elem.push_back(nee->Signature_element()); }; } // mise à jour du tableau global tab_ret_enum(i1) = tab_enu_final; } return tab_ret_enum; // retour du tableau }; // retourne la liste des grandeurs évoluées interne actuellement utilisés // par les éléments, c'est-à-dire comme les ddl mais directement sous forme de vecteur, tenseurs ..., // la liste est exhaustive, elle contiend tous les types au moins une fois utilisée // cela ne signifie pas que la donnée particulière en question soit présent // pour tous les éléments du maillage considéré // - le tableau de retour est indicé par le numéro de maillage correspondant // - il y a une liste par maillage // absolue: indique si oui ou non on sort les tenseurs dans la base absolue ou une base particulière Tableau > LesMaillages::Les_type_de_donnees_evolues_internes_par_element(bool absolue) { // def de la liste de retour Tableau > tab_ret_enum(nbMaillageTotal); // on définit une liste de signature d'élément, ce qui permet de tester que les types d'éléments différents list list_signature_elem; // on boucle sur les maillages for (int i1 = 1; i1<= nbMaillageTotal; i1++) { // liste intermédiaire dont la taille peut augmenter List_io tab_enu_final; list_signature_elem.clear(); // on boucle sur les elements int nbelementmax = tabMaillage(i1)->Nombre_element(); for (int i2 = 1; i2 <= nbelementmax; i2++) { // recup de l'element Element * nee = & Element_LesMaille(i1,i2); // on regarde si un élément de même type n'a pas déjà été considéré if (find(list_signature_elem.begin(),list_signature_elem.end(),nee->Signature_element())==list_signature_elem.end()) { // nouveau type d'élément , on récupère les données particulières // les opérations qui suivent sont assez longues mais normalement n'arrives pas souvent // recup du tableau de type de données particulières associées List_io tab_enum_parti(nee->Les_type_evolues_internes(absolue)); tab_enu_final.sort(); // ordonne la liste tab_enum_parti.sort(); // idem la nouvelle tab_enu_final.merge(tab_enum_parti); // ajout de la liste tab_enu_final.unique(); // supprime les doublons // on ajoute la signature list_signature_elem.push_back(nee->Signature_element()); }; }; // mise à jour du tableau global tab_ret_enum(i1) = tab_enu_final; }; return tab_ret_enum; // retour du tableau }; // retourne la liste des types de données particulières actuellement utilisés // aux éléments pour chaque maillage, la liste est exhaustive // elle contiend tous les types au moins une fois utilisée // cela ne signifie pas que la donnée particulière en question soit présent // pour tous les éléments du maillage considéré // - le tableau de retour est indicé par le numéro de maillage correspondant // - il y a une liste par maillage Tableau > LesMaillages::Les_type_de_donnees_particulieres_par_element(bool absolue) { // def de la liste de retour Tableau > tab_ret_enum(nbMaillageTotal); // on boucle sur les maillages for (int i1 = 1; i1<= nbMaillageTotal; i1++) { // vecteur intermédiaire dont la taille peut augmenter List_io tab_enu_final; // on définit une liste de signature d'élément, ce qui permet de tester que les types d'éléments différents list list_signature_elem; // on boucle sur les elements int nbelementmax = tabMaillage(i1)->Nombre_element(); for (int i2 = 1; i2 <= nbelementmax; i2++) { // recup du element Element * nee = & Element_LesMaille(i1,i2); // on regarde si un élément de même type n'a pas déjà été considéré if (find(list_signature_elem.begin(),list_signature_elem.end(),nee->Signature_element())==list_signature_elem.end()) { // nouveau type d'élément , on récupère les données particulières // les opérations qui suivent sont assez longues mais normalement n'arrives pas souvent // recup du tableau de type de données particulières associées List_io tab_enum_parti(nee->Les_types_particuliers_internes(absolue)); tab_enu_final.sort(); // ordonne la liste tab_enu_final.merge(tab_enum_parti); // ajout de la liste tab_enu_final.unique(); // supprime les doublons // on ajoute la signature list_signature_elem.push_back(nee->Signature_element()); }; }; // mise à jour du tableau global tab_ret_enum(i1) = tab_enu_final; }; //----- debug // cout << "\n debug LesMaillages::Les_type_de_donnees_particulieres_par_element " // << tab_ret_enum << endl; // ------ fin debug return tab_ret_enum; // retour du tableau }; // Au niveau des noeuds: transfert des coordonnées de grandeurs vectorielles à des grandeurs évoluées // stockée sous forme de grandeurs TypeQuelconque // exemple: les réactions qui sont naturellement stockée en composantes // le principe est que ce passage s'effectue si les conteneurs existent au niveau des noeuds void LesMaillages::PassageInterneDansNoeud_composantes_vers_vectorielles() { int dim = ParaGlob::Dimension(); // dimension du pb if(ParaGlob::AxiSymetrie()) dim--; // en axisymétrie on récupère uniquement les forces en x et y // on boucle sur les maillages puis sur les noeuds for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // --- cas des réactions: {// on regarde si le conteneur existe, si oui on transfert, si non, on passe les valeurs EnumTypeQuelconque enuq = VECT_REAC_N; if ((noo->Existe_ici(enuq)) && (noo->Existe_ici(R_X1))) {TypeQuelconque& typQ = noo->ModifGrandeur_quelconque(enuq); // récup du conteneur du noeud // récup de la grandeur Grandeur_coordonnee* gcoor = (Grandeur_coordonnee*) typQ.Grandeur_pointee(); Coordonnee& conoe = *(gcoor->ConteneurCoordonnee()); // les coordonnées switch (dim) // on rempli les coordonnées { case 3: conoe(3)=noo->Valeur_tdt(R_X3); case 2: conoe(2)=noo->Valeur_tdt(R_X2); case 1: conoe(1)=noo->Valeur_tdt(R_X1); }; }; }; }; }; }; // retourne la liste des types de grandeur quelconque actuellement utilisé // aux faces élément pour chaque maillage, la liste est exhaustive // elle contiend tous les types au moins une fois utilisée // cela ne signifie pas que la grandeur en question soit présent // pour tous les éléments du maillage considéré // - le tableau de retour est indicé par le numéro de maillage correspondant // - il y a une liste par maillage Tableau > LesMaillages::Les_type_de_donnees_evolues_internes_par_face_element(bool absolue) { // def de la liste de retour Tableau > tab_ret_enum(nbMaillageTotal); // on boucle sur les maillages for (int i1 = 1; i1<= nbMaillageTotal; i1++) { // vecteur intermédiaire dont la taille peut augmenter List_io tab_enu_final; // on définit une liste de signature d'élément, ce qui permet de tester que les types d'éléments différents list list_signature_elem; // on boucle sur les elements int nbelementmax = tabMaillage(i1)->Nombre_element(); for (int i2 = 1; i2 <= nbelementmax; i2++) { // recup du element Element * nee = & Element_LesMaille(i1,i2); // on regarde si un élément de même type n'a pas déjà été considéré if (find(list_signature_elem.begin(),list_signature_elem.end(),nee->Signature_element())==list_signature_elem.end()) { // nouveau type d'élément , on récupère les données particulières // les opérations qui suivent sont assez longues mais normalement n'arrives pas souvent // recup du tableau de type de données particulières associées List_io tab_enum_parti(nee->Les_type_quelconque_de_face(absolue)); tab_enu_final.sort(); // ordonne la liste tab_enu_final.merge(tab_enum_parti); // ajout de la liste tab_enu_final.unique(); // supprime les doublons // on ajoute la signature list_signature_elem.push_back(nee->Signature_element()); }; }; // mise à jour du tableau global tab_ret_enum(i1) = tab_enu_final; }; //----- debug // cout << "\n debug LesMaillages::Les_type_de_donnees_evolues_internes_par_face_element " // << tab_ret_enum << endl; // ------ fin debug return tab_ret_enum; // retour du tableau }; // retourne la liste des types de grandeur quelconque actuellement utilisé // aux arêtes élément pour chaque maillage, la liste est exhaustive // elle contiend tous les types au moins une fois utilisée // cela ne signifie pas que la grandeur en question soit présent // pour tous les éléments du maillage considéré // - le tableau de retour est indicé par le numéro de maillage correspondant Tableau > LesMaillages::Les_type_de_donnees_evolues_internes_par_arete_element(bool absolue) { // def de la liste de retour Tableau > tab_ret_enum(nbMaillageTotal); // on boucle sur les maillages for (int i1 = 1; i1<= nbMaillageTotal; i1++) { // vecteur intermédiaire dont la taille peut augmenter List_io tab_enu_final; // on définit une liste de signature d'élément, ce qui permet de tester que les types d'éléments différents list list_signature_elem; // on boucle sur les elements int nbelementmax = tabMaillage(i1)->Nombre_element(); for (int i2 = 1; i2 <= nbelementmax; i2++) { // recup du element Element * nee = & Element_LesMaille(i1,i2); // on regarde si un élément de même type n'a pas déjà été considéré if (find(list_signature_elem.begin(),list_signature_elem.end(),nee->Signature_element())==list_signature_elem.end()) { // nouveau type d'élément , on récupère les données particulières // les opérations qui suivent sont assez longues mais normalement n'arrives pas souvent // recup du tableau de type de données particulières associées List_io tab_enum_parti(nee->Les_type_quelconque_de_arete(absolue)); tab_enu_final.sort(); // ordonne la liste tab_enu_final.merge(tab_enum_parti); // ajout de la liste tab_enu_final.unique(); // supprime les doublons // on ajoute la signature list_signature_elem.push_back(nee->Signature_element()); }; }; // mise à jour du tableau global tab_ret_enum(i1) = tab_enu_final; }; //----- debug // cout << "\n debug LesMaillages::Les_type_de_donnees_evolues_internes_par_arete_element " // << tab_ret_enum << endl; // ------ fin debug return tab_ret_enum; // retour du tableau }; // initialisation d'un ou ne plusieurs nouveaux cas d'assemblage // ramène le numéro du premier nouveau cas d'assemblage Nb_assemb LesMaillages::InitNouveauCasAssemblage(int nb_cas) { // on récupère le nombre actuel de cas d'assemblage int nb_actuel = tab_nb_assemb; // on parcours le noeud pour les dimensionner aux nouveaux cas d'assemblage for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // initialisation noo->InitNouveauCasAssemb(nb_cas); } } // dans le cas ou nb_cas est null pb #ifdef MISE_AU_POINT if (nb_cas == 0) { cout << "\n erreur, le nombre de nouveau cas d'assemblage demandé est nul !!" << " \n LesMaillages::InitNouveauCasAssemblage(int nb_cas) " ; Sortie(1); } #endif // mise à jour du nombre de cas d'assemblage tab_nb_assemb += nb_cas; // mise à jour du tableau t_i_n t_i_n.Change_taille(tab_nb_assemb); // retour du premier nouveau cas d'assemblage nb_actuel++; return Nb_assemb(nb_actuel); }; // met a jour les pointeurs d'assemblage dans les noeuds // et enregistre les ddl_actifs et leurs ordres au niveau des noeuds // a effectuer si l'on a changer de nb de noeuds, de nb de ddl, de nb de maillage // casAssemb : donne le cas d'assemblage qui est a considérer void LesMaillages::MiseAJourPointeurAssemblage(const Nb_assemb& casAssemb) { // pour la construction du tableau t_i_n pour le cas d'assemblage // on utilise une liste intermédiaire car on ne connait pas le nombre d'élément final list list_in ; // definition de la position globale d'assemblage int pointeur=0 ; // position d'assemblage int nb_assemb = casAssemb.n; bool absolue = true; // par défaut on travaille en absolu, mais en fait // cela n'a pas d'importance ici, car on n'utilise que le type for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // enregistrement des variables ddl actives noo->Enreg_ordre_variable_ddl_actives(nb_assemb); // on change le pointeur noo->ChangePosiAssemb(pointeur,nb_assemb); // récup de tous les ddl du noeud List_io list_ddl = noo->Les_type_de_ddl(absolue); // on définit le tableau d'indexage t_in List_io ::iterator ie,iefin=list_ddl.end(); for(ie=list_ddl.begin();ie!=iefin;ie++) { if (noo->En_service(*ie) && noo->UneVariable(*ie)) // si le ddl est en service on l'enregistre {Posi_ddl_noeud posi(i1,*ie,noo->Num_noeud()); list_in.push_back(posi); pointeur++; } } } } // construction du tableau t_i_n pour le cas d'assemblage // NB: t_i_n (i)(j) -> donne les infos pour retrouver le ddl numéro j du cas de charge i // le numéro j correspond au pointeur d'assemblage c-a-d la position du ddl dans l'assemblage Tableau & t_in = t_i_n(nb_assemb); // pour simplifier int taille_tab = (int) list_in.size(); // la taille finale t_in.Change_taille(taille_tab); int i; list::iterator ile; for (i=1,ile=list_in.begin();i<=taille_tab;i++,ile++) t_in(i) = (*ile); }; // met a jour les pointeurs d'assemblage dans les noeuds pour un cas d'assemblage // a effectuer si l'on a changer de nb de noeuds, de nb de ddl, de nb de maillage // casAssemb : donne le cas d'assemblage qui est a considérer // ici, l'assemblage suit l'ordre du tableau de noeud passé en paramètre // le tableau de noeuds rassemble tous les noeuds des maillages mais avec une numérotation propre // NB: t_i_n (i)(j) -> donne les infos pour retrouver le ddl numéro j du cas de charge i // le numéro j correspond au pointeur d'assemblage c-a-d la position du ddl dans l'assemblage // verif_maillage: si true: on vérifie que les numéros de noeuds sont possibles pour le maillage // mais cette vérification n'est pas effectuée si verif_maillage est false: c'est utile // dans une phase transitoire de fabrication de t_i_n: bien noter que dans ce cas le tableau // t_i_n n'est pas utilisable void LesMaillages::MiseAJourPointeurAssemblage_interne (const Nb_assemb& casAssemb,Tableau & tab_N_final ,bool verif_maillage) { // pour la construction du tableau t_i_n pour le cas d'assemblage // on utilise une liste intermédiaire car on ne connait pas le nombre d'élément final list list_in ; // definition de la position globale d'assemblage int pointeur=0 ; // position d'assemblage int nb_assemb = casAssemb.n; bool absolue = true; // par défaut on travaille en absolu, mais en fait // cela n'a pas d'importance ici, car on n'utilise que le type int nb_noeud = tab_N_final.Taille(); for (int i = 1; i<= nb_noeud; i++) { // recup du noeud Noeud * noo = tab_N_final(i); //if (noo->Num_noeud() != i) // cout << "\n debug LesMaillages::MiseAJourPointeurAssemblage_interne " // << " noo->Num_noeud()= "<< noo->Num_noeud() << " i= " << i << endl; // enregistrement des variables ddl actives noo->Enreg_ordre_variable_ddl_actives(nb_assemb); // on change le pointeur noo->ChangePosiAssemb(pointeur,nb_assemb); // récup de tous les ddl du noeud List_io list_ddl = noo->Les_type_de_ddl(absolue); // on définit le tableau d'indexage t_in List_io ::iterator ie,iefin=list_ddl.end(); for(ie=list_ddl.begin();ie!=iefin;ie++) { if (noo->En_service(*ie) && noo->UneVariable(*ie)) // si le ddl est en service on l'enregistre {Posi_ddl_noeud posi(noo->Num_Mail(),*ie,noo->Num_noeud()); list_in.push_back(posi); pointeur++; } }; }; // construction du tableau t_i_n pour le cas d'assemblage Tableau & t_in = t_i_n(nb_assemb); // pour simplifier int taille_tab = (int) list_in.size(); // la taille finale t_in.Change_taille(taille_tab); int i; list::iterator ile; for (i=1,ile=list_in.begin();i<=taille_tab;i++,ile++) { t_in(i) = (*ile); // debug // // on vérifie que le maillage correspondant contient bien le noeud pointé // if (t_in(i).Nb_noeud() > tabMaillage(t_in(i).Nb_maillage())->Nombre_noeud()) // cout << "\n debug LesMaillages::MiseAJourPointeurAssemblage_interne " // << " (t_in(i).Nb_noeud() > tabMaillage(t_in(i).Nb_maillage())->Nombre_noeud()) " // << " t_in(i).Nb_noeud()= "<< t_in(i).Nb_noeud() // << " tabMaillage(t_in(i).Nb_maillage())->Nombre_noeud()= "<< tabMaillage(t_in(i).Nb_maillage())->Nombre_noeud(); // fin debug }; // vérification éventuelle du tableau t_i_n if (verif_maillage) {for (int j=1;j<=taille_tab;j++) if (t_in(j).Nb_noeud() > tabMaillage(t_in(j).Nb_maillage())->Nombre_noeud()) { cout << "\n erreur !! LesMaillages::MiseAJourPointeurAssemblage_interne " << " le tableau t_i_n est incorrecte -> il y aura des problemes d'assemblage "; #ifdef MISE_AU_POINT cout << "\n cas d'assemblage nb= " << nb_assemb << ", ddl nb_global= " << j << " \n (t_in(j).Nb_noeud() > tabMaillage(t_in(j).Nb_maillage())->Nombre_noeud()) " << " \n t_in(j).Nb_noeud()= "<< t_in(j).Nb_noeud() << " tabMaillage(t_in(j).Nb_maillage())->Nombre_noeud()= "<< tabMaillage(t_in(j).Nb_maillage())->Nombre_noeud(); Sortie(1); #endif }; }; }; // remise à jour des tableaux de pointeurs t_i_n uniquement, due à un changement de numéro de noeud // en fonction d'un changement de num de noeud (mais pas de changement de pointeur d'assemblage // pour chaque noeud, tab_N_final(i) correspond au noeud qui avait le numéro i ancien // et qui a maintenant le numéro tab_N_final(i)->Num_noeud() // NB: t_i_n (i)(j) -> donne les infos pour retrouver le ddl numéro j du cas de charge i // le numéro j correspond au pointeur d'assemblage c-a-d la position du ddl dans l'assemblage void LesMaillages::MiseAJourTableau_t_i_n(const Nb_assemb& nb_casAssemb,Tableau & tab_N_final) { int nb_assemb = nb_casAssemb.n; // le tableau t_i_n pour le cas d'assemblage Tableau & t_in = t_i_n(nb_assemb); // pour simplifier // pour mémoire un élément Posi_ddl_noeud // données // int nb_maillage; // le numéro du maillage // int nb_noeud; // le numéro du noeud // Enum_ddl enu; // l'identifieur du ddl int taille_tab = t_in.Taille(); for (int i=1;i<= taille_tab;i++) { int ancien_num_noeud = t_in(i).Nb_noeud(); int nouveau_num_noeud = tab_N_final(ancien_num_noeud)->Num_noeud(); t_in(i).Nb_noeud() = nouveau_num_noeud; ////--- vérif debug //Coordonnee co = Noeud_LesMaille(t_in(i).Nb_maillage(),t_in(i).Nb_noeud()).Coord0(); //if (i==taille_tab) // cout << "\n debug LesMaillages::MiseAJourTableau_t_i_n "<< co << endl; ////-- fin debug // on vérifie que le maillage correspondant contient bien le noeud pointé if (nouveau_num_noeud > tabMaillage(t_in(i).Nb_maillage())->Nombre_noeud()) { cout << "\n erreur** LesMaillages::MiseAJourTableau_t_i_n " << " le tableau t_i_n est incorrecte -> il y aura des problemes d'assemblage "; #ifdef MISE_AU_POINT cout << "\n cas d'assemblage nb= " << nb_assemb << ", ddl nb_global= " << i << " \n (t_in(i).Nb_noeud() > tabMaillage(t_in(i).Nb_maillage())->Nombre_noeud()) " << " \n t_in(i).Nb_noeud()= "<< t_in(i).Nb_noeud() << " tabMaillage(t_in(i).Nb_maillage())->Nombre_noeud()= "<< tabMaillage(t_in(i).Nb_maillage())->Nombre_noeud(); Sortie(1); #endif }; }; }; // mise a zero de tous les ddl actifs autres que les deplacements // si indic = false; pas de creation des tableaux a t+dt // si indic = true; creation des tableaux a t+dt // cas = true; les coordonnées à t et éventuellement à t+dt sont initialisées // aux valeurs de t=0, sinon on ne les modifies pas void LesMaillages::ZeroDdl(bool indic,bool cas) { for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // if (i2 >= 583) // { // //debug // cout << "\n debug LesMaillages::ZeroDdl "; // cout << "\n pb coordonnee 2 noeud 583 "; // // fin debug // } if (indic) // construit les tableaux de ddl a t+dt selon indic noo->Travail_tdt(); // if ((i2 >= 583)&&(!(tabMaillage(1)->Noeud_mail(583).ExisteCoord2()))) // { // //debug // cout << "\n debug LesMaillages::ZeroDdl "; // cout << "\n pb coordonnee 2 noeud 583 "; // // fin debug // } noo->ZeroVariablesDdl(cas); } } ////debug //cout << "\n debug LesMaillages::ZeroDdl "; //cout << "\n coordonnees0 du noeud 583 "; //tabMaillage(1)->Noeud_mail(583).Coord0().Affiche(); // //tabMaillage(1)->Noeud_mail(583).Coord2().Affiche(); //// fin debug }; // ramene la demi largeur de bande en ddl et la largeur de bande // casAssemb : donne le cas d'assemblage qui est a considérer void LesMaillages::Largeur_Bande(int& demi, int& total,const Nb_assemb& casAssemb) { int demib =0; int totalb = 0; demi = 0; total = 0; for (int i1 = 1; i1<= nbMaillageTotal; i1++) { demib =0; totalb = 0; tabMaillage(i1)->Largeur_Bande(demib,totalb,casAssemb); if (demib > demi) demi = demib; if (totalb > total ) total = totalb; } }; // méthode permettant le calcul des matrices de connexion pour chaque // élément ceci par rapport à la numérotation absolu des ddl // casAssemb : donne le cas d'assemblage qui est a considérer // les petites matrices sont carrées, ils sont définit par un tableau ligne qui contiend // la position d'un terme de la petite matrice dans la grande matrice // exemple : pet_mat(k)(i), pet_mat(k)(j) : indique le numéro de ligne et le numéro de colonne // d'un élément non nul dans la grande matrice void LesMaillages::Table_connexion (Tableau < Tableau >& pet_mat_mat,const Nb_assemb& casAssemb) const { // calcul du nombre d'élément totaux int nbelem=0; for (int i = 1; i<= nbMaillageTotal; i++) nbelem += Nombre_element(i); // on dimensionne le tableau en conséquence pet_mat_mat.Change_taille(nbelem); // récup du numéro d'assemblage int nb_casAssemb = casAssemb.n; // on passe en revue tous les éléments et on rempli de tableau for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbelmax = Nombre_element(i1); for (int jel = 1; jel <= nbelmax; jel++) { // récup de l'élément Element& elem = tabMaillage(i1)->Element_mail(jel); Tableau & tabb = (pet_mat_mat(jel)); // simplification const Tableau& tab_noeud = elem.Tab_noeud (); // recup tab_noeud const DdlElement & tab_ddl = elem.TableauDdl(); // tableau des ddl // dimensionnement du tableau de connexion tabb.Change_taille(tab_ddl.NbDdl()); // differents indices de lignes int iloc, inoeud ; // boucle sur les noeuds de l'element int inoeud_max = tab_noeud.Taille(); for ( inoeud=1,iloc=1; inoeud<= inoeud_max; inoeud++) {Noeud& noei = *(tab_noeud(inoeud)); // simplification // boucle sur les ddl du noeudElement int ni_nbddl = tab_ddl.NbDdl(inoeud); for (int i = 1;i<= ni_nbddl ;i++,iloc++) // enregistrement de la position si le pointeur d'assemblage est valide { int pt = noei.Pointeur_assemblage(tab_ddl(inoeud,i),nb_casAssemb); if (pt != -1) tabb(iloc) = pt; } } // fin de la boucle sur les noeuds de l'élément } // fin de la boucle sur les éléments d'un maillage } // fin de la boucle sur les maillages }; // actualisation des ddl et des grandeurs actives de t+dt vers t void LesMaillages::TdtversT() {// tout d'abord on s'occupe des ddl for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) Noeud_LesMaille(i1,i2).TdtversT(); }; // puis on s'occupe des éléments for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbelementmax = tabMaillage(i1)->Nombre_element(); for (int i2 = 1; i2 <= nbelementmax; i2++) { Element & elem = Element_LesMaille(i1,i2); elem.TdtversT(); } } // cas des intégrales et on alimente les grandeurs globales {int taille = integ_vol_typeQuel.Taille(); for (int il =1;il <= taille ;il++) if (ref_integ_vol(il) != NULL) // si NULL => la grandeur reste fixe et n'est pas intégrée {TypeQuelconque& TQ_t = integ_vol_typeQuel_t(il); // pour simplifier TypeQuelconque& TQ = integ_vol_typeQuel(il); // pour simplifier // transfert des intégrales finalisées (TQ_t.Grandeur_pointee())->Affectation_numerique(*(TQ.Grandeur_pointee())); // !! non ce sera fait dans l'intégration, et il vaut mieux garder une valeur correcte // TQ.Grandeur_pointee()->InitParDefaut(); // on initialise pour le prochain calcul // cas des grandeurs à t: on alimente les grandeurs globales // le conteneur qui contient le résultat globalisé // --> au début les grandeurs auront les mêmes valeurs à t et tdt TypeQuelconque::Grandeur* g_TG_t = TQ_t.Grandeur_pointee(); const string* nom_de_ref = g_TG_t->Nom_ref(); #ifdef MISE_AU_POINT if (nom_de_ref == NULL) { cout << "\n *** pb dans l'integration !! " << " nom_de_ref est nul, on ne peut pas continuer " << "\n LesMaillages::TdtversT()"<GrandeurGlobal(*nom_de_ref)); #ifdef MISE_AU_POINT if (pointe == NULL) { cout << "\n *** pb dans l'integration !! " << " la variable globale "<< (*nom_de_ref) << ", n'est pas disponible, on ne peut pas continuer " << "\n LesMaillages::TdtversT()"<Grandeur_pointee())->Affectation_numerique(*(g_TG_t)); }; }; // on réinitialise également les grandeurs à 0, car le calcul est fait dans les éléments // et le stockage à t est sauvegardé dans les éléments, du coup si on n'initialise pas ici // au final on aura 2 fois l'intégrale à chaque pas de temps !! {int taille = integ_vol_t_typeQuel.Taille(); for (int il =1;il <= taille ;il++) if (ref_integ_vol_t(il) != NULL) // si ==NULL => la grandeur reste fixe et n'est pas intégrée {TypeQuelconque& TQ_t = integ_vol_t_typeQuel_t(il); // pour simplifier TypeQuelconque& TQ = integ_vol_t_typeQuel(il); // pour simplifier // transfert des intégrales finalisées (TQ_t.Grandeur_pointee())->Affectation_numerique(*(TQ.Grandeur_pointee())); // !! non ce sera fait dans l'intégration, et il vaut mieux garder une valeur correcte // TQ.Grandeur_pointee()->InitParDefaut(); // on initialise pour le prochain calcul // cas des grandeurs à t: on alimente les grandeurs globales // le conteneur qui contient le résultat globalisé // --> au début les grandeurs auront les mêmes valeurs à t et tdt TypeQuelconque::Grandeur* g_TG_t = TQ_t.Grandeur_pointee(); const string* nom_de_ref = g_TG_t->Nom_ref(); #ifdef MISE_AU_POINT if (nom_de_ref == NULL) { cout << "\n *** pb dans l'integration !! " << " nom_de_ref est nul, on ne peut pas continuer " << "\n LesMaillages::TdtversT()"<GrandeurGlobal(*nom_de_ref)); #ifdef MISE_AU_POINT if (pointe == NULL) { cout << "\n *** pb dans l'integration !! " << " la variable globale "<< (*nom_de_ref) << ", n'est pas disponible, on ne peut pas continuer " << "\n LesMaillages::TdtversT()"<Grandeur_pointee())->Affectation_numerique(*(g_TG_t)); }; }; // cas des statistiques et on alimente les grandeurs globales {int taille = statistique_typeQuel.Taille(); for (int il =1;il <= taille ;il++) if (ref_statistique(il) != NULL) // si NULL => la grandeur reste fixe et n'est pas calculée {TypeQuelconque& TQ_t = statistique_typeQuel_t(il); // pour simplifier TypeQuelconque& TQ = statistique_typeQuel(il); // pour simplifier // transfert des statistiques finalisées (TQ_t.Grandeur_pointee())->Affectation_numerique(*(TQ.Grandeur_pointee())); // cas des grandeurs à t: on alimente les grandeurs globales // le conteneur qui contient le résultat globalisé // --> au début les grandeurs auront les mêmes valeurs à t et tdt TypeQuelconque::Grandeur* g_TG_t = TQ_t.Grandeur_pointee(); const string* nom_de_ref = g_TG_t->Nom_ref(); #ifdef MISE_AU_POINT if (nom_de_ref == NULL) { cout << "\n *** pb dans statistique !! " << " nom_de_ref est nul, on ne peut pas continuer " << "\n LesMaillages::TdtversT()"<GrandeurGlobal(*nom_de_ref)); #ifdef MISE_AU_POINT if (pointe == NULL) { cout << "\n *** pb dans statistique !! " << " la variable globale "<< (*nom_de_ref) << ", n'est pas disponible, on ne peut pas continuer " << "\n LesMaillages::TdtversT()"<Grandeur_pointee())->Affectation_numerique(*(g_TG_t)); }; }; // on réinitialise également les grandeurs à 0, car le calcul est fait dans les éléments // et le stockage à t est sauvegardé dans les éléments, du coup si on n'initialise pas ici // au final on aura 2 fois l'intégrale à chaque pas de temps !! {int taille = statistique_t_typeQuel.Taille(); for (int il =1;il <= taille ;il++) if (ref_statistique_t(il) != NULL) // si ==NULL => la grandeur reste fixe et n'est pas intégrée {TypeQuelconque& TQ_t = statistique_t_typeQuel_t(il); // pour simplifier TypeQuelconque& TQ = statistique_t_typeQuel(il); // pour simplifier // transfert des statistiques finalisées (TQ_t.Grandeur_pointee())->Affectation_numerique(*(TQ.Grandeur_pointee())); // !! non ce sera fait dans l'intégration, et il vaut mieux garder une valeur correcte // TQ.Grandeur_pointee()->InitParDefaut(); // on initialise pour le prochain calcul // cas des grandeurs à t: on alimente les grandeurs globales // le conteneur qui contient le résultat globalisé // --> au début les grandeurs auront les mêmes valeurs à t et tdt TypeQuelconque::Grandeur* g_TG_t = TQ_t.Grandeur_pointee(); const string* nom_de_ref = g_TG_t->Nom_ref(); #ifdef MISE_AU_POINT if (nom_de_ref == NULL) { cout << "\n *** pb dans statistique avec cumul en temps !! " << " nom_de_ref est nul, on ne peut pas continuer " << "\n LesMaillages::TdtversT()"<GrandeurGlobal(*nom_de_ref)); #ifdef MISE_AU_POINT if (pointe == NULL) { cout << "\n *** pb dans statistique avec cumul en temps !! " << " la variable globale "<< (*nom_de_ref) << ", n'est pas disponible, on ne peut pas continuer " << "\n LesMaillages::TdtversT()"<Grandeur_pointee())->Affectation_numerique(*(g_TG_t)); }; }; }; // actualisation des ddl et des grandeurs actives de t vers tdt void LesMaillages::TversTdt() {// tout d'abord on s'occupe des ddl for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) Noeud_LesMaille(i1,i2).TversTdt(); }; // puis on s'occupe des éléments for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbelementmax = tabMaillage(i1)->Nombre_element(); for (int i2 = 1; i2 <= nbelementmax; i2++) { Element & elem = Element_LesMaille(i1,i2); elem.TversTdt(); } }; // -- cas des intégrales de volumes // on réinitialise les grandeurs qui vont être calculée // ceux à t ne changent pas {int taille = integ_vol_typeQuel.Taille(); for (int il =1;il <= taille ;il++) if (ref_integ_vol(il) != NULL) // si == NULL => la grandeur reste fixe et n'est pas intégrée {TypeQuelconque& TQ = integ_vol_typeQuel(il); // pour simplifier TypeQuelconque& TQ_t = integ_vol_typeQuel_t(il); // pour simplifier // transfert des intégrales finalisées (TQ.Grandeur_pointee())->Affectation_numerique(*(TQ_t.Grandeur_pointee())); // !! non ce sera fait dans l'intégration, et il vaut mieux garder une valeur correcte // TQ.Grandeur_pointee()->InitParDefaut(); // cas des grandeurs à tdt: on alimente les grandeurs globales // le conteneur qui contient le résultat globalisé // donc on le remet à du pas précédent à t TypeQuelconque::Grandeur* g_TG = TQ.Grandeur_pointee(); TypeQuelconque::Grandeur* g_TG_t = TQ_t.Grandeur_pointee(); const string* nom_de_ref = g_TG->Nom_ref(); #ifdef MISE_AU_POINT if (nom_de_ref == NULL) { cout << "\n *** pb dans l'integration !! " << " nom_de_ref est nul, on ne peut pas continuer " << "\n LesMaillages::TversTdt()"<GrandeurGlobal(*nom_de_ref)); #ifdef MISE_AU_POINT if (pointe == NULL) { cout << "\n *** pb dans l'integration !! " << " la variable globale "<< (*nom_de_ref) << ", n'est pas disponible, on ne peut pas continuer " << "\n LesMaillages::TversTdT()"<Grandeur_pointee())->Affectation_numerique(*(g_TG_t)); }; }; // -- cas des intégrales de volumes et en temps // on réinitialise également les grandeurs à 0, car le calcul est fait dans les éléments // et le stockage à t est sauvegardé dans les éléments, du coup si on n'initialise pas ici // au final on aura 2 fois l'intégrale à la fin du pas de temps !! // par contre avant l'initialisation, on met à jour la variable globale {int taille = integ_vol_t_typeQuel.Taille(); for (int il =1;il <= taille ;il++) if (ref_integ_vol_t(il) != NULL) // si NULL => la grandeur reste fixe et n'est pas intégrée {TypeQuelconque& TQ_t = integ_vol_t_typeQuel_t(il); // pour simplifier TypeQuelconque& TQ = integ_vol_t_typeQuel(il); // pour simplifier // on remet à t les grandeurs globales TypeQuelconque::Grandeur* g_TG = TQ.Grandeur_pointee(); TypeQuelconque::Grandeur* g_TG_t = TQ_t.Grandeur_pointee(); const string* nom_de_ref = g_TG->Nom_ref(); #ifdef MISE_AU_POINT if (nom_de_ref == NULL) { cout << "\n *** pb dans l'integration !! " << " nom_de_ref est nul, on ne peut pas continuer " << "\n LesMaillages::TdtversT()"<GrandeurGlobal(*nom_de_ref)); #ifdef MISE_AU_POINT if (pointe == NULL) { cout << "\n *** pb dans l'integration !! " << " la variable globale "<< (*nom_de_ref) << ", n'est pas disponible, on ne peut pas continuer " << "\n LesMaillages::TversTdT()"<Grandeur_pointee())->Affectation_numerique(*(g_TG_t)); // !! non ce sera fait dans l'intégration, et il vaut mieux garder une valeur correcte // // maintenant on initialise le conteneur local // TQ.Grandeur_pointee()->InitParDefaut(); // on initialise pour le prochain calcul }; }; // -- cas des statistiques sur des ref de noeuds // on réinitialise les grandeurs qui vont être calculée // ceux à t ne changent pas {int taille = statistique_typeQuel.Taille(); for (int il =1;il <= taille ;il++) if (ref_statistique(il) != NULL) // si == NULL => la grandeur reste fixe et n'est pas intégrée {TypeQuelconque& TQ = statistique_typeQuel(il); // pour simplifier TypeQuelconque& TQ_t = statistique_typeQuel_t(il); // pour simplifier // transfert des intégrales finalisées (TQ.Grandeur_pointee())->Affectation_numerique(*(TQ_t.Grandeur_pointee())); // !! non ce sera fait dans l'intégration, et il vaut mieux garder une valeur correcte // TQ.Grandeur_pointee()->InitParDefaut(); // cas des grandeurs à tdt: on alimente les grandeurs globales // le conteneur qui contient le résultat globalisé // donc on le remet à du pas précédent à t TypeQuelconque::Grandeur* g_TG = TQ.Grandeur_pointee(); TypeQuelconque::Grandeur* g_TG_t = TQ_t.Grandeur_pointee(); const string* nom_de_ref = g_TG->Nom_ref(); #ifdef MISE_AU_POINT if (nom_de_ref == NULL) { cout << "\n *** pb dans l'integration !! " << " nom_de_ref est nul, on ne peut pas continuer " << "\n LesMaillages::TversTdt()"<GrandeurGlobal(*nom_de_ref)); #ifdef MISE_AU_POINT if (pointe == NULL) { cout << "\n *** pb dans l'integration !! " << " la variable globale "<< (*nom_de_ref) << ", n'est pas disponible, on ne peut pas continuer " << "\n LesMaillages::TversTdT()"<Grandeur_pointee())->Affectation_numerique(*(g_TG_t)); }; }; // -- cas des statistiques sur des refs de noeuds avec cumul en temps //**** à voir si c'est vrai pour les statistiques // on réinitialise également les grandeurs à 0, car le calcul est fait dans les éléments // et le stockage à t est sauvegardé dans les éléments, du coup si on n'initialise pas ici // au final on aura 2 fois l'intégrale à la fin du pas de temps !! // par contre avant l'initialisation, on met à jour la variable globale {int taille = statistique_t_typeQuel.Taille(); for (int il =1;il <= taille ;il++) if (ref_statistique_t(il) != NULL) // si NULL => la grandeur reste fixe {TypeQuelconque& TQ_t = statistique_t_typeQuel_t(il); // pour simplifier TypeQuelconque& TQ = statistique_t_typeQuel(il); // pour simplifier // on remet à t les grandeurs globales TypeQuelconque::Grandeur* g_TG = TQ.Grandeur_pointee(); TypeQuelconque::Grandeur* g_TG_t = TQ_t.Grandeur_pointee(); const string* nom_de_ref = g_TG->Nom_ref(); #ifdef MISE_AU_POINT if (nom_de_ref == NULL) { cout << "\n *** pb dans statistique avec cumul en temps !! " << " nom_de_ref est nul, on ne peut pas continuer " << "\n LesMaillages::TdtversT()"<GrandeurGlobal(*nom_de_ref)); #ifdef MISE_AU_POINT if (pointe == NULL) { cout << "\n *** pb dans statistique avec cumul en temps !! " << " la variable globale "<< (*nom_de_ref) << ", n'est pas disponible, on ne peut pas continuer " << "\n LesMaillages::TversTdT()"<Grandeur_pointee())->Affectation_numerique(*(g_TG_t)); // !! non ce sera fait dans l'intégration, et il vaut mieux garder une valeur correcte // // maintenant on initialise le conteneur local // TQ.Grandeur_pointee()->InitParDefaut(); // on initialise pour le prochain calcul }; }; }; // actualisation des ddl actifs a t+dt, a partir du resultat de la resolution // casAssemb : donne le cas d'assemblage qui est a considérer void LesMaillages::PlusDelta_tdt(Vecteur& sol,const Nb_assemb& casAssemb) { // on balaie le tableau d'indexage Tableau & ti_n = t_i_n(casAssemb.n); // pour simplifier int ti_nTaille = ti_n.Taille(); for (int i=1;i<=ti_nTaille;i++) { Posi_ddl_noeud& a = ti_n(i); Noeud_LesMaille(a.Const_Nb_maillage(),a.Const_Nb_noeud()).Ajout_val_tdt(a.Const_Enu(),sol(i)); }; }; // actualisation des ddl actifs a t, a partir du resultat de la resolution // casAssemb : donne le cas d'assemblage qui est a considérer void LesMaillages::PlusDelta_t(Vecteur& sol,const Nb_assemb& casAssemb) { // on balaie le tableau d'indexage Tableau & ti_n = t_i_n(casAssemb.n); // pour simplifier int ti_nTaille = ti_n.Taille(); for (int i=1;i<=ti_nTaille;i++) { Posi_ddl_noeud& a = ti_n(i); Noeud_LesMaille(a.Const_Nb_maillage(),a.Const_Nb_noeud()).Ajout_val_t(a.Const_Enu(),sol(i)); }; }; // récupération du vecteur correspondant à l'incrément de déplacement entre t et tdt // en paramètre le vecteur vide et en sortie le vecteur rempli // casAssemb : donne le cas d'assemblage qui est a considérer Vecteur& LesMaillages::RecupDepde_tatdt(Vecteur& sol,const Nb_assemb& casAssemb) { // on balaie le tableau d'indexage Tableau & ti_n = t_i_n(casAssemb.n); // pour simplifier int ti_nTaille = ti_n.Taille(); for (int i=1;i<=ti_nTaille;i++) { Posi_ddl_noeud& a = ti_n(i); Noeud & noe = Noeud_LesMaille(a.Const_Nb_maillage(),a.Const_Nb_noeud()); sol(i) = noe.Valeur_tdt(a.Const_Enu()) - noe.Valeur_t(a.Const_Enu()); }; return sol; }; // changement des ddl à tdt par ceux correspondant au vecteur passé en paramètre // casAssemb : donne le cas d'assemblage qui est a considérer void LesMaillages::ChangeDdla_tdt(Vecteur& sol,const Nb_assemb& casAssemb) { // on balaie le tableau d'indexage Tableau & ti_n = t_i_n(casAssemb.n); // pour simplifier int ti_nTaille = ti_n.Taille(); for (int i=1;i<=ti_nTaille;i++) { Posi_ddl_noeud& a = ti_n(i); Noeud_LesMaille(a.Const_Nb_maillage(),a.Const_Nb_noeud()).Change_val_tdt(a.Const_Enu(),sol(i)); }; }; // retrouver le ddl correspondant a un pointeur de position // d'assemblage, le nb du noeud et du maillage // insol = le pointeur d'assemblage; // ddl = le ddl en sortie; a t+dt si elle il existe // sinon la valeur a t // casAssemb : donne le cas d'assemblage qui est a considérer Ddl LesMaillages::NoeudIndice(int inSol,int& nbNoeud, int& nbMaillage,const Nb_assemb& casAssemb) { // on utilise le tableau d'indexage Posi_ddl_noeud& a = t_i_n(casAssemb.n)(inSol); nbNoeud = a.Const_Nb_noeud(); nbMaillage = a.Const_Nb_maillage(); Noeud & noe = Noeud_LesMaille(a.Const_Nb_maillage(),a.Const_Nb_noeud()); if (noe.Tdt()) return noe.Ddl_noeud_tdt(a.Const_Enu()); else return noe.Ddl_noeud_t(a.Const_Enu()); }; // idem en ramenant en plus la valeur du ddl a 0 Ddl LesMaillages::NoeudIndice(int inSol,int& nbNoeud, int& nbMaillage, double& val0 ,const Nb_assemb& casAssemb) { // on utilise le tableau d'indexage Posi_ddl_noeud& a = t_i_n(casAssemb.n)(inSol); nbNoeud = a.Const_Nb_noeud(); nbMaillage = a.Const_Nb_maillage(); Noeud & noe = Noeud_LesMaille(a.Const_Nb_maillage(),a.Const_Nb_noeud()); val0=noe.Valeur_0(a.Const_Enu()); if (noe.Tdt()) return noe.Ddl_noeud_tdt(a.Const_Enu()); else return noe.Ddl_noeud_t(a.Const_Enu()); }; // creation des elements frontiere // creation des elements frontiere: cela n'a lieu qu'une seule fois // si les frontières existent déjà, --> aucune action, --> ramène 0 // sinon il y a réellement création, et --> ramène 1 int LesMaillages::CreeElemFront() { int retour = 0; if ((listFrontiere.Taille() == 0) || (tt_noeud_front.Taille() == 0)) { for (int nbmail=1;nbmail<=nbMaillageTotal;nbmail++) tabMaillage(nbmail)->CreeElemFront(); listFrontiere.Change_taille(nbMaillageTotal); tt_noeud_front.Change_taille(nbMaillageTotal); for (int nbmail=1;nbmail<=nbMaillageTotal;nbmail++) {listFrontiere(nbmail) = tabMaillage(nbmail)->ListFront(); tt_noeud_front(nbmail) = &(tabMaillage(nbmail)->Tab_noeud_front()); }; retour = 1; } else {retour = 0;}; //// pour le débug //for (int nbmail=1;nbmail<=nbMaillageTotal;nbmail++) // {int nbfront = listFrontiere(nbmail)->size(); // cout << "\n maillage " << nbmail << " -------- "; // LaLIST ::iterator iff,iffin = listFrontiere(nbmail)->end(); // iff=listFrontiere(nbmail)->begin(); //// for (iff=listFrontiere(nbmail)->begin();iff !=iffin;iff++) // Front& titi = (*iff); // titi.Affiche(); cout << "\n"; // // }; // // Sortie(1); //// fin débug //// pour le débug //for (int nbmail=1;nbmail<=nbMaillageTotal;nbmail++) // {int nbfront = listFrontiere(nbmail)->size(); // cout << "\n maillage " << nbmail << " -------- "; // LaLIST ::iterator iff,iffin = listFrontiere(nbmail)->end(); // for (iff=listFrontiere(nbmail)->begin();iff !=iffin;iff++) // {(*iff).Affiche(); cout << "\n";}; // }; // Sortie(1); //// fin débug // retour return retour; }; // ramene le tableau des noeuds des frontières des maillages esclaves Tableau < Tableau *> LesMaillages::Tab_noeud_frontiere_esclave() { Tableau < Tableau *> ret(domEsclave); if ((domEsclave)&&(ParaGlob::NiveauImpression()>2)) cout << "\n >>>> Information maillages : "; for (int i=1;i<=domEsclave;i++) {ret(i) = tt_noeud_front(i); if (ParaGlob::NiveauImpression()>2) cout << "\n il y a "<Taille() << " noeuds esclaves possible sur front. du maillage " << i ; }; return ret; }; // calcul et ramene le tableau de tous les noeuds des maillages esclaves // noeuds de la frontière et noeuds internes // s'ils existent, sinon le tableau est vide // le tableau n'est pas sauvegarde const Tableau LesMaillages::Esclave() { // tout d'abord on cherche la taille du tableau int tail = 0; for (int i=1;i<= domEsclave;i++) tail += tabMaillage(i)->Nombre_noeud(); // tail += tabMaillage(i)->Nombre_noeud(); // dimensionnement du tableau Tableau tab(tail); // remplissage du tableau int indice =1; for (int i=1;i<= domEsclave;i++) {int nbnimax = tabMaillage(i)->Nombre_noeud(); for (int j=1; j<= nbnimax;j++,indice++) tab(indice) = &(tabMaillage(i)->Noeud_mail(j)); }; // retour return tab; }; // création forcée en 3D de toutes les frontières lignes (non traités par CreeElemFront()) // qui appartiennent à la frontière globales, ceci uniquement pour les éléments volumiques // - Ces frontières ne sont pas intégrées dans la liste de frontière minimale // - une même ligne peut appartenir à plusieurs éléments finis, elle n'est donc pas ici // définit de manière unique (contrairement aux frontières minimales) // NB: cela n'a lieu qu'une seule fois // si les frontières existent déjà, --> aucune action, --> ramène 0 // sinon il y a réellement création, et --> ramène 1 int LesMaillages::CreeListFrontiere_ligne_3D() { int retour = 0; if (listFrontiere_ligne_3D.Taille() == 0) { for (int nbmail=1;nbmail<=nbMaillageTotal;nbmail++) tabMaillage(nbmail)->CreeListFrontiere_ligne_3D(); listFrontiere_ligne_3D.Change_taille(nbMaillageTotal); for (int nbmail=1;nbmail<=nbMaillageTotal;nbmail++) {listFrontiere_ligne_3D(nbmail) = tabMaillage(nbmail)->ListFront_ligne_3D(); }; retour = 1; } else {retour = 0;}; //// pour le débug //for (int nbmail=1;nbmail<=nbMaillageTotal;nbmail++) // {int nbfront = listFrontiere(nbmail)->size(); // cout << "\n maillage " << nbmail << " -------- "; // LaLIST ::iterator iff,iffin = listFrontiere(nbmail)->end(); // iff=listFrontiere(nbmail)->begin(); //// for (iff=listFrontiere(nbmail)->begin();iff !=iffin;iff++) // Front& titi = (*iff); // titi.Affiche(); cout << "\n"; // // }; // // Sortie(1); //// fin débug //// pour le débug //for (int nbmail=1;nbmail<=nbMaillageTotal;nbmail++) // {int nbfront = listFrontiere(nbmail)->size(); // cout << "\n maillage " << nbmail << " -------- "; // LaLIST ::iterator iff,iffin = listFrontiere(nbmail)->end(); // for (iff=listFrontiere(nbmail)->begin();iff !=iffin;iff++) // {(*iff).Affiche(); cout << "\n";}; // }; // Sortie(1); //// fin débug // retour return retour; }; // inactive tous les ddl et les données void LesMaillages::Inactive_ddl_et_donnees() { for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) Noeud_LesMaille(i1,i2).Met_hors_service(); } }; // inactive tous les ddl mais pas les données void LesMaillages::Inactive_ddl() { for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) Noeud_LesMaille(i1,i2).Met_hors_service_ddl(); } }; // inactive les ddl primaires void LesMaillages::Inactive_ddl_primaire() { for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbelementmax = tabMaillage(i1)->Nombre_element(); for (int i2 = 1; i2 <= nbelementmax; i2++) Element_LesMaille(i1,i2).Inactive_ddl_primaire(); } }; // active les ddl primaires void LesMaillages::Active_ddl_primaire() { for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbelementmax = tabMaillage(i1)->Nombre_element(); for (int i2 = 1; i2 <= nbelementmax; i2++) Element_LesMaille(i1,i2).Active_ddl_primaire(); } }; // introduction des ddl de contraintes si cela veut dire quelques chose // pour l'élément void LesMaillages::Plus_ddl_Sigma() { for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbelementmax = tabMaillage(i1)->Nombre_element(); for (int i2 = 1; i2 <= nbelementmax; i2++) { Element & elem = Element_LesMaille(i1,i2); if (elem.Id_TypeProblem() == MECA_SOLIDE_DEFORMABLE) ((ElemMeca&) elem).Plus_ddl_Sigma(); } } }; // inactivation des ddls de contraintes si cela veut dire quelques chose // pour l'élément void LesMaillages::Inactive_ddl_Sigma() { for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbelementmax = tabMaillage(i1)->Nombre_element(); for (int i2 = 1; i2 <= nbelementmax; i2++) { Element & elem = Element_LesMaille(i1,i2); if (elem.Id_TypeProblem() == MECA_SOLIDE_DEFORMABLE) ((ElemMeca&) elem).Inactive_ddl_Sigma(); } } }; // activation des ddls de contraintes si cela veut dire quelques chose // pour l'élément void LesMaillages::Active_ddl_Sigma() { for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbelementmax = tabMaillage(i1)->Nombre_element(); for (int i2 = 1; i2 <= nbelementmax; i2++) { Element & elem = Element_LesMaille(i1,i2); if (elem.Id_TypeProblem() == MECA_SOLIDE_DEFORMABLE) ((ElemMeca&) elem).Active_ddl_Sigma(); } } }; // activation du premier ddl de contraintes si cela veut dire quelques chose // pour l'élément void LesMaillages::Active_premier_ddl_Sigma() { for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbelementmax = tabMaillage(i1)->Nombre_element(); for (int i2 = 1; i2 <= nbelementmax; i2++) { Element & elem = Element_LesMaille(i1,i2); if (elem.Id_TypeProblem() == MECA_SOLIDE_DEFORMABLE) ((ElemMeca&) elem).Active_premier_ddl_Sigma(); } } }; // introduction des ddl d'erreur si cela veut dire quelques chose // pour l'élément void LesMaillages::Plus_ddl_Erreur() { for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbelementmax = tabMaillage(i1)->Nombre_element(); for (int i2 = 1; i2 <= nbelementmax; i2++) { Element & elem = Element_LesMaille(i1,i2); if (elem.Id_TypeProblem() == MECA_SOLIDE_DEFORMABLE) ((ElemMeca&) elem).Plus_ddl_Erreur(); } } }; // inactivation des ddls d'erreur si cela veut dire quelques chose // pour l'élément void LesMaillages::Inactive_ddl_Erreur() { for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbelementmax = tabMaillage(i1)->Nombre_element(); for (int i2 = 1; i2 <= nbelementmax; i2++) { Element & elem = Element_LesMaille(i1,i2); if (elem.Id_TypeProblem() == MECA_SOLIDE_DEFORMABLE) ((ElemMeca&) elem).Inactive_ddl_Erreur(); } } }; // activation des ddls d'erreur si cela veut dire quelques chose // pour l'élément void LesMaillages::Active_ddl_Erreur() { for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbelementmax = tabMaillage(i1)->Nombre_element(); for (int i2 = 1; i2 <= nbelementmax; i2++) { Element & elem = Element_LesMaille(i1,i2); if (elem.Id_TypeProblem() == MECA_SOLIDE_DEFORMABLE) ((ElemMeca&) elem).Active_ddl_Erreur(); } } }; // active un ddl particulier void LesMaillages::Active_un_ddl_particulier(Enum_ddl en) { for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // on regarde si le ddl existe if (noo->Existe_ici(en)) // si oui on l'active noo->Met_en_service(en); }; }; }; // inactive un ddl particulier void LesMaillages::Inactive_un_ddl_particulier(Enum_ddl en) { for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // on regarde si le ddl existe if (noo->Existe_ici(en)) // si oui on l'active noo->Met_hors_service(en); }; }; }; // d'une manière plus générique une fonction pour activer une série de ddl // donnée par un identificateur, si c'est une grandeur vectoriel c'est l'ensemble // des ddl du vecteur qui sont inactivé. void LesMaillages::Active_un_type_ddl_particulier(Enum_ddl eni) { // on retient le premier ddl de la famille Enum_ddl en = PremierDdlFamille(eni); // il y a deux versions suivant que le ddl est une grandeur vectorielle ou pas if (FoncDim(en)) // oui c'est une fonction vectorielle { // recup de la dimension int dimen = ParaGlob::Dimension(); // dans le cas où le calcul est axisymétrique on décrémente de 1 if (ParaGlob::AxiSymetrie()) dimen--; // création du tableau de ddl de travail Tableau taben(dimen); for (int ii=1; ii<= dimen; ii++) taben(ii) = Enum_ddl(en + ii-1); for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // on regarde si le ddl existe if (noo->Existe_ici(en)) // si oui on l'active noo->Met_en_service(taben); // dans le cas où en = X1, on regarde le cas des épaisseurs // celles-ci sont par exemple utilisées pour les coques et plaques et correspondent // à une dimension du même ordre que Xi if (en == X1) if ( noo->Existe_ici(EPAIS) && noo->UneVariable(EPAIS)) noo->Met_en_service(EPAIS); } } } else // cas où il s'agit d'une grandeur scalaire for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // on regarde si le ddl existe if (noo->Existe_ici(en)) // si oui on l'active noo->Met_en_service(en); } } }; //idem pour un tableau void LesMaillages::Active_un_type_ddl_particulier(Tableau & tab_en) { int tab_enTaille = tab_en.Taille(); for (int it=1;it<=tab_enTaille;it++) Active_un_type_ddl_particulier(tab_en(it)); }; //idem pour une liste void LesMaillages::Active_un_type_ddl_particulier(const list & list_en) { list ::const_iterator il,ilfin=list_en.end(); for (il = list_en.begin();il != ilfin;il++) Active_un_type_ddl_particulier((*il)); }; // idem la fonction Active_ddl_noeud mais ici pour l'inactivation void LesMaillages::Inactive_un_type_ddl_particulier(Enum_ddl eni) { // on retient le premier ddl de la famille Enum_ddl en = PremierDdlFamille(eni); // il y a deux versions suivant que le ddl est une grandeur vectorielle ou pas if (FoncDim(en)) // oui c'est une fonction vectorielle { // recup de la dimension int dimen = ParaGlob::Dimension(); // dans le cas où le calcul est axisymétrique on décrémente de 1 if (ParaGlob::AxiSymetrie()) dimen--; // création du tableau de ddl de travail Tableau taben(dimen); for (int ii=1; ii<= dimen; ii++) taben(ii) = Enum_ddl(en + ii-1); for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // on regarde si le ddl existe if (noo->Existe_ici(en)) // si oui on l'inactive noo->Met_hors_service(taben); // dans le cas où en = X1, on regarde le cas des épaisseurs // celles-ci sont par exemple utilisées pour les coques et plaques et correspondent // à une dimension du même ordre que Xi if (PremierDdlFamille(en) == X1) if ( noo->Existe_ici(EPAIS) && noo->UneVariable(EPAIS)) noo->Met_hors_service(EPAIS); } } } else // cas où il s'agit d'une grandeur scalaire for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // on regarde si le ddl existe if (noo->Existe_ici(en)) // si oui on l'inactive noo->Met_hors_service(en); } } }; //idem pour un tableau void LesMaillages::Inactive_un_type_ddl_particulier(Tableau & tab_en) { int tab_enTaille = tab_en.Taille(); for (int it=1;it<=tab_enTaille;it++) Inactive_un_type_ddl_particulier(tab_en(it)); }; //idem pour une liste void LesMaillages::Inactive_un_type_ddl_particulier(const list & list_en) { list ::const_iterator il,ilfin=list_en.end(); for (il = list_en.begin();il != ilfin;il++) Inactive_un_type_ddl_particulier((*il)); }; // Calcul de l'erreur sur l'ensemble des éléments // type indique le type d'erreur retenue // type = 1 : cas d'un calcul aux moindres carrés // et retour un tableau de tableau de grandeurs sur les maillages en cours // ret(i) : concerne le maillage i // ret(i)(1) : somme des erreurs sur l'ensemble des éléments: est homogêne à // un |delta contrainte| * domaine // ret(i)(2) : somme de la grandeur de ref du calcul d'erreur sur l'ensemble des // éléments: est homogêne à une |contrainte| * domaine // ret(i)(3) : le maxi pour les tous les éléments de |delta contrainte| * domaine // ret(i)(4) : le maxi pour les tous les éléments de |contrainte| * domaine // ret(i)(5) : le maxi pour les tous les éléments de l'erreur relative Tableau > LesMaillages::ErreurSurChaqueElement(int type) { double errElemRelative; // variable de travail Tableau > ret(nbMaillageTotal); // init du tableau de retour for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbelementmax = tabMaillage(i1)->Nombre_element(); double ErreurTot = 0.; // erreur totale ret(i1).Change_taille(5); double numerateur,denominateur; double numtot = 0.; double denotot = 0.; double maxi_numerateur = 0.; double maxi_denominateur = 0.; double maxi_relatif = 0.; for (int i2 = 1; i2 <= nbelementmax; i2++) { Element & elem = Element_LesMaille(i1,i2); if (elem.Id_TypeProblem() == MECA_SOLIDE_DEFORMABLE) { // calcul des elements d'erreur ((ElemMeca&) elem).ErreurElement(type,errElemRelative ,numerateur,denominateur); numtot += numerateur; denotot += denominateur; maxi_numerateur = DabsMaX(maxi_numerateur,numerateur); maxi_denominateur = DabsMaX(maxi_denominateur, denominateur); double relatif = 0.; if (Dabs(denominateur) > ConstMath::petit) { relatif = numerateur/denominateur;} else { relatif = numerateur; }; // on prend les valeurs non relatives si maxi_relatif = DabsMaX(maxi_relatif, relatif); }; }; ret(i1)(1)=numtot; ret(i1)(2)=denotot; ret(i1)(3)=maxi_numerateur; ret(i1)(4)=maxi_denominateur; // ret(i1)(5)=maxi_relatif; } // maintenant on va calculer la vraie erreur relative et on l'attribue aux éléments for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbelementmax = tabMaillage(i1)->Nombre_element(); double maxi_relatif = 0.; for (int i2 = 1; i2 <= nbelementmax; i2++) { Element & elem = Element_LesMaille(i1,i2); if (elem.Id_TypeProblem() == MECA_SOLIDE_DEFORMABLE) { double erreur_absolue = ((ElemMeca&) elem).Erreur_sigma(); double erreur_relative = erreur_absolue/ret(i1)(4); ((ElemMeca&) elem).Change_erreur_relative(erreur_relative); maxi_relatif = DabsMaX(maxi_relatif, erreur_relative); }; }; ret(i1)(5)=maxi_relatif; }; ////--- debug //cout << "\n debug LesMaillages::ErreurSurChaqueElement " // << "\n Int_(delta sig)^2= " << numtot << ", int_sig^2= "< indicTravail_t(nbMaillageTotal,false); // cas des contraintes if (type == 1) { // on parcours les éléments pour trouver le bon fichier int i1; for (i1 = 1; i1<= nbMaillageTotal; i1++) // on regarde si le nom de maillage correspond if ( tabMaillage(i1)->NomDuMaillage() == nomMaillage) break; if (i1 == nbMaillageTotal+1) { cout << "\n erreur, on n'a pas trouve un nom de maillage utilisable pour la lecture de " << "\n de donnees externes sur fichier !"; entreePrinc->MessageBuffer(" LesMaillages::LectureDonneesExternes(..."); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie(1); } // on initialise le travail à t, nécessaire pour le calcul des métriques avec // les coordonnées à t if (!indicTravail_t(i1)) { Travail_t(i1); ZeroDdl(false); // mise à zéro des ddl sauf les déplacements qui sont = coord0 // et mémorisation indicTravail_t(i1) = true; } // maintenant passage de l'entête entreePrinc->NouvelleDonnee(); int toto,nbe; *(entreePrinc->entree) >> toto >> nbe; // passage des identificateurs des contraintes entreePrinc->NouvelleDonnee(); // lecture des données pour chaque élément int nbelementmax = tabMaillage(i1)->Nombre_element(); // vérif du nombre d'élément if (nbe != nbelementmax) { // cas d'une différence cout << "\n erreur (1) dans la lecture externe des contraintes, le nombre d'element interne" << "\n au calcul, et le nombre externe sur fichier est different!"; entreePrinc->MessageBuffer(" LesMaillages::LectureDonneesExternes(..."); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie(1); } for (int i2 = 1; i2 <= nbelementmax; i2++) { // lecture d'un premier enregistrement entreePrinc->NouvelleDonnee(); Element & elem = Element_LesMaille(i1,i2); // lecture du type d'élément (ne sert à rien ici) int typelem; *(entreePrinc->entree) >> typelem; // lecture des contraintes if (elem.Id_TypeProblem() == MECA_SOLIDE_DEFORMABLE) ((ElemMeca&) elem).LectureContraintes(entreePrinc); } } // cas des déplacements if (type == 2) { // on parcours les éléments pour trouver le bon fichier int i1; for (i1 = 1; i1<= nbMaillageTotal; i1++) // on regarde si le nom de maillage correspond if ( tabMaillage(i1)->NomDuMaillage() == nomMaillage) break; // on initialise le travail à t, nécessaire pour le calcul des métriques avec // les coordonnées à t if (!indicTravail_t(i1)) { Travail_t(i1); ZeroDdl(false); // mise à zéro des ddl sauf les déplacements qui sont = coord0 // et mémorisation indicTravail_t(i1) = true; } // maintenant on lit le nombre de déplacements enregistrés dans le fichier entreePrinc->NouvelleDonnee(); int nbenreg; *(entreePrinc->entree) >> nbenreg; // récup du nombre de noeud du maillage int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); if (nbnoeudmax != nbenreg) { // cas d'une différence cout << "\n erreur (2) dans la lecture externe des contraintes, le nombre de noeuds interne" << "\n au calcul, et le nombre externe sur fichier est different!"; cout << "\n LesMaillages::LectureDonneesExternes( etc ... " << endl; entreePrinc->MessageBuffer(" LesMaillages::LectureDonneesExternes(..."); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie(1); } // lecture des données pour chaque noeud for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // lecture d'un premier enregistrement entreePrinc->NouvelleDonnee(); Noeud_LesMaille(i1,i2).LectureDeplacements(entreePrinc); } } }; // mise en place du travail à t sur les maillages // indique que l'on va utiliser les ddl en 0, t // si les grandeurs en tdt existaient, elles sont supprimées void LesMaillages::Travail_t() { for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // construit les tableaux de ddl a t noo->Travail_t(); } } }; // mise en place du travail à t tdt sur les maillages // indique que l'on va utiliser les ddl en 0, t, tdt void LesMaillages::Travail_tdt() { for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // construit les tableaux de ddl a t noo->Travail_tdt(); } } }; // idem pour un maillage donné de numéro num void LesMaillages::Travail_t(int num) { int nbnoeudmax = tabMaillage(num)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(num,i2); // construit les tableaux de ddl a t noo->Travail_t(); } }; // définition des coordonnées à t identiques à ceux à t=0, void LesMaillages::Insert_coord1() { for (int i1 = 1; i1<= nbMaillageTotal; i1++) { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); for (int i2 = 1; i2 <= nbnoeudmax; i2++) { // recup du noeud Noeud * noo = & Noeud_LesMaille(i1,i2); // construit les coordonnées de ddl a t noo->Insert_coord1(); } } }; // ramène le maximum de variation de coordonnée entre t et tdt de tous les noeuds du maillage double LesMaillages::Max_var_dep_t_a_tdt() const { double ret=0.; for (int i1 = 1; i1<= nbMaillageTotal; i1++) ret=MaX(tabMaillage(i1)->Max_var_dep_t_a_tdt(),ret); return ret; }; // ramène le minimum de la distance entre deux noeuds de l'ensemble des éléments pour tous les maillages double LesMaillages::Min_dist2Noeud_des_elements(Enum_dure temps) const { double ret=ConstMath::tresgrand; for (int i1 = 1; i1<= nbMaillageTotal; i1++) ret=MiN(tabMaillage(i1)->Min_dist2Noeud_des_elements(temps),ret); return ret; };