// FICHIER : Maillage.cp // CLASSE : Maillage // 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 "Maillage.h" # include using namespace std; //introduces namespace std #include #include "Sortie.h" #include #include #include "List_io.h" #include "CharUtil.h" #ifndef SYSTEM_MAC_OS_X_unix #include "Frontier.h" #endif #include "ConstMath.h" #include "ReferenceNE.h" #include "ReferenceAF.h" #include "Util.h" #include "MvtSolide.h" #include "Basiques.h" #include // définition interactive de listes de références void Maillage::CreationInteractiveListesRef(LesReferences* lesRef) { string reponse=""; bool fr = ParaGlob::Francais(); // pour simplifier while ((reponse != "f")&&(reponse != "fi")&&(reponse != "fin")) { // def de la liste des types de références voulues list list_typeReference; Enum_ddl enu_ddl; // associé aux pt d'integ nécessite un enuméré associé list ::iterator it; string typeReference=""; while (!((typeReference == "f")||(typeReference == "fi")||(typeReference == "fin"))) {// on initialise les listes de ref utilisées pour la def des nouvelles ref // de manière à ne pas utiliser les refs déjà définies list_refIn.clear(); list_refOut.clear(); // debug // cout << "\n effacement de list_refIn et list_refOut " << endl; // fin debug // affichage du menu du type de référence voulu if (list_typeReference.size()!= 0) { if (fr) {cout << "\n type de reference a creer actuellement enregistre ";} else {cout << "\n type(s) already read ";}; for (it=list_typeReference.begin();it!=list_typeReference.end();it++) cout << " " << *it; }; if (fr) {cout << "\n ref de noeuds (rep no) " << "\n ref d'elements (rep el) " << "\n ref de faces (rep fa) " << "\n ref d'arretes (rep ar) " << "\n ref de pt d'integration d'element (rep pt) " << "\n toutes les ref de frontiere (rep tfr) " << "\n effacer la liste actuelle (rep ef) " << "\n fin def des types de ref voulu (rep f) " << "\n reponses : (il peut y en avoir plusieurs differentes) "; } else {cout << "\n reference of nodes (rep no) " << "\n reference of elements (rep el) " << "\n reference of facets (rep fa) " << "\n reference of edges (rep ar) " << "\n reference of integration points (rep pt) " << "\n all the references of the boundary (rep tfr) " << "\n deletion of the registered references (rep ef) " << "\n end of the def of the type of ref (rep f) " << "\n answer : (you can set several different ) "; }; typeReference=lect_return_defaut(false,"f"); if ((typeReference=="no")||(typeReference=="el")||(typeReference=="fa") ||(typeReference=="ar")||(typeReference=="pt")) { if (find(list_typeReference.begin(),list_typeReference.end(),typeReference) == list_typeReference.end()) {list_typeReference.push_back(typeReference);} else {if (fr){cout << "\n type deja enregistre !! on n'en tient pas compte ";} else {cout << "\n ype already registered !! we don't consider this choice ";}; }; } else if (typeReference=="tfr") {// là on crée directement les références et on continue CreationRefFrontiere(*lesRef); ////--- debug //cout << "\n debug Maillage::CreationInteractiveListesRef( "; //lesRef->Affiche(1); // ////--- fin debug } else if (typeReference=="ef") list_typeReference.erase(list_typeReference.begin(),list_typeReference.end()); else if ((typeReference == "f")||(typeReference == "fi")||(typeReference == "fin")) { // fin demandé: on ne fait rien } else {if (fr){cout << "\n mauvais choix lu : " << typeReference << ", verifiez la syntaxe et recommencez ";} else {cout << "\n bad choice : " << typeReference << ", check your answer ";} }; }; // définition du nom des références string nomref; string rep = ""; bool existe_demande_pti = false; if (fr){cout << "\n \n ---- acquisition des noms de references ---- ";} else {cout << "\n \n ---- reading of the reference names ---- ";} list list_nomReference; list ::iterator il, ilfin = list_typeReference.end(); // si la liste est non vide on continue if ( list_typeReference.size()!= 0) {while ((rep != "f")&&(rep != "fi")&&(rep != "fin")) { // affichage du menu du type de référence voulu list ::iterator il; if (list_typeReference.size()!= 0) { if (fr){cout << "\n liste de nom de reference a creer actuellement enregistre ";} else {cout << "\n list of the already registered new reference names ";} for (il=list_nomReference.begin();il!=list_nomReference.end();il++) cout << " " << *il; }; for (il = list_typeReference.begin();il != ilfin; il++) {if (*il == "no") { bool nom_correcte = false; while (!nom_correcte) {if (fr){cout << "\n nom de la reference de noeud ? ";}else{cout << "\n name of the node reference ? ";}; nomref= lect_chaine(); nomref = "N_"+nomref; if (!(lesRef->Existe(nomref,idmail))) {list_nomReference.push_back(nomref); nom_correcte=true; } else { if (fr){cout << "\n la reference " << nomref << " existe deja, choissez un autre nom ";} else {cout << "\n the reference " << nomref << " already exists, choose another name ";}; }; }; // fin du while } else if (*il == "el") { bool nom_correcte = false; while (!nom_correcte) {if (fr){cout << "\n nom de la reference d'element ? "; nomref= lect_chaine();} else {cout << "\n name of the element reference ? "; nomref= lect_chaine();}; nomref = "E_"+nomref; if (!(lesRef->Existe(nomref,idmail))) {list_nomReference.push_back(nomref); nom_correcte=true; } else { if (fr){cout << "\n la reference " << nomref << " existe deja, choissez un autre nom ";} else {cout << "\n the reference " << nomref << " already exists, choose another name ";}; }; }; // fin du while } else if (*il == "fa") { bool nom_correcte = false; while (!nom_correcte) {if (fr){cout << "\n nom de la reference de face ? "; nomref= lect_chaine();} else {cout << "\n name of the facet reference ? "; nomref= lect_chaine();}; nomref = "F_"+nomref; if (!(lesRef->Existe(nomref,idmail))) {list_nomReference.push_back(nomref); nom_correcte=true; } else { if (fr){cout << "\n la reference " << nomref << " existe deja, choissez un autre nom ";} else {cout << "\n the reference " << nomref << " already exists, choose another name ";}; }; }; // fin du while } else if (*il == "ar") { bool nom_correcte = false; while (!nom_correcte) {if (fr){cout << "\n nom de la reference d'arrete ? "; nomref= lect_chaine();} else {cout << "\n name of the edge reference ? "; nomref= lect_chaine();}; nomref = "A_"+nomref; if (!(lesRef->Existe(nomref,idmail))) {list_nomReference.push_back(nomref); nom_correcte=true; } else { if (fr){cout << "\n la reference " << nomref << " existe deja, choissez un autre nom ";} else {cout << "\n the reference " << nomref << " already exists, choose another name ";}; }; }; // fin du while } else if (*il == "pt") { bool nom_correcte = false; while (!nom_correcte) {if (fr){cout << "\n nom de la reference de point d'integration ? " << endl; } else {cout << "\n name of integration point reference ? "<< endl;}; nomref= lect_chaine(); string nomddl=""; nomref = "G_"+nomref; if (!(lesRef->Existe(nomref,idmail))) {list_nomReference.push_back(nomref); while (!ExisteEnum_ddl(nomddl)) { if (fr) {cout << "\n donnez un nom d'un ddl de base associe aux points d'integration "; cout << "\n liste de ddl possible : " << endl;} else {cout << "\n give a dof name associated to this integration point "; cout << "\n list of possible dof : " << endl;}; for (int i=1;i::iterator il, ilfin = list_typeReference.end(); for (il = list_typeReference.begin(); il!=ilfin;il++) {if (*il == "pt") while ((dem != "f")&&(dem != "fi")&&(dem != "fin")) { List_io li_inter; li_inter.push_back(Ddl_enum_etendu(enu_ddl)); // liste de travail if (fr){cout << "\n ---- information concernant les pt d'integ existant ------ " << "\n les coor d'un pt d'integ d'un ele choisit par numero (elem+integ) (rep chnbe ) " << "\n les coor d'un pt d'integ d'un ele choisit le plus pres de (rep npres ) " << "\n tous les coor des pt d'integ d'un elem choisit par numero (rep lespti ) " << "\n fin (f )" << endl; } else {cout << "\n -- information concerning the existing integration points ------ " << "\n the coord of an integ pt, choosen by its number+elem number (rep chnbe ) " << "\n the coordinates of an integ pt, choosen with a nearest point (rep npres ) " << "\n all the coord of an integ pt of an elem, choosen by its elem number (rep lespti ) " << "\n end (f )" << endl; }; dem= lect_return_defaut(false,"f"); int nbe, nbpti; if (dem == "chnbe") { if (fr){cout << "\n num element ? " << endl;}else{cout << "\n element number ? " << endl;}; nbe=(int)lect_double(); if ((nbe > 0) || (nbe <= tab_noeud.Taille())) {if (fr){cout << "\n num pt integ ? " << endl;}else{cout << "\n integretion number ? " << endl;}; nbpti=(int)lect_double(); // vérification de l'existence d'un point d'intégration correspondant à un ddl bool erreur=false; if (tab_element(nbe)->Existe_pt_integ (nbpti,enu_ddl)) { Coordonnee M = tab_element(nbe)->CoordPtInteg(TEMPS_0 ,enu_ddl,nbpti,erreur); if (!erreur) {cout << "\n " << M << "\n ";} else {if (fr){cout << "\n ** erreur en sortie du point ?? " << endl;} else{cout << "\n ** error in output of the point ?? " << endl;}; }; } else {if (fr){cout << " num de pt d'integ non correcte, recommencez !" << endl;} else {cout << " bad number of integ pt, start again !" << endl;}; }; } else {if (fr){cout << " num d'element non correcte, recommencez !"<< endl;} else {cout << " bad number of element, start again !" << endl;}; }; } else if (dem == "npres") { int dima = ParaGlob::Dimension(); Coordonnee xi(dima); if (fr){cout << "\n coordonnee d'un point dans la matiere !! ("<< dima <<" nombre(s)) ? ";} else {cout << "\n coordinate of a point in the material !! ("<< dima <<" number(s)) ? ";}; for(int j=1;j<=dima;j++) cin >> xi(j); std::cin.ignore( std::numeric_limits::max(), '\n' );// purge de cin Maillage::NBelemEtptInteg nu = Element_le_plus_proche(TEMPS_0,li_inter,xi); bool erreur=false; if (nu.nbElem != 0) { Coordonnee M = tab_element(nu.nbElem)->CoordPtInteg(TEMPS_0 ,enu_ddl,nu.nbPtInteg,erreur); if (!erreur) {cout << "\n element: " < 0) || (nbe <= tab_noeud.Taille())) { int nbpti = tab_element(nbe)->NbPtInteg(enu_ddl); bool erreur=false; for (int i=1;i<=nbpti;i++) cout << "\n pti "<CoordPtInteg(TEMPS_0 ,enu_ddl,i,erreur) << "\n "; } else {if (fr){cout << " num d'element non correcte, recommencez !";} else {cout << " wrong number of element, try again !";} }; } else if (dem == "f") {} else {if (fr){cout << "\n syntaxe non correcte recommencez ! ";} else {cout << "\n wrong syntaxes, try again ! ";} }; }; //-- fin du while }; //-- fin de la boucle sur les type de ref }; // -- fin du if demande pti // def de la méthode pour définir la liste d'éléments associé à la référence string methode=""; list list_methode; int dima = ParaGlob::Dimension(); while ((methode != "f")&&(methode != "fi")&&(methode != "fin")) {// affichage du menu du type de référence voulu switch (dima) {case 3: if (fr) {cout << "\n pres d'un plan (rep pres_plan) " << "\n d'un cote du plan (rep cote_plan) " << "\n entre deux plans // (rep entre_plans) " << "\n entre plan // +- distance (rep entre_plans_dist) " << "\n pres d'un cylindre (rep pres_cylindre) " << "\n a l'interieur d'un cylindre (rep in_cylindre) " << "\n a l'exterieur cylindre (rep ex_cylindre) " << "\n entre deux cylindres // (rep entre_cylindres) " << "\n pres d'une sphere (rep pres_sphere) " << "\n dans une sphere (rep in_sphere) " << "\n a l'exterieur d'une sphere (rep ex_sphere) " << "\n entre deux spheres concentriques (rep entre_spheres) " << "\n entre deux spheres concentriques (rep entre_spheres) " // << "\n pres d'un parallelepipede (rep pres_para) " // << "\n dans une parallelepipede (rep in_para) " // << "\n a l'exterieur d'une parallelepipede (rep ex_para) " // << "\n entre deux parallelepipedes (rep entre_para) " << "\n pres d'un point (rep pres_point) " << "\n pres d'une droite (rep pres_droite) " << "\n pres d'un cercle (rep pres_cercle) " << "\n addition d'une ref deja existante (rep in_ref) " << "\n hors une ref dejà existante (rep out_ref) " << "\n ordonner N et ptint / project sur une droite (rep ord_droite ) "; break; } else {cout << "\n near a plane (rep pres_plan) " << "\n on one side of a plane (rep cote_plan) " << "\n between two planes // (rep entre_plans) " << "\n between plane // +- distance (rep entre_plans_dist) " << "\n near a cylinder (rep pres_cylindre) " << "\n inside a cylinder (rep in_cylindre) " << "\n outside a cylinder (rep ex_cylindre) " << "\n between two cylinders // (rep entre_cylindres) " << "\n near a sphere (rep pres_sphere) " << "\n into a sphere (rep in_sphere) " << "\n outside a sphere (rep ex_sphere) " << "\n between two concentric spheres (rep entre_spheres) " // << "\n pres d'un parallelepipede (rep pres_para) " // << "\n dans une parallelepipede (rep in_para) " // << "\n a l'exterieur d'une parallelepipede (rep ex_para) " // << "\n entre deux parallelepipedes (rep entre_para) " << "\n near a point (rep pres_point) " << "\n near a line (rep pres_droite) " << "\n near a cercle (rep pres_cercle) " << "\n addition of an already existing reference (rep in_ref) " << "\n outside to an already existing reference (rep out_ref) " << "\n sort N and Gauss points / projection on a line (rep ord_droite ) "; break; } case 2: if (fr) { cout << "\n pres d'un point (rep pres_point) " << "\n pres d'une droite (rep pres_droite) " << "\n d'un cote d'une droite (rep cote_droite) " << "\n entre deux droites // (rep entre_droites) " << "\n entre droite // +- distance (rep entre_droites_dist) " << "\n pres d'un cercle (rep pres_cercle) " << "\n a l'interieur d'un cercle (rep in_cercle) " << "\n a l'exterieur d'un cercle (rep ex_cercle) " << "\n entre deux cercles concentriques (rep entre_cercles) " << "\n addition d'une ref deja existante (rep in_ref) " << "\n hors une ref dejà existante (rep out_ref) " << "\n ordonner N et ptint / project sur une droite (rep ord_droite ) "; // << "\n pres d'un rectangle (rep pres_rec) " // << "\n a l'interieur d'un rectangle (rep in_rec) " // << "\n a l'exterieur d'un rectangle (rep ex_rec) " // << "\n entre deux rectangles (rep entre_rec) "; break; } else { cout << "\n near a point (rep pres_point) " << "\n near a line (rep pres_droite) " << "\n on one side of a line (rep cote_droite) " << "\n between two lines // (rep entre_droites) " << "\n between line // +- distance (rep entre_droites_dist) " << "\n near a cercle (rep pres_cercle) " << "\n inside a cercle (rep in_cercle) " << "\n outside a cercle (rep ex_cercle) " << "\n between two concentric cercles (rep entre_cercles) " << "\n addition of an already existing reference (rep in_ref) " << "\n outside to an already existing reference (rep out_ref) " << "\n sort N and Gauss points / projection on a line (rep ord_droite ) "; // << "\n pres d'un rectangle (rep pres_rec) " // << "\n a l'interieur d'un rectangle (rep in_rec) " // << "\n a l'exterieur d'un rectangle (rep ex_rec) " // << "\n entre deux rectangles (rep entre_rec) "; break; } case 1: if (fr) { cout << "\n pres d'un point (rep pres_point) " << "\n d'un cote d'un point (rep cote_point) " << "\n entre deux points (rep entre_points) " << "\n entre point +- distance (rep entre_points_dist) " << "\n addition d'une ref deja existante (rep in_ref) " << "\n hors une ref dejà existante (rep out_ref) " << "\n ordonner N et ptint / project sur l'axe (rep ord_droite ) "; break; } else { cout << "\n near a point (rep pres_point) " << "\n on one side of a point (rep cote_point) " << "\n between two points (rep entre_points) " << "\n between point +- distance (rep entre_points_dist) " << "\n addition of an already existing reference (rep in_ref) " << "\n outside to an already existing reference (rep out_ref) " << "\n sort N and Gauss points / projection on the axe (rep ord_droite ) "; break; } }; if (fr){cout << "\n effacer la liste des methode (rep ef) " << "\n fin def methodes (rep f) ";} else {cout << "\n clear the list of method (rep ef) " << "\n end def methods (rep f) ";}; if (list_methode.size()!=0) {if (fr) { cout << "\n (pour info: list actuellement enreg: ";} else { cout << "\n (for info: list currently stored: ";}; for (it=list_methode.begin();it!=list_methode.end();it++) cout << " " << *it; cout << " ) "; }; if (fr) {cout << "\n reponses : (il peut y en avoir plusieurs ) "<< endl;} else {cout << "\n answers : (several if needed ) "<< endl;} methode= lect_return_defaut(false,"f"); // lecture if (methode=="ef") {list_methode.erase(list_methode.begin(),list_methode.end());} else {switch (dima) {case 1 : if ((methode == "pres_point")||(methode == "cote_point") ||(methode == "entre_points")||(methode == "entre_points_dist") ||(methode == "ord_droite") ||(methode == "in_ref")||(methode == "out_ref")) { list_methode.push_back(methode);} else if ((methode == "f") || (methode == "fi") || (methode != "fin")) { } // on ne fait rien else {if (fr) {cout << "\n mauvais choix lu : " << methode << ", verifiez la syntaxe et recommencez ";} else {cout << "\n wrong choice read : " << methode << ", take a look on the syntaxes or spelling and do it again ";} }; break; case 2 : if ((methode == "pres_point")||(methode == "pres_droite")||(methode == "cote_droite") ||(methode == "entre_droites")||(methode == "entre_droites_dist") ||(methode == "pres_cercle")||(methode == "in_cercle")||(methode == "ex_cercle")||(methode == "entre_cercles") ||(methode == "pres_rec")||(methode == "in_rec")||(methode == "ex_rec")||(methode == "entre_rec") ||(methode == "ord_droite") ||(methode == "in_ref")||(methode == "out_ref")) { list_methode.push_back(methode);} else if ((methode == "f") || (methode == "fi") || (methode != "fin")) { } // on ne fait rien else {if (fr) {cout << "\n mauvais choix lu : " << methode << ", verifiez la syntaxe et recommencez ";} else {cout << "\n wrong choice read : " << methode << ", take a look on the syntaxes or spelling and do it again ";} }; break; case 3 : if ((methode == "pres_plan")||(methode == "cote_plan")||(methode == "entre_plans") ||(methode == "entre_plans_dist") ||(methode == "pres_cylindre")||(methode == "in_cylindre")||(methode == "ex_cylindre")||(methode == "entre_cylindres") ||(methode == "pres_sphere")||(methode == "in_sphere")||(methode == "ex_sphere")||(methode == "entre_spheres") // ||(methode == "pres_para")||(methode == "in_para")||(methode == "ex_para")||(methode == "entre_para") ||(methode == "pres_point")||(methode == "pres_droite")||(methode == "pres_cercle") ||(methode == "ord_droite") ||(methode == "in_ref")||(methode == "out_ref")) { list_methode.push_back(methode);} else if ((methode == "f") || (methode == "fi") || (methode != "fin")) { } // on ne fait rien else {if (fr) {cout << "\n mauvais choix lu : " << methode << ", verifiez la syntaxe et recommencez ";} else {cout << "\n wrong choice read : " << methode << ", take a look on the syntaxes or spelling and do it again ";} }; break; }; }; }; // on récupère pour le passe en interne la liste des références existantes lesRefin = lesRef; // sert pour InitInRef(), ExeInRef (), InitOutRef(), ExeOutRef() // execution en fonction des réponses try // on met le calcul sous surveillance au cas d'un fausse manip {switch (dima) { case 1: CalculListRef_1D(list_nomReference,lesRef,list_methode,enu_ddl); break; case 2: CalculListRef_2D(list_nomReference,lesRef,list_methode,enu_ddl); break; case 3: CalculListRef_3D(list_nomReference,lesRef,list_methode,enu_ddl); break; }; } catch (ErrSortieFinale) // cas d'une direction voulue vers la sortie // on relance l'interuption pour le niveau supérieur { ErrSortieFinale toto; throw (toto); } catch ( ... ) { if (fr) {cout << "\n erreur dans la constitution des listes, recommencer ou modifer ";} else {cout << "\n error in the constitution of lists, try again or modify something ";} }; }; if (fr) {cout << "\n fin def reference ? (rep f) " << "\n (ou n'importe quoi d'autre si l'on veut continuer ) " << endl; reponse = lect_return_defaut(false,"f");; } else { cout << "\n end def reference ? (rep f) " << "\n (or anything else if you want to continue ) " << endl; reponse = lect_return_defaut(false,"f");; } }; }; // calcul des listes de références en fonction de la demande: // list_nomReference: contient les types de refs que l'on veut // list_methode: contient la ou les méthodes que l'on veut utiliser // cas 1D void Maillage::CalculListRef_1D(list& list_nomReference,LesReferences* lesRef ,list& list_methode,const Enum_ddl & enu_ddl) { // def des listes de noeuds et d'éléments à considérer: ces listes diminuent à mesure que l'on // appliques des contraintes // au début on part avec tous les noeuds et éléments list list_noeud_restant; int nbnoeud = tab_noeud.Taille(); for (int ne = 1; ne <= nbnoeud; ne++) list_noeud_restant.push_back(tab_noeud(ne)); list list_element_restant; int nbelement = tab_element.Taille(); for (int nel = 1; nel <= nbelement; nel++) list_element_restant.push_back(tab_element(nel)); // def des listes de faces, arêtes, pt integ, là on démarre avec des listes vides et // on rempli la liste avec la première contrainte, puis avec les autres contraintes on diminue la liste // les booleen sont utiliser pour savoir si c'est la première contrainte ou pas list list_elemFace_restant; bool premLpti = true; list list_elemArrete_restant; bool premLface = true; list list_elemPtin_restant; bool premLarrete = true; bool fr = ParaGlob::Francais(); // pour simplifier // on balaie la liste des méthodes list::iterator il,ilfin=list_methode.end(); for (il = list_methode.begin();il!=ilfin;il++) { string methode = *il; if (methode == "pres_point" ) { initConditionPresDe = & Maillage::InitPresPoint; ExeConditionPresDe = & Maillage::ExePresPoint; // appel de la fonction générique PresDe(list_nomReference,list_noeud_restant,list_element_restant,enu_ddl ,list_elemPtin_restant,premLpti,list_elemFace_restant,premLface ,list_elemArrete_restant,premLarrete); } else if ( (methode == "cote_point")||(methode == "entre_points") || (methode == "entre_point_dist") ||(methode == "in_ref")||(methode == "out_ref") ) // sinon c'est du type Toutdedans { if (methode == "cote_point") { initConditionToutDedans = & Maillage::InitCotePoint; ExeConditionToutDedans = & Maillage::ExeCotePoint; } else if (methode == "entre_point") { initConditionToutDedans = & Maillage::InitEntrePoint; ExeConditionToutDedans = & Maillage::ExeEntrePoint; } else if (methode == "entre_point_dist") { initConditionToutDedans = & Maillage::InitEntrePoint_avec_distance; ExeConditionToutDedans = & Maillage::ExeEntrePoint_avec_distance; } else if (methode == "in_ref") { initConditionToutDedans = & Maillage::InitInRef; ExeConditionToutDedans = & Maillage::Exe_In_out_avecRefExistantes; } else if (methode == "out_ref") { initConditionToutDedans = & Maillage::InitOutRef; ExeConditionToutDedans = & Maillage::Exe_In_out_avecRefExistantes; } // appel de la fonction générique ToutDedans(list_nomReference,list_noeud_restant,list_element_restant,enu_ddl ,list_elemPtin_restant,premLpti,list_elemFace_restant,premLface ,list_elemArrete_restant,premLarrete); } else if (methode == "ord_droite") {} // on ne fait rien ici, ce sera au deuxième balayage else { if (fr) {cout << "\n desole, la condition " << methode << " n'est pas encore implantee " << " il faut se plaindre !! ";} else {cout << "\n sorry, the method " << methode << " is not yet implemented " << " you must complain !! ";} }; }; //-- fin du balayage 1) des méthodes // on balaie une seconde fois la liste des méthodes, pour voir si éventuellement il faut ordonner // une liste de noeuds ou de points d'intégration for (il = list_methode.begin();il!=ilfin;il++) { string methode = *il; if (methode == "ord_droite") { // on regarde s'il faut ordonner des noeuds et des pt d'integ, ou un des deux, ou aucun list::const_iterator ie,iefin=list_nomReference.end(); bool ordo_noeud = false; bool ordo_ptinteg = false; for (ie=list_nomReference.begin();ie!=iefin;ie++) { if ((*ie)[0] == 'N') ordo_noeud = true; if ((*ie)[0] == 'G') ordo_ptinteg = true; }; if (ordo_noeud || ordo_ptinteg) InitOrdonneLigne(); // on initialise que s'il y a quelque chose à faire if (ordo_noeud && ordo_ptinteg) { OrdonneLigne(list_noeud_restant,list_elemPtin_restant,enu_ddl);} else if (ordo_noeud) { list toto; // une liste vide qui ne sera pas ordonnée OrdonneLigne(list_noeud_restant,toto,enu_ddl); } else if (ordo_ptinteg) { list titi; // une liste vide qui ne sera pas ordonnée OrdonneLigne(titi,list_elemPtin_restant,enu_ddl); }; } }; // constitution des références EnregRef(list_nomReference,list_noeud_restant,list_elemPtin_restant,list_element_restant ,list_elemFace_restant,list_elemArrete_restant,lesRef); }; // calcul des listes de références en fonction de la demande: // list_nomReference: contient les types de refs que l'on veut // list_methode: contient la ou les méthodes que l'on veut utiliser // cas 2D void Maillage::CalculListRef_2D(list& list_nomReference,LesReferences* lesRef ,list& list_methode,const Enum_ddl & enu_ddl) { // def des listes de noeuds et d'éléments à considérer: ces listes diminuent à mesure que l'on // appliques des contraintes // au début on part avec tous les noeuds et éléments list list_noeud_restant; int nbnoeud = tab_noeud.Taille(); for (int ne = 1; ne <= nbnoeud; ne++) list_noeud_restant.push_back(tab_noeud(ne)); list list_element_restant; int nbelement = tab_element.Taille(); for (int nel = 1; nel <= nbelement; nel++) list_element_restant.push_back(tab_element(nel)); // def des listes de faces, arêtes, pt integ, là on démarre avec des listes vides et // on rempli la liste avec la première contrainte, puis avec les autres contraintes on diminue la liste // les booleen sont utiliser pour savoir si c'est la première contrainte ou pas list list_elemFace_restant; bool premLpti = true; list list_elemArrete_restant; bool premLface = true; list list_elemPtin_restant; bool premLarrete = true; bool fr = ParaGlob::Francais(); // pour simplifier // on balaie une première fois la liste des méthodes list::iterator il,ilfin=list_methode.end(); for (il = list_methode.begin();il!=ilfin;il++) { string methode = *il; if ((methode == "pres_point")||(methode == "pres_droite")||(methode == "pres_cercle") ||(methode == "pres_rec")) { if (methode == "pres_point" ) { initConditionPresDe = & Maillage::InitPresPoint; ExeConditionPresDe = & Maillage::ExePresPoint; } else if (methode == "pres_droite") { initConditionPresDe = & Maillage::InitPresLigne; ExeConditionPresDe = & Maillage::ExePresLigne; } else if (methode == "pres_cercle") { initConditionPresDe = & Maillage::InitPresCercle; ExeConditionPresDe = & Maillage::ExePresCercle; } // appel de la fonction générique PresDe(list_nomReference,list_noeud_restant,list_element_restant,enu_ddl ,list_elemPtin_restant,premLpti,list_elemFace_restant,premLface ,list_elemArrete_restant,premLarrete); } else if ( (methode == "cote_droite")||(methode == "entre_droites") ||(methode == "entre_droites_dist") ||(methode == "in_cercle")||(methode == "ex_cercle")||(methode == "entre_cercles") ||(methode == "in_ref")||(methode == "out_ref") ) // sinon c'est du type Toutdedans { if (methode == "cote_droite") { initConditionToutDedans = & Maillage::InitCoteDroite; ExeConditionToutDedans = & Maillage::ExeCoteDroite; } else if (methode == "entre_droites") { initConditionToutDedans = & Maillage::InitEntreDroite; ExeConditionToutDedans = & Maillage::ExeEntreDroite; } else if (methode == "entre_droites_dist") { initConditionToutDedans = & Maillage::InitEntreDroite_avec_distance; ExeConditionToutDedans = & Maillage::ExeEntreDroite_avec_distance; } else if (methode == "in_cercle") { initConditionToutDedans = & Maillage::InitDansCercle; ExeConditionToutDedans = & Maillage::ExeDansCercle; } else if (methode == "ex_cercle") { initConditionToutDedans = & Maillage::InitDansCercle; ExeConditionToutDedans = & Maillage::ExeOutCercle; } else if (methode == "entre_cercles") { initConditionToutDedans = & Maillage::InitEntreCercles; ExeConditionToutDedans = & Maillage::ExeEntreCercles; } else if (methode == "in_ref") { initConditionToutDedans = & Maillage::InitInRef; ExeConditionToutDedans = & Maillage::Exe_In_out_avecRefExistantes; } else if (methode == "out_ref") { initConditionToutDedans = & Maillage::InitOutRef; ExeConditionToutDedans = & Maillage::Exe_In_out_avecRefExistantes; } // appel de la fonction générique ToutDedans(list_nomReference,list_noeud_restant,list_element_restant,enu_ddl ,list_elemPtin_restant,premLpti,list_elemFace_restant,premLface ,list_elemArrete_restant,premLarrete); } else if (methode == "ord_droite") {} // on ne fait rien ici, ce sera au deuxième balayage else { if (fr) {cout << "\n desole, la condition " << methode << " n'est pas encore implantee " << " il faut se plaindre !! ";} else {cout << "\n sorry, the method " << methode << " is not yet implemented " << " you must complain !! ";} }; }; //-- fin du balayage des méthodes // on balaie une seconde fois la liste des méthodes, pour voir si éventuellement il faut ordonner // une liste de noeuds ou de points d'intégration for (il = list_methode.begin();il!=ilfin;il++) { string methode = *il; if (methode == "ord_droite") { // on regarde s'il faut ordonner des noeuds et des pt d'integ, ou un des deux, ou aucun list::const_iterator ie,iefin=list_nomReference.end(); bool ordo_noeud = false; bool ordo_ptinteg = false; for (ie=list_nomReference.begin();ie!=iefin;ie++) { if ((*ie)[0] == 'N') ordo_noeud = true; if ((*ie)[0] == 'G') ordo_ptinteg = true; }; if (ordo_noeud || ordo_ptinteg) InitOrdonneLigne(); // on initialise que s'il y a quelque chose à faire if (ordo_noeud && ordo_ptinteg) { OrdonneLigne(list_noeud_restant,list_elemPtin_restant,enu_ddl);} else if (ordo_noeud) { list toto; // une liste vide qui ne sera pas ordonnée OrdonneLigne(list_noeud_restant,toto,enu_ddl); } else if (ordo_ptinteg) { list titi; // une liste vide qui ne sera pas ordonnée OrdonneLigne(titi,list_elemPtin_restant,enu_ddl); }; } }; // constitution des références EnregRef(list_nomReference,list_noeud_restant,list_elemPtin_restant,list_element_restant ,list_elemFace_restant,list_elemArrete_restant,lesRef); }; // calcul des listes de références en fonction de la demande: // list_nomReference: contient les types de refs que l'on veut // list_methode: contient la ou les méthodes que l'on veut utiliser // cas 3D void Maillage::CalculListRef_3D(list& list_nomReference,LesReferences* lesRef ,list& list_methode,const Enum_ddl & enu_ddl) { // def des listes de noeuds et d'éléments à considérer: ces listes diminuent à mesure que l'on // appliques des contraintes // au début on part avec tous les noeuds et éléments list list_noeud_restant; int nbnoeud = tab_noeud.Taille(); for (int ne = 1; ne <= nbnoeud; ne++) list_noeud_restant.push_back(tab_noeud(ne)); list list_element_restant; int nbelement = tab_element.Taille(); for (int nel = 1; nel <= nbelement; nel++) list_element_restant.push_back(tab_element(nel)); // def des listes de faces, arêtes, pt integ, là on démarre avec des listes vides et // on rempli la liste avec la première contrainte, puis avec les autres contraintes on diminue la liste // les booleen sont utiliser pour savoir si c'est la première contrainte ou pas list list_elemFace_restant; bool premLpti = true; list list_elemArrete_restant; bool premLface = true; list list_elemPtin_restant; bool premLarrete = true; bool fr = ParaGlob::Francais(); // pour simplifier // on balaie une première fois la liste des méthodes list::iterator il,ilfin=list_methode.end(); for (il = list_methode.begin();il!=ilfin;il++) { string methode = *il; if ((methode == "pres_plan")||(methode == "pres_cylindre")||(methode == "pres_sphere") // ||(methode == "pres_para") ||(methode == "pres_point")||(methode == "pres_cercle")||(methode == "pres_droite")) { if (methode == "pres_point" ) { initConditionPresDe = & Maillage::InitPresPoint; ExeConditionPresDe = & Maillage::ExePresPoint; } else if (methode == "pres_droite") { initConditionPresDe = & Maillage::InitPresLigne; ExeConditionPresDe = & Maillage::ExePresLigne; } else if (methode == "pres_cercle") { initConditionPresDe = & Maillage::InitPresCercle; ExeConditionPresDe = & Maillage::ExePresCercle; } else if (methode == "pres_plan") { initConditionPresDe = & Maillage::InitPresPlan; ExeConditionPresDe = & Maillage::ExePresPlan; } else if (methode == "pres_cylindre") { initConditionPresDe = & Maillage::InitPresCylindre; ExeConditionPresDe = & Maillage::ExePresCylindre; } else if (methode == "pres_sphere") { initConditionPresDe = & Maillage::InitPresSphere; ExeConditionPresDe = & Maillage::ExePresSphere; } // else if (methode == "pres_para") // { cout << "\n methode " << methode << " non encore implante, il faut se plaindre !! "; // } // appel de la fonction générique PresDe(list_nomReference,list_noeud_restant,list_element_restant,enu_ddl ,list_elemPtin_restant,premLpti,list_elemFace_restant,premLface ,list_elemArrete_restant,premLarrete); } else if ((methode == "cote_plan")||(methode == "entre_plans")||(methode == "entre_plans_dist") ||(methode == "in_cylindre")||(methode == "ex_cylindre")||(methode == "entre_cylindres") ||(methode == "in_sphere")||(methode == "ex_sphere")||(methode == "entre_spheres") ||(methode == "in_ref")||(methode == "out_ref") // ||(methode == "in_para")||(methode == "ex_para")||(methode == "entre_para") ) // sinon c'est du type Toutdedans { if (methode == "cote_plan") { initConditionToutDedans = & Maillage::InitCotePlan; ExeConditionToutDedans = & Maillage::ExeCotePlan; } else if (methode == "entre_plans") { initConditionToutDedans = & Maillage::InitEntrePlan; ExeConditionToutDedans = & Maillage::ExeEntrePlan; } else if (methode == "entre_plans_dist") { initConditionToutDedans = & Maillage::InitEntrePlan_avec_distance; ExeConditionToutDedans = & Maillage::ExeEntrePlan_avec_distance; } else if (methode == "in_cylindre") { initConditionToutDedans = & Maillage::InitDansCylindre; ExeConditionToutDedans = & Maillage::ExeDansCylindre; } else if (methode == "ex_cylindre") { initConditionToutDedans = & Maillage::InitDansCylindre; ExeConditionToutDedans = & Maillage::ExeOutCylindre; } else if (methode == "entre_cylindres") { initConditionToutDedans = & Maillage::InitEntreCylindre; ExeConditionToutDedans = & Maillage::ExeEntreCylindre; } else if (methode == "in_sphere") { initConditionToutDedans = & Maillage::InitDansSphere; ExeConditionToutDedans = & Maillage::ExeDansSphere; } else if (methode == "ex_sphere") { initConditionToutDedans = & Maillage::InitDansSphere; ExeConditionToutDedans = & Maillage::ExeOutSpheres; } else if (methode == "entre_spheres") { initConditionToutDedans = & Maillage::InitEntreSpheres; ExeConditionToutDedans = & Maillage::ExeEntreSpheres; } else if (methode == "in_ref") { initConditionToutDedans = & Maillage::InitInRef; ExeConditionToutDedans = & Maillage::Exe_In_out_avecRefExistantes; } else if (methode == "out_ref") { initConditionToutDedans = & Maillage::InitOutRef; ExeConditionToutDedans = & Maillage::Exe_In_out_avecRefExistantes; } // else if (methode == "in_para") // { cout << "\n methode " << methode << " non encore implante, il faut se plaindre !! "; // } // else if (methode == "ex_para") // { cout << "\n methode " << methode << " non encore implante, il faut se plaindre !! "; // } // else if (methode == "entre_paras") // { cout << "\n methode " << methode << " non encore implante, il faut se plaindre !! "; // } // appel de la fonction générique ToutDedans(list_nomReference,list_noeud_restant,list_element_restant,enu_ddl ,list_elemPtin_restant,premLpti,list_elemFace_restant,premLface ,list_elemArrete_restant,premLarrete); } else if (methode == "ord_droite") {} // on ne fait rien ici, ce sera au deuxième balayage else { if (fr) {cout << "\n desole, la condition " << methode << " n'est pas encore implantee " << " il faut se plaindre !! ";} else {cout << "\n sorry, the method " << methode << " is not yet implemented " << " you must complain !! ";} }; }; //-- fin du balayage des méthodes // on balaie une seconde fois la liste des méthodes, pour voir si éventuellement il faut ordonner // une liste de noeuds ou de points d'intégration for (il = list_methode.begin();il!=ilfin;il++) { string methode = *il; if (methode == "ord_droite") { // on regarde s'il faut ordonner des noeuds et des pt d'integ, ou un des deux, ou aucun list::const_iterator ie,iefin=list_nomReference.end(); bool ordo_noeud = false; bool ordo_ptinteg = false; for (ie=list_nomReference.begin();ie!=iefin;ie++) { if ((*ie)[0] == 'N') ordo_noeud = true; if ((*ie)[0] == 'G') ordo_ptinteg = true; }; if (ordo_noeud || ordo_ptinteg) InitOrdonneLigne(); // on initialise que s'il y a quelque chose à faire if (ordo_noeud && ordo_ptinteg) { OrdonneLigne(list_noeud_restant,list_elemPtin_restant,enu_ddl);} else if (ordo_noeud) { list toto; // une liste vide qui ne sera pas ordonnée OrdonneLigne(list_noeud_restant,toto,enu_ddl); } else if (ordo_ptinteg) { list titi; // une liste vide qui ne sera pas ordonnée OrdonneLigne(titi,list_elemPtin_restant,enu_ddl); }; } }; // constitution des références EnregRef(list_nomReference,list_noeud_restant,list_elemPtin_restant,list_element_restant ,list_elemFace_restant,list_elemArrete_restant,lesRef); }; // fonction générique pour des condition PresDe void Maillage::PresDe(const list& list_nomReference, list & list_noeud_restant ,list & list_element_restant,const Enum_ddl & enu_ddl ,list & list_elemPtin_restant,bool& premLpti ,list & list_elemFace_restant,bool& premLface ,list & list_elemArrete_restant,bool& premLarrete) { // a) on commence par initialiser la condition bool fr = ParaGlob::Francais(); // pour simplifier double dist = 0.; // puis on appelle la fonction d'initialisation (this->*initConditionPresDe)(dist); // b) deuxième temps, on exécute la condition associée (il doit y en avoir qu'une // car avant chaque condition il faut appeler init !!) // par contre la condition peut-être appliquée plusieurs fois // on balaie la liste des nom de ref pour savoir quel type de ref on cherche list::const_iterator al,alfin = list_nomReference.end(); for (al=list_nomReference.begin();al!=alfin;al++) if ((*al)[0] == 'N') {// cas d'une liste de noeuds: on balaie la liste et on cherche list ::iterator nit,nits; // on calcul à chaque fois la borne finale car elle peut changer dans la boucle nit = list_noeud_restant.begin(); nits = nit; // init while (nits != list_noeud_restant.end()) { nit = nits; nits++; // nits pointeur sur le suivant // on supprime si la condition n'est pas remplie Coordonnee M=(*nit)->Coord0(); bool condi = (this->*ExeConditionPresDe)(dist,M); if (!condi) list_noeud_restant.erase(nit); }; } else if ((*al)[0] == 'E') {// cas d'une liste d'éléments: on balaie la liste et on cherche // il faut que un des noeuds de l'élément remplit la condition list ::iterator nit,nits; // on calcul à chaque fois la borne finale car elle peut changer dans la boucle nit = list_element_restant.begin(); nits = nit; // init while (nits != list_element_restant.end()) { nit = nits; nits++; // nits pointeur sur le suivant // recup du tableau de noeuds de l'élément const Tableau& t_N = (*nit)->Tab_noeud(); int nbne = t_N.Taille(); bool condition = false; // par défaut for (int ie=1;ie<=nbne;ie++) { Coordonnee M=t_N(ie)->Coord0(); condition = (this->*ExeConditionPresDe)(dist,M); }; // on supprime si la condition n'est pas remplie if (!condition) list_element_restant.erase(nit); }; } else if ((*al)[0] == 'G') {// cas d'une liste de point d'intégration d'éléments: on balaie la liste des éléments // et dedans la liste des points d'intégration et on cherche if (premLpti) // cas d'une première contrainte {// on va balayer tous les éléments existant int nbne = tab_element.Taille(); for (int ine=1;ine<=nbne;ine++) { Element& el = *(tab_element(ine)); // recup du nombre de point d'intégration de l'élément int nbpti = el.NbPtInteg(enu_ddl); // on boucle sur les pt d'integ for (int ipt = 1;ipt<=nbpti;ipt++) { bool erreur =false; Coordonnee Mpti0 = el.CoordPtInteg(TEMPS_0,enu_ddl,ipt,erreur); if (erreur) { if (fr) {cout << "\n erreur bizarre, on ne peut pas trouver les coordoonees t0 du pt d'integ " << ipt << "de l'element " << el.Num_elt() << " du maillage " << el.Num_maillage() << " on ne le test donc pas pour la liste des pt d'integ ! "; } else {cout << "\n strange error, we cannot find the coordinates at t0 of the gauss point " << ipt << "of the element " << el.Num_elt() << " of the mesh " << el.Num_maillage() << " so, we do not test it, for the list of integ points ! "; }; } else { // cas ok bool condition = (this->*ExeConditionPresDe)(dist,Mpti0); NBelemEtptInteg nu; nu.nbElem=el.Num_elt(); nu.nbPtInteg = ipt; if (condition) { list_elemPtin_restant.push_back(nu);}; // première fois on ajoute }; }; //-- fin de la boucle des pt d'integ }; //-- fin de la boucle sur tous les éléments // on signale pour la suite qu'une contrainte a déjà été appliqué premLpti = false; } else // cas d'une contrainte qui n'est pas la première {// on boucle sur les éléments déjà enregistrée list ::iterator nit,nits; // on calcul à chaque fois la borne finale car elle peut changer dans la boucle nit = list_elemPtin_restant.begin(); nits = nit; // init while (nits != list_elemPtin_restant.end()) {nit = nits; nits++; // nits pointeur sur le suivant // for (nit=list_elemPtin_restant.begin();nit!=list_elemPtin_restant.end();nit++) Element& el = *(tab_element((*nit).nbElem)); // récup élément int ipt = (*nit).nbPtInteg; // récup le pt d'integ bool erreur =false; Coordonnee Mpti0 = el.CoordPtInteg(TEMPS_0,enu_ddl,ipt,erreur); if (erreur) { if (fr) {cout << "\n erreur bizarre, on ne peut pas trouver les coordoonees t0 du pt d'integ " << ipt << "de l'element " << el.Num_elt() << " du maillage " << el.Num_maillage() << " on ne le test donc pas pour la liste des pt d'integ ! "; } else {cout << "\n strange error, we cannot find the coordinates at t0 of the gauss point " << ipt << "of the element " << el.Num_elt() << " of the mesh " << el.Num_maillage() << " so, we do not test it, for the list of integ points ! "; }; } else { // cas ok pour la gestion d'erreur bool condition = (this->*ExeConditionPresDe)(dist,Mpti0); NBelemEtptInteg nu; nu.nbElem=el.Num_elt(); nu.nbPtInteg = ipt; if (!condition) // il ne satisfait pas la contrainte, on le supprime {list_elemPtin_restant.erase(nit);}; }; }; }; //-- fin du test sur première contrainte ou pas } else if ((*al)[0] == 'F') {// cas d'une liste de face d'éléments: on balaie la liste des éléments // et dedans la liste des faces et on cherche if (premLface) // cas d'une première contrainte {// on va balayer tous les éléments existant int nbne = tab_element.Taille(); for (int ine=1;ine<=nbne;ine++) { Element& el = *(tab_element(ine)); ElemGeomC0& elgeom = el.ElementGeometrique(); // récup de l'élément géométrique const Tableau > nonf = elgeom.Nonf(); // récup de la connection des faces int nbptface = nonf.Taille(); const Tableau& t_N = el.Tab_noeud(); // récup du tableau de noeud de l'élément // on boucle sur les faces for (int iface = 1;iface<=nbptface;iface++) { // on regarde si un des noeuds de la face remplit la condition int nbnoeudface = nonf(iface).Taille(); for (int ino = 1; ino<= nbnoeudface; ino++) { Coordonnee M = (t_N(nonf(iface)(ino)))->Coord0(); bool condition = (this->*ExeConditionPresDe)(dist,M); if (condition) { NBelemEtFace nu; nu.nbElem = el.Num_elt(); nu.nbFace = iface; list_elemFace_restant.push_back(nu); break; // pour éviter d'enregistrer n fois la même face }; }; }; }; //-- fin de la boucle sur tous les éléments ////--- debug // cout << "\n Maillage::PresDe(.."; // cout << "\n list finale de face après traitement : nb face ="<< list_elemFace_restant.size() << endl; ////--- fin debug // on signale pour la suite qu'une contrainte a déjà été appliqué premLface = false; } else // cas d'une contrainte qui n'est pas la première {// on boucle sur les éléments déjà enregistrée list ::iterator nit,nits; // on calcul à chaque fois la borne finale car elle peut changer dans la boucle nit = list_elemFace_restant.begin(); nits = nit; // init while (nits != list_elemFace_restant.end()) {nit = nits; nits++; // nits pointeur sur le suivant // for (nit=list_elemFace_restant.begin();nit!=list_elemFace_restant.end();nit++) Element& el = *(tab_element((*nit).nbElem)); // récup élément ElemGeomC0& elgeom = el.ElementGeometrique(); // récup de l'élément géométrique const Tableau > nonf = elgeom.Nonf(); // récup de la connection des faces const Tableau& t_N = el.Tab_noeud(); // récup du tableau de noeud de l'élément bool condition = false; // a priori int iface = (*nit).nbFace; // on regarde si un des noeuds de la face rempli la condition int nbnoeudface = nonf(iface).Taille(); for (int ino = 1; ino<= nbnoeudface; ino++) { Coordonnee M = (t_N(nonf(iface)(ino)))->Coord0(); condition = (this->*ExeConditionPresDe)(dist,M); if (condition) break; }; if (!condition) // cas où la condition n'est pas satisfaite on supprime l'élément {list_elemFace_restant.erase(nit);}; }; }; //-- fin du test sur première contrainte ou pas } else if ((*al)[0] == 'A') {// cas d'une liste de d'arêtes d'éléments: on balaie la liste des éléments // et dedans la liste des arêtes et on cherche if (premLarrete) // cas d'une première contrainte {// on va balayer tous les éléments existant int nbne = tab_element.Taille(); for (int ine=1;ine<=nbne;ine++) { Element& el = *(tab_element(ine)); ElemGeomC0& elgeom = el.ElementGeometrique(); // récup de l'élément géométrique const Tableau > nons = elgeom.NonS(); // récup de la connection des arêtes int nbptarr = nons.Taille(); const Tableau& t_N = el.Tab_noeud(); // récup du tableau de noeud de l'élément // on boucle sur les arêtes for (int iarr = 1;iarr <=nbptarr;iarr++) { // on regarde si un des noeuds de l'arête remplit la condition int nbnoeudarr = nons(iarr).Taille(); for (int ino = 1; ino<= nbnoeudarr; ino++) { Coordonnee M = (t_N(nons(iarr)(ino)))->Coord0(); bool condition = (this->*ExeConditionPresDe)(dist,M); if (condition) { NBelemEtArete nu; nu.nbElem = el.Num_elt(); nu.nbArete = iarr; list_elemArrete_restant.push_back(nu); break; // pour éviter d'enregistrer n fois la même arête }; }; }; }; //-- fin de la boucle sur tous les éléments // on signale pour la suite qu'une contrainte a déjà été appliqué premLarrete = false; } else // cas d'une contrainte qui n'est pas la première {// on boucle sur les éléments déjà enregistrée list ::iterator nit,nits; // on calcul à chaque fois la borne finale car elle peut changer dans la boucle nit = list_elemArrete_restant.begin(); nits = nit; // init while (nits != list_elemArrete_restant.end()) { nit = nits; nits++; // nits pointeur sur le suivant // for (nit=list_elemArrete_restant.begin();nit!=list_elemArrete_restant.end();nit++) Element& el = *(tab_element((*nit).nbElem)); // récup élément ElemGeomC0& elgeom = el.ElementGeometrique(); // récup de l'élément géométrique const Tableau > nons = elgeom.NonS(); // récup de la connection des arêtes const Tableau& t_N = el.Tab_noeud(); // récup du tableau de noeud de l'élément bool condition = false; // a priori int iarr = (*nit).nbArete; // on regarde si un des noeuds de l'arête remplit la condition int nbnoeudarr = nons(iarr).Taille(); for (int ino = 1; ino<= nbnoeudarr; ino++) { Coordonnee M = (t_N(nons(iarr)(ino)))->Coord0(); condition = (this->*ExeConditionPresDe)(dist,M); if (condition) break; }; if (!condition) // cas où la condition n'est pas satisfaite on supprime l'élément {list_elemArrete_restant.erase(nit);}; }; }; //-- fin du test sur première contrainte ou pas } }; // fonction générique pour des condition "tout dedans" void Maillage::ToutDedans(const list& list_nomReference, list & list_noeud_restant ,list & list_element_restant,const Enum_ddl & enu_ddl ,list & list_elemPtin_restant,bool& premLpti ,list & list_elemFace_restant,bool& premLface ,list & list_elemArrete_restant,bool& premLarrete) { // a) on commence par initialiser la condition bool fr = ParaGlob::Francais(); // pour simplifier // puis on appelle la fonction d'initialisation (this->*initConditionToutDedans)(); // b) deuxième temps, on exécute la condition associée (il doit y en avoir qu'une // car avant chaque condition il faut appeler init !!) // par contre la condition peut-être appliquée plusieurs fois // on balaie la liste des nom de ref pour savoir quel type de ref on cherche list::const_iterator al,alfin = list_nomReference.end(); for (al=list_nomReference.begin();al!=alfin;al++) if ((*al)[0] == 'N') {// cas d'une liste de noeuds: on balaie la liste et on cherche list ::iterator nit,nits; Tableau t_coor(1); // tableau de travail // on calcul à chaque fois la borne finale car elle peut changer dans la boucle nit = list_noeud_restant.begin(); nits = nit; // init while (nits != list_noeud_restant.end()) { nit = nits; nits++; // nits pointeur sur le suivant // on supprime si la condition n'est pas remplie t_coor(1)=(*nit)->Coord0(); bool condi = (this->*ExeConditionToutDedans)(t_coor); if (!condi) list_noeud_restant.erase(nit); }; } else if ((*al)[0] == 'E') {// cas d'une liste d'éléments: on balaie la liste et on cherche // il faut que tous les noeuds de l'élément remplisse la condition list ::iterator nit,nits; // on calcul à chaque fois la borne finale car elle peut changer dans la boucle nit = list_element_restant.begin(); nits = nit; // init while (nits != list_element_restant.end()) { nit = nits; nits++; // nits pointeur sur le suivant // recup du tableau de noeuds de l'élément const Tableau& t_N = (*nit)->Tab_noeud(); int nbne = t_N.Taille(); bool condition = false; // par défaut // on définit le tableau de coordonnées de tous les noeuds Tableau t_coor(nbne); for (int ie=1;ie<=nbne;ie++) { t_coor(ie)=t_N(ie)->Coord0();}; // on vérifie la condition condition = (this->*ExeConditionToutDedans)(t_coor); // on supprime si la condition n'est pas remplie if (!condition) list_element_restant.erase(nit); }; } else if ((*al)[0] == 'G') {// cas d'une liste de point d'intégration d'éléments: on balaie la liste des éléments // et dedans la liste des points d'intégration et on cherche Tableau t_coor(1); // tableau de travail if (premLpti) // cas d'une première contrainte {// on va balayer tous les éléments existant int nbne = tab_element.Taille(); for (int ine=1;ine<=nbne;ine++) { Element& el = *(tab_element(ine)); // recup du nombre de point d'intégration de l'élément int nbpti = el.NbPtInteg(enu_ddl); // on boucle sur les pt d'integ for (int ipt = 1;ipt<=nbpti;ipt++) { bool erreur =false; t_coor(1) = el.CoordPtInteg(TEMPS_0,enu_ddl,ipt,erreur); if (erreur) { if (fr) {cout << "\n erreur bizarre, on ne peut pas trouver les coordoonees t0 du pt d'integ " << ipt << "de l'element " << el.Num_elt() << " du maillage " << el.Num_maillage() << " on ne le test donc pas pour la liste des pt d'integ ! "; } else {cout << "\n strange error, we cannot find the coordinates at t0 of the gauss point " << ipt << "of the element " << el.Num_elt() << " of the mesh " << el.Num_maillage() << " so, we do not test it, for the list of integ points ! "; }; } else { // cas ok bool condition = (this->*ExeConditionToutDedans)(t_coor); NBelemEtptInteg nu; nu.nbElem=el.Num_elt(); nu.nbPtInteg = ipt; if (condition) { list_elemPtin_restant.push_back(nu);}; // première fois on ajoute }; }; //-- fin de la boucle des pt d'integ }; //-- fin de la boucle sur tous les éléments // on signale pour la suite qu'une contrainte a déjà été appliqué premLpti = false; } else // cas d'une contrainte qui n'est pas la première {// on boucle sur les éléments déjà enregistrée list ::iterator nit,nits; // on calcul à chaque fois la borne finale car elle peut changer dans la boucle nit = list_elemPtin_restant.begin(); nits = nit; // init while (nits != list_elemPtin_restant.end()) { nit = nits; nits++; // nits pointeur sur le suivant // for (nit=list_elemPtin_restant.begin();nit!=list_elemPtin_restant.end();nit++) Element& el = *(tab_element((*nit).nbElem)); // récup élément int ipt = (*nit).nbPtInteg; // récup le pt d'integ bool erreur =false; t_coor(1) = el.CoordPtInteg(TEMPS_0,enu_ddl,ipt,erreur); if (erreur) { if (fr) {cout << "\n erreur bizarre, on ne peut pas trouver les coordoonees t0 du pt d'integ " << ipt << "de l'element " << el.Num_elt() << " du maillage " << el.Num_maillage() << " on ne le test donc pas pour la liste des pt d'integ ! "; } else {cout << "\n strange error, we cannot find the coordinates at t0 of the gauss point " << ipt << "of the element " << el.Num_elt() << " of the mesh " << el.Num_maillage() << " so, we do not test it, for the list of integ points ! "; }; } else { // cas ok pour la gestion d'erreur bool condition = (this->*ExeConditionToutDedans)(t_coor); NBelemEtptInteg nu; nu.nbElem=el.Num_elt(); nu.nbPtInteg = ipt; if (!condition) // il ne satisfait pas la contrainte, on le supprime {list_elemPtin_restant.erase(nit);}; }; }; }; //-- fin du test sur première contrainte ou pas } else if ((*al)[0] == 'F') {// cas d'une liste de face d'éléments: on balaie la liste des éléments // et dedans la liste des faces et on cherche if (premLface) // cas d'une première contrainte {// on va balayer tous les éléments existant int nbne = tab_element.Taille(); for (int ine=1;ine<=nbne;ine++) { Element& el = *(tab_element(ine)); ElemGeomC0& elgeom = el.ElementGeometrique(); // récup de l'élément géométrique const Tableau > nonf = elgeom.Nonf(); // récup de la connection des faces int nbptface = nonf.Taille(); const Tableau& t_N = el.Tab_noeud(); // récup du tableau de noeud de l'élément // on boucle sur les faces for (int iface = 1;iface<=nbptface;iface++) { // on regarde si tous les noeuds de la face remplissent la condition int nbnoeudface = nonf(iface).Taille(); Tableau t_coor(nbnoeudface); // tableau intermédiaire bool condition = true; // condition vraie par défaut for (int ino = 1; ino<= nbnoeudface; ino++) t_coor(ino) = (t_N(nonf(iface)(ino)))->Coord0(); // on update la condition condition = (this->*ExeConditionToutDedans)(t_coor); if (condition) {NBelemEtFace nu; nu.nbElem = el.Num_elt(); nu.nbFace = iface; list_elemFace_restant.push_back(nu); }; }; }; //-- fin de la boucle sur tous les éléments // on signale pour la suite qu'une contrainte a déjà été appliqué premLface = false; ////--- debug // cout << "\n Maillage::ToutDedans(.."; // cout << "\n PREMIER PASSAGE: list finale de face après traitement : nb face ="<< list_elemFace_restant.size() << endl; ////--- fin debug } else // cas d'une contrainte qui n'est pas la première {// on boucle sur les éléments déjà enregistrée list ::iterator nit,nits; // on calcul à chaque fois la borne finale car elle peut changer dans la boucle nit = list_elemFace_restant.begin(); nits = nit; // init while (nits != list_elemFace_restant.end()) { nit = nits; nits++; // nits pointeur sur le suivant // for (nit=list_elemFace_restant.begin();nit!=list_elemFace_restant.end();nit++) Element& el = *(tab_element((*nit).nbElem)); // récup élément ElemGeomC0& elgeom = el.ElementGeometrique(); // récup de l'élément géométrique const Tableau > nonf = elgeom.Nonf(); // récup de la connection des faces const Tableau& t_N = el.Tab_noeud(); // récup du tableau de noeud de l'élément bool condition = true; // a priori int iface = (*nit).nbFace; // on regarde si tous les noeuds de la face remplissent la condition int nbnoeudface = nonf(iface).Taille(); Tableau t_coor(nbnoeudface); // tableau intermédiaire for (int ino = 1; ino<= nbnoeudface; ino++) t_coor(ino) = (t_N(nonf(iface)(ino)))->Coord0(); // on update la condition condition = (this->*ExeConditionToutDedans)(t_coor); if (!condition) // cas où la condition n'est pas satisfaite on supprime l'élément {list_elemFace_restant.erase(nit);}; }; ////--- debug // cout << "\n Maillage::ToutDedans(.."; // cout << "\n PASSAGE SECONDAIRE: list finale de face après traitement : nb face ="<< list_elemFace_restant.size() << endl; ////--- fin debug }; //-- fin du test sur première contrainte ou pas } else if ((*al)[0] == 'A') {// cas d'une liste d'arêtes d'éléments: on balaie la liste des éléments // et dedans la liste des arêtes et on cherche if (premLarrete) // cas d'une première contrainte {// on va balayer tous les éléments existant int nbne = tab_element.Taille(); for (int ine=1;ine<=nbne;ine++) { Element& el = *(tab_element(ine)); ElemGeomC0& elgeom = el.ElementGeometrique(); // récup de l'élément géométrique const Tableau > nons = elgeom.NonS(); // récup de la connection des arêtes int nbptarr = nons.Taille(); const Tableau& t_N = el.Tab_noeud(); // récup du tableau de noeud de l'élément // on boucle sur les arêtes for (int iarr = 1;iarr <=nbptarr;iarr++) { // on regarde si un des noeuds de l'arête est près du point int nbnoeudarr = nons(iarr).Taille(); Tableau t_coor(nbnoeudarr); // tableau intermédiaire for (int ino = 1; ino<= nbnoeudarr; ino++) t_coor(ino) = (t_N(nons(iarr)(ino)))->Coord0(); bool condition = (this->*ExeConditionToutDedans)(t_coor); if (condition) {NBelemEtArete nu; nu.nbElem = el.Num_elt(); nu.nbArete = iarr; list_elemArrete_restant.push_back(nu); }; }; }; //-- fin de la boucle sur tous les éléments // on signale pour la suite qu'une contrainte a déjà été appliqué premLarrete = false; } else // cas d'une contrainte qui n'est pas la première {// on boucle sur les éléments déjà enregistrée list ::iterator nit,nits; // on calcul à chaque fois la borne finale car elle peut changer dans la boucle nit = list_elemArrete_restant.begin(); nits = nit; // init while (nits != list_elemArrete_restant.end()) { nit = nits; nits++; // nits pointeur sur le suivant // for (nit=list_elemArrete_restant.begin();nit!=list_elemArrete_restant.end();nit++) Element& el = *(tab_element((*nit).nbElem)); // récup élément ElemGeomC0& elgeom = el.ElementGeometrique(); // récup de l'élément géométrique const Tableau > nons = elgeom.NonS(); // récup de la connection des arêtes const Tableau& t_N = el.Tab_noeud(); // récup du tableau de noeud de l'élément bool condition = false; // a priori int iarr = (*nit).nbArete; // on regarde si un des noeuds de l'arête est près du point int nbnoeudarr = nons(iarr).Taille(); Tableau t_coor(nbnoeudarr); // tableau intermédiaire for (int ino = 1; ino<= nbnoeudarr; ino++) t_coor(ino) = (t_N(nons(iarr)(ino)))->Coord0(); condition = (this->*ExeConditionToutDedans)(t_coor); if (!condition) // cas où la condition n'est pas satisfaite on supprime l'élément {list_elemArrete_restant.erase(nit);}; }; }; //-- fin du test sur première contrainte ou pas } }; // constitution des références void Maillage::EnregRef(const list& list_nomReference,list & list_noeud_restant ,list & list_elemPtin_restant,list & list_element_restant ,list & list_elemFace_restant,list & list_elemArrete_restant ,LesReferences* lesRef) { bool fr = ParaGlob::Francais(); // pour simplifier // on balaie la liste des nom de ref list::const_iterator ag,agfin = list_nomReference.end(); for (ag=list_nomReference.begin();ag!=agfin;ag++) if ((*ag)[0] == 'N') { // cas d'une liste de noeuds // mise en place de la condition d'appartenance ou d'exclusion à des références existantes Exe_In_out_avecRefExistantes_N(list_noeud_restant); // on crée la nouvelle référence que s'il reste des noeuds if (list_noeud_restant.size() != 0) { // mise en place de la condition d'appartenance ou d'exclusion à des références existantes // Exe_In_out_avecRefExistantes_N(list_noeud_restant); // on ordonne et supprime les noeuds redondants //list_noeud_restant.sort();list_noeud_restant.unique(); // création d'un tableau de numéros de noeuds Tableau tab(list_noeud_restant.size()); list ::iterator itn,itnfin=list_noeud_restant.end(); int i=1; for (itn=list_noeud_restant.begin();itn!=itnfin;itn++,i++) tab(i)=(*itn)->Num_noeud(); ReferenceNE* refN = new ReferenceNE(tab,idmail,1,(*ag));// construction de la référence lesRef->Ajout_reference( refN); if (fr) {cout << "\n enregistrement ref noeuds " << (*ag) << " de " << tab.Taille() << " item " << endl;} else {cout << "\n storage of nodes reference " << (*ag) << " of " << tab.Taille() << " item " << endl;}; }; } else if ((*ag)[0] == 'E') { // cas d'une liste d'éléments // mise en place de la condition d'appartenance ou d'exclusion à des références existantes Exe_In_out_avecRefExistantes_E(list_element_restant); // on crée la nouvelle référence que s'il reste des éléments if (list_element_restant.size() != 0) {// on ordonne et supprime les noeuds redondants //list_element_restant.sort();list_element_restant.unique(); // création d'un tableau de numéros d'éléments Tableau tab(list_element_restant.size()); list ::iterator itn,itnfin=list_element_restant.end(); int i=1; for (itn=list_element_restant.begin();itn!=itnfin;itn++,i++) tab(i)=(*itn)->Num_elt(); ReferenceNE* refN = new ReferenceNE(tab,idmail,2,(*ag));// création de la référence lesRef->Ajout_reference( refN); if (fr) {cout << "\n enregistrement ref elements " << (*ag) << " de " << tab.Taille() << " item " << endl;} else {cout << "\n storage of elements reference " << (*ag) << " of " << tab.Taille() << " item " << endl;}; }; } else if ((*ag)[0] == 'G') { // cas d'une liste de points d'intégration d'éléments // mise en place de la condition d'appartenance ou d'exclusion à des références existantes Exe_In_out_avecRefExistantes_G(list_elemPtin_restant); // on crée la nouvelle référence que s'il reste des pti if (list_elemPtin_restant.size() != 0) {// on supprime les refs redondantes, mais comme on gère deux listes, on fait le travail à la main //list_elemPtin_restant.sort();list_elemPtin_restant.unique(); // création d'un tableau de numéros d'éléments Tableau tabelem(list_elemPtin_restant.size()); Tableau tabpti(list_elemPtin_restant.size()); // idem pour les pti list ::iterator itn,itnfin=list_elemPtin_restant.end(); int i=1; for (itn=list_elemPtin_restant.begin();itn!=itnfin;itn++,i++) {tabelem(i)=(*itn).nbElem;tabpti(i) = (*itn).nbPtInteg;}; ReferenceAF* refAF = new ReferenceAF(tabelem,tabpti,idmail,6,(*ag));// création de la référence lesRef->Ajout_reference( refAF); if (fr) {cout << "\n enregistrement ref pt integ " << (*ag) << " de " << tabelem.Taille() << " item " << endl;} else {cout << "\n storage of integ points reference " << (*ag) << " of " << tabelem.Taille() << " item " << endl;}; }; } else if ((*ag)[0] == 'F') { // cas d'une liste de face d'éléments // mise en place de la condition d'appartenance ou d'exclusion à des références existantes Exe_In_out_avecRefExistantes_F(list_elemFace_restant); // on crée la nouvelle ref que s'il reste des faces if (list_elemFace_restant.size() != 0) { // on ordonne et supprime les noeuds redondants //list_elemFace_restant.sort();list_elemFace_restant.unique(); // création d'un tableau de numéros d'éléments Tableau tabelem(list_elemFace_restant.size()); Tableau tabface(list_elemFace_restant.size()); // idem pour les face list ::iterator itn,itnfin=list_elemFace_restant.end(); int i=1; for (itn=list_elemFace_restant.begin();itn!=itnfin;itn++,i++) {tabelem(i)=(*itn).nbElem;tabface(i) = (*itn).nbFace;}; ReferenceAF* refAF = new ReferenceAF(tabelem,tabface,idmail,3,(*ag));// création de la référence lesRef->Ajout_reference( refAF); if (fr) {cout << "\n enregistrement ref faces " << (*ag) << " de " << tabelem.Taille() << " item " << endl;} else {cout << "\n storage of facets reference " << (*ag) << " of " << tabelem.Taille() << " item " << endl;}; if (ParaGlob::NiveauImpression()> 7) { for (int i=1; i<= tabelem.Taille(); i++) {int Ne = refAF->NumeroElem(i); int Nf = refAF->NumeroFA(i); Element * el = tab_element(Ne); ElFrontiere* fron = el->Frontiere_surfacique(Nf,true); fron->Affiche(TEMPS_0); }; }; }; } else if ((*ag)[0] == 'A') { // cas d'une liste d'arêtes d'éléments // mise en place de la condition d'appartenance ou d'exclusion à des références existantes Exe_In_out_avecRefExistantes_A(list_elemArrete_restant); // on crée la nouvelle référence que s'il reste des arêtes d'éléments if (list_elemArrete_restant.size() != 0) {// on ordonne et supprime les noeuds redondants //list_elemArrete_restant.sort();list_elemArrete_restant.unique(); // création d'un tableau de numéros d'éléments Tableau tabelem(list_elemArrete_restant.size()); Tableau tabarr(list_elemArrete_restant.size()); // idem pour les arêtes list ::iterator itn,itnfin=list_elemArrete_restant.end(); int i=1; for (itn=list_elemArrete_restant.begin();itn!=itnfin;itn++,i++) {tabelem(i)=(*itn).nbElem;tabarr(i) = (*itn).nbArete;}; ReferenceAF* refAF = new ReferenceAF(tabelem,tabarr,idmail,4,(*ag));// création de la référence lesRef->Ajout_reference( refAF); if (fr) {cout << "\n enregistrement ref aretes " << (*ag) << " de " << tabelem.Taille() << " item " << endl;} else {cout << "\n storage of edges reference " << (*ag) << " of " << tabelem.Taille() << " item " << endl;}; }; } }; // recherche près d'un point // def interactive du point et de la distance void Maillage::InitPresPoint(double& dist) { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier Coordonnee poin(dima); if (fr) {cout << "\n -- condition : près d'un point ---- "<< endl; } else {cout << "\n -- condition : near a point ---- "<< endl; }; // acquisition d'un point poin = Acquisition_interactive_point(); if (fr) {cout << "\n distance au point (on retient la partie positive) " << endl;} else {cout << "\n distance to the point (only the absolute value will be kept) " << endl;} dist=lect_double(); dist = Dabs(dist); t_poi.Change_taille(1); t_poi(1) = poin; }; // exécution de la condition : ramène true si ok, false sinon bool Maillage::ExePresPoint(const double& dist,const Coordonnee& M) const { return ((M - t_poi(1)).Norme() < dist); }; // recherche d'un coté d'un point (en 1D) void Maillage::InitCotePoint() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier Coordonnee poin1(dima),poin2(dima); if (fr) {cout << "\n -- condition : d'un cote d'un point (en 1D) ---- "<< endl; } else {cout << "\n -- condition : on one side of a point (in 1D) ---- " << endl; }; // acquisition d'un point poin1 = Acquisition_interactive_point(); if (fr) {cout << "\n donner un second point qui positionne le cote que l'on veut garder " << endl; } else {cout << "\n give a second point which locate the side " << endl; }; // acquisition d'un point poin2 = Acquisition_interactive_point(); t_poi.Change_taille(2); t_poi(1) = poin1; t_poi(2) = poin2; }; // ramène true si tous les points sont du même coté que t_poi(2) bool Maillage::ExeCotePoint(const Tableau & t_M) const { int tMtaille = t_M.Taille(); // on regarde si c'est ok pour tous les points for (int i=1;i<=tMtaille;i++) if ((t_M(i) - t_poi(1)) * (t_poi(2)-t_poi(1)) < 0) return false; // sinon c'est ok return true; }; // recherche entre deux points (1D) void Maillage::InitEntrePoint() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier Coordonnee poin1(dima),poin2(dima); if (fr) {cout << "\n -- condition : entre deux points (en 1D) ---- "; cout << "\n premier point " << endl; } else {cout << "\n -- condition : between two points (in 1D) ---- "; cout << "\n first point " << endl; }; // acquisition d'un point poin1 = Acquisition_interactive_point(); if (fr) {cout << "\n second point " << endl;} else {cout << "\n second point " << endl;} // acquisition d'un point poin2 = Acquisition_interactive_point(); t_poi.Change_taille(2); t_poi(1) = poin1; t_poi(2) = poin2; }; // ramène true si tous les points sont entre t_poi(1) et t_poi(2) bool Maillage::ExeEntrePoint(const Tableau & t_M)const { int tMtaille = t_M.Taille(); // on regarde si c'est ok pour tous les points for (int i=1;i<=tMtaille;i++) if ((t_M(i) - t_poi(1)) * (t_poi(2)-t_M(i)) > 0) return false; // sinon c'est ok return true; }; // recherche entre deux points (1D) _avec_distance void Maillage::InitEntrePoint_avec_distance() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier Coordonnee poin1(dima),poin2(dima); if (fr) {cout << "\n -- condition : entre point (en 1D) +- une distance ---- "; cout << "\n point median: " << endl; } else {cout << "\n -- condition : between point (in 1D) +- a distance ---- "; cout << "\n median point " << endl; }; // acquisition d'un point Coordonnee A = Acquisition_interactive_point(); double dist=0.; if (fr) {cout << "\n distance au point median (on retient la partie positive) " << endl;} else {cout << "\n distance to the median point (only the absolute value will be kept) " << endl;} dist=lect_double(); dist = Dabs(dist); // on va déplacer le plan via sa normale poin1(1) = A(1) - dist; poin2(1) = A(1) + dist; t_poi.Change_taille(2); t_poi(1) = poin1; t_poi(2) = poin2; }; // ramène true si tous les points sont entre t_poi(1) et t_poi(2) _avec_distance bool Maillage::ExeEntrePoint_avec_distance(const Tableau & t_M)const { int tMtaille = t_M.Taille(); // on regarde si c'est ok pour tous les points for (int i=1;i<=tMtaille;i++) if ((t_M(i) - t_poi(1)) * (t_poi(2)-t_M(i)) > 0) return false; // sinon c'est ok return true; }; // recherche près d'une ligne void Maillage::InitPresLigne(double& dist) { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier Coordonnee poin1(dima),poin2(dima); if (fr) {cout << "\n -- condition : pres d'une ligne ---- "; cout << "\n la ligne est defini par deux points "<< endl; } else {cout << "\n -- condition : near a line ---- "; cout << "\n the line is defined by two points " << endl; }; // acquisition d'un point poin1 = Acquisition_interactive_point(); if (fr) {cout << "\n second point " << endl;} else {cout << "\n second point " << endl;} // acquisition d'un point poin2 = Acquisition_interactive_point(); dist=0.; if (fr) {cout << "\n distance à la ligne (on retient la partie positive) " << endl;} else {cout << "\n distance to the line (only the absolute value will be kept) " << endl;} dist=lect_double(); cout << " distance lue: "<< dist << flush; dist = Dabs(dist); t_droit.Change_taille(1); t_droit(1).change_donnees(poin1,(poin2-poin1)); }; bool Maillage::ExePresLigne(const double& dist,const Coordonnee& M) const { return (t_droit(1).Distance_a_la_droite(M) < dist); }; // recherche près d'un cercle void Maillage::InitPresCercle(double& dist) { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier Coordonnee centre(dima); if (fr) {cout << "\n -- condition : pres d'un cercle ---- "; cout << "\n centre du cercle " << endl; } else {cout << "\n -- condition : near a cercle ---- "; cout << "\n cercle center " << endl; }; // acquisition d'un point centre = Acquisition_interactive_point(); double rayon=0.; if (fr) {cout << "\n rayon (on retient la partie positive) " << endl;} else {cout << "\n radius (only the absolute value will be kept) " << endl;} rayon=lect_double(); rayon = Dabs(rayon); t_cercle.Change_taille(1,Cercle(dima)); t_cercle(1).change_donnees(centre,rayon,NULL); dist=0.; if (fr) {cout << "\n distance au cercle (on retient la partie positive) " << endl;} else {cout << "\n distance to the cercle (only the absolute value will be kept) " << endl;} dist=lect_double(); dist = Dabs(dist); }; bool Maillage::ExePresCercle(const double& dist,const Coordonnee& M) const { return (t_cercle(1).Distance_au_Cercle(M) < dist); }; // recherche près d'un plan void Maillage::InitPresPlan( double& dist) { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier Coordonnee poin(dima); if (fr) {cout << "\n -- condition : pres d'un plan ---- " << endl; } else {cout << "\n -- condition : near a plane ---- " << endl; }; // acquisition d'un plan Plan pl = Acquisition_interactive_plan(); t_plan.Change_taille(1); t_plan(1)=pl; //.change_donnees(poin,normal); dist=0.; if (fr) {cout << "\n distance au plan (on retient la partie positive) " << endl;} else {cout << "\n distance to the plane (only the absolute value will be kept) " << endl;} dist=lect_double(); dist = Dabs(dist); }; bool Maillage::ExePresPlan(const double& dist,const Coordonnee& M) const { return (t_plan(1).Distance_au_plan(M) < dist); }; // recherche près d'un cylindre void Maillage::InitPresCylindre(double& dist) { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier Coordonnee centre(dima); if (fr) {cout << "\n -- condition : pres d'un cylindre ---- "; cout << "\n un point de l'axe du cylindre " << endl; } else {cout << "\n -- condition : near a cylinder ---- "; cout << "\n a point belonging to the axis of the cylinder " << endl; }; // acquisition d'un point centre = Acquisition_interactive_point(); double rayon=0.; cout << "\n rayon du cylindre (on retient la partie positive) " << endl; rayon=lect_double(); rayon = Dabs(rayon); cout << " rayon retenu: "<< rayon << endl; Coordonnee axe(dima); if (fr) {cout << "\n coordonnee du vecteur definissant l'axe du cylindre ("<< dima << " reels) " << endl;} else {cout << "\n coordinate of the vector of the axis of the cylinder ("<< dima << " reals) " << endl;}; // acquisition d'un vecteur=direction axe = Acquisition_interactive_vecteur(); Cercle cer(centre,rayon,&axe); t_cylindre.Change_taille(1); t_cylindre(1).change_donnees(cer); dist=0.; if (fr) {cout << "\n distance au cylindre (on retient la partie positive) " << endl;} else {cout << "\n distance to the cylinder (only the absolute value will be kept) " << endl;} dist=lect_double(); dist = Dabs(dist); }; bool Maillage::ExePresCylindre(const double& dist,const Coordonnee& M) const { return (t_cylindre(1).Distance_au_Cylindre(M) < dist); }; // recherche près d'un cylindre void Maillage::InitPresSphere(double& dist) { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier Coordonnee centre(dima); if (fr) {cout << "\n -- condition : pres d'une sphere ---- "; cout << "\n centre de la sphere " << endl; } else {cout << "\n -- condition : near a sphere ---- "; cout << "\n the sphere center " << endl; }; // acquisition d'un point centre = Acquisition_interactive_point(); double rayon=0.; if (fr) {cout << "\n rayon de la sphere (on retient la partie positive) " << endl;} else {cout << "\n radius of the sphere (only the absolute value will be kept) " << endl;}; rayon=lect_double(); rayon = Dabs(rayon); t_sphere.Change_taille(1); t_sphere(1).change_donnees(centre,rayon); dist=0.; if (fr) {cout << "\n distance a la sphere (on retient la partie positive) " << endl;} else {cout << "\n distance to the sphere (only the absolute value will be kept) " << endl;} dist=lect_double(); dist = Dabs(dist); }; bool Maillage::ExePresSphere(const double& dist,const Coordonnee& M) const { return (t_sphere(1).Distance_a_sphere(M) < dist); }; // recherche d'un coté d'un plan void Maillage::InitCotePlan() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier Coordonnee poin(dima); if (fr) {cout << "\n -- condition : d'un cote d'un plan ---- " << "\n le plan: " << endl; } else {cout << "\n -- condition : on one side of a plane ---- "; cout << "\n the plane: " << endl; } // acquisition d'un plan Plan pl = Acquisition_interactive_plan(); t_plan.Change_taille(1); t_plan(1)=pl; //.change_donnees(poin,normal); t_poi.Change_taille(1); if (fr) {cout << "\n un point d'un cote du plan " << endl;} else {cout << "\n a point on one side of the plane " << endl;} poin = Acquisition_interactive_point(); t_poi(1)=poin; }; // ramène true si tous les points sont du même coté que t_poi(1) du plan bool Maillage::ExeCotePlan(const Tableau & t_M)const { int tMtaille = t_M.Taille(); for (int i=1;i<=tMtaille;i++) if (!(t_plan(1).DuMemeCote(t_poi(1),t_M(i)))) return false; // sinon c'est ok return true; }; // condition entre plans void Maillage::InitEntrePlan() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier if (fr) {cout << "\n -- condition : entre deux plans // ---- "; cout << "\n premier plan " << endl; } else {cout << "\n -- condition : between two planes // ---- "; cout << "\n first plane " << endl; } // acquisition d'un plan Plan pl = Acquisition_interactive_plan(); t_plan.Change_taille(1); t_plan(1) = pl; //.change_donnees(poin,normal); t_poi.Change_taille(1); if (fr) {cout << "\n un point du second plan "<< endl;} else {cout << "\n a point of the second plane "<< endl;} // acquisition d'un point Coordonnee poin(Acquisition_interactive_point()); t_poi(1)=poin; }; // ramène true si tous les points sont entre les deux plans bool Maillage::ExeEntrePlan(const Tableau & t_M)const { int tMtaille = t_M.Taille(); // on regarde si d'une part les points sont du même coté que t_poi(1) et // d'autre part si la distance du points au premier plan est <= à celle de t_poi(1) double dist = t_plan(1).Distance_au_plan(t_poi(1)); for (int i=1;i<=tMtaille;i++) if (!(t_plan(1).DuMemeCote(t_poi(1),t_M(i)) && (t_plan(1).Distance_au_plan(t_M(i)) < dist ))) return false; // sinon c'est ok return true; }; // condition entre plans _avec_distance void Maillage::InitEntrePlan_avec_distance() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier if (fr) {cout << "\n -- condition : entre un plan +- une distance ---- "; cout << "\n le plan median: " << endl; } else {cout << "\n -- condition : between a plane +- a distance ---- "; cout << "\n the median plane " << endl; } // acquisition d'un plan Plan pl = Acquisition_interactive_plan(); double dist=0.; if (fr) {cout << "\n distance au plan (on retient la partie positive) " << endl;} else {cout << "\n distance to the plane (only the absolute value will be kept) " << endl;} dist=lect_double(); dist = Dabs(dist); // on va déplacer le plan via sa normale const Coordonnee& A = pl.PointPlan(); const Coordonnee& N = pl.Vecplan(); Coordonnee Ap = A - dist*N; pl.Change_ptref(Ap); // nouveau pt de ref du plan // maintenant le point idem entre plan originale Coordonnee poin = A + 2.*dist*N; // on enregistre t_plan.Change_taille(1); t_plan(1) = pl; t_poi.Change_taille(1); t_poi(1)=poin; }; // ramène true si tous les points sont entre les deux plans _avec_distance bool Maillage::ExeEntrePlan_avec_distance(const Tableau & t_M)const { int tMtaille = t_M.Taille(); // on regarde si d'une part les points sont du même coté que t_poi(1) et // d'autre part si la distance du points au premier plan est <= à celle de t_poi(1) ////-- debug //cout << "\n debug Maillage::ExeEntrePlan_avec_distance( \n" // << t_plan(1) << "\n point " << t_poi(1); // ////--- fin debug double dist = t_plan(1).Distance_au_plan(t_poi(1)); for (int i=1;i<=tMtaille;i++) if (!(t_plan(1).DuMemeCote(t_poi(1),t_M(i)) && (t_plan(1).Distance_au_plan(t_M(i)) < dist ))) return false; // sinon c'est ok return true; }; // condition dans ou dehors un cylindre void Maillage::InitDansCylindre() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier if (fr) {cout << "\n -- condition : dans ou a l'exterieur d'un cylindre ---- "; cout << "\n un point de l'axe du cylindre " << endl; } else {cout << "\n -- condition : inside or outside a cylinder ---- "; cout << "\n a point belonging to the axis of the cylinder " << endl; }; // acquisition d'un point Coordonnee centre(Acquisition_interactive_point()); double rayon=0.; if (fr) {cout << "\n rayon du cylindre (on retient la partie positive) " << endl;} else {cout << "\n radius of the cylinder (only the absolute value will be kept) " << endl;}; rayon=lect_double(); rayon = Dabs(rayon); cout << " rayon retenu: "<< rayon << endl; if (fr) {cout << "\n le vecteur definissant l'axe des cylindres " << endl;} else {cout << "\n the vector of the axis of the cylinders " << endl;}; // acquisition d'un vecteur=direction Coordonnee axe(Acquisition_interactive_vecteur()); Cercle cer(centre,rayon,&axe); t_cylindre.Change_taille(1); t_cylindre(1).change_donnees(cer); }; // ramène true si tous les points sont dans le cylindre bool Maillage::ExeDansCylindre(const Tableau & t_M)const { int tMtaille = t_M.Taille(); for (int i=1;i<=tMtaille;i++) if (!(t_cylindre(1).Dedans(t_M(i)))) return false; // sinon c'est ok return true; }; // ramène true si tous les points sont à l'extérieur du cylindre bool Maillage::ExeOutCylindre(const Tableau & t_M)const { int tMtaille = t_M.Taille(); for (int i=1;i<=tMtaille;i++) if ((t_cylindre(1).Dedans(t_M(i)))) return false; // sinon c'est ok return true; }; // condition entre deux cylindre void Maillage::InitEntreCylindre() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier if (fr) {cout << "\n -- condition : entre deux cylindres ---- "; cout << "\n un point de l'axe des deux cylindres " << endl; } else {cout << "\n -- condition : between two cylinders ---- "; cout << "\n a point belonging to the axis of the cylinders " << endl; }; // acquisition d'un point Coordonnee centre(Acquisition_interactive_point()); double rayon1=0.; if (fr) {cout << "\n rayon du premier cylindre (on retient la partie positive) " << endl;} else {cout << "\n radius of the first cylinder (only the absolute value will be kept) " << endl;}; rayon1=lect_double(); rayon1 = Dabs(rayon1); double rayon2=0.; if (fr) {cout << "\n rayon du second cylindre (on retient la partie positive) " << endl;} else {cout << "\n radius of the second cylinder (only the absolute value will be kept) " << endl;}; rayon2=lect_double(); rayon2 = Dabs(rayon2); if (fr) {cout << "\n vecteur definissant l'axe des cylindres " << endl;} else {cout << "\n vector of the axis of the cylinders " << endl;}; // acquisition d'un vecteur=direction Coordonnee axe(Acquisition_interactive_vecteur()); Cercle cer1(centre,MaX(rayon1,rayon2),&axe); Cercle cer2(centre,MiN(rayon1,rayon2),&axe); t_cylindre.Change_taille(2); t_cylindre(1).change_donnees(cer1); t_cylindre(2).change_donnees(cer2); }; // ramène true si tous les points sont entre les deux cylindres bool Maillage::ExeEntreCylindre(const Tableau & t_M) const { int tMtaille = t_M.Taille(); // on regarde si d'une part les points sont à l'intérieur du cylindre (le plus grand) et // a l'extérieur du plus petit for (int i=1;i<=tMtaille;i++) if ( (!(t_cylindre(1).Dedans(t_M(i)))) || ((t_cylindre(2).Dedans(t_M(i)))) ) return false; // sinon c'est ok return true; }; // condition dans ou dehors d'une sphére void Maillage::InitDansSphere() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier if (fr) {cout << "\n -- condition : dans ou a l'exterieur d'une sphere ---- "; cout << "\n le centre de la sphere " << endl; } else {cout << "\n -- condition : inside or outside of a sphere ---- "; cout << "\n the sphere center " << endl; }; // acquisition d'un point Coordonnee centre(Acquisition_interactive_point()); double rayon=0.; if (fr) {cout << "\n rayon de la sphere (on retient la partie positive) " << endl;} else {cout << "\n radius of the sphere (only the absolute value will be kept) " << endl;}; rayon=lect_double(); rayon = Dabs(rayon); t_sphere.Change_taille(1); t_sphere(1).change_donnees(centre,rayon); }; // ramène true si tous les points sont dans la sphère bool Maillage::ExeDansSphere(const Tableau & t_M)const { int tMtaille = t_M.Taille(); for (int i=1;i<=tMtaille;i++) if (!(t_sphere(1).Dedans(t_M(i)))) return false; // sinon c'est ok return true; }; // ramène true si tous les points sont à l'extérieur de la sphère bool Maillage::ExeOutSpheres(const Tableau & t_M)const { int tMtaille = t_M.Taille(); for (int i=1;i<=tMtaille;i++) if ((t_sphere(1).Dedans(t_M(i)))) return false; // sinon c'est ok return true; }; // condition entre deux sphères concentriques void Maillage::InitEntreSpheres() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier if (fr) {cout << "\n -- condition : entre deux spheres ---- "; cout << "\n le centre des spheres " << endl; } else {cout << "\n -- condition :between two spheres ---- "; cout << "\n the center of the spheres " << endl; }; // acquisition d'un point Coordonnee centre(Acquisition_interactive_point()); double rayon1=0.; if (fr) {cout << "\n rayon de la premiere sphere (on retient la partie positive) " << endl;} else {cout << "\n radius of the first sphere (only the absolute value will be kept) " << endl;}; rayon1=lect_double(); rayon1 = Dabs(rayon1); double rayon2=0.; if (fr) {cout << "\n rayon de la seconde sphere (on retient la partie positive) " << endl;} else {cout << "\n radius of the second sphere (only the absolute value will be kept) " << endl;}; rayon2=lect_double(); rayon2 = Dabs(rayon2); t_sphere.Change_taille(2); t_sphere(1).change_donnees(centre,MaX(rayon1,rayon2)); t_sphere(2).change_donnees(centre,MiN(rayon1,rayon2)); }; // ramène true si tous les points sont entre les deux sphères bool Maillage::ExeEntreSpheres(const Tableau & t_M)const { int tMtaille = t_M.Taille(); // on regarde si d'une part les points sont à l'intérieur de la sphère 1 (la plus grande) et // a l'extérieur de la plus petite for (int i=1;i<=tMtaille;i++) if ( (!(t_sphere(1).Dedans(t_M(i)))) || ((t_sphere(2).Dedans(t_M(i)))) ) return false; // sinon c'est ok return true; }; // condition du même coté d'une droite void Maillage::InitCoteDroite() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier //Coordonnee poin1(dima),poin2(dima); if (fr) {cout << "\n -- condition : d'un meme cote d'une droite (2D) ---- "; cout << "\n def de la ligne: " << endl; } else {cout << "\n -- condition : on one side of a line (2D) ---- "; cout << "\n the line : " << endl; }; // acquisition d'une droite Droite dr(Acquisition_interactive_droite()); t_droit.Change_taille(1); t_droit(1)=dr; //change_donnees(poin1,(poin2-poin1)); t_poi.Change_taille(1); if (fr) {cout << "\n un point d'un cote de la droite " << endl;} else {cout << "\n a point on one side of the line " << endl;}; // acquisition d'un point Coordonnee poin(Acquisition_interactive_point()); t_poi(1)=poin; }; // ramène true si tous les points sont du même coté que t_poi(1) de la droite (en 2D uniquement) bool Maillage::ExeCoteDroite(const Tableau & t_M)const { int tMtaille = t_M.Taille(); for (int i=1;i<=tMtaille;i++) if (!(t_droit(1).DuMemeCote(t_poi(1),t_M(i)))) return false; // sinon c'est ok return true; }; // condition entre 2 droites (en 2D seulement) void Maillage::InitEntreDroite() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier if (fr) {cout << "\n -- condition : entre deux droite (2D) ---- "; cout << "\n la premiere ligne: " << endl; } else {cout << "\n -- condition : between two lines (2D) ---- "; cout << "\n the first line: " << endl; } // acquisition d'une droite Droite dr(Acquisition_interactive_droite()); t_droit.Change_taille(1); t_droit(1)=dr; // t_poi.Change_taille(1); if (fr) {cout << "\n un point de la seconde droite (//) " << endl;} else {cout << "\n a point belonging to the second line (//) " << endl;}; // acquisition d'un point Coordonnee poin(Acquisition_interactive_point()); t_poi(1)=poin; }; // ramène true si tous les points sont entre les 2 droites (en 2D uniquement) bool Maillage::ExeEntreDroite(const Tableau & t_M)const { int tMtaille = t_M.Taille(); // on regarde si d'une part les points sont du même coté que t_poi(1) et // d'autre part si la distance du points à la première droite est <= à celle de t_poi(1) double dist = t_droit(1).Distance_a_la_droite(t_poi(1)); for (int i=1;i<=tMtaille;i++) if (!(t_droit(1).DuMemeCote(t_poi(1),t_M(i)) && (t_droit(1).Distance_a_la_droite(t_M(i)) < dist ))) return false; // sinon c'est ok return true; }; // condition entre 2 droites (en 2D seulement) _avec_distance void Maillage::InitEntreDroite_avec_distance() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier if (fr) {cout << "\n -- condition : entre droite (2D) +- une distance ---- "; cout << "\n la ligne mediane : " << endl; } else {cout << "\n -- condition : between line (2D) +- a distance---- "; cout << "\n the mediane line: " << endl; } // acquisition d'une droite Droite dr(Acquisition_interactive_droite()); const Coordonnee& A = dr.PointDroite(); // retourne le vecteur directeur de la droite (de norme = 1 ) const Coordonnee& U = dr.VecDroite(); double dist=0.; if (fr) {cout << "\n distance a la droite (on retient la partie positive) " << endl;} else {cout << "\n distance to the line (only the absolute value will be kept) " << endl;} dist=lect_double(); dist = Dabs(dist); Coordonnee Ap = A - dist * U; dr.Change_ptref(Ap); Coordonnee poin = A + 2.*dist * U; // enreg t_droit.Change_taille(1); t_droit(1)=dr; // t_poi.Change_taille(1); t_poi(1)=poin; }; // ramène true si tous les points sont entre les 2 droites (en 2D uniquement) _avec_distance bool Maillage::ExeEntreDroite_avec_distance(const Tableau & t_M)const { int tMtaille = t_M.Taille(); // on regarde si d'une part les points sont du même coté que t_poi(1) et // d'autre part si la distance du points à la première droite est <= à celle de t_poi(1) double dist = t_droit(1).Distance_a_la_droite(t_poi(1)); for (int i=1;i<=tMtaille;i++) if (!(t_droit(1).DuMemeCote(t_poi(1),t_M(i)) && (t_droit(1).Distance_a_la_droite(t_M(i)) < dist ))) return false; // sinon c'est ok return true; }; // condition dans ou dehors un cercle (en 2D seulement) void Maillage::InitDansCercle() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier if (fr) {cout << "\n -- condition : dans ou a l'exterieur d'un cercle (2D) ---- "; cout << "\n le centre du cercle : " << endl; } else {cout << "\n -- condition : inside or outside a cercle (2D) ---- "; cout << "\n the cercle center: " << endl; } // acquisition d'un point Coordonnee centre(Acquisition_interactive_point()); double rayon=0.; if (fr) {cout << "\n rayon du cercle (on retient la partie positive) "<< endl; } else {cout << "\n radius of the cercle (only the absolute value will be kept) "<< endl; }; rayon=lect_double(); rayon = Dabs(rayon); t_cercle.Change_taille(1,Cercle(dima)); t_cercle(1).change_donnees(centre,rayon,NULL); }; // ramène true si tous les points sont dans le cercle (en 2D seulement) bool Maillage::ExeDansCercle(const Tableau & t_M)const { int tMtaille = t_M.Taille(); for (int i=1;i<=tMtaille;i++) if (!(t_cercle(1).Dedans(t_M(i)))) return false; // sinon c'est ok return true; }; // ramène true si tous les points sont à l'extérieur du cercle (en 2D seulement) bool Maillage::ExeOutCercle(const Tableau & t_M)const { int tMtaille = t_M.Taille(); for (int i=1;i<=tMtaille;i++) if ((t_cercle(1).Dedans(t_M(i)))) return false; // sinon c'est ok return true; }; // condition entre cercles concentriques (en 2D seulement) void Maillage::InitEntreCercles() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier if (fr) {cout << "\n -- condition : entre deux cercles concentriques ---- "; cout << "\n centre des cercle: " << endl; } else {cout << "\n -- condition : between two concentric cercles ---- "; cout << "\n the center of the cercles: " << endl; }; // acquisition d'un point Coordonnee centre(Acquisition_interactive_point()); double rayon1=0.; if (fr) {cout << "\n rayon du premier cercle (on retient la partie positive) "<< endl; } else {cout << "\n radius of the first cercle (only the absolute value will be kept) "<< endl; }; rayon1=lect_double(); rayon1 = Dabs(rayon1); double rayon2=0.; if (fr) {cout << "\n rayon du second cercle (on retient la partie positive) " << endl;} else {cout << "\n radius of the second cercle (only the absolute value will be kept) "<< endl; }; rayon2=lect_double(); rayon2 = Dabs(rayon2); t_cercle.Change_taille(2,Cercle(dima)); t_cercle(1).change_donnees(centre,MaX(rayon1,rayon2),NULL); t_cercle(2).change_donnees(centre,MiN(rayon1,rayon2),NULL); }; // ramène true si tous les points sont entre les deux cercles concentriques bool Maillage::ExeEntreCercles(const Tableau & t_M)const { int tMtaille = t_M.Taille(); // on regarde si d'une part les points sont à l'intérieur du cercle 1 (le plus grand) et // a l'extérieur du plus petit for (int i=1;i<=tMtaille;i++) if ( (!(t_cercle(1).Dedans(t_M(i)))) || ((t_cercle(2).Dedans(t_M(i)))) ) return false; // sinon c'est ok return true; }; // acquisition d'un plan Plan Maillage::Acquisition_interactive_plan() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier Coordonnee poin(dima); Coordonnee normal(dima); if (fr) {cout << "\n coordonnee d'un point du premier plan ("<< dima << " reels) " << "\n ou un noeud -> rep: noeud= " << "\n ou 3 noeuds pour tout le plan " << "\n -> noeudi= " << endl; } else {cout << "\n coordinates of a point of the first plane ("<< dima << " reals) " << "\n or one node -> answer: noeud= " << "\n or 3 nodes for the whole plane " << "\n -> noeudi= " << endl; } int c=getchar(); string inter("");// une chaîne vide string rep; std::getline (std::cin,rep); if (isalnum(c)|| (c=='-')) // si jamais on a lu quelque chose de viable dans c on le rajoute {inter.push_back(c); rep = inter + rep; }; // si la taille de rep == 0 cela veut dire que c'est un retour chariot // if (rep.size()==0) char * chh = (char*)rep.c_str(); #ifndef ENLINUX_STREAM istringstream flux (chh); #else istrstream flux (chh); #endif if(strstr(chh,"oeud=")!=0) {int numn; string toto; flux >> toto >> numn; cout << "\n numero de noeud lu "<< numn; poin = tab_noeud(numn)->Coord0(); cout << "\n --> coordonnees lues: "; poin.Affiche_1(cout) ; if (fr) {cout << "\n coordonnees de la normale du plan ("<< dima << " reels) " << endl;} else {cout << "\n coordinates of the plane normal ("<< dima << " reals) " << endl;} for (int i = 1; i<= dima; i++) cin >> normal(i); cout << "\n --> normale lue: "; normal.Affiche_1(cout) ; std::cin.ignore( std::numeric_limits::max(), '\n' );// purge de cin } else if(strstr(chh,"oeudi=")!=0) { int n1,n2,n3; string toto; flux >> toto >> n1 >> n2 >> n3; cout << "\n numeros de noeud lu "<< n1 <<", "<Coord0(); // on fait le produit vectoriel pour la normale Coordonnee v1( tab_noeud(n2)->Coord0() - poin); Coordonnee v2( tab_noeud(n3)->Coord0() - poin); normal = Util::ProdVec_coor(v1,v2); } else { for (int i = 1; i<= dima; i++) flux >> poin(i); cout << "\n --> coordonnees lues: "; poin.Affiche_1(cout) ; if (fr) {cout << "\n coordonnees de la normale du plan ("<< dima << " reels) " << endl;} else {cout << "\n coordinates of the plane normal ("<< dima << " reals) " << endl;} for (int i = 1; i<= dima; i++) cin >> normal(i); cout << "\n --> normale lue: "; normal.Affiche_1(cout) ; std::cin.ignore( std::numeric_limits::max(), '\n' );// purge de cin }; Plan pl(poin,normal); return pl; }; // acquisition d'un point Coordonnee Maillage::Acquisition_interactive_point() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier Coordonnee poin(dima); if (fr) {cout << "\n coordonnee d'un point ("<< dima << " reels) " << "\n ou un noeud -> rep: noeud= " << flush; } else {cout << "\n coordinates of a point ("<< dima << " reals) " << "\n or one node -> answer: noeud= " << flush; } using namespace std; // on passe un caractère, *** je ne sais pas pourquoi *** pour que getline fonctionne !! (pas d'indication au niveau de rdstate // cout << "\n cin.iostat good(): "<< cin.good() << " eof: "<< cin.eof() // << " fail: "<< cin.fail() << " bad: "<< cin.bad() // << "\n rdstate(): " << cin.rdstate() << endl; int c=getchar(); string inter("");// une chaîne vide string rep; std::getline (std::cin,rep); if (isalnum(c) || (c=='-')) // si jamais on a lu quelque chose de viable dans c on le rajoute {inter.push_back(c); // cout << "\n** valeur de c "<< c << flush; rep = inter + rep; }; // si la taille de rep == 0 cela veut dire que c'est un retour chariot // if (rep.size()==0) char * chh = (char*)rep.c_str(); #ifndef ENLINUX_STREAM istringstream flux (chh); #else istrstream flux (chh); #endif if(strstr(chh,"oeud=")!=0) {int numn; string toto; flux >> toto >> numn; cout << "\n numero de noeud lu "<< numn; poin = tab_noeud(numn)->Coord0(); } else { for (int i = 1; i<= dima; i++) flux >> poin(i); cout << "\n --> coordonnees lues: "; poin.Affiche_1(cout) ; }; return poin; }; // acquisition d'une droite Droite Maillage::Acquisition_interactive_droite() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier Coordonnee poin1(dima); // --- le premier point ---- if (fr) {cout << "\n coordonnee d'un point de la droite ("<< dima << " reels) " << "\n ou un noeud -> rep: noeud= " << endl; } else {cout << "\n coordinates of a point of the line ("<< dima << " reals) " << "\n or one node -> answer: noeud= " << endl; } using namespace std; {// on passe un caractère, *** je ne sais pas pourquoi *** pour que getline fonctionne !! (pas d'indication au niveau de rdstate // cout << "\n cin.iostat good(): "<< cin.good() << " eof: "<< cin.eof() // << " fail: "<< cin.fail() << " bad: "<< cin.bad() // << "\n rdstate(): " << cin.rdstate() << endl; int c=getchar(); string inter("");// une chaîne vide string rep; std::getline (std::cin,rep); if (isalnum(c)) // si jamais on a lu quelque chose de viable dans c on le rajoute {inter.push_back(c); rep = inter + rep; }; // si la taille de rep == 0 cela veut dire que c'est un retour chariot // if (rep.size()==0) char * chh = (char*)rep.c_str(); #ifndef ENLINUX_STREAM istringstream flux (chh); #else istrstream flux (chh); #endif if(strstr(chh,"oeud=")!=0) {int numn; string toto; flux >> toto >> numn; cout << "\n numero de noeud lu "<< numn; poin1 = tab_noeud(numn)->Coord0(); } else { for (int i = 1; i<= dima; i++) flux >> poin1(i); cout << "\n --> coordonnees lues: "; poin1.Affiche_1(cout) ; }; }; // --- le second point ---- Coordonnee poin2(dima); if (fr) {cout << "\n coordonnee du second point de la droite ("<< dima << " reels) " << "\n ou un noeud -> rep: noeud= " << endl; } else {cout << "\n coordinates of the second point of the line ("<< dima << " reals) " << "\n or one node -> answer: noeud= " << endl; } {// on passe un caractère, *** je ne sais pas pourquoi *** pour que getline fonctionne !! (pas d'indication au niveau de rdstate // cout << "\n cin.iostat good(): "<< cin.good() << " eof: "<< cin.eof() // << " fail: "<< cin.fail() << " bad: "<< cin.bad() // << "\n rdstate(): " << cin.rdstate() << endl; int c=getchar(); string inter("");// une chaîne vide string rep; std::getline (std::cin,rep); if (isalnum(c)|| (c=='-')) // si jamais on a lu quelque chose de viable dans c on le rajoute {inter.push_back(c); rep = inter + rep; }; // si la taille de rep == 0 cela veut dire que c'est un retour chariot // if (rep.size()==0) char * chh = (char*)rep.c_str(); #ifndef ENLINUX_STREAM istringstream flux (chh); #else istrstream flux (chh); #endif if(strstr(chh,"oeud=")!=0) {int numn; string toto; flux >> toto >> numn; cout << "\n numero de noeud lu "<< numn; poin2 = tab_noeud(numn)->Coord0(); } else { for (int i = 1; i<= dima; i++) flux >> poin2(i); cout << "\n --> coordonnees lues: "; poin2.Affiche_1(cout) ; }; }; Coordonnee V(poin2-poin1); Droite dl(poin1,V); return dl; }; // acquisition d'un vecteur=direction Coordonnee Maillage::Acquisition_interactive_vecteur() { int dima = ParaGlob::Dimension(); bool fr = ParaGlob::Francais(); // pour simplifier Coordonnee V(dima); if (fr) {cout << "\n coordonnee du vecteur ("<< dima << " reels) " << "\n ou 2 noeuds pour tout le plan " << "\n -> noeudi= " << endl; } else {cout << "\n coordinates of a the vector ("<< dima << " reals) " << "\n or 2 nodes for the whole plane " << "\n -> noeudi= " << endl; } int c=getchar(); string inter("");// une chaîne vide string rep; std::getline (std::cin,rep); if (isalnum(c) || (c=='-')) // si jamais on a lu quelque chose de viable dans c on le rajoute {inter.push_back(c); rep = inter + rep; }; // si la taille de rep == 0 cela veut dire que c'est un retour chariot // if (rep.size()==0) char * chh = (char*)rep.c_str(); #ifndef ENLINUX_STREAM istringstream flux (chh); #else istrstream flux (chh); #endif if(strstr(chh,"noeudi=")!=0) { Coordonnee poin1(dima); Coordonnee poin2(dima); int n1,n2; string toto; flux >> toto >> n1 >> n2 ; cout << "\n numeros de noeud lu "<< n1 <<", "<Coord0(); poin2 = tab_noeud(n2)->Coord0(); V = poin2-poin1; } else { for (int i = 1; i<= dima; i++) flux >> V(i); cout << "\n --> coordonnees lues: "; V.Affiche_1(cout) ; }; return V; }; // condition d'appartenance à une référence existante void Maillage::InitInRef() { bool fr = ParaGlob::Francais(); // pour simplifier string nom_ref; const Reference * refIn = NULL; bool demande_fin = false; while (!demande_fin) {if (fr) {cout << "\n -- init condition : appartenance a une reference ---- \n (liste in actuelle: "; {list ::const_iterator il,ilfin=list_refIn.end(); if (list_refIn.size() == 0 ) {cout << " aucune ref " ;} else { for (il = list_refIn.begin(); il != ilfin; il++) cout << " "<< (*il)->Nom(); cout << " ) "; } } cout << "\n nom de la reference existante ? (seules les ref de " << "\n meme type seront comparees) " << endl; } else {cout << "\n -- init condition : belonging to an already existing reference ---- \n list in use: "; {list ::const_iterator il,ilfin=list_refIn.end(); if (list_refIn.size() == 0 ) {cout << " no ref " ;} else { for (il = list_refIn.begin(); il != ilfin; il++) cout << " "<< (*il)->Nom(); cout << " ) "; } } cout << "\n name of the reference ? (only a reference of a " << "\n same type can be used) " << endl; }; nom_ref=lect_return_defaut(true,"f"); if (nom_ref == "f" ) {demande_fin = true;} // sinon on essaie de récupérer la référence else if (!(lesRefin->Existe(nom_ref,idmail))) {if (fr) {cout << "\n le nom lue " << nom_ref << " ne correspond pas a une reference existante " << " donnez un autre nom ou taper f pour finir "; } else {cout << "\n the input name " << nom_ref << " does not belong to an existing reference " << " give another name, or f for leaving "; }; } else { // on récupère la référence refIn = &(lesRefin->Trouve(nom_ref,idmail)); list_refIn.push_back(refIn); demande_fin=true; // seul cas où tout est ok } }; }; // ramène true si tous les points appartiennent à la ref //bool Maillage::ExeInRef (const Tableau & t_M)const // { //const ReferenceNE & refi = *((ReferenceNE *) refIn); // on récupère tous les noeuds de la référence // }; // condition d'exclusion à une référence existante void Maillage::InitOutRef() { bool fr = ParaGlob::Francais(); // pour simplifier string nom_ref; const Reference * refOut = NULL; bool demande_fin = false; while (!demande_fin) {if (fr) {cout << "\n -- init condition : hors d'une reference ---- \n (liste in actuelle: "; {list ::const_iterator il,ilfin=list_refOut.end(); if (list_refOut.size() == 0 ) {cout << " aucune ref " ;} else { for (il = list_refOut.begin(); il != ilfin; il++) cout << " "<< (*il)->Nom(); cout << " ) "; } } cout << "\n nom de la reference existante ? (seules les ref de " << "\n meme type seront comparees) " << endl; } else {cout << "\n -- init condition : out of to an already existing reference ---- \n list in use: "; {list ::const_iterator il,ilfin=list_refOut.end(); if (list_refOut.size() == 0 ) {cout << " aucune ref " ;} else { for (il = list_refOut.begin(); il != ilfin; il++) cout << " "<< (*il)->Nom(); cout << " ) "; } } cout << "\n name of the reference ? (only a reference of a " << "\n same type can be used) " << endl; }; nom_ref=lect_return_defaut(true,"f"); if (nom_ref == "f" ) {demande_fin = true;} // sinon on essaie de récupérer la référence else if (!(lesRefin->Existe(nom_ref,idmail))) {if (fr) {cout << "\n le nom lue " << nom_ref << " ne correspond pas a une reference existante " << " donnez un autre nom ou taper f pour finir "; } else {cout << "\n the input name " << nom_ref << " does not belong to an existing reference " << " give another name, or f for leaving "; } } else { // on récupère la référence refOut = &(lesRefin->Trouve(nom_ref,idmail)); list_refOut.push_back(refOut); demande_fin=true; // seul cas où tout est ok } }; }; // 1) une fonction qui ne fait rien, mais est là pour que le tout fonctionne normalement bool Maillage::Exe_In_out_avecRefExistantes(const Tableau & t_M)const {return true;}; // ne fait rien // 2) fonctions qui réellement font quelque chose: utilisées dans la méthode EnregRef // a - cas des ref de noeuds void Maillage::Exe_In_out_avecRefExistantes_N(list & list_noeud_restant) { // ---- cas des ref in list liste_finale_in; { // on commence par concaténer l'ensemble des noeuds des refs In list ::iterator lref,lref_fin= list_refIn.end(); for (lref=list_refIn.begin();lref != lref_fin; lref++) {// on ne continue que si c'est une ref de noeud, du même maillage if (((*lref)->Indic() == 1) && ((*lref)->Nbmaille() == idmail)) { ReferenceNE * refi = ((ReferenceNE *) (*lref)); const Tableau& tab_num = refi->Tab_num(); int tailmax = tab_num.Taille(); for (int i=1;i<=tailmax;i++) {liste_finale_in.push_back(tab_noeud(tab_num(i)));}; }; }; // on trie et on supprime les doublons liste_finale_in.sort(); liste_finale_in.unique(); }; list ::iterator lf_in_deb=liste_finale_in.begin(); list ::iterator lf_in_end=liste_finale_in.end(); // ---- cas des ref out list liste_finale_out; { // on commence par concaténer l'ensemble des noeuds des refs out list ::iterator lref,lref_fin= list_refOut.end(); for (lref=list_refOut.begin();lref != lref_fin; lref++) { // on ne continue que si c'est une ref de noeud, du même maillage if (((*lref)->Indic() == 1) && ((*lref)->Nbmaille() == idmail)) { ReferenceNE * refi = ((ReferenceNE *) (*lref)); const Tableau& tab_num = refi->Tab_num(); int tailmax = tab_num.Taille(); for (int i=1;i<=tailmax;i++) {liste_finale_out.push_back(tab_noeud(tab_num(i)));}; }; }; // on trie et on supprime les doublons liste_finale_out.sort(); liste_finale_out.unique(); }; list ::iterator lf_out_deb=liste_finale_out.begin(); list ::iterator lf_out_end=liste_finale_out.end(); ////--- debug // cout << "\n Maillage::Exe_In_out_avecRefExistantes_N(.."; // cout << "\n list in "; // list < Noeud*>::iterator lnn; // for (lnn=lf_in_deb;lnn != lf_in_end; lnn++) // cout << (*lnn)->Num_noeud() << " "; // cout << "\n list out "; // for (lnn=lf_out_deb;lnn != lf_out_end; lnn++) // cout << (*lnn)->Num_noeud() << " "; // cout << "\n list finale avant traitement "; // for (lnn=list_noeud_restant.begin();lnn != list_noeud_restant.end(); lnn++) // cout << (*lnn)->Num_noeud() << " "; ////--- fin debug // ---- application // on passe en revue les noeuds et on regarde s'ils font partie d'une des listes In // et s'ils sont en dehors des out bool liste_finale_in_a_considerer = liste_finale_in.size(); bool liste_finale_out_a_considerer = liste_finale_out.size(); ////--- debug // cout << "liste_finale_in_a_considerer" << liste_finale_in_a_considerer // << "liste_finale_out_a_considerer" << liste_finale_out_a_considerer << endl; ////--- fin debug list ::iterator li; list liinter(list_noeud_restant); int nb_trouve_in=0; int nb_trouve_out=0; // comme on supprime en cours de route des ref de noeuds on recalcul la borne sup à chaque passage for (li=list_noeud_restant.begin();li != list_noeud_restant.end();li++) { bool deja_supprime = false; // pour indiquer si un element a déjà ete supprimer, ce qui evite une double ////--- fin debug // cout << "(*li)->Num_noeud()=" << (*li)->Num_noeud() << endl; // cout << "\n taper un lettre "; string unelettre ; cin >> unelettre; ////--- fin debug if (liste_finale_in_a_considerer) // prise en compte que si la liste est non vide {if (find(lf_in_deb, lf_in_end, *li) == lf_in_end) // on n'a pas trouvé de noeud appartenant à la liste, on supprime le noeud {//list ::iterator toto = li; liinter.remove(*li);// // list_noeud_restant.remove(*li); nb_trouve_in++;deja_supprime=true; } }; if ((liste_finale_out_a_considerer)&&(!deja_supprime)) // prise en compte que si la liste est non vide {if (find(lf_out_deb, lf_out_end, *li) != lf_out_end) // on a trouvé un noeud appartenant à la liste, on supprime le noeud {//list_noeud_restant.erase(li); liinter.remove(*li);// nb_trouve_out++; }; }; }; list_noeud_restant = liinter; if (ParaGlob::NiveauImpression() > 4) { if (liste_finale_in_a_considerer) cout << "\n "<& list_element_restant) { // ---- cas des ref in list liste_finale_in; { // on commence par concaténer l'ensemble des Elements des refs In list ::iterator lref,lref_fin= list_refIn.end(); for (lref=list_refIn.begin();lref != lref_fin; lref++) {// on ne continue que si c'est une ref de Element, du même maillage if (((*lref)->Indic() == 2) && ((*lref)->Nbmaille() == idmail)) { ReferenceNE * refi = ((ReferenceNE *) (*lref)); const Tableau& tab_num = refi->Tab_num(); int tailmax = tab_num.Taille(); for (int i=1;i<=tailmax;i++) {liste_finale_in.push_back(tab_element(tab_num(i)));}; }; }; // on trie et on supprime les doublons liste_finale_in.sort(); liste_finale_in.unique(); }; list ::iterator lf_in_deb=liste_finale_in.begin(); list ::iterator lf_in_end=liste_finale_in.end(); // ---- cas des ref out list liste_finale_out; { // on commence par concaténer l'ensemble des Elements des refs out list ::iterator lref,lref_fin= list_refOut.end(); for (lref=list_refOut.begin();lref != lref_fin; lref++) { // on ne continue que si c'est une ref de Element, du même maillage if (((*lref)->Indic() == 2) && ((*lref)->Nbmaille() == idmail)) { ReferenceNE * refi = ((ReferenceNE *) (*lref)); const Tableau& tab_num = refi->Tab_num(); int tailmax = tab_num.Taille(); for (int i=1;i<=tailmax;i++) {liste_finale_out.push_back(tab_element(tab_num(i)));}; }; }; // on trie et on supprime les doublons liste_finale_out.sort(); liste_finale_out.unique(); }; list ::iterator lf_out_deb=liste_finale_out.begin(); list ::iterator lf_out_end=liste_finale_out.end(); ////--- debug // cout << "\n Maillage::Exe_In_out_avecRefExistantes_N(.."; // cout << "\n list in "; // list < Element*>::iterator lnn; // for (lnn=lf_in_deb;lnn != lf_in_end; lnn++) // cout << (*lnn)->Num_Element() << " "; // cout << "\n list out "; // for (lnn=lf_out_deb;lnn != lf_out_end; lnn++) // cout << (*lnn)->Num_Element() << " "; // cout << "\n list finale avant traitement "; // for (lnn=list_element_restant.begin();lnn != list_element_restant.end(); lnn++) // cout << (*lnn)->Num_Element() << " "; ////--- fin debug // ---- application // on passe en revue les Elements et on regarde s'ils font partie d'une des listes In // et s'ils sont en dehors des out bool liste_finale_in_a_considerer = liste_finale_in.size(); bool liste_finale_out_a_considerer = liste_finale_out.size(); list ::iterator li; int nb_trouve_in=0; int nb_trouve_out=0; // comme on supprime en cours de route des ref de Elements on recalcul la borne sup à chaque passage for (li=list_element_restant.begin();li != list_element_restant.end();li++) { bool deja_supprime = false; // pour indiquer si un element a déjà ete supprimer, ce qui evite une double if (liste_finale_in_a_considerer) // prise en compte que si la liste est non vide if (find(lf_in_deb, lf_in_end, *li) == lf_in_end) // on n'a pas trouvé de Element appartenant à la liste, on supprime le Element {list_element_restant.erase(li);nb_trouve_in++;deja_supprime=true;} if ((liste_finale_out_a_considerer)&&(!deja_supprime)) // prise en compte que si la liste est non vide if (find(lf_out_deb, lf_out_end, *li) != lf_out_end) // on a trouvé un Element appartenant à la liste, on supprime le Element {list_element_restant.erase(li);nb_trouve_out++;} }; if (ParaGlob::NiveauImpression() > 4) { if (liste_finale_in_a_considerer) cout << "\n "<& list_elemPtin_restant) { // ---- cas des ref in pour les pti list liste_finale_in; { // on commence par concaténer l'ensemble des pti des refs In list ::iterator lref,lref_fin= list_refIn.end(); for (lref=list_refIn.begin();lref != lref_fin; lref++) {// on ne continue que si c'est une ref de pti, du même maillage if (((*lref)->Indic() == 6) && ((*lref)->Nbmaille() == idmail)) { ReferenceAF * refi = ((ReferenceAF *) (*lref)); const Tableau& tab_elem = refi->Tab_Elem(); const Tableau& tab_fa = refi->Tab_FA(); int tailmax = tab_elem.Taille(); for (int i=1;i<=tailmax;i++) { NBelemEtptInteg nu; nu.nbElem = tab_elem(i); nu.nbPtInteg = tab_fa(i); liste_finale_in.push_back(nu); }; }; }; // on trie et on supprime les doublons liste_finale_in.sort(); liste_finale_in.unique(); }; list ::iterator lf_in_deb=liste_finale_in.begin(); list ::iterator lf_in_end=liste_finale_in.end(); // ---- cas des ref out list liste_finale_out; { // on commence par concaténer l'ensemble des pti des refs out list ::iterator lref,lref_fin= list_refOut.end(); for (lref=list_refOut.begin();lref != lref_fin; lref++) { // on ne continue que si c'est une ref de pti, du même maillage if (((*lref)->Indic() == 6) && ((*lref)->Nbmaille() == idmail)) { ReferenceAF * refi = ((ReferenceAF *) (*lref)); const Tableau& tab_elem = refi->Tab_Elem(); const Tableau& tab_fa = refi->Tab_FA(); int tailmax = tab_elem.Taille(); for (int i=1;i<=tailmax;i++) { NBelemEtptInteg nu; nu.nbElem = tab_elem(i); nu.nbPtInteg = tab_fa(i); liste_finale_out.push_back(nu); }; }; }; // on trie et on supprime les doublons liste_finale_out.sort(); liste_finale_out.unique(); }; list ::iterator lf_out_deb=liste_finale_out.begin(); list ::iterator lf_out_end=liste_finale_out.end(); ////--- debug // ////--- debug // cout << "\n Maillage::Exe_In_out_avecRefExistantes_F(.."; // cout << "\n list in "; // list < NBelemEtptInteg>::iterator lnn; // for (lnn=lf_in_deb;lnn != lf_in_end; lnn++) // cout << (*lnn).nbElem << " "<< (*lnn).nbPtInteg << " "; // cout << "\n list out "; // for (lnn=lf_out_deb;lnn != lf_out_end; lnn++) // cout << (*lnn).nbElem << " "<< (*lnn).nbPtInteg << " "; // cout << "\n list finale avant traitement "; // for (lnn=list_elemPtin_restant.begin();lnn != list_elemPtin_restant.end(); lnn++) // cout << (*lnn).nbElem << " "<< (*lnn).nbPtInteg << " "; ////--- fin debug // ---- application // on passe en revue les pti et on regarde s'ils font partie d'une des listes In // et s'ils sont en dehors des out bool liste_finale_in_a_considerer = liste_finale_in.size(); bool liste_finale_out_a_considerer = liste_finale_out.size(); list ::iterator li; int nb_trouve_in=0; int nb_trouve_out=0; // comme on supprime en cours de route des ref de face on recalcul la borne sup à chaque passage for (li=list_elemPtin_restant.begin();li != list_elemPtin_restant.end();li++) { bool deja_supprime = false; // pour indiquer si un element a déjà ete supprimer, ce qui evite une double if (liste_finale_in_a_considerer) // prise en compte que si la liste est non vide if (find(lf_in_deb, lf_in_end, *li) == lf_in_end) // on n'a pas trouvé de face appartenant à la liste, on supprime le pti {list_elemPtin_restant.erase(li);nb_trouve_in++;deja_supprime=true;} if ((liste_finale_out_a_considerer)&&(!deja_supprime)) // prise en compte que si la liste est non vide if (find(lf_out_deb, lf_out_end, *li) != lf_out_end) // on a trouvé une face appartenant à la liste, on supprime le pti {list_elemPtin_restant.erase(li);nb_trouve_out++;} }; if (ParaGlob::NiveauImpression() > 4) { if (liste_finale_in_a_considerer) cout << "\n "<& list_elemFace_restant) { // ---- cas des ref in pour les faces list liste_finale_in; { // on commence par concaténer l'ensemble des faces des refs In list ::iterator lref,lref_fin= list_refIn.end(); for (lref=list_refIn.begin();lref != lref_fin; lref++) {// on ne continue que si c'est une ref de face, du même maillage if (((*lref)->Indic() == 3) && ((*lref)->Nbmaille() == idmail)) { ReferenceAF * refi = ((ReferenceAF *) (*lref)); const Tableau& tab_elem = refi->Tab_Elem(); const Tableau& tab_fa = refi->Tab_FA(); int tailmax = tab_elem.Taille(); for (int i=1;i<=tailmax;i++) { NBelemEtFace nu; nu.nbElem = tab_elem(i); nu.nbFace = tab_fa(i); liste_finale_in.push_back(nu); }; }; }; // on trie et on supprime les doublons liste_finale_in.sort(); liste_finale_in.unique(); }; list ::iterator lf_in_deb=liste_finale_in.begin(); list ::iterator lf_in_end=liste_finale_in.end(); // ---- cas des ref out list liste_finale_out; { // on commence par concaténer l'ensemble des faces des refs out list ::iterator lref,lref_fin= list_refOut.end(); for (lref=list_refOut.begin();lref != lref_fin; lref++) { // on ne continue que si c'est une ref de face, du même maillage if (((*lref)->Indic() == 3) && ((*lref)->Nbmaille() == idmail)) { ReferenceAF * refi = ((ReferenceAF *) (*lref)); const Tableau& tab_elem = refi->Tab_Elem(); const Tableau& tab_fa = refi->Tab_FA(); int tailmax = tab_elem.Taille(); for (int i=1;i<=tailmax;i++) { NBelemEtFace nu; nu.nbElem = tab_elem(i); nu.nbFace = tab_fa(i); liste_finale_out.push_back(nu); }; }; }; // on trie et on supprime les doublons liste_finale_out.sort(); liste_finale_out.unique(); }; list ::iterator lf_out_deb=liste_finale_out.begin(); list ::iterator lf_out_end=liste_finale_out.end(); ////--- debug // ////--- debug // cout << "\n Maillage::Exe_In_out_avecRefExistantes_F(.."; // cout << "\n list in "; // list < NBelemEtFace>::iterator lnn; // for (lnn=lf_in_deb;lnn != lf_in_end; lnn++) // cout << (*lnn).nbElem << " "<< (*lnn).nbFace << " "; // cout << "\n list out "; // for (lnn=lf_out_deb;lnn != lf_out_end; lnn++) // cout << (*lnn).nbElem << " "<< (*lnn).nbFace << " "; // cout << "\n list finale avant traitement "; // for (lnn=list_elemFace_restant.begin();lnn != list_elemFace_restant.end(); lnn++) // cout << (*lnn).nbElem << " "<< (*lnn).nbFace << " "; ////--- fin debug // ---- application // on passe en revue les faces et on regarde s'ils font partie d'une des listes In // et s'ils sont en dehors des out bool liste_finale_in_a_considerer = liste_finale_in.size(); bool liste_finale_out_a_considerer = liste_finale_out.size(); list ::iterator li; int nb_trouve_in=0; int nb_trouve_out=0; // comme on supprime en cours de route des ref de face on recalcul la borne sup à chaque passage for (li=list_elemFace_restant.begin();li != list_elemFace_restant.end();li++) { bool deja_supprime = false; // pour indiquer si un element a déjà ete supprimer, ce qui evite une double if (liste_finale_in_a_considerer) // prise en compte que si la liste est non vide if (find(lf_in_deb, lf_in_end, *li) == lf_in_end) // on n'a pas trouvé de face appartenant à la liste, on supprime le face {list_elemFace_restant.erase(li);nb_trouve_in++;deja_supprime=true;} if ((liste_finale_out_a_considerer)&&(!deja_supprime)) // prise en compte que si la liste est non vide if (find(lf_out_deb, lf_out_end, *li) != lf_out_end) // on a trouvé une face appartenant à la liste, on supprime le face {list_elemFace_restant.erase(li);nb_trouve_out++;} }; if (ParaGlob::NiveauImpression() > 4) { if (liste_finale_in_a_considerer) cout << "\n "<& list_elemArrete_restant) { // ---- cas des ref in pour les arêtes list liste_finale_in; { // on commence par concaténer l'ensemble des arêtes des refs In list ::iterator lref,lref_fin= list_refIn.end(); for (lref=list_refIn.begin();lref != lref_fin; lref++) {// on ne continue que si c'est une ref de arêtes, du même maillage if (((*lref)->Indic() == 4) && ((*lref)->Nbmaille() == idmail)) { ReferenceAF * refi = ((ReferenceAF *) (*lref)); const Tableau& tab_elem = refi->Tab_Elem(); const Tableau& tab_fa = refi->Tab_FA(); int tailmax = tab_elem.Taille(); for (int i=1;i<=tailmax;i++) { NBelemEtArete nu; nu.nbElem = tab_elem(i); nu.nbArete = tab_fa(i); liste_finale_in.push_back(nu); }; }; }; // on trie et on supprime les doublons liste_finale_in.sort(); liste_finale_in.unique(); }; list ::iterator lf_in_deb=liste_finale_in.begin(); list ::iterator lf_in_end=liste_finale_in.end(); // ---- cas des ref out list liste_finale_out; { // on commence par concaténer l'ensemble des arêtes des refs out list ::iterator lref,lref_fin= list_refOut.end(); for (lref=list_refOut.begin();lref != lref_fin; lref++) { // on ne continue que si c'est une ref de arête, du même maillage if (((*lref)->Indic() == 4) && ((*lref)->Nbmaille() == idmail)) { ReferenceAF * refi = ((ReferenceAF *) (*lref)); const Tableau& tab_elem = refi->Tab_Elem(); const Tableau& tab_fa = refi->Tab_FA(); int tailmax = tab_elem.Taille(); for (int i=1;i<=tailmax;i++) { NBelemEtArete nu; nu.nbElem = tab_elem(i); nu.nbArete = tab_fa(i); liste_finale_out.push_back(nu); }; }; }; // on trie et on supprime les doublons liste_finale_out.sort(); liste_finale_out.unique(); }; list ::iterator lf_out_deb=liste_finale_out.begin(); list ::iterator lf_out_end=liste_finale_out.end(); ////--- debug // ////--- debug // cout << "\n Maillage::Exe_In_out_avecRefExistantes_F(.."; // cout << "\n list in "; // list < NBelemEtArete>::iterator lnn; // for (lnn=lf_in_deb;lnn != lf_in_end; lnn++) // cout << (*lnn).nbElem << " "<< (*lnn).nbArete << " "; // cout << "\n list out "; // for (lnn=lf_out_deb;lnn != lf_out_end; lnn++) // cout << (*lnn).nbElem << " "<< (*lnn).nbArete << " "; // cout << "\n list finale avant traitement "; // for (lnn=list_elemArrete_restant.begin();lnn != list_elemArrete_restant.end(); lnn++) // cout << (*lnn).nbElem << " "<< (*lnn).nbArete << " "; ////--- fin debug // ---- application // on passe en revue les arêtes et on regarde s'ils font partie d'une des listes In // et s'ils sont en dehors des out bool liste_finale_in_a_considerer = liste_finale_in.size(); bool liste_finale_out_a_considerer = liste_finale_out.size(); int nb_trouve_in=0; int nb_trouve_out=0; list ::iterator li; // comme on supprime en cours de route des ref de arête on recalcul la borne sup à chaque passage for (li=list_elemArrete_restant.begin();li != list_elemArrete_restant.end();li++) { bool deja_supprime = false; // pour indiquer si un element a déjà ete supprimer, ce qui evite une double if (liste_finale_in_a_considerer) // prise en compte que si la liste est non vide if (find(lf_in_deb, lf_in_end, *li) == lf_in_end) // on n'a pas trouvé de arête appartenant à la liste, on supprime le arête {list_elemArrete_restant.erase(li);nb_trouve_in++;deja_supprime=true;} if ((liste_finale_out_a_considerer)&&(!deja_supprime)) // prise en compte que si la liste est non vide if (find(lf_out_deb, lf_out_end, *li) != lf_out_end) // on a trouvé une arête appartenant à la liste, on supprime le arête {list_elemArrete_restant.erase(li);nb_trouve_out++;} }; if (ParaGlob::NiveauImpression() > 4) { if (liste_finale_in_a_considerer) cout << "\n "<& list_noeud_restant,list & list_elemPtin_restant ,const Enum_ddl & enu_ddl) { // --- cas des noeuds --- bool fr = ParaGlob::Francais(); // pour simplifier // on crée un tableau des noeuds restants if (list_noeud_restant.size() != 0) {int nbtn = list_noeud_restant.size(); Tableau tab_n(nbtn); list ::iterator il,ilfin=list_noeud_restant.end(); int i=1; for (il = list_noeud_restant.begin();il != ilfin;il++,i++) tab_n(i) = *il; // maintenant on crée une liste de Entier_et_Double qui contient le numéro dans le tableau et la coordonnée // curviligne de la projection list list_curvi; // on rempli la liste Droite & dr = t_droit(1); // pour simplifier for (int i=1;i<=nbtn;i++) { Coordonnee M = tab_n(i)->Coord0(); Coordonnee Mp = dr.Projete(M); double xcurv = (Mp-dr.PointDroite()) * dr.VecDroite(); list_curvi.push_front(Entier_et_Double(i,xcurv)); }; // on ordonne la liste list_curvi.sort(); // on reconstruit la liste de noeud restant list_noeud_restant.clear(); list ::iterator ia,iafin= list_curvi.end(); for (ia=list_curvi.begin();ia!=iafin;ia++) list_noeud_restant.push_front(tab_n((*ia).n)); }; // encapsulation // --- cas des points d'intégrations --- if (list_elemPtin_restant.size() != 0) {list list_curvi; // on crée un tableau des ptint int nbptint = list_elemPtin_restant.size(); Tableau tab_ptint(nbptint); list ::iterator jl,jlfin=list_elemPtin_restant.end(); int j=1; for (jl = list_elemPtin_restant.begin();jl != jlfin;jl++,j++) tab_ptint(j) = *jl; // maintenant on crée une liste de Entier_et_Double qui contient le numéro dans le tableau et la coordonnée // curviligne de la projection: list_curvi.clear(); // en fait on utilise la précédente liste // on rempli la liste Droite & dr = t_droit(1); // pour simplifier for (int i=1;i<=nbptint;i++) { Element& el = *(tab_element(tab_ptint(i).nbElem)); bool erreur =false; Coordonnee M = el.CoordPtInteg(TEMPS_0,enu_ddl,tab_ptint(i).nbPtInteg,erreur); if (erreur) { int num = tab_ptint(i).nbPtInteg; if (fr) {cout << "\n erreur bizarre, on ne peut pas trouver les coordoonees t0 du pt d'integ " << num << "de l'element " << el.Num_elt() << " du maillage " << el.Num_maillage() << " on arrete d'ordonner les pt d'integ ! ! "; } else {cout << "\n strange error, we cannot find the coordinates at t0 of the gauss point " << num << "of the element " << el.Num_elt() << " of the mesh " << el.Num_maillage() << " we stop the process of sorting the integ pt ! ! "; } return; } Coordonnee Mp = dr.Projete(M); double xcurv = (Mp-dr.PointDroite()) * dr.VecDroite(); list_curvi.push_front(Entier_et_Double(i,xcurv)); }; // on ordonne la liste list_curvi.sort(); // on reconstruit la liste des ptinteg restants list_elemPtin_restant.clear(); list ::iterator ja,jafin= list_curvi.end(); for (ja=list_curvi.begin();ja!=jafin;ja++) list_elemPtin_restant.push_front(tab_ptint((*ja).n)); }; // encapsulation }; //- il faut faire la doc en ligne d'herehz++ //- il faut mettre un ordre pour sauvegarder le nouveau maillage //- mettre un sous-ordre dans l'algo, qui a pour objet de rien faire au niveau algo mettre de faire // l'exécution des choses prévu dans les classes utilisées: ici les maillages