diff --git a/Algo/AlgoRef/Algori.cc b/Algo/AlgoRef/Algori.cc index a4a3e46..898d7dd 100644 --- a/Algo/AlgoRef/Algori.cc +++ b/Algo/AlgoRef/Algori.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -150,7 +150,13 @@ Algori::Algori () : // par defaut ,tempsSecondMembreEnergContact(),temps_CL(),temps_CLL() ,temps_lois_comportement(),temps_metrique_K_SM(),temps_chargement() ,temps_rech_contact() - ,lesTempsCpu(16),ptalgocombi(NULL) + ,ptalgocombi(NULL) + #ifndef UTILISATION_MPI + ,lesTempsCpu(16) + #else + ,lesTempsCpu(19),distribution_CPU_algo() + ,temps_transfert_court(),temps_transfert_long(),temps_attente() + #endif //---------- stockage pour la transmission des grandeurs consultables ----- // ,stock_compteur(GENERIQUE_UNE_GRANDEUR_GLOBALE),val_stock_compteur(NULL) // ,stock_icharge(GENERIQUE_UNE_GRANDEUR_GLOBALE),val_stock_icharge(NULL) @@ -165,7 +171,8 @@ Algori::Algori () : // par defaut Algori::Algori (EnumTypeCalcul type,const bool avec_typeDeCal ,const list & soustype ,const list & avec_soustypeDeCal - ,UtilLecture& entreePrincipal): + ,UtilLecture& entreePrincipal + ): typeCalcul(type),avec_typeDeCalcul(avec_typeDeCal) ,soustypeDeCalcul(&soustype),avec_soustypeDeCalcul(&avec_soustypeDeCal) ,paraTypeCalcul() @@ -234,13 +241,21 @@ Algori::Algori (EnumTypeCalcul type,const bool avec_typeDeCal ,tempsSecondMembreEnergContact(),temps_CL(),temps_CLL() ,temps_lois_comportement(),temps_metrique_K_SM(),temps_chargement() ,temps_rech_contact() - ,lesTempsCpu(16),ptalgocombi(NULL) + ,ptalgocombi(NULL) + #ifndef UTILISATION_MPI + ,lesTempsCpu(16) + #else + ,lesTempsCpu(19),distribution_CPU_algo() + ,temps_transfert_court(),temps_transfert_long(),temps_attente() + #endif + //---------- stockage pour la transmission des grandeurs consultables ----- // ,stock_compteur(GENERIQUE_UNE_GRANDEUR_GLOBALE),val_stock_compteur(NULL) // ,stock_icharge(GENERIQUE_UNE_GRANDEUR_GLOBALE),val_stock_icharge(NULL) { // on met à jour ParaGlob ParaGlob::param->ChangeParaAlgoControleActifs(&pa); + // stockage pour la transmission des grandeurs consultables // 1) on définie un type quelconque adapté comme conteneur {int toto=0; @@ -418,13 +433,22 @@ Algori::Algori (const Algori& algo) : ,temps_CL(algo.temps_CL),temps_CLL(algo.temps_CLL) ,temps_lois_comportement(algo.temps_lois_comportement),temps_metrique_K_SM(algo.temps_metrique_K_SM) ,temps_chargement(algo.temps_chargement),temps_rech_contact(algo.temps_rech_contact) - ,lesTempsCpu(16),ptalgocombi(NULL) + ,ptalgocombi(NULL) +#ifndef UTILISATION_MPI + ,lesTempsCpu(16) +#else + ,lesTempsCpu(18),distribution_CPU_algo(algo.distribution_CPU_algo) // distribution de charge sur les CPU + ,temps_transfert_court(algo.temps_transfert_court),temps_transfert_long(algo.temps_transfert_long) + ,temps_attente(algo.temps_attente) +#endif + //---------- stockage pour la transmission des grandeurs consultables ----- // ,stock_compteur(algo.stock_compteur),val_stock_compteur(NULL) // ,stock_icharge(algo.stock_icharge),val_stock_icharge(NULL) { // on met à jour ParaGlob ParaGlob::param->ChangeParaAlgoControleActifs(&pa); + if (vglob_stat != NULL) vglob_stat = new Vecteur(*vglob_stat); // // 2) on adapte le stockage @@ -451,7 +475,7 @@ Algori::~Algori () if (vglob_sigeps != NULL) {delete vglob_sigeps;vglob_sigeps=NULL;} if (vglobal_sigeps != NULL) {delete vglobal_sigeps;vglobal_sigeps=NULL;} if (vglob_stat != NULL) delete vglob_stat; - }; + }; //lecture des parametres de controle // et préparation de la sortie des paramètres globaux @@ -581,7 +605,11 @@ void Algori::Preparation_conteneurs_interne(LesMaillages& lesMail) // Temps_CPU_HZpp temps_metrique_K_SM; // lesTempsCpu(14) // Temps_CPU_HZpp temps_chargement; // lesTempsCpu(15) // Temps_CPU_HZpp temps_rech_contact; // lesTempsCpu(16) - // + // si calcul //: + // Temps_CPU_HZpp temps_transfert_court; // lesTempsCpu(17) + // Temps_CPU_HZpp temps_transfert_long ; // lesTempsCpu(19) + // Temps_CPU_HZpp temps_attente ; // lesTempsCpu(18) + // Tableau lesTempsCpu; // un tableau intermédiaire qui récupère et globalise les temps pour les sorties // // via listeVarGlob, mais c'est les variables Temps_CPU_HZpp qui stockent // // réellement les temps @@ -628,7 +656,12 @@ void Algori::Preparation_conteneurs_interne(LesMaillages& lesMail) listeVarGlob["tpsU_Metriques"]=&lesTempsCpu(14)(1); listeVarGlob["tpsU_chargement"]=&lesTempsCpu(15)(1); listeVarGlob["tpsU_rech_contact"]=&lesTempsCpu(16)(1); - + #ifdef UTILISATION_MPI + // cas d'un calcul parallèle + listeVarGlob["tpsU_transfert_inter_cpu"]=&lesTempsCpu(17)(1); + listeVarGlob["tpsU_attente_inter_cpu"]=&lesTempsCpu(18)(1); + #endif + // cas des vecteurs globaux int dim = ParaGlob::Dimension(); if (ParaGlob::AxiSymetrie()) @@ -1009,7 +1042,7 @@ bool Algori::Convergence // cas où l'on prend en compte l'évolution des var ddl et/ou des max résidu double var_mini_ddl = pa.VarMiniDdl(); - double var_maxi_ddl = pa.VarMaxiDdl(); +// double var_maxi_ddl = pa.VarMaxiDdl(); int nbmax_cycle_test_var_residu= pa.PlageControleResidu(); // traitement initial dans le cas iteratif if (itera > 0) @@ -1138,6 +1171,12 @@ void Algori::InfoIncrementDdl(LesMaillages * lesMail, void Algori::InfoIncrementReac(LesMaillages * lesMail,int compteur, int inreaction,double maxreaction,const Nb_assemb& nb_casAssemb) { int nbNoeud2,nbMaillage2; + #ifdef UTILISATION_MPI + // cas d'un calcul //, pour l'instant seule la (ou les) matrices du CPU 0 sont concernées + if (ParaGlob::Monde()->rank() != 0) + return ; + #endif + Ddl ddl2 = lesMail->NoeudIndice(inreaction,nbNoeud2,nbMaillage2,nb_casAssemb.n); int nbcar = ParaGlob::NbdigdoEC(); @@ -1158,6 +1197,12 @@ void Algori::InfoIncrementReac(LesMaillages * lesMail,int compteur, void Algori::InfoIncrementReac(LesMaillages * lesMail, int inreaction,double maxreaction,const Nb_assemb& nb_casAssemb) { int nbNoeud2,nbMaillage2; + #ifdef UTILISATION_MPI + // cas d'un calcul //, pour l'instant seule la (ou les) matrices du CPU 0 sont concernées + if (ParaGlob::Monde()->rank() != 0) + return ; + #endif + Ddl ddl2 = lesMail->NoeudIndice(inreaction,nbNoeud2,nbMaillage2,nb_casAssemb.n); int nbcar = ParaGlob::NbdigdoEC(); @@ -1184,7 +1229,14 @@ void Algori::InfoIncrementReac(LesMaillages * lesMail, void Algori::CalEnergieAffichage(const double& coef_mass,const Vecteur & V,const Mat_abstraite& mat_mass ,const Vecteur & delta_X,int icharge,bool brestart,const Vecteur & gamma ,const Vecteur & forces_vis_num) - { // -- le calcul est conditionnelle + { + #ifdef UTILISATION_MPI + // cas d'un calcul //, pour l'instant seule le CPU 0 est concerné + if (ParaGlob::Monde()->rank() != 0) + return ; + #endif + + // -- le calcul est conditionnelle if (icharge >= pa.NbIncrCalEnergie()) {int nbcar = ParaGlob::NbdigdoEC(); @@ -1464,14 +1516,48 @@ bool Algori::RaidSmEner(LesMaillages * lesMail,Assemblage& Ass,Vecteur & vglobin {vol_total2D_avec_plan_ref.Inita(Coordonnee(ParaGlob::Dimension())); }; + #ifdef UTILISATION_MPI + mpi::request reqs1; + mpi::request reqs2; + mpi::request reqs3; + bool premier_passage = true; + #endif // on gère les exceptions éventuelles en mettant le bloc sous surveillance try {// boucle sur les elements int nbMailMax = lesMail->NbMaillage(); + #ifndef UTILISATION_MPI + // cas d'un calcul mono CPU for (int nbMail =1; nbMail<= nbMailMax; nbMail++) {int nemax = lesMail->Nombre_element(nbMail); for (int ne=1; ne<= nemax;ne++) - { + { + #else + // cas d'un calcul multi-CPU + // on va parcourir les éléments associés au cpu + // on récupère la distribution d'éléments concernant le cpu en cours + const Tableau < list > tab_list_elem_cpu = distribution_CPU_algo.List_element_CPU_en_cours(); + // la taille est identique à nbMailMax, sauf si c'est le cpu 0, là le tableau est vide et il n'y + // aura pas de boucle, (ou plutôt on sortira directement de la boucle + // le cas CPU 0 est traité à part + int nb_mail_distrib = tab_list_elem_cpu.Taille(); + for (int nbMail =1; nbMail<= nb_mail_distrib; nbMail++) + {const list & list_elem_cpu= tab_list_elem_cpu(nbMail); // pour simplifier + // on balaie les éléments nécessaires + list ::const_iterator il,ilfin=list_elem_cpu.end(); + for (il = list_elem_cpu.begin();il != ilfin;il++) + { int ne = (*il); + // on récupère un signal du process 0 + temps_attente.Mise_en_route_du_comptage(); // comptage cpu + if (premier_passage) {premier_passage = false;} + else // on attend que les transferts soient finis + {reqs1.wait(); + reqs2.wait(); + reqs3.wait(); + }; + temps_attente.Arret_du_comptage(); // fin comptage cpu + + #endif //calcul de la raideur local et du residu local ElemMeca & el = *((ElemMeca*) &lesMail->Element_LesMaille(nbMail,ne)); // l'element Tableau& taN = el.Tab_noeud(); // tableau de noeuds de l'el @@ -1479,6 +1565,7 @@ bool Algori::RaidSmEner(LesMaillages * lesMail,Assemblage& Ass,Vecteur & vglobin temps_debut_metrique_K_SM = el.Temps_metrique_K_SM(); // init Element::ResRaid resu = el.Calcul_implicit(pa); + ////---- débug //{ //cout << "\n Algori::RaidSmEner debug : "; @@ -1494,7 +1581,8 @@ bool Algori::RaidSmEner(LesMaillages * lesMail,Assemblage& Ass,Vecteur & vglobin //if (!(resu.raid->Symetrie())) // resu.raid->AfficheNonSymetries(); //-- fin débug - + #ifndef UTILISATION_MPI + // --- assemblage et calcul de grandeur globale, pour mono-CPU // assemblage Ass.AssemSM (vglobin,*(resu.res),el.TableauDdl(),taN); // du second membre ////---debug--- @@ -1516,22 +1604,41 @@ bool Algori::RaidSmEner(LesMaillages * lesMail,Assemblage& Ass,Vecteur & vglobin P_bulk += el.Puissance_Bulk(); // globalisation des volumes volume_total_matiere += el.Volume(); + if (pa.CalVolTotalEntreSurfaceEtPlansRef()) + { const Coordonnee& volPlan = el.VolumePlan(); + if (volPlan.Dimension()) + vol_total2D_avec_plan_ref(nbMail) += volPlan; +//--- debug +// cout << "\n calcul des volumes balayés"; +// vol_total2D_avec_plan_ref.Affiche(); +// cout << "\n " << *(listeVarGlob["vol_total2D_avec_plan_yz"]) << " " << *(listeVarGlob["vol_total2D_avec_plan_xz"]) +// << " " << *(listeVarGlob["vol_total2D_avec_plan_xy"]) << endl; +// fin débug + }; + #else + // cas d'un calcul parallèle, et CPU != 0 + int num_process = ParaGlob::Monde()->rank(); + if (num_process != 0) + {tempsRaidSmEner.Arret_du_comptage(); + temps_transfert_court.Mise_en_route_du_comptage(); // comptage cpu + DeuxEntiers num_el_et_mail(el.Num_elt(),el.Num_maillage()); + // on transmet les numéros d'élément et de maillage + reqs1 = ParaGlob::Monde()->isend(0, 24, num_el_et_mail); + // puis on transmets le vecteur résidu + reqs2 = resu.res->Ienvoi_MPI(0,25); + //puis la matrice + reqs3 = resu.raid->Ienvoi_MPI(0, 26); + temps_transfert_court.Arret_du_comptage(); // fin comptage cpu + tempsRaidSmEner.Mise_en_route_du_comptage(); + }; + + #endif // globalisation des temps cpu loi de comp et métrique temps_lois_comportement += el.Temps_lois_comportement(); temps_lois_comportement -= temps_debut_lois_comportement; temps_metrique_K_SM += el.Temps_metrique_K_SM(); temps_metrique_K_SM -= temps_debut_metrique_K_SM; - if (pa.CalVolTotalEntreSurfaceEtPlansRef()) - { const Coordonnee& volPlan = el.VolumePlan(); - if (volPlan.Dimension()) - vol_total2D_avec_plan_ref(nbMail) += volPlan; -//--- debug -// cout << "\n calcul des volumes balayés"; -// vol_total2D_avec_plan_ref.Affiche(); -// cout << "\n " << *(listeVarGlob["vol_total2D_avec_plan_yz"]) << " " << *(listeVarGlob["vol_total2D_avec_plan_xz"]) -// << " " << *(listeVarGlob["vol_total2D_avec_plan_xy"]) << endl; -// fin débug - }; + ////--- debug //{ //cout << "\n Algori::RaidSmEner debug : "; @@ -1614,8 +1721,64 @@ bool Algori::RaidSmEner(LesMaillages * lesMail,Assemblage& Ass,Vecteur & vglobin // --- debug ------- essai ---- // cout << "\temps cpu raid SM energ " << tempsRaidSmEner; // --- fin debug ------- essai ---- - - + #ifdef UTILISATION_MPI + if (ParaGlob::Monde()->rank() == 0) + { tempsRaidSmEner.Mise_en_route_du_comptage(); // comptage cpu + // récup du nombre total d'éléments, cumul sur tous les maillages + int total_elem = distribution_CPU_algo.NB_total_element(); + // on va boucler sur les éléments récupérés des différents process + // jusqu'au nombre maxi d'élément + int nb_elem_deja_calcule = 0; // init + while (nb_elem_deja_calcule < total_elem) + { // on récupère un résultat de calcul + temps_transfert_court.Mise_en_route_du_comptage(); // comptage cpu + DeuxEntiers num_el_et_mail; + mpi::request reqs1 = ParaGlob::Monde()->irecv(mpi::any_source, 24, num_el_et_mail); + temps_transfert_court.Arret_du_comptage(); // fin comptage cpu + temps_attente.Mise_en_route_du_comptage(); // comptage cpu + mpi::status stat = reqs1.wait(); // on attend que le conteneur soit rempli + temps_attente.Arret_du_comptage(); // fin comptage cpu + int ne = num_el_et_mail.un; // numero d'identification de l'element + int nbMail = num_el_et_mail.deux; // numéro de maillage + // d'où l'élément + ElemMeca & el = *((ElemMeca*) &lesMail->Element_LesMaille(nbMail,ne)); + // récupération des conteneurs ad hoc vecteur et raideur + int source = stat.source(); // récupération du numéro de la source + Vecteur * residu = el.Conteneur_Residu(); + temps_transfert_court.Mise_en_route_du_comptage(); // comptage cpu + mpi::request reqs2 = residu->Irecup_MPI(source, 25); + Mat_pleine* raideur = el.Conteneur_raideur(); + mpi::request reqs3 = raideur->Irecup_MPI(source, 26); + temps_transfert_court.Arret_du_comptage(); // fin comptage cpu + + temps_attente.Mise_en_route_du_comptage(); // comptage cpu + reqs2.wait(); // on attend que le conteneur soit rempli + reqs3.wait(); // on attend que le conteneur soit rempli + temps_attente.Arret_du_comptage(); // fin comptage cpu + + Tableau& taN = el.Tab_noeud(); // tableau de noeuds de l'el + // --- assemblage + Ass.AssemSM (vglobin,*residu,el.TableauDdl(),taN); // du second membre + if (pa.Symetrie_matrice()) + Ass.AssembMatSym (matglob,*raideur,el.TableauDdl(),taN); // de la raideur + else + Ass.AssembMatnonSym (matglob,*raideur,el.TableauDdl(),taN); // de la raideur + // on incrémente le nombre d'élément traité + nb_elem_deja_calcule++; + }; + tempsRaidSmEner.Arret_du_comptage(); // fin comptage cpu + } +// else +// {// on récupère le dernier signal du process 0 +//// std::string msg; +//// ParaGlob::Monde()->recv(0, 12, msg); +// // synchronisation ici de tous les process +// ParaGlob::Monde()->barrier(); +// }; + // synchronisation ici de tous les process +// ParaGlob::Monde()->barrier(); + + #endif // retour indiquant que tout c'est bien passé return true ; }; @@ -1771,7 +1934,7 @@ bool Algori::RaidSmEnerContact(LesContacts * lesCont,Assemblage& Ass,Vecteur & v for (il=listElContact.begin();il != ilfin; il++) { ////------ debug -// cout << "\n Algori::RaidSmEnerContact "; +// cout << "\n debug Algori::RaidSmEnerContact "; //// ------ fin debug if ((*il).Actif()) // on n'intervient que si le contact est actif { //calcul de la raideur locale et du residu local @@ -1825,7 +1988,12 @@ bool Algori::RaidSmEnerContact(LesContacts * lesCont,Assemblage& Ass,Vecteur & v }; } // affichage éventuelle de la matrice de raideur et du second membre - if (ParaGlob::NiveauImpression() >= 10) +//------ debug +// cout << "\n debug Algori::RaidSmEnerContact "; +// string entete = " affichage du second membre uniquement du au contact "; +// vglobin.Affichage_ecran(entete); +// ------ fin debug + if (ParaGlob::NiveauImpression() >= 10) { string entete = " affichage de la matrice de raideur (puissance interne) apres le contact "; matglob.Affichage_ecran(entete); entete = " affichage du second membre uniquement du au contact "; @@ -1966,18 +2134,30 @@ Tableau Algori::Choix_matriciel if (tab_enu_preconditionnement.Taille() >= (inum_mat-1)) enumPreconditionnement = tab_enu_preconditionnement(inum_mat-1); }; + int nbddl_MPI = nbddl; // init + bool cal_parallele_et_rang_non_nul = false; + #ifdef UTILISATION_MPI + // cas d'un calcul //, seule la matrice du CPU 0 est initialisée + // à la taille nécessaire pour une résolution globale + // pour les autres CPU on définit une matrice de taille unitaire + // qui ne sera pas utilisée mais qui sera valide + if (ParaGlob::Monde()->rank() != 0) + {nbddl_MPI = 1; + cal_parallele_et_rang_non_nul = true; + }; + #endif switch (enumatrice) { case CARREE : case RECTANGLE : // ici comme les tailles sont identiques rectangle // et CARRE -> même traitement {// cas s'une matrice carrée if (tab_matglob(inum_mat) == NULL) - {tab_matglob(inum_mat) = new Mat_pleine (nbddl,nbddl);} + {tab_matglob(inum_mat) = new Mat_pleine (nbddl_MPI,nbddl_MPI);} // sinon on regarde si la taille est bonne - else if ((tab_matglob(inum_mat)->Nb_ligne()!= nbddl) || (tab_matglob(inum_mat)->Nb_colonne()!= nbddl)) + else if ((tab_matglob(inum_mat)->Nb_ligne()!= nbddl_MPI) || (tab_matglob(inum_mat)->Nb_colonne()!= nbddl_MPI)) // dans ce cas on change de matrice { delete tab_matglob(inum_mat); - tab_matglob(inum_mat) = new Mat_pleine (nbddl,nbddl); + tab_matglob(inum_mat) = new Mat_pleine (nbddl_MPI,nbddl_MPI); }; tab_matglob(inum_mat)->Change_Choix_resolution (enumResolutionMatri,enumPreconditionnement); @@ -1987,14 +2167,14 @@ Tableau Algori::Choix_matriciel case CARREE_LAPACK : {// cas s'une matrice carrée a priori quelconque if (tab_matglob(inum_mat) == NULL) - {tab_matglob(inum_mat) = new MatLapack (nbddl,nbddl,false,0. + {tab_matglob(inum_mat) = new MatLapack (nbddl_MPI,nbddl_MPI,false,0. ,enumResolutionMatri,enumPreconditionnement); } // sinon on regarde si la taille est bonne - else if ((tab_matglob(inum_mat)->Nb_ligne()!= nbddl) || (tab_matglob(inum_mat)->Nb_colonne()!= nbddl)) + else if ((tab_matglob(inum_mat)->Nb_ligne()!= nbddl_MPI) || (tab_matglob(inum_mat)->Nb_colonne()!= nbddl_MPI)) // dans ce cas on change de matrice { delete tab_matglob(inum_mat); - tab_matglob(inum_mat) = new MatLapack (nbddl,nbddl,false,0. + tab_matglob(inum_mat) = new MatLapack (nbddl_MPI,nbddl_MPI,false,0. ,enumResolutionMatri,enumPreconditionnement); }; // sinon il n'y a rien n'a faire au niveau des tailles @@ -2004,14 +2184,14 @@ Tableau Algori::Choix_matriciel {// cas s'une matrice carrée symétrique bool symetrique = true; if (tab_matglob(inum_mat) == NULL) - {tab_matglob(inum_mat) = new MatLapack (nbddl,nbddl,symetrique,0. + {tab_matglob(inum_mat) = new MatLapack (nbddl_MPI,nbddl_MPI,symetrique,0. ,enumResolutionMatri,enumPreconditionnement); } // sinon on regarde si la taille est bonne - else if ((tab_matglob(inum_mat)->Nb_ligne()!= nbddl) || (tab_matglob(inum_mat)->Nb_colonne()!= nbddl)) + else if ((tab_matglob(inum_mat)->Nb_ligne()!= nbddl_MPI) || (tab_matglob(inum_mat)->Nb_colonne()!= nbddl_MPI)) // dans ce cas on change de matrice { delete tab_matglob(inum_mat); - tab_matglob(inum_mat) = new MatLapack (nbddl,nbddl,symetrique,0. + tab_matglob(inum_mat) = new MatLapack (nbddl_MPI,nbddl_MPI,symetrique,0. ,enumResolutionMatri,enumPreconditionnement); }; // sinon il n'y a rien n'a faire au niveau des tailles @@ -2020,14 +2200,14 @@ Tableau Algori::Choix_matriciel case RECTANGLE_LAPACK : {// cas s'une matrice rectangulaire if (tab_matglob(inum_mat) == NULL) - {tab_matglob(inum_mat) = new MatLapack (nbddl,nbddl,false,0. + {tab_matglob(inum_mat) = new MatLapack (nbddl_MPI,nbddl_MPI,false,0. ,enumResolutionMatri,enumPreconditionnement); } // sinon on regarde si la taille est bonne - else if ((tab_matglob(inum_mat)->Nb_ligne()!= nbddl) || (tab_matglob(inum_mat)->Nb_colonne()!= nbddl)) + else if ((tab_matglob(inum_mat)->Nb_ligne()!= nbddl_MPI) || (tab_matglob(inum_mat)->Nb_colonne()!= nbddl_MPI)) // dans ce cas on change de matrice { delete tab_matglob(inum_mat); - tab_matglob(inum_mat) = new MatLapack (nbddl,nbddl,false,0. + tab_matglob(inum_mat) = new MatLapack (nbddl_MPI,nbddl_MPI,false,0. ,enumResolutionMatri,enumPreconditionnement); }; // sinon il n'y a rien n'a faire au niveau des tailles @@ -2037,8 +2217,8 @@ Tableau Algori::Choix_matriciel { // calcul de la largeur de bande effective int demi=0,total=0; lesMail->Largeur_Bande(demi,total,nb_casAssemb); - total = std::min(total,nbddl); - demi = std::min(demi,nbddl); + total = std::min(total,nbddl_MPI); + demi = std::min(demi,nbddl_MPI); // --- on stocke les largeurs initiales de ddl { // on redimensionne si nécessaire int nombre_cas_assemb = tab_para_stockage.Taille(); @@ -2050,64 +2230,70 @@ Tableau Algori::Choix_matriciel parstock.demi = demi; parstock.total = total; }; - if (ParaGlob::NiveauImpression() >= 5) - cout << "\n raideur: largeur de bande initiale pour les elements (en ddl) " << total << " "; - if (lescontacts!= NULL) - {// calcul de la largeur de bande effective en tenant compte du contact - int demic=0,totalc=0,cumule=0; - // on n'intervient que si la largeur en noeud augmente - if (lescontacts->Largeur_Bande(demic,totalc,nb_casAssemb,cumule)) - {totalc = std::min(totalc,nbddl); - demic = std::min(demic,nbddl); - cumule = std::min(cumule,nbddl); - if (ParaGlob::NiveauImpression() >= 5) - cout << "\n augmentation de la largeur de bande pour les conditions de contact (en ddl) " << cumule << " "; - demi += cumule; // c'est donc toute la largeur hors diag que l'on ajoute - total += 2 * cumule; - // on limite au nombres total de ddl - total = std::min(total,nbddl); - demi = std::min(demi,nbddl); - } - }; - // cas de l'influence des conditions linéaires d'entrée - int demic=0,totalc=0,cumule=0; - // on n'intervient que si la largeur en noeud augmente - if (lesCondLim->Largeur_Bande(demic,totalc,nb_casAssemb,lesMail,lesRef,cumule)) - {totalc = std::min(totalc,nbddl); - demic = std::min(demic,nbddl); - cumule = std::min(cumule,nbddl); - if (ParaGlob::NiveauImpression() >= 5) - cout << "\n augmentation de la largeur de bande pour les conditions lineaires (en ddl) " << cumule << " "; - // ---- les deux lignes qui suivent sont fausses, car dans le cas du produit de deux matrices bandes la largeur de bande du produit - // = non pas le max, mais la "somme" des deux largeurs de bandes (parties hors diagonales), - // d'une manière plus précise cf. J Chevalier 1993, soit une matrice bande avec deux bandes de part et autre de la diagonale, différentes - // A_ij (a,b) telle que A_ij = 0 si ji+b, donc a est la bande inf (hors diag) et b est la bande sup (hors diag) - // soient A(a,b) et B(c,d) alors A*B est de type (a+B,b+d) - // or pour mettre en place les CL (actuellement) - // on utilise une matrice de rotation et on fait S^T * K * S , tel S est de type (a,b) et donc S^T est de type (b,a) donc - // si on suppose que K est de type (l,l) et bien S^T * K * S sera de type (l+a+b,l+a+b) donc c'est a+b qui compte (hors diag) - - // demi = MaX(demi,demic); - // total = MaX(total,totalc); - demi += cumule; // c'est donc toute la largeur hors diag que l'on ajoute - total += 2 * cumule; - // on limite au nombres total de ddl - total = std::min(total,nbddl); - demi = std::min(demi,nbddl); - }; + + // dans le cas non // ou // pour le CPU 0, on précise la dim + // ici on garde nbddl au lien de nbddl_MPI: ils sont identiques + if (!cal_parallele_et_rang_non_nul) + { if (ParaGlob::NiveauImpression() >= 5) + cout << "\n raideur: largeur de bande initiale pour les elements (en ddl) " << total << " "; + if (lescontacts!= NULL) + {// calcul de la largeur de bande effective en tenant compte du contact + int demic=0,totalc=0,cumule=0; + // on n'intervient que si la largeur en noeud augmente + if (lescontacts->Largeur_Bande(demic,totalc,nb_casAssemb,cumule)) + {totalc = std::min(totalc,nbddl); + demic = std::min(demic,nbddl); + cumule = std::min(cumule,nbddl); + if (ParaGlob::NiveauImpression() >= 5) + cout << "\n augmentation de la largeur de bande pour les conditions de contact (en ddl) " << cumule << " "; + demi += cumule; // c'est donc toute la largeur hors diag que l'on ajoute + total += 2 * cumule; + // on limite au nombres total de ddl + total = std::min(total,nbddl); + demi = std::min(demi,nbddl); + } + }; + // cas de l'influence des conditions linéaires d'entrée + int demic=0,totalc=0,cumule=0; + // on n'intervient que si la largeur en noeud augmente + if (lesCondLim->Largeur_Bande(demic,totalc,nb_casAssemb,lesMail,lesRef,cumule)) + {totalc = std::min(totalc,nbddl); + demic = std::min(demic,nbddl); + cumule = std::min(cumule,nbddl); + if (ParaGlob::NiveauImpression() >= 5) + cout << "\n augmentation de la largeur de bande pour les conditions lineaires (en ddl) " << cumule << " "; + // ---- les deux lignes qui suivent sont fausses, car dans le cas du produit de deux matrices bandes la largeur de bande du produit + // = non pas le max, mais la "somme" des deux largeurs de bandes (parties hors diagonales), + // d'une manière plus précise cf. J Chevalier 1993, soit une matrice bande avec deux bandes de part et autre de la diagonale, différentes + // A_ij (a,b) telle que A_ij = 0 si ji+b, donc a est la bande inf (hors diag) et b est la bande sup (hors diag) + // soient A(a,b) et B(c,d) alors A*B est de type (a+B,b+d) + // or pour mettre en place les CL (actuellement) + // on utilise une matrice de rotation et on fait S^T * K * S , tel S est de type (a,b) et donc S^T est de type (b,a) donc + // si on suppose que K est de type (l,l) et bien S^T * K * S sera de type (l+a+b,l+a+b) donc c'est a+b qui compte (hors diag) + + // demi = MaX(demi,demic); + // total = MaX(total,totalc); + demi += cumule; // c'est donc toute la largeur hors diag que l'on ajoute + total += 2 * cumule; + // on limite au nombres total de ddl + total = std::min(total,nbddl); + demi = std::min(demi,nbddl); + }; - if (ParaGlob::NiveauImpression() >= 5) - cout << "\n largeur de bande finale (en ddl) " << total << " " - << "\n stockage symetrique d'ou utilisation de la demi largeur= " << demi << " "; + if (ParaGlob::NiveauImpression() >= 5) + cout << "\n largeur de bande finale (en ddl) " << total << " " + << "\n stockage symetrique d'ou utilisation de la demi largeur= " << demi << " "; + }; + // création éventuelle et initialisation a zero if (tab_matglob(inum_mat) == NULL) - {tab_matglob(inum_mat) = new MatBand (BANDE_SYMETRIQUE,demi,nbddl,0); + {tab_matglob(inum_mat) = new MatBand (BANDE_SYMETRIQUE,demi,nbddl_MPI,0); } // sinon on regarde si la taille est bonne - else if ((tab_matglob(inum_mat)->Nb_ligne()!= nbddl) || (tab_matglob(inum_mat)->Nb_colonne()!= nbddl)) + else if ((tab_matglob(inum_mat)->Nb_ligne()!= nbddl_MPI) || (tab_matglob(inum_mat)->Nb_colonne()!= nbddl_MPI)) // dans ce cas on change de matrice { delete tab_matglob(inum_mat); - tab_matglob(inum_mat) = new MatBand (BANDE_SYMETRIQUE,demi,nbddl,0); + tab_matglob(inum_mat) = new MatBand (BANDE_SYMETRIQUE,demi,nbddl_MPI,0); } else // sinon on se contente d'initialiser à 0. tab_matglob(inum_mat)->Initialise(0.); @@ -2131,8 +2317,8 @@ Tableau Algori::Choix_matriciel { // calcul de la largeur de bande effective int demi=0,total=0; lesMail->Largeur_Bande(demi,total,nb_casAssemb); - total = std::min(total,2*nbddl-1); - demi = std::min(demi,nbddl); + total = std::min(total,2*nbddl_MPI-1); + demi = std::min(demi,nbddl_MPI); // --- on stocke les largeurs initiales de ddl { // on redimensionne si nécessaire int nombre_cas_assemb = tab_para_stockage.Taille(); @@ -2144,71 +2330,77 @@ Tableau Algori::Choix_matriciel parstock.demi = demi; parstock.total = total; }; - if (ParaGlob::NiveauImpression() >= 5) - cout << "\n raideur: largeur de bande initiale pour les elements (en ddl) " << total << " "; - if (lescontacts!= NULL) - {// calcul de la largeur de bande effective en tenant compte du contact - int demic=0,totalc=0,cumule=0; - // on n'intervient que si la largeur en noeud augmente - if (lescontacts->Largeur_Bande(demic,totalc,nb_casAssemb,cumule)) - {totalc = std::min(totalc,2*nbddl-1); - demic = std::min(demic,nbddl); - cumule = std::min(cumule,nbddl); - if (ParaGlob::NiveauImpression() >= 5) - cout << "\n augmentation de la largeur de bande pour les conditions de contact (en ddl) " << cumule << " "; - demi += cumule; // c'est donc toute la largeur hors diag que l'on ajoute - total += 2 * cumule; - // on limite au nombres total de ddl - total = std::min(total,2*nbddl-1); - demi = std::min(demi,nbddl); - }; - }; - // cas de l'influence des conditions linéaires d'entrée - int demic=0,totalc=0,cumule=0; - // on n'intervient que si la largeur en noeud augmente - if (lesCondLim->Largeur_Bande(demic,totalc,nb_casAssemb,lesMail,lesRef,cumule)) - {totalc = std::min(totalc,2*nbddl-1); - demic = std::min(demic,nbddl); - cumule = std::min(cumule,nbddl); - if (ParaGlob::NiveauImpression() >= 5) - cout << "\n augmentation de largeur de bande pour les conditions lineaires (en ddl) " << totalc << " "; - // ---- les deux lignes qui suivent sont faussent, car dans le cas du produit de deux matrices bandes la largeur de bande du produit - // = non pas le max, mais la "somme" des deux largeurs de bandes (parties hors diagonales), - // d'une manière plus précise cf. J Chevalier 1993, soit une matrice bande avec deux bandes de part et autre de la diagonale, différentes - // A_ij (a,b) telle que A_ij = 0 si ji+b, donc a est la bande inf (hors diag) et b est la bande sup (hors diag) - // soient A(a,b) et B(c,d) alors A*B est de type (a+c,b+d) - // or pour mettre en place les CL (actuellement) - // on utilise une matrice de rotation et on fait S^T * K * S , tel S est de type (a,b) et donc S^T est de type (b,a) donc - // si on suppose que K est de type (l,l) et bien S^T * K * S sera de type (l+a+b,l+a+b) donc c'est a+b qui compte (hors diag) - - // demi = MaX(demi,demic); - // total = MaX(total,totalc); - demi += cumule; // c'est donc toute la largeur hors diag que l'on ajoute - total += 2 * cumule; - // on limite au nombres total de ddl - total = std::min(total,2*nbddl-1); - demi = std::min(demi,nbddl); - }; - if (ParaGlob::NiveauImpression() >= 5) - cout << "\n largeur de bande finale (en ddl) " << total << " "; + + // dans le cas non // ou // pour le CPU 0, on précise la dim + // ici on garde nbddl au lien de nbddl_MPI: ils sont identiques + if (!cal_parallele_et_rang_non_nul) + {if (ParaGlob::NiveauImpression() >= 5) + cout << "\n raideur: largeur de bande initiale pour les elements (en ddl) " << total << " "; + if (lescontacts!= NULL) + {// calcul de la largeur de bande effective en tenant compte du contact + int demic=0,totalc=0,cumule=0; + // on n'intervient que si la largeur en noeud augmente + if (lescontacts->Largeur_Bande(demic,totalc,nb_casAssemb,cumule)) + {totalc = std::min(totalc,2*nbddl-1); + demic = std::min(demic,nbddl); + cumule = std::min(cumule,nbddl); + if (ParaGlob::NiveauImpression() >= 5) + cout << "\n augmentation de la largeur de bande pour les conditions de contact (en ddl) " << cumule << " "; + demi += cumule; // c'est donc toute la largeur hors diag que l'on ajoute + total += 2 * cumule; + // on limite au nombres total de ddl + total = std::min(total,2*nbddl-1); + demi = std::min(demi,nbddl); + }; + }; + // cas de l'influence des conditions linéaires d'entrée + int demic=0,totalc=0,cumule=0; + // on n'intervient que si la largeur en noeud augmente + if (lesCondLim->Largeur_Bande(demic,totalc,nb_casAssemb,lesMail,lesRef,cumule)) + {totalc = std::min(totalc,2*nbddl-1); + demic = std::min(demic,nbddl); + cumule = std::min(cumule,nbddl); + if (ParaGlob::NiveauImpression() >= 5) + cout << "\n augmentation de largeur de bande pour les conditions lineaires (en ddl) " << totalc << " "; + // ---- les deux lignes qui suivent sont faussent, car dans le cas du produit de deux matrices bandes la largeur de bande du produit + // = non pas le max, mais la "somme" des deux largeurs de bandes (parties hors diagonales), + // d'une manière plus précise cf. J Chevalier 1993, soit une matrice bande avec deux bandes de part et autre de la diagonale, différentes + // A_ij (a,b) telle que A_ij = 0 si ji+b, donc a est la bande inf (hors diag) et b est la bande sup (hors diag) + // soient A(a,b) et B(c,d) alors A*B est de type (a+c,b+d) + // or pour mettre en place les CL (actuellement) + // on utilise une matrice de rotation et on fait S^T * K * S , tel S est de type (a,b) et donc S^T est de type (b,a) donc + // si on suppose que K est de type (l,l) et bien S^T * K * S sera de type (l+a+b,l+a+b) donc c'est a+b qui compte (hors diag) + + // demi = MaX(demi,demic); + // total = MaX(total,totalc); + demi += cumule; // c'est donc toute la largeur hors diag que l'on ajoute + total += 2 * cumule; + // on limite au nombres total de ddl + total = std::min(total,2*nbddl-1); + demi = std::min(demi,nbddl); + }; + if (ParaGlob::NiveauImpression() >= 5) + cout << "\n largeur de bande finale (en ddl) " << total << " "; + }; + // création éventuelle et initialisation a zero if (tab_matglob(inum_mat) == NULL) { if (enumatrice == BANDE_SYMETRIQUE_LAPACK) - { tab_matglob(inum_mat) = new MatLapack (enumatrice,demi,nbddl,true,0.0 + { tab_matglob(inum_mat) = new MatLapack (enumatrice,demi,nbddl_MPI,true,0.0 ,enumResolutionMatri,enumPreconditionnement);} else - { tab_matglob(inum_mat) = new MatLapack (enumatrice,total,nbddl,false,0.0 + { tab_matglob(inum_mat) = new MatLapack (enumatrice,total,nbddl_MPI,false,0.0 ,enumResolutionMatri,enumPreconditionnement);}; } // sinon on regarde si la taille est bonne - else if ((tab_matglob(inum_mat)->Nb_ligne()!= nbddl) || (tab_matglob(inum_mat)->Nb_colonne()!= nbddl)) + else if ((tab_matglob(inum_mat)->Nb_ligne()!= nbddl_MPI) || (tab_matglob(inum_mat)->Nb_colonne()!= nbddl_MPI)) // dans ce cas on change de matrice { delete tab_matglob(inum_mat); if (enumatrice == BANDE_SYMETRIQUE_LAPACK) - { tab_matglob(inum_mat) = new MatLapack (enumatrice,demi,nbddl,true,0.0 + { tab_matglob(inum_mat) = new MatLapack (enumatrice,demi,nbddl_MPI,true,0.0 ,enumResolutionMatri,enumPreconditionnement);} else - { tab_matglob(inum_mat) = new MatLapack (enumatrice,total,nbddl,false,0.0 + { tab_matglob(inum_mat) = new MatLapack (enumatrice,total,nbddl_MPI,false,0.0 ,enumResolutionMatri,enumPreconditionnement);}; } else // sinon on se contente d'initialiser à 0. @@ -2259,13 +2451,13 @@ Tableau Algori::Choix_matriciel }; // puis on définit la matrice en conséquence if (tab_matglob(inum_mat) == NULL) - {tab_matglob(inum_mat) = new Mat_creuse_CompCol(nbddl,nbddl, petites_matrices); + {tab_matglob(inum_mat) = new Mat_creuse_CompCol(nbddl_MPI,nbddl_MPI, petites_matrices); } // sinon on regarde si la taille est bonne - else if ((tab_matglob(inum_mat)->Nb_ligne()!= nbddl) || (tab_matglob(inum_mat)->Nb_colonne()!= nbddl)) + else if ((tab_matglob(inum_mat)->Nb_ligne()!= nbddl_MPI) || (tab_matglob(inum_mat)->Nb_colonne()!= nbddl_MPI)) // dans ce cas on change de matrice { delete tab_matglob(inum_mat); - tab_matglob(inum_mat) = new Mat_creuse_CompCol(nbddl,nbddl, petites_matrices); + tab_matglob(inum_mat) = new Mat_creuse_CompCol(nbddl_MPI,nbddl_MPI, petites_matrices); }; // on spécifie le type de résolution tab_matglob(inum_mat)->Change_Choix_resolution @@ -2308,12 +2500,16 @@ Tableau Algori::Choix_matriciel // nouvelle_largeur_imposee.deux = la demie largeur // nouvelles_largeur_en_ddl.trois = la demie largeur maximale pour la partie éléments finis // uniquement (sans les CLL) -Tableau Algori::Mise_a_jour_Choix_matriciel_contact +void Algori::Mise_a_jour_Choix_matriciel_contact (Tableau & tab_matglob,const Nb_assemb& nb_casAssemb , LesContacts* lescontacts ,int niveau_substitution ,TroisEntiers* nouvelle_largeur_imposee) { - + #ifdef UTILISATION_MPI + // cas d'un calcul //, seule la (ou les) matrices du CPU 0 sont concernées + if (ParaGlob::Monde()->rank() != 0) + return ; + #endif // tout d'abord le choix de la matrice de stockage Tableau tab_enu_matrice_sec; // init @@ -2534,8 +2730,6 @@ Tableau Algori::Mise_a_jour_Choix_matriciel_contact cout << "\n stockage raideur " << enumatrice << " taille (entiers) :" << matglob->Place() << endl; }; - - return tab_matglob; }; // choix de la matrice de la matrice de masse globale @@ -2544,15 +2738,18 @@ Mat_abstraite* Algori::Choix_matrice_masse (int nbddl,Mat_abstraite* mat_mass,LesMaillages * lesMail,LesReferences* lesRef ,const Nb_assemb& nb_casAssemb,LesContacts* ,LesCondLim* lesCondLim) { -//// préparation pour le cas particulier : pa.ContactType() == 1 -// int contact_type_1_et_maitre_deformable = false; -// if (pa.ContactType() == 1) -// {// on veut savoir s'il y a des contacts autres que solide-déformables -// if (lescontacts->Maitres_avec_deplacement_imposer()) -// // cas où tous les surfaces maîtres sont fixées -// {contact_type_1_et_maitre_deformable = true;}; -// // dans ce cas on peut utiliser une tridiagonale ! -// }; + int nbddl_MPI = nbddl; // init + bool cal_parallele_et_rang_non_nul = false; + #ifdef UTILISATION_MPI + // cas d'un calcul //, seule la matrice du CPU 0 est initialisée + // à la taille nécessaire pour une résolution globale + // pour les autres CPU on définit une matrice de taille unitaire + // qui ne sera pas utilisée mais qui sera valide + if (ParaGlob::Monde()->rank() != 0) + {nbddl_MPI = 1; + cal_parallele_et_rang_non_nul = true; + }; + #endif // tout d'abord le choix de la matrice de stockage // s'il n'y a pas de condition linéaires classiques, la largeur de bande ne doit pas changer @@ -2563,18 +2760,18 @@ Mat_abstraite* Algori::Choix_matrice_masse ) { // on utilise une matrice diagonale if (mat_mass == NULL) - { mat_mass = new MatDiag (nbddl); - if (ParaGlob::NiveauImpression() > 2) - cout << "\n stockage initial matrice masse --> diagonal, nbddl= " << nbddl ; + { mat_mass = new MatDiag (nbddl_MPI); + if ((ParaGlob::NiveauImpression() > 2)&&(!cal_parallele_et_rang_non_nul)) + cout << "\n stockage initial matrice masse --> diagonal, nbddl= " << nbddl_MPI ; } else // sinon on redimentionne ou on change si nécessaire { if (mat_mass->Type_matrice() != DIAGONALE) - { delete mat_mass; mat_mass = new MatDiag (nbddl);} // cas où on change de matrice + { delete mat_mass; mat_mass = new MatDiag (nbddl_MPI);} // cas où on change de matrice else { MatDiag * mat_mass_diag = (MatDiag*) mat_mass; // cas où on redimentionne la matrice - mat_mass_diag->Change_taille(nbddl); + mat_mass_diag->Change_taille(nbddl_MPI); }; - if (ParaGlob::NiveauImpression() > 2) - cout << "\n changement stockage matrice masse --> diagonal, nbddl= " << nbddl ; + if ((ParaGlob::NiveauImpression() > 2)&&(!cal_parallele_et_rang_non_nul)) + cout << "\n changement stockage matrice masse --> diagonal, nbddl= " << nbddl_MPI ; }; // --- on stocke les largeurs initiales de ddl // on redimensionne si nécessaire @@ -2614,7 +2811,10 @@ Mat_abstraite* Algori::Choix_matrice_masse int demic=0,totalc=0,cumule=0; int demi=0,total=0; // on n'intervient que si la largeur en noeud augmente - if (lesCondLim->Largeur_Bande(demic,totalc,nb_casAssemb,lesMail,lesRef,cumule)) + // et que l'on est sur le CPU 0 + if ( (lesCondLim->Largeur_Bande(demic,totalc,nb_casAssemb,lesMail,lesRef,cumule)) + && (!cal_parallele_et_rang_non_nul) + ) { demi = 1 + cumule; // c'est donc toute la largeur hors diag que l'on ajoute total = 1 + 2 * cumule; } @@ -2624,8 +2824,8 @@ Mat_abstraite* Algori::Choix_matrice_masse total = 1 + 2 * (dim_espace-1); }; // on limite au nombres total de ddl - total = std::min(total,nbddl); - demi = std::min(demi,nbddl); + total = std::min(total,nbddl_MPI); + demi = std::min(demi,nbddl_MPI); // si la matrice actuelle est de type diagonale il faut la supprimer et définir une // matrice bande bool change_stockage = false; @@ -2638,10 +2838,10 @@ Mat_abstraite* Algori::Choix_matrice_masse { case CARREE : {// cas d'une matrice carrée, là a priori on n'a pas besoin d'augmenter la largeur, on est au maxi if (mat_mass == NULL) - { mat_mass = new Mat_pleine (nbddl,nbddl);} + { mat_mass = new Mat_pleine (nbddl_MPI,nbddl_MPI);} else // sinon on redimentionne ou on change si nécessaire { Mat_pleine * mat_mass_d = (Mat_pleine*) mat_mass; // cas où on redimentionne la matrice - mat_mass_d->Initialise (nbddl,nbddl,0.); + mat_mass_d->Initialise (nbddl_MPI,nbddl_MPI,0.); }; break; } @@ -2649,50 +2849,50 @@ Mat_abstraite* Algori::Choix_matrice_masse {// cas s'une matrice rectangulaire, pour l'instant idem que le cas précédent // car pour l'instant on ne voit pas très bien à quoi cela servirait d'être différent if (mat_mass == NULL) - { mat_mass = new Mat_pleine (nbddl,nbddl);} + { mat_mass = new Mat_pleine (nbddl_MPI,nbddl_MPI);} else // sinon on redimentionne ou on change si nécessaire { Mat_pleine * mat_mass_d = (Mat_pleine*) mat_mass; // cas où on redimentionne la matrice - mat_mass_d->Initialise (nbddl,nbddl,0.); + mat_mass_d->Initialise (nbddl_MPI,nbddl_MPI,0.); }; break; } case CARREE_LAPACK : {// cas s'une matrice carrée if (mat_mass == NULL) - { mat_mass = new MatLapack (nbddl,nbddl,false,0.,pa.Type_resolution(),pa.Type_preconditionnement());} + { mat_mass = new MatLapack (nbddl_MPI,nbddl_MPI,false,0.,pa.Type_resolution(),pa.Type_preconditionnement());} else // sinon on redimentionne ou on change si nécessaire { MatLapack * mat_mass_d = (MatLapack*) mat_mass; // cas où on redimentionne la matrice - mat_mass_d->Change_taille(nbddl,nbddl,0.); + mat_mass_d->Change_taille(nbddl_MPI,nbddl_MPI,0.); }; break; } case CARREE_SYMETRIQUE_LAPACK : {// cas s'une matrice carrée symétrique if (mat_mass == NULL) - { mat_mass = new MatLapack (nbddl,nbddl,true,0.,pa.Type_resolution(),pa.Type_preconditionnement());} + { mat_mass = new MatLapack (nbddl_MPI,nbddl_MPI,true,0.,pa.Type_resolution(),pa.Type_preconditionnement());} else // sinon on redimentionne ou on change si nécessaire { MatLapack * mat_mass_d = (MatLapack*) mat_mass; // cas où on redimentionne la matrice - mat_mass_d->Change_taille(nbddl,nbddl,0.); + mat_mass_d->Change_taille(nbddl_MPI,nbddl_MPI,0.); }; break; } case RECTANGLE_LAPACK : {// cas s'une matrice rectangulaire, pour l'instant idem que le cas précédent if (mat_mass == NULL) - { mat_mass = new MatLapack (nbddl,nbddl,false,0.,pa.Type_resolution(),pa.Type_preconditionnement());} + { mat_mass = new MatLapack (nbddl_MPI,nbddl_MPI,false,0.,pa.Type_resolution(),pa.Type_preconditionnement());} else // sinon on redimentionne ou on change si nécessaire { MatLapack * mat_mass_d = (MatLapack*) mat_mass; // cas où on redimentionne la matrice - mat_mass_d->Change_taille(nbddl,nbddl,0.); + mat_mass_d->Change_taille(nbddl_MPI,nbddl_MPI,0.); }; break; } case BANDE_SYMETRIQUE : {// initialisation a zero if (mat_mass == NULL) - { mat_mass = new MatBand (BANDE_SYMETRIQUE,demi,nbddl,0);} + { mat_mass = new MatBand (BANDE_SYMETRIQUE,demi,nbddl_MPI,0);} else // sinon on redimentionne ou on change si nécessaire { MatBand * mat_mass_d = (MatBand*) mat_mass; // cas où on redimentionne la matrice - mat_mass_d->Change_taille(demi,nbddl); + mat_mass_d->Change_taille(demi,nbddl_MPI); mat_mass_d->Initialise (0.); }; break; @@ -2701,20 +2901,20 @@ Mat_abstraite* Algori::Choix_matrice_masse {// initialisation a zero if (pa.Type_Matrice() == BANDE_SYMETRIQUE_LAPACK) { if (mat_mass == NULL) - { mat_mass = new MatLapack(pa.Type_Matrice(),demi,nbddl,true,0.0 + { mat_mass = new MatLapack(pa.Type_Matrice(),demi,nbddl_MPI,true,0.0 ,pa.Type_resolution(),pa.Type_preconditionnement());} else // sinon on redimentionne si nécessaire { MatLapack * mat_mass_d = (MatLapack*) mat_mass; // cas où on redimentionne la matrice - mat_mass_d->Change_taille(demi,nbddl,0.0); + mat_mass_d->Change_taille(demi,nbddl_MPI,0.0); }; } else { if (mat_mass == NULL) - { mat_mass = new MatLapack(pa.Type_Matrice(),total,nbddl,false,0.0 + { mat_mass = new MatLapack(pa.Type_Matrice(),total,nbddl_MPI,false,0.0 ,pa.Type_resolution(),pa.Type_preconditionnement());} else // sinon on redimentionne si nécessaire { MatLapack * mat_mass_d = (MatLapack*) mat_mass; // cas où on redimentionne la matrice - mat_mass_d->Change_taille(total,nbddl,0.0); + mat_mass_d->Change_taille(total,nbddl_MPI,0.0); }; }; break; @@ -2728,12 +2928,12 @@ Mat_abstraite* Algori::Choix_matrice_masse // puis on définit la matrice en conséquence if (mat_mass == NULL) - { mat_mass = new Mat_creuse_CompCol(nbddl,nbddl, petites_matrices);} + { mat_mass = new Mat_creuse_CompCol(nbddl_MPI,nbddl_MPI, petites_matrices);} else // sinon on redimentionne ou on change si nécessaire { if (mat_mass->Type_matrice() != CREUSE_COMPRESSEE_COLONNE) - { delete mat_mass; mat_mass = new Mat_creuse_CompCol(nbddl,nbddl, petites_matrices);} // cas où on change de matrice + { delete mat_mass; mat_mass = new Mat_creuse_CompCol(nbddl_MPI,nbddl_MPI, petites_matrices);} // cas où on change de matrice else {Mat_creuse_CompCol * mat_mass_d = (Mat_creuse_CompCol*) mat_mass; // cas où on redimentionne la matrice - mat_mass_d->Change_taille(nbddl,nbddl, petites_matrices); + mat_mass_d->Change_taille(nbddl_MPI,nbddl_MPI, petites_matrices); }; }; // pour l'instant on ne prend pas en compte les conditions linéaires initiales qui augmente la largeur @@ -2763,7 +2963,7 @@ Mat_abstraite* Algori::Choix_matrice_masse if (tempsMiseAjourAlgo.Comptage_en_cours()) tempsMiseAjourAlgo.Arret_du_comptage(); Sortie(1); }; - if (ParaGlob::NiveauImpression() > 2) + if ((ParaGlob::NiveauImpression() > 2)&&(!cal_parallele_et_rang_non_nul)) { cout << "\n"; if (change_stockage) cout << " changement de "; cout << " stockage matrice masse -->" << Nom_matrice(mat_mass->Type_matrice()) << " nb_ligne= "<< mat_mass->Nb_ligne() <<" nb_col= "<< mat_mass->Nb_colonne() << endl; @@ -2776,10 +2976,10 @@ Mat_abstraite* Algori::Choix_matrice_masse { case CARREE : {// cas d'une matrice carrée, là a priori on n'a pas besoin d'augmenter la largeur, on est au maxi if (mat_mass == NULL) - { mat_mass = new Mat_pleine (nbddl,nbddl);} + { mat_mass = new Mat_pleine (nbddl_MPI,nbddl_MPI);} else // sinon on redimentionne ou on change si nécessaire { Mat_pleine * mat_mass_d = (Mat_pleine*) mat_mass; // cas où on redimentionne la matrice - mat_mass_d->Initialise (nbddl,nbddl,0.); + mat_mass_d->Initialise (nbddl_MPI,nbddl_MPI,0.); }; break; } @@ -2787,40 +2987,40 @@ Mat_abstraite* Algori::Choix_matrice_masse {// cas s'une matrice rectangulaire, pour l'instant idem que le cas précédent // car pour l'instant on ne voit pas très bien à quoi cela servirait d'être différent if (mat_mass == NULL) - { mat_mass = new Mat_pleine (nbddl,nbddl);} + { mat_mass = new Mat_pleine (nbddl_MPI,nbddl_MPI);} else // sinon on redimentionne ou on change si nécessaire { Mat_pleine * mat_mass_d = (Mat_pleine*) mat_mass; // cas où on redimentionne la matrice - mat_mass_d->Initialise (nbddl,nbddl,0.); + mat_mass_d->Initialise (nbddl_MPI,nbddl_MPI,0.); }; break; } case CARREE_LAPACK : {// cas s'une matrice carrée if (mat_mass == NULL) - { mat_mass = new MatLapack (nbddl,nbddl,false,0.,pa.Type_resolution(),pa.Type_preconditionnement());} + { mat_mass = new MatLapack (nbddl_MPI,nbddl_MPI,false,0.,pa.Type_resolution(),pa.Type_preconditionnement());} else // sinon on redimentionne ou on change si nécessaire { MatLapack * mat_mass_d = (MatLapack*) mat_mass; // cas où on redimentionne la matrice - mat_mass_d->Change_taille(nbddl,nbddl,0.); + mat_mass_d->Change_taille(nbddl_MPI,nbddl_MPI,0.); }; break; } case CARREE_SYMETRIQUE_LAPACK : {// cas s'une matrice carrée symétrique if (mat_mass == NULL) - { mat_mass = new MatLapack (nbddl,nbddl,true,0.,pa.Type_resolution(),pa.Type_preconditionnement());} + { mat_mass = new MatLapack (nbddl_MPI,nbddl_MPI,true,0.,pa.Type_resolution(),pa.Type_preconditionnement());} else // sinon on redimentionne ou on change si nécessaire { MatLapack * mat_mass_d = (MatLapack*) mat_mass; // cas où on redimentionne la matrice - mat_mass_d->Change_taille(nbddl,nbddl,0.); + mat_mass_d->Change_taille(nbddl_MPI,nbddl_MPI,0.); }; break; } case RECTANGLE_LAPACK : {// cas s'une matrice rectangulaire, pour l'instant idem que le cas précédent if (mat_mass == NULL) - { mat_mass = new MatLapack (nbddl,nbddl,false,0.,pa.Type_resolution(),pa.Type_preconditionnement());} + { mat_mass = new MatLapack (nbddl_MPI,nbddl_MPI,false,0.,pa.Type_resolution(),pa.Type_preconditionnement());} else // sinon on redimentionne ou on change si nécessaire { MatLapack * mat_mass_d = (MatLapack*) mat_mass; // cas où on redimentionne la matrice - mat_mass_d->Change_taille(nbddl,nbddl,0.); + mat_mass_d->Change_taille(nbddl_MPI,nbddl_MPI,0.); }; break; } @@ -2828,8 +3028,8 @@ Mat_abstraite* Algori::Choix_matrice_masse {// calcul de la largeur de bande effective int demi=0,total=0; lesMail->Largeur_Bande(demi,total,nb_casAssemb); - total = std::min(total,nbddl); - demi = std::min(demi,nbddl); + total = std::min(total,nbddl_MPI); + demi = std::min(demi,nbddl_MPI); // --- on stocke les largeurs initiales de ddl // on redimensionne si nécessaire int nombre_cas_assemb = tab_para_stockage.Taille(); @@ -2840,33 +3040,36 @@ Mat_abstraite* Algori::Choix_matrice_masse parstock.nbass = nb_casAssemb; parstock.demi = demi; parstock.total = total; - if (ParaGlob::NiveauImpression() >= 5) - cout << "\n matrice masse: largeur de bande pour les elements (en ddl) " << total << " "; - // cas de l'influence des conditions linéaires d'entrée - int demic=0,totalc=0,cumule=0; - // on n'intervient que si la largeur en noeud augmente - if (lesCondLim->Largeur_Bande(demic,totalc,nb_casAssemb,lesMail,lesRef,cumule)) - {totalc = std::min(totalc,nbddl); - demic = std::min(demic,nbddl); - cumule = std::min(cumule,nbddl); - if (ParaGlob::NiveauImpression() >= 5) - cout << "\n matrice masse: largeur de bande pour les conditions lineaires (en ddl) " << totalc << " "; - demi += cumule; // c'est donc toute la largeur hors diag que l'on ajoute - total += 2 * cumule; - // on limite au nombres total de ddl - total = std::min(total,nbddl); - demi = std::min(demi,nbddl); - }; + // l'influence des CLL n'intervient que sur le CPU 0 + if (!cal_parallele_et_rang_non_nul) + {if (ParaGlob::NiveauImpression() >= 5) + cout << "\n matrice masse: largeur de bande pour les elements (en ddl) " << total << " "; + // cas de l'influence des conditions linéaires d'entrée + int demic=0,totalc=0,cumule=0; + // on n'intervient que si la largeur en noeud augmente + if (lesCondLim->Largeur_Bande(demic,totalc,nb_casAssemb,lesMail,lesRef,cumule)) + {totalc = std::min(totalc,nbddl_MPI); + demic = std::min(demic,nbddl_MPI); + cumule = std::min(cumule,nbddl_MPI); + if (ParaGlob::NiveauImpression() >= 5) + cout << "\n matrice masse: largeur de bande pour les conditions lineaires (en ddl) " << totalc << " "; + demi += cumule; // c'est donc toute la largeur hors diag que l'on ajoute + total += 2 * cumule; + // on limite au nombres total de ddl + total = std::min(total,nbddl_MPI); + demi = std::min(demi,nbddl_MPI); + }; - if (ParaGlob::NiveauImpression() >= 5) - cout << "\n matrice masse: largeur de bande finale (en ddl) " << total << " " - << "\n stockage symetrique d'ou utilisation de la demi largeur= " << demi << " "; + if (ParaGlob::NiveauImpression() >= 5) + cout << "\n matrice masse: largeur de bande finale (en ddl) " << total << " " + << "\n stockage symetrique d'ou utilisation de la demi largeur= " << demi << " "; + }; // initialisation a zero if (mat_mass == NULL) - { mat_mass = new MatBand (BANDE_SYMETRIQUE,demi,nbddl,0);} + { mat_mass = new MatBand (BANDE_SYMETRIQUE,demi,nbddl_MPI,0);} else // sinon on redimentionne ou on change si nécessaire { MatBand * mat_mass_d = (MatBand*) mat_mass; // cas où on redimentionne la matrice - mat_mass_d->Change_taille(demi,nbddl); + mat_mass_d->Change_taille(demi,nbddl_MPI); mat_mass_d->Initialise (0.); }; // // on vérifie que l'assemblage choisit est bien de type symétrique @@ -2882,8 +3085,8 @@ Mat_abstraite* Algori::Choix_matrice_masse {// calcul de la largeur de bande effective int demi=0,total=0; lesMail->Largeur_Bande(demi,total,nb_casAssemb); - total = std::min(total,2*nbddl-1); - demi = std::min(demi,nbddl); + total = std::min(total,2*nbddl_MPI-1); + demi = std::min(demi,nbddl_MPI); // --- on stocke les largeurs initiales de ddl // on redimensionne si nécessaire int nombre_cas_assemb = tab_para_stockage.Taille(); @@ -2897,37 +3100,40 @@ Mat_abstraite* Algori::Choix_matrice_masse // cas de l'influence des conditions linéaires d'entrée int demic=0,totalc=0,cumule=0; // on n'intervient que si la largeur en noeud augmente - if (lesCondLim->Largeur_Bande(demic,totalc,nb_casAssemb,lesMail,lesRef,cumule)) - {totalc = std::min(totalc,2*nbddl-1); - demic = std::min(demic,nbddl); - cumule = std::min(cumule,nbddl); + // et que l'on est sur le CPU 0 + if ( (lesCondLim->Largeur_Bande(demic,totalc,nb_casAssemb,lesMail,lesRef,cumule)) + && (!cal_parallele_et_rang_non_nul) + ) + {totalc = std::min(totalc,2*nbddl_MPI-1); + demic = std::min(demic,nbddl_MPI); + cumule = std::min(cumule,nbddl_MPI); demi += cumule; // c'est donc toute la largeur hors diag que l'on ajoute total += 2 * cumule; if (ParaGlob::NiveauImpression() >= 5) cout << "\n matrice masse: augmentation de la largeur de bande pour les conditions lineaires (en ddl) " << cumule << " "; // on limite au nombres total de ddl - total = std::min(total,2*nbddl-1); - demi = std::min(demi,nbddl); + total = std::min(total,2*nbddl_MPI-1); + demi = std::min(demi,nbddl_MPI); }; - if (ParaGlob::NiveauImpression() >= 5) + if ((ParaGlob::NiveauImpression() >= 5)&& (!cal_parallele_et_rang_non_nul)) cout << "\n matrice masse: largeur de bande finale (en ddl) " << total << " "; // initialisation a zero if (pa.Type_Matrice() == BANDE_SYMETRIQUE_LAPACK) { if (mat_mass == NULL) - { mat_mass = new MatLapack(pa.Type_Matrice(),demi,nbddl,true,0.0 + { mat_mass = new MatLapack(pa.Type_Matrice(),demi,nbddl_MPI,true,0.0 ,pa.Type_resolution(),pa.Type_preconditionnement());} else // sinon on redimentionne si nécessaire { MatLapack * mat_mass_d = (MatLapack*) mat_mass; // cas où on redimentionne la matrice - mat_mass_d->Change_taille(demi,nbddl,0.0); + mat_mass_d->Change_taille(demi,nbddl_MPI,0.0); }; } else { if (mat_mass == NULL) - { mat_mass = new MatLapack(pa.Type_Matrice(),total,nbddl,false,0.0 + { mat_mass = new MatLapack(pa.Type_Matrice(),total,nbddl_MPI,false,0.0 ,pa.Type_resolution(),pa.Type_preconditionnement());} else // sinon on redimentionne si nécessaire { MatLapack * mat_mass_d = (MatLapack*) mat_mass; // cas où on redimentionne la matrice - mat_mass_d->Change_taille(total,nbddl,0.0); + mat_mass_d->Change_taille(total,nbddl_MPI,0.0); }; }; break; @@ -2941,12 +3147,12 @@ Mat_abstraite* Algori::Choix_matrice_masse // puis on définit la matrice en conséquence if (mat_mass == NULL) - { mat_mass = new Mat_creuse_CompCol(nbddl,nbddl, petites_matrices);} + { mat_mass = new Mat_creuse_CompCol(nbddl_MPI,nbddl_MPI, petites_matrices);} else // sinon on redimentionne ou on change si nécessaire { if (mat_mass->Type_matrice() != CREUSE_COMPRESSEE_COLONNE) - { delete mat_mass; mat_mass = new Mat_creuse_CompCol(nbddl,nbddl, petites_matrices);} // cas où on change de matrice + { delete mat_mass; mat_mass = new Mat_creuse_CompCol(nbddl_MPI,nbddl_MPI, petites_matrices);} // cas où on change de matrice else {Mat_creuse_CompCol * mat_mass_d = (Mat_creuse_CompCol*) mat_mass; // cas où on redimentionne la matrice - mat_mass_d->Change_taille(nbddl,nbddl, petites_matrices); + mat_mass_d->Change_taille(nbddl_MPI,nbddl_MPI, petites_matrices); }; }; // !!! pour l'instant on ne prend pas en compte les conditions linéaires initiales @@ -2976,7 +3182,7 @@ Mat_abstraite* Algori::Choix_matrice_masse Sortie(1); }; }; - if (ParaGlob::NiveauImpression() >= 5) + if ((ParaGlob::NiveauImpression() >= 5)&& (!cal_parallele_et_rang_non_nul)) cout << "\n Taille du stockage masse " << mat_mass->Type_matrice() << " (taille en entiers) :" << mat_mass->Place() << endl; return mat_mass; @@ -2990,6 +3196,13 @@ Mat_abstraite* Algori::Mise_a_jour_type_et_taille_matrice_masse_en_explicite (int nbddl,Mat_abstraite* mat_mass,LesMaillages * lesMail,LesReferences* lesRef ,const Nb_assemb& nb_casAssemb, LesContacts* lescontacts) { + #ifdef UTILISATION_MPI + // cas d'un calcul //, seule la matrice du CPU 0 est concernée + if (ParaGlob::Monde()->rank() != 0) + return NULL; + #endif + + //// préparation pour le cas particulier : pa.ContactType() == 1 // int contact_type_1_et_maitre_deformable = false; // if (pa.ContactType() == 1) @@ -3032,7 +3245,7 @@ Mat_abstraite* Algori::Mise_a_jour_type_et_taille_matrice_masse_en_explicite int demic=0,totalc=0,cumule=0; int demi=0,total=0; - int ancien_lb = mat_mass->Nb_colonne(); +// int ancien_lb = mat_mass->Nb_colonne(); //-- dans tous les cas, à minima il faut passer en tridiagonale if (lescontacts->Largeur_Bande(demic,totalc,nb_casAssemb,cumule)) @@ -3467,12 +3680,18 @@ void Algori::Ajout_masses_ponctuelles(LesMaillages * lesMail,Assemblage& Ass,Mat ,const DiversStockage* divStoc,LesReferences* lesRef ,const Enum_ddl & N_ddl,LesFonctions_nD* lesFonctionsnD) { + #ifdef UTILISATION_MPI + // cas d'un calcul //, seule la matrice du CPU 0 est concernée + if (ParaGlob::Monde()->rank() != 0) + return ; + #endif + // prise en compte de masses ponctuelles int dima = ParaGlob::Dimension(); // dans le cas où on est en axisymétrie il faut diminuer de 1 if (ParaGlob::AxiSymetrie()) dima--; - int nbddl_X = mat_masse.Nb_ligne(); +// int nbddl_X = mat_masse.Nb_ligne(); // ---- cas des masses concentrées ----- // on récupère les masses concentrées const Tableau < BlocDdlLim > & Tab_M_A = divStoc->TabMasseAddi(); @@ -3634,7 +3853,13 @@ void Algori::Ajout_masses_ponctuelles(LesMaillages * lesMail,Assemblage& Ass,Mat // ramène un pointeur sur la matrice visqueuse instancié ou nul si aucune instantiation Mat_abstraite* Algori::Cal_mat_visqueux_num_expli(const Mat_abstraite& mat_mass,Mat_abstraite* mat_C_pt ,const Vecteur & delta_X,bool inita, const Vecteur & vitesse) - { + { + #ifdef UTILISATION_MPI + // cas d'un calcul //, seule la matrice du CPU 0 est concernée + if (ParaGlob::Monde()->rank() != 0) + return mat_C_pt; + #endif + // on regarde s'il ne faut pas redimentionner la matrice: // si inadéquation: on supprime la matrice C existante if (inita) @@ -3742,7 +3967,14 @@ Mat_abstraite* Algori::Cal_mat_visqueux_num_expli(const Mat_abstraite& mat_mass, // on ajoute la viscosité critique ce qui permet de cumuler avec de la viscosité numérique void Algori::CalculEnContinuMatriceViscositeCritique(const Mat_abstraite& mat_mass,Mat_abstraite& mat_C_pt ,const Vecteur & delta_X, const Vecteur & vitesse) - { // ---- on commence par calculer (omega_0)^2 qui représente la plus basse fréquence + { + #ifdef UTILISATION_MPI + // cas d'un calcul //, seule la matrice du CPU 0 est concernée + if (ParaGlob::Monde()->rank() != 0) + return ; + #endif + + // ---- on commence par calculer (omega_0)^2 qui représente la plus basse fréquence double omega02=0.; // init switch (opt_cal_C_critique) {case -1 : // version test : c= 0 @@ -3869,8 +4101,13 @@ void Algori::CalculEnContinuMatriceViscositeCritique(const Mat_abstraite& mat_ma // l'algo modifie mat_glob et calcul les forces visqueuses void Algori::Cal_mat_visqueux_num_stat(Mat_abstraite& mat_glob,Vecteur& forces_vis_num) { + #ifdef UTILISATION_MPI + // cas d'un calcul //, seule la matrice du CPU 0 est concernée + if (ParaGlob::Monde()->rank() != 0) + return ; + #endif + // le fonctionnement n'est pas identique au cas explicite - switch (pa.Amort_visco_artificielle()) {case 1 : // cas d'un amortissement de Rayleigh classique {// ici on n'utilise que la matrice de raideur qui est la seule connue en statique diff --git a/Algo/AlgoRef/Algori.h b/Algo/AlgoRef/Algori.h index c6a71c9..972252a 100644 --- a/Algo/AlgoRef/Algori.h +++ b/Algo/AlgoRef/Algori.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -80,6 +80,10 @@ #include "Temps_CPU_HZpp.h" #include "TypeQuelconqueParticulier.h" #include "VariablesExporter.h" +#ifdef UTILISATION_MPI + #include "Distribution_CPU.h" + #include "ResRaid_MPI.h" +#endif // peut-être à modifier sur linux #ifdef BIBLIOTHEQUE_STL_CODE_WARRIOR @@ -152,7 +156,8 @@ class Algori Algori (EnumTypeCalcul type,const bool avec_typeDeCalcul ,const list & soustype ,const list & avec_soustypeDeCalcul - ,UtilLecture& entreePrinc); + ,UtilLecture& entreePrinc + ); // constructeur de copie Algori (const Algori& algo); @@ -171,14 +176,16 @@ class Algori static Algori* New_Agori(EnumTypeCalcul type,const bool avec_typeDeCalcul ,const list & soustype ,const list & avec_soustypeDeCalcul - ,UtilLecture& entreePrinc); + ,UtilLecture& entreePrinc + ); // ramène un tableau de pointeurs sur tous les algorithmes spécifique existants // IMPORTANT : il y a création des algorithmes (utilisation d'un new) static Tableau New_tous_les_Algo (const bool avec_typeDeCalcul ,const list & soustype ,const list & avec_soustypeDeCalcul - ,UtilLecture& entreePrinc); + ,UtilLecture& entreePrinc + ); //lecture des parametres de controle // peut être modifié dans le cas d'un algo particulier @@ -303,12 +310,12 @@ class Algori // type_incre :signal permet de localiser le dernier incrément virtual void Ecriture_base_info (int cas,LesMaillages *lesMaillages, - LesReferences* lesReferences,LesCourbes1D* lesCourbes1D, - LesFonctions_nD* lesFonctionsnD, - LesLoisDeComp* lesLoisDeComp, - DiversStockage* diversStockage,Charge* charge, - LesCondLim* lesCondlim,LesContacts* lesContacts,Resultats* resultats, - OrdreVisu::EnumTypeIncre type_incre,int incre = 0); + LesReferences* lesReferences,LesCourbes1D* lesCourbes1D, + LesFonctions_nD* lesFonctionsnD, + LesLoisDeComp* lesLoisDeComp, + DiversStockage* diversStockage,Charge* charge, + LesCondLim* lesCondlim,LesContacts* lesContacts,Resultats* resultats, + OrdreVisu::EnumTypeIncre type_incre,int incre = 0); // cas d'un démarrage à partir de base_info // éventuellement est définit de manière spécifique pour chaque algorithme // dans les classes filles @@ -316,13 +323,14 @@ class Algori // incrément voulu et qu'il faut simplement faire la lecture des infos // cas = 3 : on met à jour uniquement les données variables, il y a modification des grandeurs, // mais pas redimentionnement lorsque cela est viable (sinon on redimentionne) - virtual void Lecture_base_info(int cas,LesMaillages *lesMaillages, - LesReferences* lesReferences,LesCourbes1D* lesCourbes1D, - LesFonctions_nD* lesFonctionsnD, - LesLoisDeComp* lesLoisDeComp, - DiversStockage* diversStockage,Charge* charge, - LesCondLim* lesCondlim,LesContacts* lesContacts,Resultats* resultats, - int inc_voulu=0); + virtual void Lecture_base_info + (int cas,LesMaillages *lesMaillages, + LesReferences* lesReferences,LesCourbes1D* lesCourbes1D, + LesFonctions_nD* lesFonctionsnD, + LesLoisDeComp* lesLoisDeComp, + DiversStockage* diversStockage,Charge* charge, + LesCondLim* lesCondlim,LesContacts* lesContacts,Resultats* resultats, + int inc_voulu=0); // visualisation intéractive via le standard vrml // la fonction est virtuelle ce qui lui permet d'être éventuellement facilement surchargée @@ -444,6 +452,11 @@ class Algori streampos Debut_increment() const {return debut_increment;}; // ==============VARIABLES PROTEGEES : + #ifdef UTILISATION_MPI + // cas d'un calcul parallèle + Distribution_CPU distribution_CPU_algo; // gestion de la distribution de charge sur CPU + #endif + // 1)----------- protégées: spécifiques à un algo ---------- int mode_debug; // permet de spécifier des options particulières pour débugger // controle de la sortie des informations: utilisé par les classes dérivées @@ -530,6 +543,16 @@ class Algori // variables privées internes servant au pilotage de la convergence int PhaseDeConvergence() const {return phase_de_convergence;}; // pour l'acces en lecture uniquement void Change_PhaseDeConvergence(int phase) {phase_de_convergence=phase;}; + + #ifdef UTILISATION_MPI + // cas d'un calcul parallèle + void Passage_indicConvergenceAuxProcCalcul() ; // passage des indicateurs aux process de calcul + // globalisation des grandeurs globales: proc de calcul -> maitre puis transmission à ParaGlob + // et transmission aux proc de calcul: + // on ne demande pas à ParaGlob de faire la transmission, car il ne sait pas ce qu'il transmet + // et les infos ne sont pas contigües, le transfert ne sera pas performant + void Globalisation_et_transfert_auxProcCalcul_grandeurs_globales(); + #endif private : int phase_de_convergence; // =0 indique si l'on est en phase de convergence // =1 on a convergé soit très bien soit correctement @@ -550,7 +573,7 @@ class Algori // que si on veut une vérification double (deux fois) de la convergence Tableau max_var_residu; // tableau qui garde en souvenir la suite des maxi pour le pilotage int nb_cycle_test_max_var_residu; // utilisé dans Convergence() - + //--- gestion des stockages // -- une classe de stockage de paramètres pour le changement de largeur de bande class ParaStockage {public: Nb_assemb nbass; int demi,total; @@ -716,7 +739,13 @@ class Algori Temps_CPU_HZpp temps_metrique_K_SM; // lesTempsCpu(14) Temps_CPU_HZpp temps_chargement; // lesTempsCpu(15) Temps_CPU_HZpp temps_rech_contact; // lesTempsCpu(16) - + #ifdef UTILISATION_MPI + // cas d'un calcul parallèle: // passage des infos entre process + Temps_CPU_HZpp temps_transfert_court ; // lesTempsCpu(17) + Temps_CPU_HZpp temps_transfert_long ; // lesTempsCpu(19) + Temps_CPU_HZpp temps_attente ; // lesTempsCpu(18) + #endif + Tableau lesTempsCpu; // un tableau intermédiaire qui récupère et globalise les temps pour les sorties // via listeVarGlob, mais c'est les variables Temps_CPU_HZpp qui stockent // réellement les temps @@ -865,7 +894,7 @@ class Algori // nouvelle_largeur_imposee.deux = la demie largeur // nouvelles_largeur_en_ddl.trois = la demie largeur maximale pour la partie éléments finis // uniquement (sans les CLL) - Tableau Mise_a_jour_Choix_matriciel_contact + void Mise_a_jour_Choix_matriciel_contact (Tableau & tab_matglob,const Nb_assemb& nb_casAssemb , LesContacts*lescontacts ,int niveau_substitution ,TroisEntiers* nouvelle_largeur_imposee = NULL); @@ -1032,7 +1061,9 @@ class Algori // mise à jour de la viscosité critique en continu: spécifique au algo de relaxation dynamique, appelé par Cal_mat_visqueux_num_expli void CalculEnContinuMatriceViscositeCritique(const Mat_abstraite& mat_mass,Mat_abstraite& mat_C_pt ,const Vecteur & delta_X, const Vecteur & vitesse); - protected: + + protected: + // passage des grandeurs gérées par l'algorithme de tdt à t // en particulier les énergies et les puissances void TdtversT(); @@ -1082,7 +1113,8 @@ class Algori // passage des grandeurs globales aux noeuds où il y a des variables globales attachées // nb_casAssemb correspond au cas d'assemblage de X1 - void Passage_de_grandeurs_globales_vers_noeuds_pour_variables_globales(LesMaillages * lesMail,VariablesExporter* varExpor,const Nb_assemb& nb_casAssemb,const LesReferences& lesRef); + void Passage_de_grandeurs_globales_vers_noeuds_pour_variables_globales + (LesMaillages * lesMail,VariablesExporter* varExpor,const Nb_assemb& nb_casAssemb,const LesReferences& lesRef); // des fonctions inlines pour mettre à jour des grandeurs globales // -- initialisation du compteur d'itérations diff --git a/Algo/AlgoRef/Algori2.cc b/Algo/AlgoRef/Algori2.cc index b3839a8..b48032d 100644 --- a/Algo/AlgoRef/Algori2.cc +++ b/Algo/AlgoRef/Algori2.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -64,8 +64,9 @@ void Algori::Lecture_base_info(int cas,LesMaillages *lesMaillages, {bool inc_trouve = entreePrinc->Positionnement_base_info(inc_voulu); if (!inc_trouve) { cout << "\nErreur : On ne trouve pas l'increment de restart demande !\n"; - cout << "Algori::Lecture_base_info(....)" - << " increment = " << inc_voulu << endl; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) + cout << "Algori::Lecture_base_info(....)" + << " increment = " << inc_voulu << endl; // dans le cas où un comptage du calcul est en cours on l'arrête if (tempsInitialisation.Comptage_en_cours()) tempsInitialisation.Arret_du_comptage(); if (tempsMiseAjourAlgo.Comptage_en_cours()) tempsMiseAjourAlgo.Arret_du_comptage(); @@ -108,8 +109,9 @@ void Algori::Lecture_base_info(int cas,LesMaillages *lesMaillages, // dans le cas où on n'a pas trouvé le bon incrément message d'erreur if (!inc_trouve) { cout << "\nErreur : On ne trouve pas l'increment demande !\n"; - cout << "Algori::Lecture_base_info(....)" - << " incrément = " << inc_voulu << endl; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) + cout << "Algori::Lecture_base_info(....)" + << " incrément = " << inc_voulu << endl; // dans le cas où un comptage du calcul est en cours on l'arrête if (tempsInitialisation.Comptage_en_cours()) tempsInitialisation.Arret_du_comptage(); if (tempsMiseAjourAlgo.Comptage_en_cours()) tempsMiseAjourAlgo.Arret_du_comptage(); @@ -119,8 +121,9 @@ void Algori::Lecture_base_info(int cas,LesMaillages *lesMaillages, } default : { cout << "\nErreur : valeur incorrecte du type de restart !\n"; - cout << "Algori::Lecture_base_info(....)" - << " cas= " << cas << endl; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) + cout << "Algori::Lecture_base_info(....)" + << " cas= " << cas << endl; // dans le cas où un comptage du calcul est en cours on l'arrête if (tempsInitialisation.Comptage_en_cours()) tempsInitialisation.Arret_du_comptage(); if (tempsMiseAjourAlgo.Comptage_en_cours()) tempsMiseAjourAlgo.Arret_du_comptage(); @@ -131,7 +134,10 @@ void Algori::Lecture_base_info(int cas,LesMaillages *lesMaillages, // lecture particulière à l'algorithme Lecture_base_info(*entrons,cas); - // ******* reste lescontacts + #ifdef UTILISATION_MPI + // si calcul on sauvegarde la distribution + distribution_CPU_algo.Lecture_base_info(*entrons,cas); + #endif lesMaillages->Lecture_base_info(*entrons,cas); // lecture des maillages et des references lesReferences->Lecture_base_info(*entrons,cas); // lecture des références lesCourbes1D->Lecture_base_info(*entrons,cas); // lecture des courbes1D @@ -242,8 +248,9 @@ void Algori::Ecriture_base_info } default : { cout << "\nErreur : valeur incorrecte du type de sauvegarde !\n"; - cout << "Algori::Ecriture_base_info(....)" - << " cas= " << cas << endl; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) + cout << "Algori::Ecriture_base_info(....)" + << " cas= " << cas << endl; // dans le cas où un comptage du calcul est en cours on l'arrête if (tempsSauvegarde.Comptage_en_cours()) tempsSauvegarde.Arret_du_comptage(); if (tempsSortieFilCalcul.Comptage_en_cours()) tempsSortieFilCalcul.Arret_du_comptage(); @@ -256,6 +263,10 @@ void Algori::Ecriture_base_info { // ******* reste lescontacts Ecriture_base_info(*sortons,cas); + #ifdef UTILISATION_MPI + // si calcul on sauvegarde la distribution + distribution_CPU_algo.Ecriture_base_info(*sortons,cas); + #endif lesMaillages->Ecriture_base_info(*sortons,cas); // Ecriture des maillages et des references lesReferences->Ecriture_base_info(*sortons,cas); // Ecriture des references lesCourbes1D->Ecriture_base_info(*sortons,cas); // Ecriture des courbes1D @@ -283,12 +294,13 @@ void Algori::Visu_vrml(ParaGlob * paraGlob,LesMaillages * lesMaillages,LesRefere { // on gère les exceptions éventuelles en mettant le bloc sous surveillance try {// écriture de l'en-tête - cout << "\n ======== module de visualisation format vrml ========\n"; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) + cout << "\n ======== module de visualisation format vrml ========\n"; // -- on définit l'ensemble des incréments possibles, ceci sont stocké dans .BI // tout d'abord ouverture du fichier de restart si nécessaire entreePrinc->Ouverture_base_info("lecture"); // récup du flot d'entrée - ifstream * entrons = entreePrinc->Ent_BI(); +// ifstream * entrons = entreePrinc->Ent_BI(); // def du conteneur des numéros d'incréments list list_incre = entreePrinc->Liste_increment(); // on informe l'instance de visualisation de la liste des incréments possibles @@ -377,7 +389,8 @@ void Algori::Visu_vrml(ParaGlob * paraGlob,LesMaillages * lesMaillages,LesRefere // entreePrinc->Fermeture_fichier_legende_vrml(); } // fin de la visualisation - cout << "\n ======== fin du module de visualisation format vrml ========\n"; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) + cout << "\n ======== fin du module de visualisation format vrml ========\n"; } catch (ErrSortieFinale) // cas d'une direction voulue vers la sortie @@ -388,7 +401,8 @@ void Algori::Visu_vrml(ParaGlob * paraGlob,LesMaillages * lesMaillages,LesRefere catch ( ... ) { if (ParaGlob::NiveauImpression() >= 1) {cout << "\n **** warning: erreur en ecriture pour la visualisation interactive via le format vrml"; - if (ParaGlob::NiveauImpression() >= 4) cout << "\n Algori::Visu_vrml(.."; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 3)) || (permet_affichage > 2)) + cout << "\n Algori::Visu_vrml(.."; cout << endl; }; }; @@ -406,12 +420,13 @@ void Algori::Visu_maple(ParaGlob * paraGlob,LesMaillages * lesMaillages,LesRefer { // on gère les exceptions éventuelles en mettant le bloc sous surveillance try {// écriture de l'en-tête - cout << "\n ======== module de visualisation par fichiers de points au format maple ========\n"; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) + cout << "\n ======== module de visualisation par fichiers de points au format maple ========\n"; // -- on définit l'ensemble des incréments possibles, ceci sont stocké dans .BI // tout d'abord ouverture du fichier de restart si nécessaire entreePrinc->Ouverture_base_info("lecture"); // récup du flot d'entrée - ifstream * entrons = entreePrinc->Ent_BI(); +// ifstream * entrons = entreePrinc->Ent_BI(); // def du conteneur des numéros d'incréments list list_incre = entreePrinc->Liste_increment(); // on informe l'instance de visualisation de la liste des incréments possibles @@ -509,7 +524,8 @@ void Algori::Visu_maple(ParaGlob * paraGlob,LesMaillages * lesMaillages,LesRefer // entreePrinc->Fermeture_fichier_principal_maple(); } // fin de la visualisation - cout << "\n ======== fin module de visualisation par fichiers de points au format maple ========\n"; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) + cout << "\n ======== fin module de visualisation par fichiers de points au format maple ========\n"; } catch (ErrSortieFinale) // cas d'une direction voulue vers la sortie @@ -520,7 +536,8 @@ void Algori::Visu_maple(ParaGlob * paraGlob,LesMaillages * lesMaillages,LesRefer catch ( ... ) { if (ParaGlob::NiveauImpression() >= 1) {cout << "\n **** warning: erreur en ecriture pour la visualisation interactive via le format maple"; - if (ParaGlob::NiveauImpression() >= 4) cout << "\n Algori::Visu_maple(.."; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 3)) || (permet_affichage > 2)) + cout << "\n Algori::Visu_maple(.."; cout << endl; }; }; @@ -538,12 +555,13 @@ void Algori::Visu_geomview(ParaGlob * paraGlob,LesMaillages * lesMaillages,LesRe { // on gère les exceptions éventuelles en mettant le bloc sous surveillance try {// écriture de l'en-tête - cout << "\n ======== module de visualisation format geomview ========\n"; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) + cout << "\n ======== module de visualisation format geomview ========\n"; // -- on définit l'ensemble des incréments possibles, ceci sont stocké dans .BI // tout d'abord ouverture du fichier de restart si nécessaire entreePrinc->Ouverture_base_info("lecture"); // récup du flot d'entrée - ifstream * entrons = entreePrinc->Ent_BI(); +// ifstream * entrons = entreePrinc->Ent_BI(); // def du conteneur des numéros d'incréments list list_incre = entreePrinc->Liste_increment(); // on informe l'instance de visualisation de la liste des incréments possibles @@ -656,7 +674,8 @@ void Algori::Visu_geomview(ParaGlob * paraGlob,LesMaillages * lesMaillages,LesRe // entreePrinc->Fermeture_fichier_legende_geomview(); } // fin de la visualisation - cout << "\n ======== fin du module de visualisation format geomview ========\n"; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) + cout << "\n ======== fin du module de visualisation format geomview ========\n"; } catch (ErrSortieFinale) // cas d'une direction voulue vers la sortie @@ -667,7 +686,8 @@ void Algori::Visu_geomview(ParaGlob * paraGlob,LesMaillages * lesMaillages,LesRe catch ( ... ) { if (ParaGlob::NiveauImpression() >= 1) {cout << "\n **** warning: erreur en ecriture pour la visualisation interactive via le format geomview"; - if (ParaGlob::NiveauImpression() >= 4) cout << "\n Algori::Visu_geomview(.."; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 3)) || (permet_affichage > 2)) + cout << "\n Algori::Visu_geomview(.."; cout << endl; }; }; @@ -685,12 +705,13 @@ void Algori::Visu_Gid(ParaGlob * paraGlob,LesMaillages * lesMaillages,LesReferen { // on gère les exceptions éventuelles en mettant le bloc sous surveillance try {// écriture de l'en-tête - cout << "\n ======== module de visualisation format Gid ========\n"; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) + cout << "\n ======== module de visualisation format Gid ========\n"; // -- on définit l'ensemble des incréments possibles, ceci sont stocké dans .BI // tout d'abord ouverture du fichier de restart si nécessaire entreePrinc->Ouverture_base_info("lecture"); // récup du flot d'entrée - ifstream * entrons = entreePrinc->Ent_BI(); +// ifstream * entrons = entreePrinc->Ent_BI(); // def du conteneur des numéros d'incréments list list_incre = entreePrinc->Liste_increment(); // on informe l'instance de visualisation de la liste des incréments possibles @@ -809,7 +830,8 @@ void Algori::Visu_Gid(ParaGlob * paraGlob,LesMaillages * lesMaillages,LesReferen // entreePrinc->Fermeture_fichier_resultat_Gid(); } // fin de la visualisation - cout << "\n ======== fin du module de visualisation format GID ========\n"; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) + cout << "\n ======== fin du module de visualisation format GID ========\n"; } catch (ErrSortieFinale) // cas d'une direction voulue vers la sortie @@ -820,7 +842,8 @@ void Algori::Visu_Gid(ParaGlob * paraGlob,LesMaillages * lesMaillages,LesReferen catch ( ... ) { if (ParaGlob::NiveauImpression() >= 1) {cout << "\n **** warning: erreur en ecriture pour la visualisation interactive via le format GID"; - if (ParaGlob::NiveauImpression() >= 4) cout << "\n Algori::Visu_Gid(.."; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 3)) || (permet_affichage > 2)) + cout << "\n Algori::Visu_Gid(.."; cout << endl; }; }; @@ -838,12 +861,13 @@ void Algori::Visu_Gmsh(ParaGlob * paraGlob,LesMaillages * lesMaillages,LesRefere { // on gère les exceptions éventuelles en mettant le bloc sous surveillance try {// écriture de l'en-tête - cout << "\n ======== module de visualisation format Gmsh ========\n"; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) + cout << "\n ======== module de visualisation format Gmsh ========\n"; // -- on définit l'ensemble des incréments possibles, ceci sont stocké dans .BI // tout d'abord ouverture du fichier de restart si nécessaire entreePrinc->Ouverture_base_info("lecture"); // récup du flot d'entrée - ifstream * entrons = entreePrinc->Ent_BI(); +// ifstream * entrons = entreePrinc->Ent_BI(); // def du conteneur des numéros d'incréments list list_incre = entreePrinc->Liste_increment(); // on informe l'instance de visualisation de la liste des incréments possibles @@ -963,7 +987,8 @@ void Algori::Visu_Gmsh(ParaGlob * paraGlob,LesMaillages * lesMaillages,LesRefere // entreePrinc->Fermeture_TousLesFichiersResultats_Gmsh(); } // fin de la visualisation - cout << "\n ======== fin du module de visualisation format Gmsh ========\n"; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) + cout << "\n ======== fin du module de visualisation format Gmsh ========\n"; } catch (ErrSortieFinale) // cas d'une direction voulue vers la sortie @@ -974,7 +999,8 @@ void Algori::Visu_Gmsh(ParaGlob * paraGlob,LesMaillages * lesMaillages,LesRefere catch ( ... ) { if (ParaGlob::NiveauImpression() >= 1) {cout << "\n **** warning: erreur en ecriture pour la visualisation interactive via le format Gmsh"; - if (ParaGlob::NiveauImpression() >= 4) cout << "\n Algori::Visu_Gmsh(.."; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) + cout << "\n Algori::Visu_Gmsh(.."; cout << endl; }; }; @@ -999,12 +1025,13 @@ void Algori::LectureCommandeVisu(ParaGlob * paraGlob,LesMaillages * lesMaillages return; } // écriture de l'en-tête - cout << "\n ======== lecture du fichier de commande de visualisation ========\n"; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) + cout << "\n ======== lecture du fichier de commande de visualisation ========\n"; // -- on définit l'ensemble des incréments possibles, ceci sont stocké dans .BI // tout d'abord ouverture du fichier de restart si nécessaire entreePrinc->Ouverture_base_info("lecture"); // récup du flot d'entrée - ifstream * entrons = entreePrinc->Ent_BI(); +// ifstream * entrons = entreePrinc->Ent_BI(); // def du conteneur des numéros d'incréments list list_incre = entreePrinc->Liste_increment(); // on informe les instances de visualisation de la liste des incréments possibles @@ -1032,7 +1059,7 @@ void Algori::LectureCommandeVisu(ParaGlob * paraGlob,LesMaillages * lesMaillages { // cas où pas de liste -> on initialise à 0 et au dernier incrément si différent list_incre_init_inter = &(visualise.List_balaie_init(-1)); } - const list & list_incre_init = * list_incre_init_inter; +// const list & list_incre_init = * list_incre_init_inter; // on impose la liste pour les autres types de visualisation visualise_maple.List_balaie_init(*list_incre_init_inter);//list_incre_init); visualise_geomview.List_balaie_init(*list_incre_init_inter);//list_incre_init); @@ -1123,14 +1150,14 @@ void Algori::LectureCommandeVisu(ParaGlob * paraGlob,LesMaillages * lesMaillages << " fin_fichier_commande_visu ! " << "\n normalement ce mot cle doit finir le fichier, on continue quand meme, mais" << "\n il y a peut-etre un probleme"; - if (ParaGlob::NiveauImpression() >= 4) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 3)) || (permet_affichage > 2)) cout << "\n Algori::LectureCommandeVisu(.."; } else { // erreur en lecture cout << "\n **** ERREUR en lecture du fichier de commande de visualisation " << "\n on continue quand meme, mais il y aura peut-etre un probleme de coherence pour la suite"; - if (ParaGlob::NiveauImpression() >= 4) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 3)) || (permet_affichage > 2)) cout << "\n Algori::LectureCommandeVisu(.."; } } @@ -1143,12 +1170,13 @@ void Algori::LectureCommandeVisu(ParaGlob * paraGlob,LesMaillages * lesMaillages catch (...)// erreur inconnue { cout << "\n **** ERREUR inconnuee en lecture du fichier de commande de visualisation " << "\n on continue quand meme, mais il y aura peut-etre un probleme de coherence pour la suite"; - if (ParaGlob::NiveauImpression() >= 4) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 3)) || (permet_affichage > 2)) cout << "\n Algori::LectureCommandeVisu(.."; }; // avertissement de la fin de lecture du fichier de commande - if (ParaGlob::NiveauImpression() >= 0) +// if (ParaGlob::NiveauImpression() >= 0) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) cout << "\n ======== fin de la lecture du fichier de commande de visualisation ========\n"; // visualisation en fonction de l'activité des différents types de sortie // récup de la list des incréments à balayer @@ -1268,7 +1296,7 @@ void Algori::LectureCommandeVisu(ParaGlob * paraGlob,LesMaillages * lesMaillages // entreePrinc->Fermeture_fichier_principal_vrml(); // entreePrinc->Fermeture_fichier_legende_vrml(); // fin de la visualisation - if (ParaGlob::NiveauImpression() >= 0) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) cout << "\n ======== fin du module de visualisation format vrml ========\n"; } if (visualise_maple.Visu_maple_valide()) @@ -1278,7 +1306,7 @@ void Algori::LectureCommandeVisu(ParaGlob * paraGlob,LesMaillages * lesMaillages // // on ferme la sortie maple (fichier) et appel éventuel du visualisateur // entreePrinc->Fermeture_fichier_principal_maple(); // fin de la visualisation - if (ParaGlob::NiveauImpression() >= 0) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) cout << "\n ======== fin module de visualisation par fichiers de points au format maple ========\n"; } if (visualise_geomview.Visu_geomview_valide()) @@ -1288,7 +1316,7 @@ void Algori::LectureCommandeVisu(ParaGlob * paraGlob,LesMaillages * lesMaillages // entreePrinc->Fermeture_fichier_principal_geomview(); // entreePrinc->Fermeture_fichier_legende_geomview(); // fin de la visualisation - if (ParaGlob::NiveauImpression() >= 0) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) cout << "\n ======== fin du module de visualisation format geomview ========\n"; } if (visualise_Gid.Visu_Gid_valide()) @@ -1298,7 +1326,7 @@ void Algori::LectureCommandeVisu(ParaGlob * paraGlob,LesMaillages * lesMaillages // entreePrinc->Fermeture_fichier_initial_Gid(); // entreePrinc->Fermeture_fichier_resultat_Gid(); // fin de la visualisation - if (ParaGlob::NiveauImpression() >= 0) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) cout << "\n ======== fin du module de visualisation format Gid ========\n"; } if (visualise_Gmsh.Visu_Gmsh_valide()) @@ -1308,7 +1336,7 @@ void Algori::LectureCommandeVisu(ParaGlob * paraGlob,LesMaillages * lesMaillages // entreePrinc->Fermeture_fichier_initial_Gmsh(); // entreePrinc->Fermeture_TousLesFichiersResultats_Gmsh(); // fin de la visualisation - if (ParaGlob::NiveauImpression() >= 0) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) cout << "\n ======== fin du module de visualisation format Gmsh ========\n"; } } @@ -1321,7 +1349,8 @@ void Algori::LectureCommandeVisu(ParaGlob * paraGlob,LesMaillages * lesMaillages catch ( ... ) { if (ParaGlob::NiveauImpression() >= 1) {cout << "\n **** warning: erreur inconnue en lecture du fichier commande Visu"; - if (ParaGlob::NiveauImpression() >= 4) cout << "\n Algori::LectureCommandeVisu(.."; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 3)) || (permet_affichage > 2)) + cout << "\n Algori::LectureCommandeVisu(.."; cout << "endl"; }; }; @@ -1350,7 +1379,7 @@ void Algori::EcritureCommandeVisu() catch (...)// erreur en écriture { cout << "\n **** ERREUR en ecriture du fichier de commande de visualisation " << "\n on continue quand meme"; - if (ParaGlob::NiveauImpression() >= 4) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 3)) || (permet_affichage > 2)) cout << "\n Algori::EcritureCommandeVisu(.."; }; }; @@ -1401,7 +1430,8 @@ void Algori::VisuAuFilDuCalcul(ParaGlob * paraGlob,LesMaillages * lesMaillages,L return; } // écriture de l'en-tête - if (ParaGlob::NiveauImpression() >= 2) {cout << "\n ======== lecture du fichier de commande " + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 1)) || (permet_affichage > 2)) + {cout << "\n ======== lecture du fichier de commande " << "de visualisation ========\n"; }; //-- initialisation des grandeurs globales par maillage @@ -1515,19 +1545,19 @@ void Algori::VisuAuFilDuCalcul(ParaGlob * paraGlob,LesMaillages * lesMaillages,L << " fin_fichier_commande_visu ! " << "\n normalement ce mot cle doit finir le fichier, on continue quand meme, mais" << "\n il y a peut-etre un probleme"; - if (ParaGlob::NiveauImpression() >= 4) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 3)) || (permet_affichage > 2)) cout << "\n Algori::VisuAuFilDuCalcul(.."; } else if ( erreur.lecture == 0) // on ne peut pas ouvrir le fichier { cout << "\n **** erreur en ouverture du fichier "; - if (ParaGlob::NiveauImpression() >= 4) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 3)) || (permet_affichage > 2)) cout << "\n Algori::VisuAuFilDuCalcul(.."; } else { // erreur en lecture cout << "\n **** ERREUR en lecture du fichier de commande de visualisation " << "\n on continue quand meme, mais il y aura peut-etre un probleme de coherence pour la suite"; - if (ParaGlob::NiveauImpression() >= 4) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 3)) || (permet_affichage > 2)) cout << "\n Algori::VisuAuFilDuCalcul(.."; } } @@ -1540,12 +1570,13 @@ void Algori::VisuAuFilDuCalcul(ParaGlob * paraGlob,LesMaillages * lesMaillages,L catch (...)// erreur inconnue { cout << "\n **** ERREUR inconnuee en lecture du fichier de commande de visualisation " << "\n on continue quand meme, mais il y aura peut-etre un probleme de coherence pour la suite"; - if (ParaGlob::NiveauImpression() >= 4) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 3)) || (permet_affichage > 2)) cout << "\n Algori::VisuAuFilDuCalcul(.."; } // avertissement de la fin de lecture du fichier de commande - if (ParaGlob::NiveauImpression() >= 2) - cout << "\n ======== fin de la lecture du fichier de commande de visualisation ========\n"; +// if (ParaGlob::NiveauImpression() >= 2) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 2)) || (permet_affichage > 2)) + cout << "\n ======== fin de la lecture du fichier de commande de visualisation ========\n"; // initialisation de la sortie vrml (fichier) si la sortie vrml est valide if (visualise.Visu_vrml_valide()) { entreePrinc->Ouverture_fichier_principal_vrml(); @@ -1675,7 +1706,7 @@ void Algori::VisuAuFilDuCalcul(ParaGlob * paraGlob,LesMaillages * lesMaillages,L // entreePrinc->Fermeture_fichier_principal_vrml(); // entreePrinc->Fermeture_fichier_legende_vrml(); // fin de la visualisation - if (ParaGlob::NiveauImpression() >= 0) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) cout << "\n ======== fin du module de visualisation format vrml ========\n"; }; if (visualise_maple.Visu_maple_valide()) @@ -1685,7 +1716,7 @@ void Algori::VisuAuFilDuCalcul(ParaGlob * paraGlob,LesMaillages * lesMaillages,L // // on ferme la sortie maple (fichier) et appel éventuel du visualisateur // entreePrinc->Fermeture_fichier_principal_maple(); // fin de la visualisation - if (ParaGlob::NiveauImpression() >= 0) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) cout << "\n ======== fin module de visualisation par fichiers de points au format maple ========\n"; }; if (visualise_geomview.Visu_geomview_valide()) @@ -1695,7 +1726,7 @@ void Algori::VisuAuFilDuCalcul(ParaGlob * paraGlob,LesMaillages * lesMaillages,L // entreePrinc->Fermeture_fichier_principal_geomview(); // entreePrinc->Fermeture_fichier_legende_geomview(); // fin de la visualisation - if (ParaGlob::NiveauImpression() >= 0) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) cout << "\n ======== fin du module de visualisation format geomview ========\n"; }; if (visualise_Gid.Visu_Gid_valide()) @@ -1705,7 +1736,7 @@ void Algori::VisuAuFilDuCalcul(ParaGlob * paraGlob,LesMaillages * lesMaillages,L // entreePrinc->Fermeture_fichier_initial_Gid(); // entreePrinc->Fermeture_fichier_resultat_Gid(); // fin de la visualisation - if (ParaGlob::NiveauImpression() >= 0) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) cout << "\n ======== fin du module de visualisation format Gid ========\n"; }; if (visualise_Gmsh.Visu_Gmsh_valide()) @@ -1715,7 +1746,7 @@ void Algori::VisuAuFilDuCalcul(ParaGlob * paraGlob,LesMaillages * lesMaillages,L // entreePrinc->Fermeture_fichier_initial_Gmsh(); // entreePrinc->Fermeture_TousLesFichiersResultats_Gmsh(); // fin de la visualisation - if (ParaGlob::NiveauImpression() >= 0) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) cout << "\n ======== fin du module de visualisation format Gmsh ========\n"; }; }; //-- fin du if (type_incre == OrdreVisu::DERNIER_INCRE) @@ -1728,9 +1759,10 @@ void Algori::VisuAuFilDuCalcul(ParaGlob * paraGlob,LesMaillages * lesMaillages,L throw (toto); } catch ( ... ) - { if (ParaGlob::NiveauImpression() >= 1) + { if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) {cout << "\n **** warning: erreur en ecriture pour la visualisation au fil du calcul"; - if (ParaGlob::NiveauImpression() >= 4) cout << "\n Algori::VisuAuFilDuCalcul(.."; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 3)) || (permet_affichage > 2)) + cout << "\n Algori::VisuAuFilDuCalcul(.."; cout << endl; }; }; @@ -1860,6 +1892,11 @@ void Algori::Ecriture_base_info sort << "\n tps_metrique_KSM "<< temps_metrique_K_SM; sort << "\n tps_chargement "<< temps_chargement; sort << "\n tps_rech_contact "<< temps_rech_contact; + #ifdef UTILISATION_MPI + sort << "\n tps_transfert_court_proc "<< temps_transfert_court; + sort << "\n tps_transfert_long_proc "<< temps_transfert_long; + sort << "\n tps_attente_proc "<< temps_attente; + #endif // ----- écriture éventuelle des paramètres de l'algorithme et informations particulières sort << "\n -----parametre_et_variables_particulieres_algo: " << Nom_TypeCalcul(typeCalcul); @@ -2046,7 +2083,11 @@ void Algori::Lecture_base_info(ifstream& ent,const int cas) ent >> nom1 >> temps_metrique_K_SM; ent >> nom1 >> temps_chargement; ent >> nom1 >> temps_rech_contact; - + #ifdef UTILISATION_MPI + ent >> nom1 >> temps_transfert_court; + ent >> nom1 >> temps_transfert_long; + ent >> nom1 >> temps_attente; + #endif // --- lecture éventuelle des paramètres de l'algorithme // on regarde tout d'abord si l'algo en lecture correspond diff --git a/Algo/AlgoRef/Algori3.cc b/Algo/AlgoRef/Algori3.cc index eb1c2a2..1a4a768 100644 --- a/Algo/AlgoRef/Algori3.cc +++ b/Algo/AlgoRef/Algori3.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -1189,7 +1189,8 @@ int Algori::AmortissementCinetique(const Vecteur & delta_ddl,const double& coef_ if (fct_nD_inter_nb_entre_relax != NULL) {int old_valeur = inter_nb_entre_relax; inter_nb_entre_relax = (fct_nD_inter_nb_entre_relax->Valeur_pour_variables_globales())(1); - if ((ParaGlob::NiveauImpression() > 2) && (old_valeur != inter_nb_entre_relax)) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 2)) || (permet_affichage > 1)) + if (old_valeur != inter_nb_entre_relax) cout << "\n >>> changement de inter_nb_entre_relax de " << old_valeur << " en ==> "<< inter_nb_entre_relax; }; @@ -1252,7 +1253,7 @@ int Algori::AmortissementCinetique(const Vecteur & delta_ddl,const double& coef_ else {moy_gliss_t= 0.; moyenne_glissante = 0.;}; // au cas où on met une valeur très grande }; // écriture d'info pour le débug au cas où - if ((ParaGlob::NiveauImpression() > 6) || (permet_affichage >3 )) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 6)) || (permet_affichage > 3)) {if (taille_moyenne_glissante == 1) {cout << "\n E_cin_tdt= " << E_cin_tdt << " compteur_decroit_pourRelaxDyn= " << compteur_decroit_pourRelaxDyn << " pic_E_cint_t= " << pic_E_cint_t << endl; @@ -1371,7 +1372,7 @@ int Algori::AmortissementCinetique(const Vecteur & delta_ddl,const double& coef_ { if (delta_ddl.Max_val_abs() <= max_deltaX_pourRelaxDyn) nb_dX_OK_pourRelaxDyn++; if (nb_dX_OK_pourRelaxDyn > nb_max_dX_OK_pourRelaxDyn) { relax_vit = -1; - if (ParaGlob::NiveauImpression() > 6) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 6)) || (permet_affichage > 3)) cout << "\n critere en deplacement ok: max_deltaX= " << delta_ddl.Max_val_abs(); nb_dX_OK_pourRelaxDyn=0; // on initialise pour une prochaine fois // dans le cas ou l'arrêt réel n'est pas drivé par le déplacement @@ -1385,7 +1386,8 @@ int Algori::AmortissementCinetique(const Vecteur & delta_ddl,const double& coef_ // on tente d'afficher que si l'amortissement a effectivement eu lieu // if (relax_vit && pa.AfficheIncrEnergie()) - if (relaxation_effectuee && ((ParaGlob::NiveauImpression() > 0) || (permet_affichage> 0))) + if (relaxation_effectuee) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 2)) {cout << "\n N:" << icharge << " relaxation cinetique effectuee " << " pic_E_cint_t("< 7)) || (permet_affichage > 5)) + {cout << "\n relax effectue au noeud " << noe << " pic_eN_cint_t("<0) // affichage global éventuel + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 4)) || (permet_affichage > 2)) + cout << "\n nb de relaxation individuelle effectuee: " << compteur_relaxation_ok; };// -- fin du cas où l'on applique l'amortissement @@ -1735,7 +1739,7 @@ bool Algori::Pilotage_fin_iteration_implicite(int compteur) else if (compteur > pa.Iterations()) { nombre_de_mauvaises_convergences++; nombre_de_bonnes_convergences = 0; - if ((ParaGlob::NiveauImpression() > 0) || (permet_affichage> 0)) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) { cout << "\n============================================================================" << "\n ******* NON convergence des iterations d'equilibre ********* " << "\n============================================================================"; @@ -1750,7 +1754,7 @@ bool Algori::Pilotage_fin_iteration_implicite(int compteur) } else if (phase_de_convergence == -2) // cas où c'est Convergence() qui est la cause de l'arret // pour cause d'évolution divergente des résidus - { if ((ParaGlob::NiveauImpression() > 0) || (permet_affichage> 0)) + { if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) { cout << "\n============================================================================" << "\n *** NON convergence equilibre: evolution divergente des residus ********* " << "\n============================================================================"; @@ -1766,7 +1770,7 @@ bool Algori::Pilotage_fin_iteration_implicite(int compteur) } else if (phase_de_convergence == -3) // cas où c'est Convergence() qui est la cause de l'arret // pour cause de variation de ddl minimal atteinte - { if ((ParaGlob::NiveauImpression() > 0) || (permet_affichage> 0)) + { if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) { cout << "\n============================================================================" << "\n *** NON convergence equilibre: variation de ddl minimal atteinte ********* " << "\n============================================================================"; @@ -1782,7 +1786,7 @@ bool Algori::Pilotage_fin_iteration_implicite(int compteur) } else if (phase_de_convergence == -4) // cas où c'est Convergence() qui est la cause de l'arret // pour cause de variation de ddl maximal atteinte - { if ((ParaGlob::NiveauImpression() > 0) || (permet_affichage> 0)) + { if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) { cout << "\n============================================================================" << "\n *** NON convergence equilibre: variation de ddl maximum atteinte ********* " << "\n============================================================================"; @@ -1797,7 +1801,7 @@ bool Algori::Pilotage_fin_iteration_implicite(int compteur) fin_iter = false; // on signale qu'il n'y a pas convergence } else if (phase_de_convergence == -5) // cas d'un arrêt à cause d'un jacobien négatif, qui est géré - { if ((ParaGlob::NiveauImpression() > 0) || (permet_affichage> 0)) + { if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) { cout << "\n============================================================================" << "\n *** NON convergence due a la gestion de jacobien negatif ********* " << "\n============================================================================"; @@ -1812,7 +1816,7 @@ bool Algori::Pilotage_fin_iteration_implicite(int compteur) nombre_de_mauvaises_convergences++; } else if (phase_de_convergence == -6) // cas d'un arrêt à cause d'une variation de jacobine trop grande - { if ((ParaGlob::NiveauImpression() > 0) || (permet_affichage> 0)) + { if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) { cout << "\n============================================================================" << "\n *** NON convergence due a une variation de jacobien trop grande ********* " << "\n============================================================================"; @@ -1827,7 +1831,7 @@ bool Algori::Pilotage_fin_iteration_implicite(int compteur) nombre_de_mauvaises_convergences++; } else if (phase_de_convergence == -7) // cas d'un arrêt à cause d'une non convergence de la loi de comp - { if ((ParaGlob::NiveauImpression() > 0) || (permet_affichage> 0)) + { if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) {if(ParaGlob::Francais()) { cout << "\n============================================================================" << "\n *** NON convergence due a la loi de comportement ********* " @@ -1845,7 +1849,7 @@ bool Algori::Pilotage_fin_iteration_implicite(int compteur) } else if (phase_de_convergence == -8) // cas d'un arrêt à cause d'une non convergence de la loi de comp // mais pour un pb qui couve depuis plusieurs incréments - { if ((ParaGlob::NiveauImpression() > 0) || (permet_affichage> 0)) + { if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) {if(ParaGlob::Francais()) { cout << "\n============================================================================" << "\n *** NON convergence du a la loi de comportement ********* " @@ -1864,7 +1868,7 @@ bool Algori::Pilotage_fin_iteration_implicite(int compteur) nombre_de_mauvaises_convergences++; } else if (phase_de_convergence == -9) // cas d'un arrêt à cause d'un pb de la résolution du syteme linéaire - { if ((ParaGlob::NiveauImpression() > 0) || (permet_affichage> 0)) + { if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) {if(ParaGlob::Francais()) { cout << "\n==============================================================================" << "\n *** NON convergence due a un pb de resolution du systeme lineaire ********* " @@ -1881,7 +1885,7 @@ bool Algori::Pilotage_fin_iteration_implicite(int compteur) nombre_de_mauvaises_convergences++; } else if (phase_de_convergence == -10) // cas d'un arrêt à cause d'un pb de calcul des efforts extérieurs - { if ((ParaGlob::NiveauImpression() > 0) || (permet_affichage> 0)) + { if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) {if(ParaGlob::Francais()) { cout << "\n==============================================================================" << "\n *** NON convergence due a un pb de calcul des efforts exterieurs ********* " @@ -1898,7 +1902,7 @@ bool Algori::Pilotage_fin_iteration_implicite(int compteur) nombre_de_mauvaises_convergences++; } else if (phase_de_convergence == -11) // cas d'un arrêt à cause d'un nan ou infini sur forces ext, int - { if ((ParaGlob::NiveauImpression() > 0) || (permet_affichage> 0)) + { if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) {if(ParaGlob::Francais()) { cout << "\n==============================================================================" << "\n *** NON convergence due a un nan ou infini sur forces int, ext, totales ********* " @@ -1915,7 +1919,7 @@ bool Algori::Pilotage_fin_iteration_implicite(int compteur) nombre_de_mauvaises_convergences++; } else // cas d'une erreur de pilotage: on ne sait pas pourquoi il s'est arrêté sans convergence - { if ((ParaGlob::NiveauImpression() > 0) || (permet_affichage> 0)) + { if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) {if(ParaGlob::Francais()) {cout << "\n cas de pilotage de fin d'iteration inconnues ? ou alors qui suit une erreur signalee precedemment "; if (ParaGlob::NiveauImpression() > 5) @@ -1940,7 +1944,7 @@ bool Algori::Pilotage_fin_iteration_implicite(int compteur) } return fin_iter; //debug -if ((ParaGlob::NiveauImpression() > 0) || (permet_affichage> 0)) +if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) { cout << "\n Algori::Pilotage_fin_iteration_implicite: phase_de_convergence=" << phase_de_convergence << " nombre_de_bonnes_convergences= " << nombre_de_bonnes_convergences << " nombre_de_mauvaises_convergences " << nombre_de_mauvaises_convergences << endl ; @@ -2029,7 +2033,8 @@ void Algori::Pilotage_chaque_iteration(Vecteur* sol,double& maxDeltaDdl,const in { // -- sur ou sous relaxation double sursousrelax = pa.SurSousRelaxation(); (*sol) *= sursousrelax; - if ((ParaGlob::NiveauImpression() >= 4) && (sursousrelax != 1.)) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 3)) || (permet_affichage > 2)) + if (sursousrelax != 1.) {if(ParaGlob::Francais()) {cout << "\n intervention d'une sur-sous relaxation: ";} else {cout << "\n intervention of an over or under relaxation: ";}; @@ -2041,7 +2046,7 @@ void Algori::Pilotage_chaque_iteration(Vecteur* sol,double& maxDeltaDdl,const in {// cas d'une limitation globale (tout le vecteur sol change if (maxDeltaDdl > pa.NormeMax_increment()) { double facteur=(pa.NormeMax_increment()/maxDeltaDdl); - if ((ParaGlob::NiveauImpression() > 0) || (permet_affichage> 0)) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) {if(ParaGlob::Francais()) {cout << "\n ===>>>>> intervention de la reduction du vecteur increment de ddl ";} else {cout << "\n ===>>>>> intervention of the reduction for the vector increment of dof ";}; @@ -2064,7 +2069,7 @@ void Algori::Pilotage_chaque_iteration(Vecteur* sol,double& maxDeltaDdl,const in { vect(i) = Signe(vect(i),maxa); modif = true;}; }; if (modif) - {if ((ParaGlob::NiveauImpression() > 0) || (permet_affichage> 0)) + {if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) {if(ParaGlob::Francais()) {cout << "\n ===>>>>> intervention de la reduction du vecteur increment de ddl, limitation des maxis ";} else {cout << "\n ===>>>>> intervention of the reduction for the vector increment of dof, limitation of the maxis ";}; @@ -2114,7 +2119,7 @@ void Algori::Pilotage_maxi_X_V(const Vecteur& X_t,Vecteur& X_tdt,const Vecteur& double maxDeltaDdl=vec_trav.Max_val_abs(); if (maxDeltaDdl > normeMax_X_increment) { double facteur=(normeMax_X_increment/maxDeltaDdl); - if (ParaGlob::NiveauImpression() > 2) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 2)) || (permet_affichage > 0)) {if(ParaGlob::Francais()) {cout << "\n ===>>>>> intervention de la reduction du vecteur delta X ";} else {cout << "\n ===>>>>> intervention of the reduction for the vector delta X ";}; @@ -2139,7 +2144,7 @@ void Algori::Pilotage_maxi_X_V(const Vecteur& X_t,Vecteur& X_tdt,const Vecteur& { vec_trav(i) = Signe(vec_trav(i),maxa); modif = true;}; }; if (modif) - {if (ParaGlob::NiveauImpression() > 2) + {if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 2)) || (permet_affichage > 0)) {if(ParaGlob::Francais()) {cout << "\n ===>>>>> intervention de la reduction du vecteur delta X, limitation des maxis ";} else {cout << "\n ===>>>>> intervention of the reduction for the vector delta X, limitation of the maxis ";}; @@ -2159,7 +2164,7 @@ void Algori::Pilotage_maxi_X_V(const Vecteur& X_t,Vecteur& X_tdt,const Vecteur& double maxDeltaDdl=vec_trav.Max_val_abs(); if (maxDeltaDdl > normeMax_V_increment) { double facteur=(normeMax_V_increment/maxDeltaDdl); - if (ParaGlob::NiveauImpression() > 2) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 2)) || (permet_affichage > 0)) {if(ParaGlob::Francais()) {cout << "\n ===>>>>> intervention de la reduction du vecteur delta V ";} else {cout << "\n ===>>>>> intervention of the reduction for the vector delta V ";}; @@ -2184,7 +2189,7 @@ void Algori::Pilotage_maxi_X_V(const Vecteur& X_t,Vecteur& X_tdt,const Vecteur& { vec_trav(i) = Signe(vec_trav(i),maxa); modif = true;}; }; if (modif) - {if (ParaGlob::NiveauImpression() > 4) + {if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 4)) || (permet_affichage > 0)) {if(ParaGlob::Francais()) {cout << "\n ===>>>>> intervention de la reduction du vecteur delta V, limitation des maxis ";} else {cout << "\n ===>>>>> intervention of the reduction for the vector delta V, limitation of the maxis ";}; @@ -2222,9 +2227,15 @@ void Algori::TdtversT() // pour un problème de mécanique, en comparant le nombre de point d'intégration total // et le nombre totale de degré de liberté void Algori::VerifSingulariteRaideurMeca(int nbddl,const LesMaillages& lesMail) const - { if (ParaGlob::NiveauImpression() != 0) + { + #ifdef UTILISATION_MPI + // cas d'un calcul //, seule la matrice du CPU 0 est concernée + if (ParaGlob::Monde()->rank() != 0) + return ; + #endif + if (ParaGlob::NiveauImpression() != 0) { // récup du nombre de grandeurs génératrices - Enum_ddl enu(SIG11); // init par défaut +// Enum_ddl enu(SIG11); // init par défaut // on récupère la liste des problèmes physiques gérés par les éléments de tous les maillages const list & li = lesMail.Ddl_representatifs_des_physiques(); @@ -2236,12 +2247,12 @@ void Algori::VerifSingulariteRaideurMeca(int nbddl,const LesMaillages& lesMail) // affichage const double ratio = 1.2; // le pourcentage if (nbpt < ratio * nbddl) - if ((ParaGlob::NiveauImpression() > 0) || (permet_affichage> 0)) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 0)) || (permet_affichage > 0)) { cout << "\n *** Attention, le nombre total de grandeurs generatrices aux point d'integrations dans " << " le probleme: " << nbpt << " est inferieur " << " a " << ratio << " * le nombre total de ddl du probleme !! c-a-d: "<< int(ratio * nbddl) << "\n en consequence il est possible que la matrice de raideur soit naturellement singuliere \n\n "; - if (ParaGlob::NiveauImpression() > 7) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 7)) || (permet_affichage > 0)) cout << "\n void Algori::VerifSingulariteRaideurMeca(... "; }; }; @@ -2282,7 +2293,7 @@ void Algori::Coherence_Algo_typeConvergence() && (Evolution_temporelle_du_calcul(typeCalcul) != AUCUNE_EVOLUTION)) { cout << "\n *** erreur: utilisation de la norme E_cinetique/E_statique avec un calcul non dynamique" << " arret ! "; - if (ParaGlob::NiveauImpression() > 5) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 5)) || (permet_affichage > 0)) cout << "\n Algori::Coherence_Algo_typeConvergence() "; // dans le cas où un comptage du calcul est en cours on l'arrête if (tempsCalEquilibre.Comptage_en_cours()) diff --git a/Algo/AlgoRef/Algori4.cc b/Algo/AlgoRef/Algori4.cc index aa69c43..de8f390 100644 --- a/Algo/AlgoRef/Algori4.cc +++ b/Algo/AlgoRef/Algori4.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -421,6 +421,11 @@ void Algori::Passage_de_grandeurs_globales_vers_noeuds_pour_variables_globales(L // Temps_CPU_HZpp temps_metrique_K_SM; // lesTempsCpu(14) // Temps_CPU_HZpp temps_chargement; // lesTempsCpu(15) // Temps_CPU_HZpp temps_rech_contact; // lesTempsCpu(16) +// si calcul // +// Temps_CPU_HZpp temps_transfert_court; // lesTempsCpu(17) +// Temps_CPU_HZpp temps_transfert_long ; // lesTempsCpu(19) +// Temps_CPU_HZpp temps_attente; // lesTempsCpu(18) + // // Tableau lesTempsCpu; // un tableau intermédiaire qui récupère et globalise les temps pour les sorties // // via listeVarGlob, mais c'est les variables Temps_CPU_HZpp qui stockent @@ -475,7 +480,12 @@ void Algori::Temps_CPU_HZpp_to_lesTempsCpu lesTempsCpu(15)(1)= temps_chargement.Temps_CPU_User(); temps_rech_contact = contact.Temps_cpu_Contact(); lesTempsCpu(16)(1)= temps_rech_contact.Temps_CPU_User(); - + #ifdef UTILISATION_MPI + lesTempsCpu(17)(1)= temps_transfert_court.Temps_CPU_User(); + lesTempsCpu(19)(1)= temps_transfert_long.Temps_CPU_User(); + lesTempsCpu(18)(1)= temps_attente.Temps_CPU_User(); + #endif + }; // idem la méthode de transfert si-dessus mais concerne uniquement les temps internes à l'algo @@ -502,6 +512,11 @@ Tableau & Algori::Ajout_Temps_CPU_HZpp_to_lesTempsCpu(Tableau < lesTsCpu(8) += tempsSortieFilCalcul; // conversion de long long en double lesTsCpu(9) += tempsRaidSmEnerContact; // conversion de long long en double lesTsCpu(10) += tempsSecondMembreEnergContact; // conversion de long long en double + #ifdef UTILISATION_MPI + lesTsCpu(17) += temps_transfert_court; + lesTsCpu(19) += temps_transfert_long; + lesTsCpu(18) += temps_attente; + #endif // retour return lesTsCpu; @@ -526,6 +541,11 @@ void Algori::Arret_du_comptage_CPU() temps_metrique_K_SM.Arret_du_comptage(); temps_chargement.Arret_du_comptage(); temps_rech_contact.Arret_du_comptage(); + #ifdef UTILISATION_MPI + temps_transfert_court.Arret_du_comptage(); + temps_transfert_long.Arret_du_comptage(); + temps_attente.Arret_du_comptage(); + #endif }; // sortie sur fichier des temps cpu @@ -561,7 +581,11 @@ void Algori::Sortie_temps_cpu(const LesCondLim& lesCondLim // écriture des temps cpu de l'algo: sort_cpu << "\n=========================================================================="; + #ifndef UTILISATION_MPI sort_cpu << "\n Herezh++ : bilan temps cpu pour l'algorithme: " << Nom_TypeCalcul(TypeDeCalcul());; + #else + sort_cpu << "\n Herezh++ : (CPU "<< ParaGlob::Monde()->rank() << ") bilan temps cpu pour l'algorithme: " << Nom_TypeCalcul(TypeDeCalcul());; + #endif sort_cpu << "\n==========================================================================\n"; // puis affichage de la version ParaGlob::Sortie_Version(sort_cpu); @@ -642,6 +666,20 @@ void Algori::Sortie_temps_cpu(const LesCondLim& lesCondLim << "("<< std::setw(nbdigit) << (100*tempsSortieFilCalcul.Temps_CPU_User()/total_cpu) << " % ) " << tempsSortieFilCalcul.Temps_CPU_User_milli() ; + #ifdef UTILISATION_MPI + sort_cpu << "\n tps__transfert_cour_inter_cpu " + << "("<< std::setw(nbdigit) << (100*temps_transfert_court.Temps_CPU_User()/total_cpu) << " % ) " + << temps_transfert_court.Temps_CPU_User_milli() + ; + sort_cpu << "\n tps__transfert_long_inter_cpu " + << "("<< std::setw(nbdigit) << (100*temps_transfert_long.Temps_CPU_User()/total_cpu) << " % ) " + << temps_transfert_long.Temps_CPU_User_milli() + ; + sort_cpu << "\n tps__attente_inter_cpu " + << "("<< std::setw(nbdigit) << (100*temps_attente.Temps_CPU_User()/total_cpu) << " % ) " + << temps_attente.Temps_CPU_User_milli() + ; + #endif sort_cpu << "\n"; }; @@ -856,16 +894,19 @@ bool Algori::Gestion_stockage_et_renumerotation_avec_contact(bool premier_calcul ,LesCondLim* lesCondLim,LesReferences* lesRef ,Tableau & tab_mato,const Nb_assemb& nb_casAssemb ,LesContacts* lescontacts,int niveau_substitution) - { // --- calcul des éléments de contact: (correspond à la définition de la surface de contact) - // definition ou mise à jour, des elements de contact eventuels - // - imposition (en fonction de l'algorithme de contact) de conditions particulières de penetration (nulle par exemple) + { + #ifdef UTILISATION_MPI + // cas d'un calcul //, seule la (ou les) matrices du CPU 0 sont concernées + // donc s'il s'agit d'un CPU différent, on revient immédiatement + if (ParaGlob::Monde()->rank() != 0) + return false; + #endif + TroisEntiers nevez_largeurs; bool retour = false; // init pas de changement a priori au niveau des matrices if (premier_calcul) {// si demandé, renumérotation en fonction des éléments en contact - if ((ParaGlob::param->ParaAlgoControleActifs().Optimisation_numerotation()) - || (ParaGlob::param->ParaAlgoControleActifs().Optimisation_numerotation()) - ) + if (ParaGlob::param->ParaAlgoControleActifs().Optimisation_numerotation()) { // récup des connexions entre noeud dues aux contacts const Tableau & tabCondLine= lescontacts->ConnectionCLL(); if (tabCondLine.Taille() > 0) //cas où il faut en tenir compte @@ -873,7 +914,7 @@ bool Algori::Gestion_stockage_et_renumerotation_avec_contact(bool premier_calcul Tableau > tabCLL(lesCondLim->ConnectionCLL(lesMail,lesRef)); int tailtabCLL = tabCLL.Taille();tabCLL.Change_taille(tailtabCLL+1); tabCLL(tailtabCLL+1) = tabCondLine; // ajout de la partie contact - if (ParaGlob::NiveauImpression() >= 3) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 2)) || (permet_affichage > 2)) cout << "\n -- renumerotation en tenant compte des elements de contact "; // appel de l'utilitaire dans lesMaillages: avec mise à jour dans la foulée de l'assemblage bool calcul_ok = lesMail->Renumerotation(*lesRef,tabCLL,nevez_largeurs,&nb_casAssemb,true); @@ -902,9 +943,7 @@ bool Algori::Gestion_stockage_et_renumerotation_avec_contact(bool premier_calcul } //-- fin du cas si premier calcul else {if (nouvelle_situation_contact) - {if ((ParaGlob::param->ParaAlgoControleActifs().Optimisation_numerotation()) - || (ParaGlob::param->ParaAlgoControleActifs().Optimisation_numerotation()) - ) + {if (ParaGlob::param->ParaAlgoControleActifs().Optimisation_numerotation()) { // récup des connexions entre noeud dues aux contacts const Tableau & tabCondLine= lescontacts->ConnectionCLL(); if (tabCondLine.Taille() > 0) //cas où il faut en tenir compte @@ -913,8 +952,8 @@ bool Algori::Gestion_stockage_et_renumerotation_avec_contact(bool premier_calcul Tableau > tabCLL(lesCondLim->Tab_CLinApplique()); int tailtabCLL = tabCLL.Taille();tabCLL.Change_taille(tailtabCLL+1); tabCLL(tailtabCLL+1) = tabCondLine; // ajout de la partie contact - if (ParaGlob::NiveauImpression() >= 3) - cout << "\n -- renumerotation en tenant compte des elements de contact "; + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 2)) || (permet_affichage > 2)) + cout << "\n -- renumerotation en tenant compte d'un changement de contact "; // appel de l'utilitaire dans lesMaillages: avec mise à jour dans la foulée de l'assemblage bool calcul_ok = lesMail->Renumerotation(*lesRef,tabCLL,nevez_largeurs,&nb_casAssemb,true); if (calcul_ok) // cas où il y a eu effectivement un changement de numérotation @@ -968,7 +1007,15 @@ bool Algori::Gestion_stockage_et_renumerotation_sans_contact(LesContacts* lesco ,LesCondLim* lesCondLim,LesReferences* lesRef ,Tableau & tab_mato,const Nb_assemb& nb_casAssemb ,int niveau_substitution) - { TroisEntiers nevez_largeurs; + { + #ifdef UTILISATION_MPI + // cas d'un calcul //, seule la (ou les) matrices du CPU 0 sont concernées + // donc s'il s'agit d'un CPU différent, on revient immédiatement + if (ParaGlob::Monde()->rank() != 0) + return false; + #endif + + TroisEntiers nevez_largeurs; bool retour = false; // init pas de changement a priori au niveau des matrices if (premier_calcul) {// si demandé, renumérotation des pointeurs d'assemblage @@ -977,7 +1024,7 @@ bool Algori::Gestion_stockage_et_renumerotation_sans_contact(LesContacts* lesco Tableau > tabCLL(lesCondLim->ConnectionCLL(lesMail,lesRef)); // int tailtabCLL = tabCLL.Taille();tabCLL.Change_taille(tailtabCLL+1); // tabCLL(tailtabCLL+1) = tabCondLine; // ajout de la partie contact - if (ParaGlob::NiveauImpression() >= 3) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 2)) || (permet_affichage > 2)) cout << "\n -- renumerotation des pointeurs d'assemblage en tenant compte des CLL "; // appel de l'utilitaire dans lesMaillages: avec mise à jour dans la foulée de l'assemblage bool calcul_ok = lesMail->Renumerotation(*lesRef,tabCLL,nevez_largeurs,&nb_casAssemb,true); @@ -1001,7 +1048,7 @@ bool Algori::Gestion_stockage_et_renumerotation_sans_contact(LesContacts* lesco { // récup des connexions entre noeuds dues aux CLL externes: comme les cll ont été mises à jour // on récupère directement le tableau Tableau > tabCLL(lesCondLim->Tab_CLinApplique()); - if (ParaGlob::NiveauImpression() >= 3) + if ( ((permet_affichage==0) && (ParaGlob::NiveauImpression() > 2)) || (permet_affichage > 2)) cout << "\n -- renumerotation des pointeurs d'assemblage en tenant compte des CLL "; // appel de l'utilitaire dans lesMaillages: avec mise à jour dans la foulée de l'assemblage bool calcul_ok = lesMail->Renumerotation(*lesRef,tabCLL,nevez_largeurs,&nb_casAssemb,true); @@ -1046,7 +1093,8 @@ void Algori::Cal_Transfert_delta_et_var_X(double& max_delta_X, double& max_var_d Algori* Algori::New_Agori(EnumTypeCalcul id_TypeCalcul,const bool avec_typeDeCalcul ,const list & soustype ,const list & avec_soustypeDeCalcul - ,UtilLecture& entreePrinc) + ,UtilLecture& entreePrinc + ) { // définition du pointeur de retour Algori* algo_specifique; @@ -1149,7 +1197,8 @@ Tableau Algori::New_tous_les_Algo ,UtilLecture& entreePrinc) { // définition du tableau de pointeurs de retour Tableau tab_algo_specifique(15); - + // la méthode ne doit pas fonctionner dans le cas d'un calcul // + #ifndef UTILISATION_MPI tab_algo_specifique(1) = new AlgoriNonDyna (avec_typeDeCalcul,soustype,avec_soustypeDeCalcul,entreePrinc); tab_algo_specifique(2) = new ImpliNonDynaCont @@ -1180,7 +1229,118 @@ Tableau Algori::New_tous_les_Algo (avec_typeDeCalcul,soustype,avec_soustypeDeCalcul,entreePrinc); tab_algo_specifique(15) = new AlgoriCombine (avec_typeDeCalcul,soustype,avec_soustypeDeCalcul,entreePrinc); - + #else + // c'est une erreur + cout << "\n *** erreur: la methode Algori::New_tous_les_Algo n'est pas prevu " + << " pour fonctionner en calcul parallele, veuillez utiliser la version " + << " mono processeur! "<< endl; + Sortie(1); + #endif return tab_algo_specifique; }; + +#ifdef UTILISATION_MPI + // cas d'un calcul parallèle, passage des indicateurs + // calculés par le process 0 aux process de calcul + void Algori::Passage_indicConvergenceAuxProcCalcul() + {// seule le process 0 a fait la résolution globale + // il gère seul également la convergence, mais il doit tenir au courant les autres process + // on utilise un std::array pour passer en une fois les infos + temps_transfert_court.Mise_en_route_du_comptage(); // comptage cpu + std::array indic_convergence = {phase_de_convergence,nombre_de_bonnes_convergences + ,nombre_de_mauvaises_convergences,a_converge + ,a_converge_iterMoins1,nb_cycle_test_max_var_residu + }; + broadcast(*ParaGlob::Monde(), indic_convergence, 0); +// ParaGlob::Monde()->barrier(); + if (ParaGlob::Monde()->rank() != 0) + // on récupère les grandeurs + {phase_de_convergence = indic_convergence[0]; + nombre_de_bonnes_convergences = indic_convergence[1]; + nombre_de_mauvaises_convergences = indic_convergence[2]; + a_converge = indic_convergence[3]; + a_converge_iterMoins1 = indic_convergence[4]; + nb_cycle_test_max_var_residu = indic_convergence[5]; + }; + temps_transfert_court.Arret_du_comptage(); // fin comptage cpu + }; + // globalisation des grandeurs globales: proc de calcul -> maitre puis transmission à ParaGlob + // et transmission aux proc de calcul: + // on ne demande pas à ParaGlob de faire la transmission, car il ne sait pas ce qu'il transmet + // et les infos ne sont pas contigües, le transfert ne sera pas performant + void Algori::Globalisation_et_transfert_auxProcCalcul_grandeurs_globales() + { // on s'occupe tout d'abord des grandeurs directement gérées par Algori + Vecteur inter(10); // vecteur de passage + + // inter(1) = + + + +// ENERGIE_CINETIQUE -> inter(1) +// ENERGIE_EXTERNE -> 2 +// ENERGIE_INTERNE -> 3 +// PUISSANCE_ACCELERATION); +// PUISSANCE_INTERNE); +// PUISSANCE_EXTERNE); +// PUISSANCE_BILAN); +// ENERGIE_ELASTIQUE); +// ENERGIE_PLASTIQUE); +// ENERGIE_VISQUEUSE); +// ENERGIE_BILAN); +// QUANTITE_MOUVEMENT); +// ENERGIE_PENALISATION); +// ENERGIE_FROT_ELAST); +// ENERGIE_FROT_PLAST); +// ENERGIE_FROT_VISQ); +// ENERGIE_VISCO_NUMERIQUE); +// ENERGIE_BULK_VISCOSITY); +// ENERGIE_HOURGLASS_); +// ENERGIE_STABILISATION_MEMB_BIEL); +// VOLUME_TOTAL_MATIERE); +// MAXPUISSEXT); +// MAXPUISSINT); +// MAXREACTION); +// MAXRESIDUGLOBAL); +// MAXdeltaX); +// MAXvarDeltaX); +// MAXvarDdl); + + +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,ENERGIE_CINETIQUE); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,ENERGIE_EXTERNE); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,ENERGIE_INTERNE); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,PUISSANCE_ACCELERATION); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,PUISSANCE_INTERNE); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,PUISSANCE_EXTERNE); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,PUISSANCE_BILAN); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,ENERGIE_ELASTIQUE); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,ENERGIE_PLASTIQUE); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,ENERGIE_VISQUEUSE); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,ENERGIE_BILAN); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,QUANTITE_MOUVEMENT); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,ENERGIE_PENALISATION); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,ENERGIE_FROT_ELAST); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,ENERGIE_FROT_PLAST); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,ENERGIE_FROT_VISQ); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,ENERGIE_VISCO_NUMERIQUE); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,ENERGIE_BULK_VISCOSITY); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,ENERGIE_HOURGLASS_); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,ENERGIE_STABILISATION_MEMB_BIEL); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,VOLUME_TOTAL_MATIERE); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,MAXPUISSEXT); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,MAXPUISSINT); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,MAXREACTION); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,MAXRESIDUGLOBAL); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,MAXdeltaX); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,MAXvarDeltaX); +// ParaGlob::param->Ajout_grandeur_consultable(&typQ1,MAXvarDdl); + + + + }; +#endif + + + + diff --git a/Algo/AlgoUtilitaires/AlgoInformations.cc b/Algo/AlgoUtilitaires/AlgoInformations.cc index c230b71..57f72d4 100644 --- a/Algo/AlgoUtilitaires/AlgoInformations.cc +++ b/Algo/AlgoUtilitaires/AlgoInformations.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Algo/AlgoUtilitaires/AlgoInformations.h b/Algo/AlgoUtilitaires/AlgoInformations.h index aa65578..031c8f3 100644 --- a/Algo/AlgoUtilitaires/AlgoInformations.h +++ b/Algo/AlgoUtilitaires/AlgoInformations.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -90,6 +90,7 @@ class AlgoInformations : public Algori << " l'algo passe en parametre est en fait : " << Nom_TypeCalcul(algo->TypeDeCalcul()) << " arret !! " << flush; Sortie(1); + return NULL; } else { AlgoInformations* inter = (AlgoInformations*) algo; diff --git a/Algo/AlgoUtilitaires/AlgoUmatAbaqus.cc b/Algo/AlgoUtilitaires/AlgoUmatAbaqus.cc index 7246495..228d8a7 100644 --- a/Algo/AlgoUtilitaires/AlgoUmatAbaqus.cc +++ b/Algo/AlgoUtilitaires/AlgoUmatAbaqus.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -522,7 +522,7 @@ void AlgoUmatAbaqus::Calcul_Umat(ParaGlob * paraGlob,LesMaillages * lesMail, void AlgoUmatAbaqus::Ecrit_Base_info_Parametre(UtilLecture& entreePrinc,const int& cas) { // récup du flot - ofstream * sort = entreePrinc.Sort_BI(); +// ofstream * sort = entreePrinc.Sort_BI(); // (*sort) << "\n parametres_algo_specifiques_ "<< Nom_TypeCalcul(this->TypeDeCalcul()); // ecriture: rien pour l'instant // if (cas == 1) @@ -542,7 +542,7 @@ void AlgoUmatAbaqus::Lecture_Base_info_Parametre(UtilLecture& entreePrinc,const {if (choix) {// cas d'une lecture normale // récup du flot - ifstream * ent = entreePrinc.Ent_BI(); +// ifstream * ent = entreePrinc.Ent_BI(); // pour l'instant on ne lit rien } } diff --git a/Algo/AlgoUtilitaires/AlgoUmatAbaqus.h b/Algo/AlgoUtilitaires/AlgoUmatAbaqus.h index bbd02a5..c83911f 100644 --- a/Algo/AlgoUtilitaires/AlgoUmatAbaqus.h +++ b/Algo/AlgoUtilitaires/AlgoUmatAbaqus.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Algo/AlgoUtilitaires/AlgoUtils.cc b/Algo/AlgoUtilitaires/AlgoUtils.cc index fbd8d0e..a7e36fa 100644 --- a/Algo/AlgoUtilitaires/AlgoUtils.cc +++ b/Algo/AlgoUtilitaires/AlgoUtils.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -91,10 +91,13 @@ void AlgoUtils::Execution(ParaGlob * p,LesMaillages * lesMail // on vérifie que les noeuds sont bien attachés à un élément sinon on met un warning si niveau > 2 if (ParaGlob::NiveauImpression() > 2) lesMail->AffichageNoeudNonReferencer(); + // definition des elements de frontiere, ces elements sont utilises pour le contact + int cal_front = lesMail->CreeElemFront(); + // calcul éventuel des normales aux noeuds -> init des normales pour t=0 + lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // dans le cas d'un contact éventuel on initialise les frontières et la répartition esclave et maître if (lesMail->NbEsclave() != 0) { // definition des elements de frontiere, ces elements sont utilises pour le contact - int cal_front = lesMail->CreeElemFront(); lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); if (lesContacts->Init_contact_pas_effectue()) {// initialisation des zones de contacts éventuelles diff --git a/Algo/AlgoUtilitaires/AlgoUtils.h b/Algo/AlgoUtilitaires/AlgoUtils.h index c0ef468..d32fff9 100644 --- a/Algo/AlgoUtilitaires/AlgoUtils.h +++ b/Algo/AlgoUtilitaires/AlgoUtils.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -94,6 +94,7 @@ class AlgoUtils : public Algori << " l'algo passe en parametre est en fait : " << Nom_TypeCalcul(algo->TypeDeCalcul()) << " arret !! " << flush; Sortie(1); + return NULL; } else { AlgoUtils* inter = (AlgoUtils*) algo; diff --git a/Algo/AlgoUtilitaires/AlgoriRemontErreur.h b/Algo/AlgoUtilitaires/AlgoriRemontErreur.h index a30b8c6..4f21ef7 100644 --- a/Algo/AlgoUtilitaires/AlgoriRemontErreur.h +++ b/Algo/AlgoUtilitaires/AlgoriRemontErreur.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Algo/AlgoUtilitaires/RemontErreur.cc b/Algo/AlgoUtilitaires/RemontErreur.cc index e75f2f0..2613bb5 100644 --- a/Algo/AlgoUtilitaires/RemontErreur.cc +++ b/Algo/AlgoUtilitaires/RemontErreur.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Algo/AlgorithmeCombiner/AlgoriCombine.cc b/Algo/AlgorithmeCombiner/AlgoriCombine.cc index c3f71a6..a5a40ab 100755 --- a/Algo/AlgorithmeCombiner/AlgoriCombine.cc +++ b/Algo/AlgorithmeCombiner/AlgoriCombine.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -316,7 +316,7 @@ void AlgoriCombine::lecture_Parametres(UtilLecture& entreePrinc) while ( !motCle.SimotCle(entreePrinc.tablcar)) ; // si le mot clé est "PARA_TYPE_DE_CALCUL" cela signifie // qu'il y a un paramètre à lire - bool lecture_effective = false; +// bool lecture_effective = false; if (strstr(entreePrinc.tablcar,"PARA_TYPE_DE_CALCUL")!=NULL) { //cas de la définition de paramètres // on signale à Algori qu'il y a eu déjà une lecture de paramètre @@ -846,7 +846,8 @@ void AlgoriCombine::Lecture_algo_interne(const bool avec_typeDeCal string nom_class_methode("AlgoriCombine::Lecture_algo_interne(..."); // pour info lecture // on passe le mot clé de début de liste string mot_cle = "liste_algorithmes_a_combiner_"; - bool lec_eff = entreePrinc.Lecture_et_verif_mot_cle(nom_class_methode,mot_cle); +// bool lec_eff = entreePrinc.Lecture_et_verif_mot_cle(nom_class_methode,mot_cle); + entreePrinc.Lecture_et_verif_mot_cle(nom_class_methode,mot_cle); list < Algori * > list_algori_inter; // une liste de travail pour la lecture // maintenant on va lire chaque algorithme entreePrinc.NouvelleDonnee(); @@ -924,6 +925,10 @@ void AlgoriCombine::AutreSortieTempsCPU(ofstream& sort,const int ) const // Temps_CPU_HZpp temps_metrique_K_SM; // lesTempsCpu(14) // Temps_CPU_HZpp temps_chargement; // lesTempsCpu(15) // Temps_CPU_HZpp temps_rech_contact; // lesTempsCpu(16) + // cas d'un calcul parallèle: // passage des infos entre process + // Temps_CPU_HZpp temps_transfert_court ; // lesTempsCpu(17) + // Temps_CPU_HZpp temps_transfert_long ; // lesTempsCpu(19) + // Temps_CPU_HZpp temps_attente ; // lesTempsCpu(18) sort << "\n tps_InitAlgo " << lesTsCpu(1); sort << "\n tps_MiseAJourAlgo "<< lesTsCpu(2); sort << "\n tps_CalEquilibre "<< lesTsCpu(3); diff --git a/Algo/AlgorithmeCombiner/AlgoriCombine.h b/Algo/AlgorithmeCombiner/AlgoriCombine.h index 1f80178..2761603 100755 --- a/Algo/AlgorithmeCombiner/AlgoriCombine.h +++ b/Algo/AlgorithmeCombiner/AlgoriCombine.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -94,6 +94,7 @@ class AlgoriCombine : public Algori << " l'algo passe en parametre est en fait : " << Nom_TypeCalcul(algo->TypeDeCalcul()) << " arret !! " << flush; Sortie(1); + return NULL; } else { AlgoriCombine* inter = (AlgoriCombine*) algo; diff --git a/Algo/AlgorithmeCombiner/AlgoriCombine2.cc b/Algo/AlgorithmeCombiner/AlgoriCombine2.cc index 102b828..ee8e1ee 100755 --- a/Algo/AlgorithmeCombiner/AlgoriCombine2.cc +++ b/Algo/AlgorithmeCombiner/AlgoriCombine2.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -47,7 +47,16 @@ void AlgoriCombine::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, { // INITIALISATION globale tempsInitialisation.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(COMBINER); // transfert info - + + #ifdef UTILISATION_MPI + // calcul de l'équilibrage initiale par le cpu 0 + if (distribution_CPU_algo.Tableau_element_CPU_en_cours()->Taille() == 0 ) + {distribution_CPU_algo.Calcul_Equilibrage_initiale(lesMail); + distribution_CPU_algo.Passage_Equilibrage_aux_CPU(); + paraGlob->Init_tableau (distribution_CPU_algo.Tableau_element_CPU_en_cours()); + }; + #endif + // on s'occupe des fonctions nD de pilotage // 1) cas de choix_algo if ((nom_choix_algo.length()) && (choix_algo == NULL)) @@ -117,6 +126,10 @@ void AlgoriCombine::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, int nb_algo = tab_algo.Taille(); for (int i=1;i<=nb_algo;i++) {ParaGlob::param->Change_ParaAlgoControle(tab_algo(i)->ParaAlgoControle_de_lalgo()); + #ifdef UTILISATION_MPI + // passage de l'équilibrage à ParaGlob + paraGlob->Init_tableau (distribution_CPU_algo.Tableau_element_CPU_en_cours()); + #endif charge->ChangeParaAlgoControle(tab_algo(i)->ParaAlgoControle_de_lalgo()); tab_algo(i)->InitAlgorithme(paraGlob,lesMail,lesRef,lesCourbes1D,lesFonctionsnD,varExpor ,lesLoisDeComp,diversStockage,charge,lesCondLim,lesContacts,resultats); @@ -170,6 +183,10 @@ void AlgoriCombine::MiseAJourAlgo(ParaGlob * paraGlob,LesMaillages * lesMail, int nb_algo = tab_algo.Taille(); for (int i=1;i<=nb_algo;i++) {ParaGlob::param->Change_ParaAlgoControle(tab_algo(i)->ParaAlgoControle_de_lalgo()); + #ifdef UTILISATION_MPI + // passage de l'équilibrage à ParaGlob + paraGlob->Init_tableau (distribution_CPU_algo.Tableau_element_CPU_en_cours()); + #endif charge->ChangeParaAlgoControle(tab_algo(i)->ParaAlgoControle_de_lalgo()); tab_algo(i)->MiseAJourAlgo(paraGlob,lesMail,lesRef,lesCourbes1D,lesFonctionsnD,varExpor ,lesLoisDeComp,diversStockage,charge,lesCondLim,lesContacts,resultats); @@ -241,6 +258,11 @@ void AlgoriCombine::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail // << "\n tab_algo(3)->pa.Deltat()= " << tab_algo(3)->pa.Deltat() << flush; // //--- fin debug ParaGlob::param->Change_ParaAlgoControle(tab_algo(i)->ParaAlgoControle_de_lalgo()); + #ifdef UTILISATION_MPI + // passage de l'équilibrage à ParaGlob + paraGlob->Init_tableau (distribution_CPU_algo.Tableau_element_CPU_en_cours()); + #endif + charge->ChangeParaAlgoControle(tab_algo(i)->ParaAlgoControle_de_lalgo()); bool aff_incr=pa.Vrai_commande_sortie(icharge,temps_derniere_sauvegarde); // pour simplifier if (aff_incr) @@ -306,6 +328,11 @@ void AlgoriCombine::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail if ((i >0)&&(i <= nb_algo)) {// on met à jour ParaGlob::param->Change_ParaAlgoControle(tab_algo(i)->ParaAlgoControle_de_lalgo()); + #ifdef UTILISATION_MPI + // passage de l'équilibrage à ParaGlob + paraGlob->Init_tableau (distribution_CPU_algo.Tableau_element_CPU_en_cours()); + #endif + charge->ChangeParaAlgoControle(tab_algo(i)->ParaAlgoControle_de_lalgo()); bool aff_incr=pa.Vrai_commande_sortie(icharge,temps_derniere_sauvegarde); // pour simplifier if (aff_incr) @@ -374,10 +401,15 @@ void AlgoriCombine::FinCalcul(ParaGlob * paraGlob,LesMaillages * lesMail,LesRefe // // on passe en revue tous les algorithmes et on demande la fin des calculs // non, sinon on a plusieurs dernières sauvegardes !! // donc on ne sauvegarde la fin que via le dernier sous_algo qui a sauvegardé - int nb_algo = tab_algo.Taille(); +// int nb_algo = tab_algo.Taille(); // for (int i=1;i<=nb_algo;i++) int i=nb_dernier_algo_qui_a_fait_une_sauvegarde; {ParaGlob::param->Change_ParaAlgoControle(tab_algo(i)->ParaAlgoControle_de_lalgo()); + #ifdef UTILISATION_MPI + // passage de l'équilibrage à ParaGlob + paraGlob->Init_tableau (distribution_CPU_algo.Tableau_element_CPU_en_cours()); + #endif + charge->ChangeParaAlgoControle(tab_algo(i)->ParaAlgoControle_de_lalgo()); tab_algo(i)->FinCalcul(paraGlob,lesMail,lesRef,lesCourbes1D,lesFonctionsnD,varExpor ,lesLoisDeComp,diversStockage,charge,lesCondLim,lesContacts,resultats); diff --git a/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoRungeKutta.cc b/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoRungeKutta.cc index 4c4813a..a7b9299 100644 --- a/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoRungeKutta.cc +++ b/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoRungeKutta.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -957,7 +957,16 @@ void AlgoriRungeKutta::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail { // INITIALISATION globale tempsInitialisation.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(DYNA_RUNGE_KUTTA); // transfert info - + + #ifdef UTILISATION_MPI + // calcul de l'équilibrage initiale par le cpu 0 + if (distribution_CPU_algo.Tableau_element_CPU_en_cours()->Taille() == 0 ) + {distribution_CPU_algo.Calcul_Equilibrage_initiale(lesMail); + distribution_CPU_algo.Passage_Equilibrage_aux_CPU(); + paraGlob->Init_tableau (distribution_CPU_algo.Tableau_element_CPU_en_cours()); + }; + #endif + // avant toute chose, au cas où l'algo interviendrait après un autre algo // on inactive tous les ddl existants lesMail->Inactive_ddl(); @@ -1092,6 +1101,10 @@ void AlgoriRungeKutta::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail // initialisation du compteur d'increments de charge icharge = 0; + // definition des elements de frontiere, ces elements sont utilises pour le contact + lesMail->CreeElemFront(); + // calcul éventuel des normales aux noeuds -> init des normales pour t=0 + lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // --- init du contact --- // doit-être avant la lecture d'un restart, car il y a une initialisation de conteneurs qui est faites // qui ensuite est utilisée en restart @@ -1099,7 +1112,6 @@ void AlgoriRungeKutta::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail // pour préparer la lecture de restart éventuel if (lesMail->NbEsclave() != 0) { // definition des elements de frontiere, ces elements sont utilises pour le contact - int cal_front = lesMail->CreeElemFront(); lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); // initialisation des zones de contacts éventuelles lesContacts->Init_contact(*lesMail,*lesRef,lesFonctionsnD); @@ -1108,6 +1120,7 @@ void AlgoriRungeKutta::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail // definition des elements de contact eventuels lesContacts->DefElemCont(0.); // au début le déplacement des noeuds est nul }; + //--cas de restart et/ou de sauvegarde------------ // tout d'abord récup du restart si nécessaire // dans le cas ou un incrément différent de 0 est demandé -> seconde lecture à l'incrément @@ -1129,7 +1142,7 @@ void AlgoriRungeKutta::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); @@ -1169,9 +1182,6 @@ void AlgoriRungeKutta::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail } } //--fin cas de restart et/ou de sauvegarde-------- - - // calcul éventuel des normales aux noeuds -> init des normales pour t=0 - lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // ajout d'un conteneur pour les coordonnées à l'itération 0 {Coordonnee coor(ParaGlob::Dimension()); // un type coordonnee typique diff --git a/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoRungeKutta.h b/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoRungeKutta.h index d54965c..4cc6202 100644 --- a/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoRungeKutta.h +++ b/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoRungeKutta.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -89,6 +89,7 @@ class AlgoriRungeKutta : public Algori << " l'algo passe en parametre est en fait : " << Nom_TypeCalcul(algo->TypeDeCalcul()) << " arret !! " << flush; Sortie(1); + return NULL; } else { AlgoriRungeKutta* inter = (AlgoriRungeKutta*) algo; diff --git a/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli.cc b/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli.cc index d2dfd15..f881bf2 100644 --- a/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli.cc +++ b/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -288,6 +288,9 @@ void AlgoriDynaExpli::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMai { // INITIALISATION globale tempsInitialisation.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(DYNA_EXP); // transfert info + // init var glob: du num d'itération. De manière arbitraire, en dynamique explicite + Transfert_ParaGlob_COMPTEUR_ITERATION_ALGO_GLOBAL(1); // on a toujours une seule itération + // cas du chargement, on verifie egalement la bonne adequation des references charge->Initialise(lesMail,lesRef,pa,*lesCourbes1D,*lesFonctionsnD); // on indique que l'on ne souhaite pas le temps fin stricte @@ -392,6 +395,10 @@ void AlgoriDynaExpli::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMai // initialisation du compteur d'increments de charge icharge = 1; + // definition des elements de frontiere, ces elements sont utilises pour le contact + lesMail->CreeElemFront(); + // calcul éventuel des normales aux noeuds -> init des normales pour t=0 + lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // --- init du contact --- // doit-être avant la lecture d'un restart, car il y a une initialisation de conteneurs qui est faites // qui ensuite est utilisée en restart @@ -399,7 +406,6 @@ void AlgoriDynaExpli::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMai // pour préparer la lecture de restart éventuel if (lesMail->NbEsclave() != 0) { // definition des elements de frontiere, ces elements sont utilises pour le contact - int cal_front = lesMail->CreeElemFront(); lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); // initialisation des zones de contacts éventuelles lesContacts->Init_contact(*lesMail,*lesRef,lesFonctionsnD); @@ -430,7 +436,7 @@ void AlgoriDynaExpli::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMai lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); @@ -542,10 +548,10 @@ void AlgoriDynaExpli::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMai double maxPuissInt; // maxi de la puissance des efforts internes double maxReaction; // maxi des reactions int inReaction = 0; // pointeur d'assemblage pour le maxi de reaction - int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl - double maxDeltaDdl=0; // // maxi de variation de ddl +// int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl +// double maxDeltaDdl=0; // // maxi de variation de ddl // initialisation de la variable puissance_précédente d'une itération à l'autre - double puis_precedente = 0.; +// double puis_precedente = 0.; // mise à jour du calcul éventuel des normales aux noeuds -> mise à jour des normales à t // mais ici, on calcule les normales à tdt, et on transfert à t @@ -866,7 +872,7 @@ void AlgoriDynaExpli::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMai Algori::TdtversT(); if (pa.ContactType()) { // actualisation des éléments de contact et éventuellement inactivation d'éléments - lesContacts->Actualisation(); // si on n'a plus de projection + lesContacts->Actualisation(0); // si on n'a plus de projection // on inactive les éléments de contact qui se relache: testé soit via la réaction lesContacts->RelachementNoeudcolle(); // ou via la sortie d'une zone d'accostage (dépend de l'algo) }; diff --git a/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli.h b/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli.h index 06596ae..8808772 100644 --- a/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli.h +++ b/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -93,6 +93,7 @@ class AlgoriDynaExpli : public Algori << " l'algo passe en parametre est en fait : " << Nom_TypeCalcul(algo->TypeDeCalcul()) << " arret !! " << flush; Sortie(1); + return NULL; } else { AlgoriDynaExpli* inter = (AlgoriDynaExpli*) algo; diff --git a/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli2.cc b/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli2.cc index 80b13cf..ed8398e 100644 --- a/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli2.cc +++ b/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli2.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -43,6 +43,8 @@ void AlgoriDynaExpli::Calcul_Equilibre2(ParaGlob * paraGlob,LesMaillages * lesMa { // INITIALISATION globale tempsInitialisation.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(DYNA_EXP); // transfert info + // init var glob: du num d'itération. De manière arbitraire, en dynamique explicite + Transfert_ParaGlob_COMPTEUR_ITERATION_ALGO_GLOBAL(1); // on a toujours une seule itération // cas du chargement, on verifie egalement la bonne adequation des references charge->Initialise(lesMail,lesRef,pa,*lesCourbes1D,*lesFonctionsnD); // on indique que l'on ne souhaite pas le temps fin stricte @@ -148,6 +150,10 @@ void AlgoriDynaExpli::Calcul_Equilibre2(ParaGlob * paraGlob,LesMaillages * lesMa // au premier passage il y a un traitement spécial: pas d'incrémentation du temps, pas de sauvegarde // in s'agit d'un incrément de mise en place, l'équilibre se faisant à la fin icharge = 0; + // definition des elements de frontiere, ces elements sont utilises pour le contact + lesMail->CreeElemFront(); + // calcul éventuel des normales aux noeuds -> init des normales pour t=0 + lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // --- init du contact --- // doit-être avant la lecture d'un restart, car il y a une initialisation de conteneurs qui est faites // qui ensuite est utilisée en restart @@ -155,7 +161,6 @@ void AlgoriDynaExpli::Calcul_Equilibre2(ParaGlob * paraGlob,LesMaillages * lesMa // pour préparer la lecture de restart éventuel if (lesMail->NbEsclave() != 0) { // definition des elements de frontiere, ces elements sont utilises pour le contact - int cal_front = lesMail->CreeElemFront(); lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); // initialisation des zones de contacts éventuelles lesContacts->Init_contact(*lesMail,*lesRef,lesFonctionsnD); @@ -188,7 +193,7 @@ void AlgoriDynaExpli::Calcul_Equilibre2(ParaGlob * paraGlob,LesMaillages * lesMa lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); @@ -304,10 +309,10 @@ void AlgoriDynaExpli::Calcul_Equilibre2(ParaGlob * paraGlob,LesMaillages * lesMa double maxPuissInt; // maxi de la puissance des efforts internes double maxReaction; // maxi des reactions int inReaction = 0; // pointeur d'assemblage pour le maxi de reaction - int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl - double maxDeltaDdl=0; // // maxi de variation de ddl +// int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl +// double maxDeltaDdl=0; // // maxi de variation de ddl // initialisation de la variable puissance_précédente d'une itération à l'autre - double puis_precedente = 0.; +// double puis_precedente = 0.; // mise à jour du calcul éventuel des normales aux noeuds -> mise à jour des normales à t // mais ici, on calcule les normales à tdt, et on transfert à t @@ -653,7 +658,7 @@ void AlgoriDynaExpli::Calcul_Equilibre2(ParaGlob * paraGlob,LesMaillages * lesMa // actualisation des éléments de contact et éventuellement suppression if (pa.ContactType()) { // actualisation des éléments de contact et éventuellement inactivation d'éléments - lesContacts->Actualisation(); // si on n'a plus de projection + lesContacts->Actualisation(0); // si on n'a plus de projection // on inactive les éléments de contact qui se relache: testé soit via la réaction lesContacts->RelachementNoeudcolle(); // ou via la sortie d'une zone d'accostage (dépend de l'algo) }; @@ -794,7 +799,16 @@ void AlgoriDynaExpli::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, { // INITIALISATION globale tempsInitialisation.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(DYNA_EXP); // transfert info - + + #ifdef UTILISATION_MPI + // calcul de l'équilibrage initiale par le cpu 0 + if (distribution_CPU_algo.Tableau_element_CPU_en_cours()->Taille() == 0 ) + {distribution_CPU_algo.Calcul_Equilibrage_initiale(lesMail); + distribution_CPU_algo.Passage_Equilibrage_aux_CPU(); + paraGlob->Init_tableau (distribution_CPU_algo.Tableau_element_CPU_en_cours()); + }; + #endif + // avant toute chose, au cas où l'algo interviendrait après un autre algo // on inactive tous les ddl existants lesMail->Inactive_ddl(); @@ -927,6 +941,10 @@ void AlgoriDynaExpli::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, // in s'agit d'un incrément de mise en place, l'équilibre se faisant à la fin compteur_demarrage = 0; // pas vraiment utile, car sera redéfini dans CalEquilibre icharge = 0; + // definition des elements de frontiere, ces elements sont utilises pour le contact + lesMail->CreeElemFront(); + // calcul éventuel des normales aux noeuds -> init des normales pour t=0 + lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // --- init du contact --- // doit-être avant la lecture d'un restart, car il y a une initialisation de conteneurs qui est faites // qui ensuite est utilisée en restart @@ -934,7 +952,6 @@ void AlgoriDynaExpli::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, // pour préparer la lecture de restart éventuel if (lesMail->NbEsclave() != 0) { // definition des elements de frontiere, ces elements sont utilises pour le contact - int cal_front = lesMail->CreeElemFront(); lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); // initialisation des zones de contacts éventuelles lesContacts->Init_contact(*lesMail,*lesRef,lesFonctionsnD); @@ -943,6 +960,7 @@ void AlgoriDynaExpli::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, // definition des elements de contact eventuels lesContacts->DefElemCont(0.); // au début le déplacement des noeuds est nul }; + //--cas de restart et/ou de sauvegarde------------ // tout d'abord récup du restart si nécessaire // dans le cas ou un incrément différent de 0 est demandé -> seconde lecture à l'incrément @@ -964,7 +982,7 @@ void AlgoriDynaExpli::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); @@ -1004,9 +1022,6 @@ void AlgoriDynaExpli::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, } }; //--fin cas de restart et/ou de sauvegarde-------- - - // calcul éventuel des normales aux noeuds -> init des normales pour t=0 - lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // ajout d'un conteneur pour les coordonnées à l'itération 0 {Coordonnee coor(ParaGlob::Dimension()); // un type coordonnee typique @@ -1119,8 +1134,12 @@ void AlgoriDynaExpli::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail { tempsCalEquilibre.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(DYNA_EXP); // transfert info + // init var glob: du num d'itération. De manière arbitraire, en dynamique explicite + Transfert_ParaGlob_COMPTEUR_ITERATION_ALGO_GLOBAL(1); // on a toujours une seule itération // récup des entités - Assemblage& Ass1 = *Ass1_;Assemblage& Ass2 = *Ass2_;Assemblage& Ass3 = *Ass3_; + Assemblage& Ass1 = *Ass1_; +// Assemblage& Ass2 = *Ass2_; + Assemblage& Ass3 = *Ass3_; // préparation pour les aspects validation du calcul et sortie contrôlée des incréments int validation_calcul = 1; // init : par défaut la validation est effective si le calcul converge @@ -1135,7 +1154,7 @@ void AlgoriDynaExpli::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail bool arret=false; // booleen pour arrêter indépendamment de la charge bool premier_calcul = true; // utilisé pour le contact icharge++; // on incrémente le chargement -> donne le num d'incr du prochain incr chargé - int icharge_precedent = icharge; // pour se souvenir du précédent icharge, ne sert que pour l'initialisation +// int icharge_precedent = icharge; // pour se souvenir du précédent icharge, ne sert que pour l'initialisation // au premier passage il y a un traitement spécial: pas d'incrémentation du temps, pas de sauvegarde compteur_demarrage=0; // donc compteur pour les premiers incréments double max_delta_X=0.; // le maxi du delta X @@ -1149,10 +1168,10 @@ void AlgoriDynaExpli::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail double maxPuissInt; // maxi de la puissance des efforts internes double maxReaction; // maxi des reactions int inReaction = 0; // pointeur d'assemblage pour le maxi de reaction - int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl - double maxDeltaDdl=0; // // maxi de variation de ddl +// int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl +// double maxDeltaDdl=0; // // maxi de variation de ddl // initialisation de la variable puissance_précédente d'une itération à l'autre - double puis_precedente = 0.; +// double puis_precedente = 0.; // mise à jour du calcul éventuel des normales aux noeuds -> mise à jour des normales à t // mais ici, on calcule les normales à tdt, et on transfert à t @@ -1232,7 +1251,7 @@ void AlgoriDynaExpli::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail {lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_tdt); if (pa.ContactType()==4) // dans le cas d'un contact de type 4 // on actualise évenuellement la position des noeuds esclaves sur la surface maître - lesContacts->Actualisation(); + lesContacts->Actualisation(0); }; // dans le cas ou il y a changement de statut il faut remettre à jour @@ -1538,7 +1557,7 @@ void AlgoriDynaExpli::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail if (compteur_demarrage != 0) Algori::TdtversT(); if ((pa.ContactType())&&(compteur_demarrage > 0)) { // actualisation des éléments de contact et éventuellement inactivation d'éléments - lesContacts->Actualisation(); // si on n'a plus de projection + lesContacts->Actualisation(0); // si on n'a plus de projection // on inactive les éléments de contact qui se relache: testé soit via la réaction lesContacts->RelachementNoeudcolle(); // ou via la sortie d'une zone d'accostage (dépend de l'algo) }; diff --git a/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli_zhai.cc b/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli_zhai.cc index 29360f5..d234dfe 100644 --- a/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli_zhai.cc +++ b/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli_zhai.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -290,7 +290,16 @@ void AlgoriDynaExpli_zhai::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * les { // INITIALISATION globale tempsInitialisation.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(DYNA_EXP_ZHAI); // transfert info - + + #ifdef UTILISATION_MPI + // calcul de l'équilibrage initiale par le cpu 0 + if (distribution_CPU_algo.Tableau_element_CPU_en_cours()->Taille() == 0 ) + {distribution_CPU_algo.Calcul_Equilibrage_initiale(lesMail); + distribution_CPU_algo.Passage_Equilibrage_aux_CPU(); + paraGlob->Init_tableau (distribution_CPU_algo.Tableau_element_CPU_en_cours()); + }; + #endif + // avant toute chose, au cas où l'algo interviendrait après un autre algo // on inactive tous les ddl existants lesMail->Inactive_ddl(); @@ -422,6 +431,10 @@ void AlgoriDynaExpli_zhai::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * les // initialisation du compteur d'increments de charge icharge = 0; + // definition des elements de frontiere, ces elements sont utilises pour le contact + lesMail->CreeElemFront(); + // calcul éventuel des normales aux noeuds -> init des normales pour t=0 + lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // --- init du contact --- // doit-être avant la lecture d'un restart, car il y a une initialisation de conteneurs qui est faites // qui ensuite est utilisée en restart @@ -429,7 +442,6 @@ void AlgoriDynaExpli_zhai::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * les // pour préparer la lecture de restart éventuel if (lesMail->NbEsclave() != 0) { // definition des elements de frontiere, ces elements sont utilises pour le contact - int cal_front = lesMail->CreeElemFront(); lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); // initialisation des zones de contacts éventuelles lesContacts->Init_contact(*lesMail,*lesRef,lesFonctionsnD); @@ -438,6 +450,7 @@ void AlgoriDynaExpli_zhai::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * les // definition des elements de contact eventuels lesContacts->DefElemCont(0.); // au début le déplacement des noeuds est nul }; + //--cas de restart et/ou de sauvegarde------------ // tout d'abord récup du restart si nécessaire // dans le cas ou un incrément différent de 0 est demandé -> seconde lecture à l'incrément @@ -459,7 +472,7 @@ void AlgoriDynaExpli_zhai::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * les lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); @@ -499,9 +512,6 @@ void AlgoriDynaExpli_zhai::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * les } }; //--fin cas de restart et/ou de sauvegarde-------- - - // calcul éventuel des normales aux noeuds -> init des normales pour t=0 - lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // ajout d'un conteneur pour les coordonnées à l'itération 0 {Coordonnee coor(ParaGlob::Dimension()); // un type coordonnee typique @@ -610,8 +620,11 @@ void AlgoriDynaExpli_zhai::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMa { tempsCalEquilibre.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(DYNA_EXP_ZHAI); // transfert info + // init var glob: du num d'itération. De manière arbitraire, en dynamique explicite + Transfert_ParaGlob_COMPTEUR_ITERATION_ALGO_GLOBAL(1); // on a toujours une seule itération // récup des entités - Assemblage& Ass1 = *Ass1_;Assemblage& Ass2 = *Ass2_;Assemblage& Ass3 = *Ass3_; + Assemblage& Ass1 = *Ass1_;//Assemblage& Ass2 = *Ass2_; + Assemblage& Ass3 = *Ass3_; // préparation pour les aspects validation du calcul et sortie contrôlée des incréments int validation_calcul = 1; // init : par défaut la validation est effective si le calcul converge @@ -628,7 +641,7 @@ void AlgoriDynaExpli_zhai::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMa bool arret=false; // booleen pour arrêter indépendamment de la charge bool premier_calcul = true; // utilisé pour le contact icharge++; // on incrémente le chargement -> donne le num d'incr du prochain incr chargé - int icharge_precedent = icharge; // pour se souvenir du précédent icharge, ne sert que pour l'initialisation +// int icharge_precedent = icharge; // pour se souvenir du précédent icharge, ne sert que pour l'initialisation while (((!charge->Fin(icharge))||(icharge == 1)) && (charge->Fin(icharge,true)!=2) // si on a dépassé le nombre d'incrément permis on s'arrête dans tous les cas && (charge->Fin(icharge,false)!=3) // idem si on a dépassé le nombre d'essai d'incrément permis @@ -640,10 +653,10 @@ void AlgoriDynaExpli_zhai::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMa double maxPuissInt; // maxi de la puissance des efforts internes double maxReaction; // maxi des reactions int inReaction = 0; // pointeur d'assemblage pour le maxi de reaction - int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl - double maxDeltaDdl=0; // // maxi de variation de ddl +// int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl +// double maxDeltaDdl=0; // // maxi de variation de ddl // initialisation de la variable puissance_précédente d'une itération à l'autre - double puis_precedente = 0.; +// double puis_precedente = 0.; // mise à jour du calcul éventuel des normales aux noeuds -> mise à jour des normales à t // mais ici, on calcule les normales à tdt, et on transfert à t @@ -1003,7 +1016,7 @@ void AlgoriDynaExpli_zhai::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMa if (pa.ContactType()) { // actualisation des éléments de contact et éventuellement inactivation d'éléments - lesContacts->Actualisation(); // si on n'a plus de projection + lesContacts->Actualisation(0); // si on n'a plus de projection // on inactive les éléments de contact qui se relache: testé soit via la réaction lesContacts->RelachementNoeudcolle(); // ou via la sortie d'une zone d'accostage (dépend de l'algo) }; @@ -1084,6 +1097,8 @@ void AlgoriDynaExpli_zhai::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * l { // INITIALISATION globale tempsInitialisation.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(DYNA_EXP_ZHAI); // transfert info + // init var glob: du num d'itération. De manière arbitraire, en dynamique explicite + Transfert_ParaGlob_COMPTEUR_ITERATION_ALGO_GLOBAL(1); // on a toujours une seule itération // cas du chargement, on verifie egalement la bonne adequation des references charge->Initialise(lesMail,lesRef,pa,*lesCourbes1D,*lesFonctionsnD); // on indique que l'on ne souhaite pas le temps fin stricte @@ -1188,6 +1203,10 @@ void AlgoriDynaExpli_zhai::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * l // initialisation du compteur d'increments de charge icharge = 1; + // definition des elements de frontiere, ces elements sont utilises pour le contact + lesMail->CreeElemFront(); + // calcul éventuel des normales aux noeuds -> init des normales pour t=0 + lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // --- init du contact --- // doit-être avant la lecture d'un restart, car il y a une initialisation de conteneurs qui est faites // qui ensuite est utilisée en restart @@ -1195,7 +1214,6 @@ void AlgoriDynaExpli_zhai::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * l // pour préparer la lecture de restart éventuel if (lesMail->NbEsclave() != 0) { // definition des elements de frontiere, ces elements sont utilises pour le contact - int cal_front = lesMail->CreeElemFront(); lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); // initialisation des zones de contacts éventuelles lesContacts->Init_contact(*lesMail,*lesRef,lesFonctionsnD); @@ -1335,10 +1353,10 @@ void AlgoriDynaExpli_zhai::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * l double maxPuissInt; // maxi de la puissance des efforts internes double maxReaction; // maxi des reactions int inReaction = 0; // pointeur d'assemblage pour le maxi de reaction - int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl - double maxDeltaDdl=0; // // maxi de variation de ddl +// int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl +// double maxDeltaDdl=0; // // maxi de variation de ddl // initialisation de la variable puissance_précédente d'une itération à l'autre - double puis_precedente = 0.; +// double puis_precedente = 0.; // mise à jour du calcul éventuel des normales aux noeuds -> mise à jour des normales à t // mais ici, on calcule les normales à tdt, et on transfert à t diff --git a/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli_zhai.h b/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli_zhai.h index 1a132f5..b5560e6 100644 --- a/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli_zhai.h +++ b/Algo/GalerkinContinu/AlgoDynaExplicite/AlgoriDynaExpli_zhai.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -94,6 +94,7 @@ class AlgoriDynaExpli_zhai : public Algori << " l'algo passe en parametre est en fait : " << Nom_TypeCalcul(algo->TypeDeCalcul()) << " arret !! " << flush; Sortie(1); + return NULL; } else { AlgoriDynaExpli_zhai* inter = (AlgoriDynaExpli_zhai*) algo; diff --git a/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_chung_lee.cc b/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_chung_lee.cc index 75bc6ae..b0ad58a 100644 --- a/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_chung_lee.cc +++ b/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_chung_lee.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -280,6 +280,15 @@ void Algori_chung_lee::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail tempsInitialisation.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(DYNA_EXP_CHUNG_LEE); // transfert info + #ifdef UTILISATION_MPI + // calcul de l'équilibrage initiale par le cpu 0 + if (distribution_CPU_algo.Tableau_element_CPU_en_cours()->Taille() == 0 ) + {distribution_CPU_algo.Calcul_Equilibrage_initiale(lesMail); + distribution_CPU_algo.Passage_Equilibrage_aux_CPU(); + paraGlob->Init_tableau (distribution_CPU_algo.Tableau_element_CPU_en_cours()); + }; + #endif + // avant toute chose, au cas où l'algo interviendrait après un autre algo // on inactive tous les ddl existants lesMail->Inactive_ddl(); @@ -415,6 +424,10 @@ void Algori_chung_lee::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail // initialisation du compteur d'increments de charge icharge = 0; + // definition des elements de frontiere, ces elements sont utilises pour le contact + lesMail->CreeElemFront(); + // calcul éventuel des normales aux noeuds -> init des normales pour t=0 + lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // --- init du contact --- // doit-être avant la lecture d'un restart, car il y a une initialisation de conteneurs qui est faites // qui ensuite est utilisée en restart @@ -422,7 +435,6 @@ void Algori_chung_lee::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail // pour préparer la lecture de restart éventuel if (lesMail->NbEsclave() != 0) { // definition des elements de frontiere, ces elements sont utilises pour le contact - int cal_front = lesMail->CreeElemFront(); lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); // initialisation des zones de contacts éventuelles lesContacts->Init_contact(*lesMail,*lesRef,lesFonctionsnD); @@ -432,6 +444,7 @@ void Algori_chung_lee::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail // definition des elements de contact eventuels lesContacts->DefElemCont(0.); // au début le déplacement des noeuds est nul }; + //--cas de restart et/ou de sauvegarde------------ // tout d'abord récup du restart si nécessaire // dans le cas ou un incrément différent de 0 est demandé -> seconde lecture à l'incrément @@ -453,7 +466,7 @@ void Algori_chung_lee::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); @@ -493,9 +506,6 @@ void Algori_chung_lee::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail } }; //--fin cas de restart et/ou de sauvegarde-------- - - // calcul éventuel des normales aux noeuds -> init des normales pour t=0 - lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // ajout d'un conteneur pour les coordonnées à l'itération 0 {Coordonnee coor(ParaGlob::Dimension()); // un type coordonnee typique @@ -612,8 +622,11 @@ void Algori_chung_lee::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail, { tempsCalEquilibre.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(DYNA_EXP_CHUNG_LEE); // transfert info + // init var glob: du num d'itération. De manière arbitraire, en dynamique explicite + Transfert_ParaGlob_COMPTEUR_ITERATION_ALGO_GLOBAL(1); // on a toujours une seule itération // récup des entités - Assemblage& Ass1 = *Ass1_;Assemblage& Ass2 = *Ass2_;Assemblage& Ass3 = *Ass3_; + Assemblage& Ass1 = *Ass1_;//Assemblage& Ass2 = *Ass2_; + Assemblage& Ass3 = *Ass3_; // préparation pour les aspects validation du calcul et sortie contrôlée des incréments int validation_calcul = 1; // init : par défaut la validation est effective si le calcul converge @@ -630,7 +643,7 @@ void Algori_chung_lee::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail, bool arret=false; // booleen pour arrêter indépendamment de la charge bool premier_calcul = true; // utilisé pour le contact icharge++; // on incrémente le chargement -> donne le num d'incr du prochain incr chargé - int icharge_precedent = icharge; // pour se souvenir du précédent icharge, ne sert que pour l'initialisation +// int icharge_precedent = icharge; // pour se souvenir du précédent icharge, ne sert que pour l'initialisation while (((!charge->Fin(icharge))||(icharge == 1)) && (charge->Fin(icharge,true)!=2) // si on a dépassé le nombre d'incrément permis on s'arrête dans tous les cas && (charge->Fin(icharge,false)!=3) // idem si on a dépassé le nombre d'essai d'incrément permis @@ -640,10 +653,10 @@ void Algori_chung_lee::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail, double maxPuissInt; // maxi de la puissance des efforts internes double maxReaction; // maxi des reactions int inReaction = 0; // pointeur d'assemblage pour le maxi de reaction - int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl - double maxDeltaDdl=0; // // maxi de variation de ddl +// int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl +// double maxDeltaDdl=0; // // maxi de variation de ddl // initialisation de la variable puissance_précédente d'une itération à l'autre - double puis_precedente = 0.; +// double puis_precedente = 0.; // mise à jour du calcul éventuel des normales aux noeuds -> mise à jour des normales à t // mais ici, on calcule les normales à tdt, et on transfert à t @@ -713,7 +726,7 @@ void Algori_chung_lee::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail, {lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_tdt); if (pa.ContactType()==4) // dans le cas d'un contact de type 4 // on actualise évenuellement la position des noeuds esclaves sur la surface maître - lesContacts->Actualisation(); + lesContacts->Actualisation(0); }; // dans le cas ou il y a changement de statut il faut remettre à jour @@ -996,7 +1009,7 @@ void Algori_chung_lee::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail, Algori::TdtversT(); if (pa.ContactType()) { // actualisation des éléments de contact et éventuellement inactivation d'éléments - lesContacts->Actualisation(); // si on n'a plus de projection + lesContacts->Actualisation(0); // si on n'a plus de projection // on inactive les éléments de contact qui se relache: testé soit via la réaction lesContacts->RelachementNoeudcolle(); // ou via la sortie d'une zone d'accostage (dépend de l'algo) }; @@ -1081,6 +1094,8 @@ void Algori_chung_lee::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMa { // INITIALISATION globale tempsInitialisation.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(DYNA_EXP_CHUNG_LEE); // transfert info + // init var glob: du num d'itération. De manière arbitraire, en dynamique explicite + Transfert_ParaGlob_COMPTEUR_ITERATION_ALGO_GLOBAL(1); // on a toujours une seule itération // 000 ---- valeurs figées pour les paramètres de l'algorithme const double betachapeau = 0.5 - (*beta_cl); const double gammaa = 1.5; const double gammachapeau = 1.-gammaa; @@ -1183,10 +1198,13 @@ void Algori_chung_lee::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMa F_int_tdt.Change_taille(nbddl_X); F_ext_tdt.Change_taille(nbddl_X); // forces généralisées int et ext au pas actuel residu_final.Change_taille(nbddl_X); // pour la sauvegarde du résidu pour le post-traitement + // definition des elements de frontiere, ces elements sont utilises pour le contact + lesMail->CreeElemFront(); + // calcul éventuel des normales aux noeuds -> init des normales pour t=0 + lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // cas avec contact potentiel if (lesMail->NbEsclave() != 0) { // definition des elements de frontiere, ces elements sont utilises pour le contact - int cal_front = lesMail->CreeElemFront(); lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); // initialisation des zones de contacts éventuelles lesContacts->Init_contact(*lesMail,*lesRef,lesFonctionsnD); @@ -1222,7 +1240,7 @@ void Algori_chung_lee::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMa lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); @@ -1342,10 +1360,10 @@ void Algori_chung_lee::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMa double maxPuissInt; // maxi de la puissance des efforts internes double maxReaction; // maxi des reactions int inReaction = 0; // pointeur d'assemblage pour le maxi de reaction - int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl - double maxDeltaDdl=0; // // maxi de variation de ddl +// int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl +// double maxDeltaDdl=0; // // maxi de variation de ddl // initialisation de la variable puissance_précédente d'une itération à l'autre - double puis_precedente = 0.; +// double puis_precedente = 0.; // gestion du pas de temps, vérif / pas critique this->Gestion_pas_de_temps(false,lesMail,2); // 2 signifie cas courant bool modif_temps = charge->Avance(); // avancement de la charge et donc du temps courant @@ -1379,7 +1397,7 @@ void Algori_chung_lee::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMa {lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_tdt); if (pa.ContactType()==4) // dans le cas d'un contact de type 4 // on actualise évenuellement la position des noeuds esclaves sur la surface maître - lesContacts->Actualisation(); + lesContacts->Actualisation(0); }; // mise en place des conditions linéaires @@ -1665,7 +1683,7 @@ void Algori_chung_lee::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMa Algori::TdtversT(); if (pa.ContactType()) { // actualisation des éléments de contact et éventuellement inactivation d'éléments - lesContacts->Actualisation(); // si on n'a plus de projection + lesContacts->Actualisation(0); // si on n'a plus de projection // on inactive les éléments de contact qui se relache: testé soit via la réaction lesContacts->RelachementNoeudcolle(); // ou via la sortie d'une zone d'accostage (dépend de l'algo) }; diff --git a/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_chung_lee.h b/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_chung_lee.h index b6e2341..eb28dc4 100644 --- a/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_chung_lee.h +++ b/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_chung_lee.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -95,6 +95,7 @@ class Algori_chung_lee : public Algori << " l'algo passe en parametre est en fait : " << Nom_TypeCalcul(algo->TypeDeCalcul()) << " arret !! " << flush; Sortie(1); + return NULL; } else { Algori_chung_lee* inter = (Algori_chung_lee*) algo; diff --git a/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_relax_dyna.cc b/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_relax_dyna.cc index 6ba1c63..eecc648 100644 --- a/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_relax_dyna.cc +++ b/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_relax_dyna.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -1102,12 +1102,12 @@ void AlgoriRelaxDyna::Info_commande_parametres(UtilLecture& entreePrinc) << "\n # (ici apres la transition vers l'amortissement visqueux, option_recalcul_mass " << "\n # initialement a 0, passe à 3) " << "\n # " - << "\n # typeCalRelaxation= 4 lambda= 0.6 type_calcul_mass= 2 option_recalcul_mass= 0 \ " + << "\n # typeCalRelaxation= 4 lambda= 0.6 type_calcul_mass= 2 option_recalcul_mass= 0 \\ " << "\n # opt_visqueux_recal_mass= 3 " << "\n # parametre_calcul_de_la_masse_ casMass_relax= 3 " << "\n # proportion_cinetique= 0.1 " << "\n # parametre_recalcul_de_la_masse_ ncycle_calcul= 100 et_pas_recalcul_masse_a_la_transition_" - << "\n # parametre_calcul_de_la_viscosite_ type_calcul_visqu_critique= 2 \ " + << "\n # parametre_calcul_de_la_viscosite_ type_calcul_visqu_critique= 2 \\ " << "\n # opt_cal_C_critique= 1 f_= 0.9 " << "\n # mode_debug_= 100 " << "\n # " @@ -1311,7 +1311,16 @@ void AlgoriRelaxDyna::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, { // INITIALISATION globale tempsInitialisation.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(RELAX_DYNA); // transfert info - + + #ifdef UTILISATION_MPI + // calcul de l'équilibrage initiale par le cpu 0 + if (distribution_CPU_algo.Tableau_element_CPU_en_cours()->Taille() == 0 ) + {distribution_CPU_algo.Calcul_Equilibrage_initiale(lesMail); + distribution_CPU_algo.Passage_Equilibrage_aux_CPU(); + paraGlob->Init_tableau (distribution_CPU_algo.Tableau_element_CPU_en_cours()); + }; + #endif + // avant toute chose, au cas où l'algo interviendrait après un autre algo // on inactive tous les ddl existants lesMail->Inactive_ddl(); @@ -1452,6 +1461,10 @@ void AlgoriRelaxDyna::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, compteur_demarrage = -1; // pas vraiment utile, car sera redéfini dans CalEquilibre icharge = 0; // par défaut + // definition des elements de frontiere, ces elements sont utilises pour le contact + lesMail->CreeElemFront(); + // calcul éventuel des normales aux noeuds -> init des normales pour t=0 + lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // --- init du contact --- // doit-être avant la lecture d'un restart, car il y a une initialisation de conteneurs qui est faites // qui ensuite est utilisée en restart @@ -1459,7 +1472,6 @@ void AlgoriRelaxDyna::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, // pour préparer la lecture de restart éventuel if (lesMail->NbEsclave() != 0) { // definition des elements de frontiere, ces elements sont utilises pour le contact - int cal_front = lesMail->CreeElemFront(); lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); // // initialisation des zones de contacts éventuelles lescontacts->Init_contact(*lesMail,*lesRef,lesFonctionsnD); @@ -1499,7 +1511,7 @@ void AlgoriRelaxDyna::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) ////--debug @@ -1545,9 +1557,6 @@ void AlgoriRelaxDyna::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, } }; - // calcul éventuel des normales aux noeuds -> init des normales pour t=0 - lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex - // ajout d'un conteneur pour les coordonnées à l'itération 0 {Coordonnee coor(ParaGlob::Dimension()); // un type coordonnee typique Grandeur_coordonnee gt(coor); // une grandeur typique de type Grandeur_coordonnee @@ -1825,7 +1834,11 @@ Vecteur V_ext(F_int_tdt); // def d'un type quelconque représentatif pour un vecteur force à chaque noeud TypeQuelconque typQ_gene_int(FORCE_GENE_INT,X1,gt); + // on définit un type générique qui sert pour passer aux noeuds les positions à l'itération 0 + TypeQuelconque typQ_XI_ITER_0(XI_ITER_0,X1,gt); + bool arret=false; // booleen pour arrêter indépendamment de la charge + bool arret_pilotage=false; // pour arrêt du calcul au niveau du pilotage bool premier_calcul = true; // utilisé pour l'initialisation de l'incrément avec le pas précédent int indicCycleContact = 0; // def d'un indicateur donnant la situation dans le cycle de contact // un booléen pour uniquement gérer le fait que dans la boucle globale on fait le test après le test du while @@ -1838,9 +1851,10 @@ Vecteur V_ext(F_int_tdt); // que si on a eu convergence || pas_de_convergence_pour_l_instant ||(compteur_demarrage <= 1) ) + && (charge->Fin(icharge,true)!=1) // si on a dépassé le temps fin on s'arrête // si on a dépassé le nombre d'incrément permis on s'arrête dans tous les cas && ((compteur_demarrage < 1)? (charge->Fin(icharge,false)!=2) : (charge->Fin(icharge,true)!=2)) - && (charge->Fin(icharge,false)!=3) // idem si on a dépassé le nombre d'essai d'incrément permis + && (charge->Fin(icharge,true)!=3) // idem si on a dépassé le nombre d'essai d'incrément permis // 1er appel avec true: pour affichage et second avec false car c'est déjà affiché && (!pa.EtatSortieEquilibreGlobal()) ) @@ -1865,6 +1879,19 @@ Vecteur V_ext(F_int_tdt); // bilan: on traite différamment selon que c'est le premier passage le second et les autres bool aff_incr = true; // par défaut, est ensuite renseigné dans le switch qui suit bool change_statut = false; // init des changements de statut + + // mise à jour du calcul éventuel des normales aux noeuds -> mise à jour des normales à t + // mais ici, on calcule les normales à tdt, et on transfert à t + // comme on est au début de l'incrément, la géométrie à tdt est identique à celle à t + // sauf "au premier incrément", si l'algo est un sous algo d'un algo combiné + // et que l'on suit un précédent algo sur un même pas de temps + // qui a aboutit à une géométrie à tdt différente de celle de t + // du coup cela permet d'utiliser la nouvelle géométrie pour ce premier incrément + lesMail->MiseAjourNormaleAuxNoeuds_de_tdt_vers_T(); + // passage aux noeuds des vecteurs globaux: F_INT, F_EXT + Algori::Passage_aux_noeuds_F_int_t_et_F_ext_t(lesMail); + + // qui, pour provoquer un arrêt de la boucle sur les incrément switch (compteur_demarrage) {case -1: {// gestion du pas de temps, mis transitoirement à 0 @@ -1882,12 +1909,17 @@ Vecteur V_ext(F_int_tdt); this->Gestion_pas_de_temps(false,lesMail,2); // 2 signifie cas courant if (!indicCycleContact) // modification de la charge et du pas de temps qu'au premier passage // mais pas après un changement de statut - { bool modif_temps = Pilotage_du_temps(charge,arret); // appel du Pilotage + { bool modif_temps = Pilotage_du_temps(charge,arret_pilotage); // appel du Pilotage //-- si le temps a changé il faut de nouveau appeler la gestion du pas de temps // car il y a des grandeurs reliées au pas de temps qui y sont calculé if (modif_temps) this->Gestion_pas_de_temps(true,lesMail,2); // 2 signifie cas courant - if (arret) break; // pilotage -> arret du calcul + if (arret_pilotage) break; // pilotage -> arret du calcul, on sort du switch + #ifdef UTILISATION_MPI + // seule le process 0 s'occupe de la sortie + if (ParaGlob::Monde()->rank() == 0) + { + #endif // affichage de l'increment de charge aff_incr=pa.Vrai_commande_sortie(icharge,temps_derniere_sauvegarde); // pour simplifier if (aff_incr) @@ -1898,7 +1930,12 @@ Vecteur V_ext(F_int_tdt); << " dt= " << ParaGlob::Variables_de_temps().IncreTempsCourant() << "\n======================================================================"; }; - // -- initialisation des coordonnees et des ddl a tdt en fonctions des + #ifdef UTILISATION_MPI + // seule le process 0 s'occupe de la sortie + } + else {aff_incr = false;}; + #endif + // -- initialisation des coordonnees et des ddl a tdt en fonctions des // ddl imposes et de l'increment du chargement: change_statut sera recalculé ensuite lesCondLim->MiseAJour_tdt (pa.Multiplicateur(),lesMail,charge->Increment_de_Temps(),lesRef,charge->Temps_courant() @@ -1935,7 +1972,11 @@ Vecteur V_ext(F_int_tdt); }; } else - { if (arret) break; // pilotage -> arret du calcul + { if (arret_pilotage) break; // pilotage -> arret du calcul + #ifdef UTILISATION_MPI + // seule le process 0 s'occupe de la sortie + if (ParaGlob::Monde()->rank() == 0) + #endif cout << "\n=============================================================================" << "\n ....... re-analyse du contact ........ " << "\nINCREMENT DE CHARGE : " << icharge << " intensite " << charge->IntensiteCharge() @@ -1945,11 +1986,18 @@ Vecteur V_ext(F_int_tdt); }; }; }; // fin du switch sur compteur_demarrage + #ifdef UTILISATION_MPI + temps_transfert_court.Mise_en_route_du_comptage(); // comptage cpu + broadcast(*ParaGlob::Monde(), arret_pilotage, 0); + temps_transfert_court.Arret_du_comptage(); // fin comptage cpu + #endif + + if (arret_pilotage) break; // si dans le switch précédent on a un arret de pilotage qui est demandé lesLoisDeComp->MiseAJour_umat_nbincr(icharge); // init pour les lois Umat éventuelles // mise à jour éventuelle de la matrice de raideur en fonction de l'existence du contact et du type de modèle de contact // if (pa.ContactType()) -// mato = Mise_a_jour_Choix_matriciel_contact(mato,Ass.Nb_cas_assemb(),lescontacts); +// Mise_a_jour_Choix_matriciel_contact(mato,Ass.Nb_cas_assemb(),lescontacts); // --- récupération (initialisation) des ddl position, vitesse et accélération // récupe X_t initiale @@ -1990,6 +2038,9 @@ Vecteur V_ext(F_int_tdt); // force_recalcul_masse : un indicateur de retour pour la méthode Cinetique_ou_visqueux: bool force_recalcul_masse= false; // par défaut on ne force pas + + // on démarre avec le compteur à 0 et on sauvegarde la position finale à l'itération 0 + lesMail->Quelconque_glob_vers_local(X1,X_tdt,typQ_XI_ITER_0); for (compteur = 0; (compteur<= pa.Iterations())&&(!pa.EtatSortieEquilibreGlobal()); compteur++) //---//\\//\\// début de la boucle sur les itérations d'équilibres //\\//\\// @@ -2040,7 +2091,12 @@ Vecteur V_ext(F_int_tdt); lesMail->Force_Ddl_etendu_aux_noeuds_a_zero(Ddl_enum_etendu::Tab_FN_FT()); // idem pour les composantes normales et tangentielles // affichage ou non de l'itération bool aff_iteration = (pa.freq_affich_iter() > 0) ? - (aff_incr && (compteur % pa.freq_affich_iter()==0) &&(compteur!=0)) : false ; + (aff_incr && (compteur % pa.freq_affich_iter()==0) &&(compteur!=0)) : false ; + #ifdef UTILISATION_MPI + // seule le process 0 s'occupe de la sortie + if (ParaGlob::Monde()->rank() != 0) aff_iteration=false; + #endif + /* // --- imposition des ddls bloqués // initialisation des coordonnees et des ddl a tdt en fonctions des // ddl imposes et de l'increment du chargement et des conditions linéaires imposées @@ -2166,14 +2222,14 @@ Vecteur V_ext(F_int_tdt); // quand un noeud glisse d'une facette sur une voisine, peut changer la position du noeud // qui est projeté sur la facette dans le cas de l'algorithme cinématique if (((compteur != 0)&&(pa.ContactType()))&&(compteur_demarrage > 0)) - { lescontacts->Actualisation(); // en particulier: pour le type 4 on a projection + { lescontacts->Actualisation(0); // en particulier: pour le type 4 on a projection // des noeuds sur les facettes maîtres // mise à jour éventuelle des répercussions du contact sur les noeuds en contact AlgoriRelaxDyna::Repercussion_algo_sur_cinematique(lescontacts,X_tdt,vitesse_tdt); // lesMail->Vect_loc_vers_glob(TEMPS_tdt,X1,X_tdt,X1); // lesMail->Vect_loc_vers_glob(TEMPS_tdt,V1,vitesse_tdt,V1); // mise à jour éventuelle de la matrice de raideur en fonction du contact -// mato = Mise_a_jour_Choix_matriciel_contact(mato,Ass.Nb_cas_assemb(),lescontacts); +// Mise_a_jour_Choix_matriciel_contact(mato,Ass.Nb_cas_assemb(),lescontacts); }; // -+-+ sinon l'actualisation du contact s'effectue à la fin de l'itération (un peu plus loin) @@ -2309,8 +2365,14 @@ Vecteur V_ext(F_int_tdt); InfoIncrementReac(lesMail,inReaction,maxReaction,Ass3.Nb_cas_assemb()); }; + bool arretResidu = false; // pour gérer le cas particulier ou on veut un arrêt et sur le résidu et sur le déplacement + bool demande_de_break=false; // pour gestion du break en tenant compte ou non du MPI + #ifdef UTILISATION_MPI + // seule le process 0 s'occupe de la convergence + if (ParaGlob::Monde()->rank() == 0) + { + #endif // examen de la convergence si nécessaire, utilisant le résidu - bool arretResidu = false; // pour gérer le cas particulier ou on veut un arrêt et sur le résidu et sur le déplacement if (ArretEquilibreStatique() && (compteur>1) && (compteur_demarrage != 0) )// cas d'une convergence en utilisant le résidu { double toto=0.; int itera = 0; // valeur par defaut pour ne pas se mettre dans un cas itératif de type algo de Newton bool arret_demande = false; // normalement n'intervient pas ici, car il n'y a pas de prise en compte d'iteration @@ -2329,12 +2391,26 @@ Vecteur V_ext(F_int_tdt); ) ) { arretResidu=true;} // cas relaxation avec amortissement cinétique - else {break;}; // cas normal, + else {demande_de_break=true;}//break;}; // cas normal, }; }; }; + #ifdef UTILISATION_MPI + }; + temps_transfert_court.Mise_en_route_du_comptage(); // comptage cpu + broadcast(*ParaGlob::Monde(), arretResidu, 0); + broadcast(*ParaGlob::Monde(), arret, 0); + temps_transfert_court.Arret_du_comptage(); // fin comptage cpu + #endif + if (demande_de_break) + break; // 4 ---- calcul des nouvelles accélérations + #ifdef UTILISATION_MPI + // seule le process 0 fait la résolution globale + if (ParaGlob::Monde()->rank() == 0) + { + #endif // resolution simple (fonction du type de matrice) // ou non suivant modif_repere tempsResolSystemLineaire.Mise_en_route_du_comptage(); // temps cpu @@ -2355,6 +2431,17 @@ Vecteur V_ext(F_int_tdt); // retour des accélération dans les reperes generaux, dans le cas où ils ont ete modifie // par des conditions linéaires lesCondLim->RepInitiaux( acceleration_tdt,Ass3.Nb_cas_assemb()); + #ifdef UTILISATION_MPI + } + else // s'il s'agit d'un process de calcul élémentaire + {sol = &vglobaal; // il faut affecter sol pour récupérer ensuite la solution + }; + // le process 0 transmet aux autres process le vecteur résultat + temps_transfert_long.Mise_en_route_du_comptage(); // comptage cpu + sol->Broadcast(0); + temps_transfert_long.Arret_du_comptage(); // fin comptage cpu + #endif + // effacement du marquage de ddl bloque du au conditions lineaire imposée par l'entrée lesCondLim->EffMarque(); if (pa.ContactType()) lescontacts->EffMarque(); @@ -2374,7 +2461,7 @@ Vecteur V_ext(F_int_tdt); // dans le cas ou la recherche de nouveaux contacts est effectuée à chaque itération if (((type_activation_contact== 1) && (pa.ContactType()))&&(compteur_demarrage > 0)) { // actualisation des éléments de contact et éventuellement inactivation d'éléments - lescontacts->Actualisation(); // si on n'a plus de projection + lescontacts->Actualisation(0); // si on n'a plus de projection // on inactive les éléments de contact qui se relache: testé soit via la réaction lescontacts->RelachementNoeudcolle(); // ou via la sortie d'une zone d'accostage (dépend de l'algo) }; @@ -2451,6 +2538,13 @@ Vecteur V_ext(F_int_tdt); }; // gestion de la fin des itérations + #ifdef UTILISATION_MPI + // seule le process 0 a fait la résolution globale + // il gère seul également la convergence, mais il doit tenir au courant les autres process + Algori::Passage_indicConvergenceAuxProcCalcul(); + // ce qui permet le déroulement correct de la suite pour tous les process + #endif + if ( ((compteur_demarrage > 0) && (!Pilotage_fin_iteration_implicite(compteur)))) { // cas d'une non convergence pas_de_convergence_pour_l_instant = 1; @@ -2471,7 +2565,7 @@ Vecteur V_ext(F_int_tdt); lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); @@ -2494,9 +2588,9 @@ Vecteur V_ext(F_int_tdt); cout << " \n ... convergence en " << compteur << " iterations "<< endl ; // traitement du contact dans le cas où son activation n'a pas été faite à chaque itération if ((pa.ContactType()) && (type_activation_contact != 1)) - { lescontacts->Actualisation(); // actualisation du contact en fonction du dernier incrément + { lescontacts->Actualisation(0); // actualisation du contact en fonction du dernier incrément // mise à jour éventuelle de la matrice de raideur en fonction du contact -// mato = Mise_a_jour_Choix_matriciel_contact(mato,Ass.Nb_cas_assemb(),lescontacts); +// Mise_a_jour_Choix_matriciel_contact(mato,Ass.Nb_cas_assemb(),lescontacts); // réexamen du contact pour voir s'il n'y a pas de nouveau element de contact // en fait on fera au plus deux passages supplémentaire, sinon la boucle peut être infini, // à la fin du second passage, on regarde s'il y a décollement, si oui on relâche et on refait un passage @@ -2549,7 +2643,7 @@ Vecteur V_ext(F_int_tdt); // cas du calcul des énergies, passage des grandeurs de tdt à t if (compteur_demarrage != -1) Algori::TdtversT(); // actualisation des éléments de contact et éventuellement suppression - if (pa.ContactType()) lescontacts->Actualisation(); // des éléments qui ne sont plus en contact + if (pa.ContactType()) lescontacts->Actualisation(0); // des éléments qui ne sont plus en contact if (compteur_demarrage != -1) {// on valide l'activité des conditions limites et condition linéaires lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); diff --git a/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_relax_dyna.h b/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_relax_dyna.h index 678180b..c435339 100644 --- a/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_relax_dyna.h +++ b/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_relax_dyna.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_tchamwa.cc b/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_tchamwa.cc index 3722bb1..5e658cf 100644 --- a/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_tchamwa.cc +++ b/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_tchamwa.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -868,7 +868,16 @@ void AlgoriTchamwa::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, { // INITIALISATION globale tempsInitialisation.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(DYNA_EXP_TCHAMWA); // transfert info - + + #ifdef UTILISATION_MPI + // calcul de l'équilibrage initiale par le cpu 0 + if (distribution_CPU_algo.Tableau_element_CPU_en_cours()->Taille() == 0 ) + {distribution_CPU_algo.Calcul_Equilibrage_initiale(lesMail); + distribution_CPU_algo.Passage_Equilibrage_aux_CPU(); + paraGlob->Init_tableau (distribution_CPU_algo.Tableau_element_CPU_en_cours()); + }; + #endif + // avant toute chose, au cas où l'algo interviendrait après un autre algo // on inactive tous les ddl existants lesMail->Inactive_ddl(); @@ -994,6 +1003,10 @@ void AlgoriTchamwa::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, // initialisation du compteur d'increments de charge icharge = 0; + // definition des elements de frontiere, ces elements sont utilises pour le contact + lesMail->CreeElemFront(); + // calcul éventuel des normales aux noeuds -> init des normales pour t=0 + lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // --- init du contact --- // doit-être avant la lecture d'un restart, car il y a une initialisation de conteneurs qui est faites // qui ensuite est utilisée en restart @@ -1001,7 +1014,6 @@ void AlgoriTchamwa::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, // pour préparer la lecture de restart éventuel if (lesMail->NbEsclave() != 0) { // definition des elements de frontiere, ces elements sont utilises pour le contact - int cal_front = lesMail->CreeElemFront(); lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); // initialisation des zones de contacts éventuelles lesContacts->Init_contact(*lesMail,*lesRef,lesFonctionsnD); @@ -1010,7 +1022,7 @@ void AlgoriTchamwa::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, // definition des elements de contact eventuels lesContacts->DefElemCont(0.); // au début le déplacement des noeuds est nul }; - + //--cas de restart et/ou de sauvegarde------------ // tout d'abord récup du restart si nécessaire // dans le cas ou un incrément différent de 0 est demandé -> seconde lecture à l'incrément @@ -1033,7 +1045,7 @@ void AlgoriTchamwa::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); @@ -1074,9 +1086,6 @@ void AlgoriTchamwa::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, } } //--fin cas de restart et/ou de sauvegarde-------- - - // calcul éventuel des normales aux noeuds -> init des normales pour t=0 - lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // ajout d'un conteneur pour les coordonnées à l'itération 0 {Coordonnee coor(ParaGlob::Dimension()); // un type coordonnee typique @@ -1188,8 +1197,11 @@ void AlgoriTchamwa::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail { tempsCalEquilibre.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(DYNA_EXP_TCHAMWA); // transfert info + // init var glob: du num d'itération. De manière arbitraire, en dynamique explicite + Transfert_ParaGlob_COMPTEUR_ITERATION_ALGO_GLOBAL(1); // on a toujours une seule itération // récup des entités - Assemblage& Ass1 = *Ass1_;Assemblage& Ass2 = *Ass2_;Assemblage& Ass3 = *Ass3_; + Assemblage& Ass1 = *Ass1_;//Assemblage& Ass2 = *Ass2_; + Assemblage& Ass3 = *Ass3_; // préparation pour les aspects validation du calcul et sortie contrôlée des incréments int validation_calcul = 1; // init : par défaut la validation est effective si le calcul converge @@ -1217,7 +1229,7 @@ void AlgoriTchamwa::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl double maxDeltaDdl=0; // // maxi de variation de ddl // initialisation de la variable puissance_précédente d'une itération à l'autre - double puis_precedente = 0.; +// double puis_precedente = 0.; // mise à jour du calcul éventuel des normales aux noeuds -> mise à jour des normales à t // mais ici, on calcule les normales à tdt, et on transfert à t @@ -1619,7 +1631,7 @@ void AlgoriTchamwa::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail Algori::TdtversT(); if (pa.ContactType()) { // actualisation des éléments de contact et éventuellement inactivation d'éléments - lesContacts->Actualisation(); // si on n'a plus de projection + lesContacts->Actualisation(0); // si on n'a plus de projection // on inactive les éléments de contact qui se relache: testé soit via la réaction lesContacts->RelachementNoeudcolle(); // ou via la sortie d'une zone d'accostage (dépend de l'algo) }; diff --git a/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_tchamwa.h b/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_tchamwa.h index 49c1a58..5d0b6b3 100644 --- a/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_tchamwa.h +++ b/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_tchamwa.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -91,16 +91,19 @@ class AlgoriTchamwa : public Algori // constructeur de copie à partie d'une instance indifférenciée Algori * New_idem(const Algori* algo) const {// on vérifie qu'il s'agit bien d'une instance + Algori * retour = NULL; if (algo->TypeDeCalcul() != DYNA_EXP_TCHAMWA) { cout << "\n *** erreur lors de la creation par copie d'un algo DYNA_EXP_TCHAMWA " << " l'algo passe en parametre est en fait : " << Nom_TypeCalcul(algo->TypeDeCalcul()) << " arret !! " << flush; Sortie(1); + retour = NULL; } else { AlgoriTchamwa* inter = (AlgoriTchamwa*) algo; - return ((Algori *) new AlgoriTchamwa(*inter)); + retour = ((Algori *) new AlgoriTchamwa(*inter)); }; + return retour; }; // DESTRUCTEUR : diff --git a/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_tchamwa2.cc b/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_tchamwa2.cc index 0d8c21e..a02439f 100644 --- a/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_tchamwa2.cc +++ b/Algo/GalerkinContinu/AlgoDynaExplicite/Algori_tchamwa2.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -40,6 +40,8 @@ void AlgoriTchamwa::Calcul_Equilibre2(ParaGlob * paraGlob,LesMaillages * lesMail { // INITIALISATION globale tempsInitialisation.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(DYNA_EXP_TCHAMWA); // transfert info + // init var glob: du num d'itération. De manière arbitraire, en dynamique explicite + Transfert_ParaGlob_COMPTEUR_ITERATION_ALGO_GLOBAL(1); // on a toujours une seule itération // cas du chargement, on verifie egalement la bonne adequation des references charge->Initialise(lesMail,lesRef,pa,*lesCourbes1D,*lesFonctionsnD); // on indique que l'on ne souhaite pas le temps fin stricte @@ -181,7 +183,7 @@ void AlgoriTchamwa::Calcul_Equilibre2(ParaGlob * paraGlob,LesMaillages * lesMail lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); @@ -294,7 +296,7 @@ void AlgoriTchamwa::Calcul_Equilibre2(ParaGlob * paraGlob,LesMaillages * lesMail int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl double maxDeltaDdl=0; // // maxi de variation de ddl // initialisation de la variable puissance_précédente d'une itération à l'autre - double puis_precedente = 0.; +// double puis_precedente = 0.; // mise à jour du calcul éventuel des normales aux noeuds -> mise à jour des normales à t // mais ici, on calcule les normales à tdt, et on transfert à t @@ -626,6 +628,8 @@ void AlgoriTchamwa::Calcul_Equilibre4(ParaGlob * paraGlob,LesMaillages * lesMail { // INITIALISATION globale tempsInitialisation.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(DYNA_EXP_TCHAMWA); // transfert info + // init var glob: du num d'itération. De manière arbitraire, en dynamique explicite + Transfert_ParaGlob_COMPTEUR_ITERATION_ALGO_GLOBAL(1); // on a toujours une seule itération // cas du chargement, on verifie egalement la bonne adequation des references charge->Initialise(lesMail,lesRef,pa,*lesCourbes1D,*lesFonctionsnD); // on indique que l'on ne souhaite pas le temps fin stricte @@ -762,7 +766,7 @@ void AlgoriTchamwa::Calcul_Equilibre4(ParaGlob * paraGlob,LesMaillages * lesMail lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); @@ -880,7 +884,7 @@ void AlgoriTchamwa::Calcul_Equilibre4(ParaGlob * paraGlob,LesMaillages * lesMail int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl double maxDeltaDdl=0; // // maxi de variation de ddl // initialisation de la variable puissance_précédente d'une itération à l'autre - double puis_precedente = 0.; +// double puis_precedente = 0.; // mise à jour du calcul éventuel des normales aux noeuds -> mise à jour des normales à t // mais ici, on calcule les normales à tdt, et on transfert à t diff --git a/Algo/GalerkinContinu/AlgoDynaImplicite/AlgoriNewmark.cc b/Algo/GalerkinContinu/AlgoDynaImplicite/AlgoriNewmark.cc index be09250..90c3aac 100644 --- a/Algo/GalerkinContinu/AlgoDynaImplicite/AlgoriNewmark.cc +++ b/Algo/GalerkinContinu/AlgoDynaImplicite/AlgoriNewmark.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Algo/GalerkinContinu/AlgoDynaImplicite/AlgoriNewmark.h b/Algo/GalerkinContinu/AlgoDynaImplicite/AlgoriNewmark.h index 4ad3497..15065a8 100644 --- a/Algo/GalerkinContinu/AlgoDynaImplicite/AlgoriNewmark.h +++ b/Algo/GalerkinContinu/AlgoDynaImplicite/AlgoriNewmark.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -92,6 +92,7 @@ class AlgoriNewmark : public Algori << " l'algo passe en parametre est en fait : " << Nom_TypeCalcul(algo->TypeDeCalcul()) << " arret !! " << flush; Sortie(1); + return NULL; } else { AlgoriNewmark* inter = (AlgoriNewmark*) algo; diff --git a/Algo/GalerkinContinu/AlgoDynaImplicite/AlgoriNewmark2.cc b/Algo/GalerkinContinu/AlgoDynaImplicite/AlgoriNewmark2.cc index bb67c29..825620f 100644 --- a/Algo/GalerkinContinu/AlgoDynaImplicite/AlgoriNewmark2.cc +++ b/Algo/GalerkinContinu/AlgoDynaImplicite/AlgoriNewmark2.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -46,7 +46,16 @@ void AlgoriNewmark::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, { // INITIALISATION globale tempsInitialisation.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(DYNA_IMP); // transfert info - + + #ifdef UTILISATION_MPI + // calcul de l'équilibrage initiale par le cpu 0 + if (distribution_CPU_algo.Tableau_element_CPU_en_cours()->Taille() == 0 ) + {distribution_CPU_algo.Calcul_Equilibrage_initiale(lesMail); + distribution_CPU_algo.Passage_Equilibrage_aux_CPU(); + paraGlob->Init_tableau (distribution_CPU_algo.Tableau_element_CPU_en_cours()); + }; + #endif + // avant toute chose, au cas où l'algo interviendrait après un autre algo // on inactive tous les ddl existants lesMail->Inactive_ddl(); @@ -211,6 +220,10 @@ void AlgoriNewmark::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, // boucle sur les increments de charge icharge = 0; // init + // definition des elements de frontiere, ces elements sont utilises pour le contact + lesMail->CreeElemFront(); + // calcul éventuel des normales aux noeuds -> init des normales pour t=0 + lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // --- init du contact --- // doit-être avant la lecture d'un restart, car il y a une initialisation de conteneurs qui est faites // qui ensuite est utilisée en restart @@ -220,7 +233,6 @@ void AlgoriNewmark::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, bool premier_calcul = true; if (lesMail->NbEsclave() != 0) { // definition des elements de frontiere, ces elements sont utilises pour le contact - int cal_front = lesMail->CreeElemFront(); lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); // initialisation des zones de contacts éventuelles lesContacts->Init_contact(*lesMail,*lesRef,lesFonctionsnD); @@ -229,7 +241,8 @@ void AlgoriNewmark::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, // definition des elements de contact eventuels bool nevez_contact = lesContacts->DefElemCont(0.); // au début le déplacement des noeuds est nul // mise à jour éventuelle de la matrice de raideur en fonction du contact - bool changement_sur_matrice = Gestion_stockage_et_renumerotation_avec_contact + //bool changement_sur_matrice = + Gestion_stockage_et_renumerotation_avec_contact (premier_calcul,lesMail,nevez_contact,lesCondLim ,lesRef,tab_mato,Ass1.Nb_cas_assemb(),lesContacts,niveau_substitution); matglob=tab_mato(1); @@ -263,7 +276,7 @@ void AlgoriNewmark::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on réinitialise des ddl avec les conditions initiales because on vient de tout libérer les ddl // or dans Initial, il y a des inits à faire au niveau des statuts // lesCondLim->Initial(lesMail,lesRef,lesCourbes1D,lesFonctionsnD,true,cas_combi_ddl); @@ -286,9 +299,10 @@ void AlgoriNewmark::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, if (lesMail->NbEsclave() != 0) {// on met à jour la boite d'encombrement compte tenue des nouvelles coordonnées lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); - bool nevez_contact = lesContacts->Actualisation(); + bool nevez_contact = lesContacts->Actualisation(0); // mise à jour éventuelle de la matrice de raideur en fonction du contact - bool changement_sur_matrice = Gestion_stockage_et_renumerotation_avec_contact + //bool changement_sur_matrice = + Gestion_stockage_et_renumerotation_avec_contact (premier_calcul,lesMail,nevez_contact,lesCondLim ,lesRef,tab_mato,Ass1.Nb_cas_assemb(),lesContacts,niveau_substitution); matglob=tab_mato(1); @@ -331,9 +345,6 @@ void AlgoriNewmark::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, }; }; //--fin cas de restart et/ou de sauvegarde-------- - - // calcul éventuel des normales aux noeuds -> init des normales pour t=0 - lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // ajout d'un conteneur pour les coordonnées à l'itération 0 {Coordonnee coor(ParaGlob::Dimension()); // un type coordonnee typique @@ -787,10 +798,11 @@ void AlgoriNewmark::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail { int niveau_substitution = 0; // on intervient sur toutes les matrices bool a_changer = false; // init if (compteur != 0) - a_changer = lescontacts->Actualisation(); + a_changer = lescontacts->Actualisation(1); // mise à jour éventuelle des matrices de raideur en fonction du contact if (a_changer) - {bool changement_sur_matrice = Gestion_stockage_et_renumerotation_avec_contact + {//bool changement_sur_matrice = + Gestion_stockage_et_renumerotation_avec_contact (premier_calcul,lesMail,a_changer,lesCondLim,lesRef ,tab_mato,Ass1.Nb_cas_assemb(),lescontacts,niveau_substitution); matglob=tab_mato(1); @@ -1129,7 +1141,7 @@ void AlgoriNewmark::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); @@ -1153,7 +1165,7 @@ void AlgoriNewmark::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail { cout << "\n --- |max_var_DeltaDdl|= "<< max_var_delta_X << " , |max_deltaDdl|= " << max_delta_X << flush;}; if (pa.ContactType()) - { bool nevez_contact = lescontacts->Actualisation(); // actualisation du contact en fonction du dernier incrément + { bool nevez_contact = lescontacts->Actualisation(0); // actualisation du contact en fonction du dernier incrément // réexamen du contact pour voir s'il n'y a pas de nouveau element de contact // en fait on fera au plus deux passages supplémentaire, sinon la boucle peut être infini, // à la fin du second passage, on regarde s'il y a décollement, si oui on relâche et on refait un passage diff --git a/Algo/GalerkinContinu/AlgoMixte/AlgoriMixte.cc b/Algo/GalerkinContinu/AlgoMixte/AlgoriMixte.cc index 2875feb..c9c3c21 100755 --- a/Algo/GalerkinContinu/AlgoMixte/AlgoriMixte.cc +++ b/Algo/GalerkinContinu/AlgoMixte/AlgoriMixte.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -390,6 +390,10 @@ void AlgoristatExpli::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMai // initialisation du compteur d'increments de charge icharge = 1; + // definition des elements de frontiere, ces elements sont utilises pour le contact + lesMail->CreeElemFront(); + // calcul éventuel des normales aux noeuds -> init des normales pour t=0 + lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // --- init du contact --- // doit-être avant la lecture d'un restart, car il y a une initialisation de conteneurs qui est faites // qui ensuite est utilisée en restart @@ -397,7 +401,6 @@ void AlgoristatExpli::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMai // pour préparer la lecture de restart éventuel if (lesMail->NbEsclave() != 0) { // definition des elements de frontiere, ces elements sont utilises pour le contact - int cal_front = lesMail->CreeElemFront(); lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); // initialisation des zones de contacts éventuelles lesContacts->Init_contact(*lesMail,*lesRef,lesFonctionsnD); @@ -427,7 +430,7 @@ void AlgoristatExpli::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMai lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); @@ -538,10 +541,10 @@ void AlgoristatExpli::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMai double maxPuissInt; // maxi de la puissance des efforts internes double maxReaction; // maxi des reactions int inReaction = 0; // pointeur d'assemblage pour le maxi de reaction - int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl - double maxDeltaDdl=0; // // maxi de variation de ddl +// int inSol =0 ; // pointeur d'assemblage du maxi de variation de ddl +// double maxDeltaDdl=0; // // maxi de variation de ddl // initialisation de la variable puissance_précédente d'une itération à l'autre - double puis_precedente = 0.; +// double puis_precedente = 0.; // mise à jour du calcul éventuel des normales aux noeuds -> mise à jour des normales à t // mais ici, on calcule les normales à tdt, et on transfert à t diff --git a/Algo/GalerkinContinu/AlgoMixte/AlgoriMixte.h b/Algo/GalerkinContinu/AlgoMixte/AlgoriMixte.h index 08e839a..2570c72 100755 --- a/Algo/GalerkinContinu/AlgoMixte/AlgoriMixte.h +++ b/Algo/GalerkinContinu/AlgoMixte/AlgoriMixte.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -90,6 +90,7 @@ class AlgoristatExpli : public Algori << " l'algo passe en parametre est en fait : " << Nom_TypeCalcul(algo->TypeDeCalcul()) << " arret !! " << flush; Sortie(1); + return NULL; } else { AlgoristatExpli* inter = (AlgoristatExpli*) algo; @@ -240,7 +241,7 @@ class AlgoristatExpli : public Algori // écoute et prise en compte d'une commande interactive // ramène true tant qu'il y a des commandes en cours ///**** inexploitable pour l'instant - bool ActionInteractiveAlgo(){}; + bool ActionInteractiveAlgo(){return false;}; diff --git a/Algo/GalerkinContinu/AlgoStatiques/AlgoriFlambLineaire.cc b/Algo/GalerkinContinu/AlgoStatiques/AlgoriFlambLineaire.cc index eb828f6..8da1fc7 100644 --- a/Algo/GalerkinContinu/AlgoStatiques/AlgoriFlambLineaire.cc +++ b/Algo/GalerkinContinu/AlgoStatiques/AlgoriFlambLineaire.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -162,6 +162,10 @@ void AlgoriFlambLineaire::Execution(ParaGlob * paraGlob,LesMaillages * lesMail, // boucle sur les increments de charge icharge = 1; + // definition des elements de frontiere, ces elements sont utilises pour le contact + lesMail->CreeElemFront(); + // calcul éventuel des normales aux noeuds -> init des normales pour t=0 + lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // --- init du contact --- // doit-être avant la lecture d'un restart, car il y a une initialisation de conteneurs qui est faites // qui ensuite est utilisée en restart @@ -169,7 +173,6 @@ void AlgoriFlambLineaire::Execution(ParaGlob * paraGlob,LesMaillages * lesMail, // pour préparer la lecture de restart éventuel if (lesMail->NbEsclave() != 0) { // definition des elements de frontiere, ces elements sont utilises pour le contact - int cal_front = lesMail->CreeElemFront(); lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); // initialisation des zones de contacts éventuelles lesContacts->Init_contact(*lesMail,*lesRef,lesFonctionsnD); @@ -194,7 +197,7 @@ void AlgoriFlambLineaire::Execution(ParaGlob * paraGlob,LesMaillages * lesMail, lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); @@ -251,7 +254,7 @@ void AlgoriFlambLineaire::Execution(ParaGlob * paraGlob,LesMaillages * lesMail, // de calculer meme si l'utilisateur indique un increment de charge supÈrieur // au temps final bool arret=false; // pour arrÍt du calcul au niveau du pilotage - while ((!charge->Fin(icharge))||(icharge == 1) + while (((!charge->Fin(icharge))||(icharge == 1)) && (charge->Fin(icharge,true)!=2) // si on a dépassé le nombre d'incrément permis on s'arrête dans tous les cas && (charge->Fin(icharge,false)!=3) // idem si on a dépassé le nombre d'essai d'incrément permis // 1er appel avec true: pour affichage et second avec false car c'est déjà affiché @@ -308,7 +311,7 @@ void AlgoriFlambLineaire::Execution(ParaGlob * paraGlob,LesMaillages * lesMail, else lesLoisDeComp->Loi_simplifie(false); // bool sur_raideur = false; // pour l'instant pas de prise en compte sur la raideur - bool sur_raideur = true; // essai +// bool sur_raideur = true; // essai // mise en place du chargement impose, c-a-d calcul de la puissance externe // si pb on sort de la boucle if (!(charge->ChargeSMembreRaideur_Im_mecaSolid diff --git a/Algo/GalerkinContinu/AlgoStatiques/AlgoriFlambLineaire.h b/Algo/GalerkinContinu/AlgoStatiques/AlgoriFlambLineaire.h index 2f74306..e70806c 100644 --- a/Algo/GalerkinContinu/AlgoStatiques/AlgoriFlambLineaire.h +++ b/Algo/GalerkinContinu/AlgoStatiques/AlgoriFlambLineaire.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -91,6 +91,7 @@ class AlgoriFlambLineaire : public Algori << " l'algo passe en parametre est en fait : " << Nom_TypeCalcul(algo->TypeDeCalcul()) << " arret !! " << flush; Sortie(1); + return NULL; } else { AlgoriFlambLineaire* inter = (AlgoriFlambLineaire*) algo; diff --git a/Algo/GalerkinContinu/AlgoStatiques/AlgoriNonDyna.cc b/Algo/GalerkinContinu/AlgoStatiques/AlgoriNonDyna.cc index 44af7df..ad026b8 100644 --- a/Algo/GalerkinContinu/AlgoStatiques/AlgoriNonDyna.cc +++ b/Algo/GalerkinContinu/AlgoStatiques/AlgoriNonDyna.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -269,10 +269,6 @@ void AlgoriNonDyna::Execution(ParaGlob * paraGlob,LesMaillages * lesMail ,divStock,charge,lesCondLim,lesContacts,resultats ); }; -//---- fonction obsolete >> a virer !! --------------------- -// Calcul_Equilibre(paraGlob,lesMail,lesRef,lesCourbes1D,lesLoisDeComp -// ,divStock,charge,lesCondLim,lesContacts,resultats ); -//---- fin fonction obsolete >> a virer !! ----------------- };// fin du cas sans commandes interactives // ensuite on teste en fonction des calculs complémentaires diff --git a/Algo/GalerkinContinu/AlgoStatiques/AlgoriNonDyna.h b/Algo/GalerkinContinu/AlgoStatiques/AlgoriNonDyna.h index cae4c99..6e4286f 100644 --- a/Algo/GalerkinContinu/AlgoStatiques/AlgoriNonDyna.h +++ b/Algo/GalerkinContinu/AlgoStatiques/AlgoriNonDyna.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -91,6 +91,7 @@ class AlgoriNonDyna : public Algori << " l'algo passe en parametre est en fait : " << Nom_TypeCalcul(algo->TypeDeCalcul()) << " arret !! " << flush; Sortie(1); + return NULL; } else { AlgoriNonDyna* inter = (AlgoriNonDyna*) algo; diff --git a/Algo/GalerkinContinu/AlgoStatiques/AlgoriNonDyna2.cc b/Algo/GalerkinContinu/AlgoStatiques/AlgoriNonDyna2.cc index a847f66..a5d463f 100644 --- a/Algo/GalerkinContinu/AlgoStatiques/AlgoriNonDyna2.cc +++ b/Algo/GalerkinContinu/AlgoStatiques/AlgoriNonDyna2.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -48,6 +48,26 @@ void AlgoriNonDyna::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, tempsInitialisation.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(NON_DYNA); // transfert info + #ifdef UTILISATION_MPI + // calcul de l'équilibrage initiale par le cpu 0 + if (distribution_CPU_algo.Tableau_element_CPU_en_cours()->Taille() == 0 ) + {distribution_CPU_algo.Calcul_Equilibrage_initiale(lesMail); + temps_transfert_court.Mise_en_route_du_comptage(); // comptage cpu + distribution_CPU_algo.Passage_Equilibrage_aux_CPU(); + temps_transfert_court.Arret_du_comptage(); // fin comptage cpu + paraGlob->Init_tableau (distribution_CPU_algo.Tableau_element_CPU_en_cours()); + }; + #endif + + +////------- debug +//cout << "\n debug AlgoriNonDyna::InitAlgorithme "; +//lesMail->Noeud_LesMaille(1,120).Affiche(9); +//cout << endl; +////-------- fin debug + + + // avant toute chose, au cas où l'algo interviendrait après un autre algo // on inactive tous les ddl existants lesMail->Inactive_ddl(); @@ -168,7 +188,7 @@ void AlgoriNonDyna::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, // vérification d'une singularité éventuelle de la matrice de raideur // à cause d'un trop faible nombre de pti VerifSingulariteRaideurMeca(nbddl_X,*lesMail); - // def vecteurs globaux + // def vecteurs globaux vglobin.Change_taille(nbddl_X); // puissance interne vglobex.Change_taille(nbddl_X); // puissance externe vglobaal.Change_taille(nbddl_X,0.); // puissance totale @@ -218,22 +238,24 @@ void AlgoriNonDyna::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, // initi boucle sur les increments de charge icharge = 0; + // definition des elements de frontiere, ces elements sont utilises pour le contact + lesMail->CreeElemFront(); + // calcul éventuel des normales aux noeuds -> init des normales pour t=0 + lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // --- init du contact --- // doit-être avant la lecture d'un restart, car il y a une initialisation de conteneurs qui est faites // qui ensuite est utilisée en restart // par exemple il faut initialiser les frontières et la répartition esclave et maître // pour préparer la lecture de restart éventuel if (lesMail->NbEsclave() != 0) - { // definition des elements de frontiere, ces elements sont utilises pour le contact - int cal_front = lesMail->CreeElemFront(); - lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); + { lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); // initialisation des zones de contacts éventuelles lesContacts->Init_contact(*lesMail,*lesRef,lesFonctionsnD); // verification qu'il n'y a pas de contact avant le premier increment de charge lesContacts->Verification(); - // definition des elements de contact eventuels - // et imposition éventuel de certaines des conditions de contact (dépend du modèle de contact) - lesContacts->DefElemCont(0.); // au début le déplacement des noeuds est nul +// // definition des elements de contact eventuels +// // et imposition éventuel de certaines des conditions de contact (dépend du modèle de contact) +// lesContacts->DefElemCont(0.); // au début le déplacement des noeuds est nul if (pa.ContactType() == 4) // cas particulier du type 4 de contact où on utilise les forces internes {// def d'un type générique, utilisé pour le transfert des forces internes, vers les conteneurs noeuds Coordonnee coor(ParaGlob::Dimension()); // un type coordonnee typique @@ -247,11 +269,14 @@ void AlgoriNonDyna::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, // double diam_mini = lesMail->Min_dist2Noeud_des_elements(TEMPS_0); // lesContacts->DefElemCont(2. * diam_mini); try { + // definition des elements de contact eventuels + // et imposition éventuel de certaines des conditions de contact (dépend du modèle de contact) bool nevez_contact = lesContacts->DefElemCont(0.); // au début le déplacement des noeuds est nul int niveau_substitution = 0; // on intervient sur toutes les matrices bool premier_calcul = true; // mise à jour éventuelle de la matrice de raideur en fonction du contact - bool changement_sur_matrice = Gestion_stockage_et_renumerotation_avec_contact + //bool changement_sur_matrice = + Gestion_stockage_et_renumerotation_avec_contact (premier_calcul,lesMail,nevez_contact,lesCondLim ,lesRef,tab_mato,Ass.Nb_cas_assemb(),lesContacts,niveau_substitution); matglob=tab_mato(1); @@ -272,6 +297,7 @@ void AlgoriNonDyna::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, }; + //--cas de restart et/ou de sauvegarde------------ // tout d'abord récup du restart si nécessaire // dans le cas ou un incrément différent de 0 est demandé -> seconde lecture à l'incrément @@ -311,8 +337,7 @@ void AlgoriNonDyna::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); - + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); @@ -334,11 +359,15 @@ void AlgoriNonDyna::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, }; // sinon ok, et on met à jour la boite d'encombrement compte tenue des nouvelles coordonnées lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); - bool nevez_contact = lesContacts->Actualisation(); + bool nevez_contact = lesContacts->Actualisation(0); + // *** test + bool nevez_bis_contact = lesContacts->Nouveau(0.); + nevez_contact = (nevez_contact || nevez_bis_contact); //double dep_max) int niveau_substitution = 0; // on intervient sur toutes les matrices bool premier_calcul = true; // mise à jour éventuelle de la matrice de raideur en fonction du contact - bool changement_sur_matrice = Gestion_stockage_et_renumerotation_avec_contact + //bool changement_sur_matrice = + Gestion_stockage_et_renumerotation_avec_contact (premier_calcul,lesMail,nevez_contact,lesCondLim ,lesRef,tab_mato,Ass.Nb_cas_assemb(),lesContacts,niveau_substitution); matglob=tab_mato(1); @@ -382,14 +411,11 @@ void AlgoriNonDyna::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, }; }; - // calcul éventuel des normales aux noeuds -> init des normales pour t=0 - lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex - // init de var glob Transfert_ParaGlob_COMPTEUR_INCREMENT_CHARGE_ALGO_GLOBAL(icharge); //--fin cas de restart et/ou de sauvegarde-------- type_incre = OrdreVisu::PREMIER_INCRE; // pour la visualisation au fil du calcul - + // ajout d'un conteneur pour les coordonnées à l'itération 0 {Coordonnee coor(ParaGlob::Dimension()); // un type coordonnee typique Grandeur_coordonnee gt(coor); // une grandeur typique de type Grandeur_coordonnee @@ -552,6 +578,10 @@ void AlgoriNonDyna::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail // mais pas après un changement de statut { Pilotage_du_temps(charge,arret_pilotage); // appel du Pilotage if (arret_pilotage) break; // pilotage -> arret du calcul + #ifdef UTILISATION_MPI + // seule le process 0 s'occupe de la sortie + if (ParaGlob::Monde()->rank() == 0) + #endif if (aff_incr) {cout << "\n======================================================================" << "\nINCREMENT DE CHARGE : " << icharge @@ -593,11 +623,13 @@ void AlgoriNonDyna::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail else { // on supprime les éléments inactifs testés à l'incr prec dans Actualisation() a_changer = lescontacts->SuppressionDefinitiveElemInactif(); - a_changer = a_changer || lescontacts->Nouveau(max_delta_X); + bool a_changer_nouveau = lescontacts->Nouveau(max_delta_X); + a_changer = a_changer || a_changer_nouveau; }; int niveau_substitution = 0; // on intervient sur toutes les matrices if (premier_calcul || a_changer) - {bool changement_sur_matrice = Gestion_stockage_et_renumerotation_avec_contact + {//bool changement_sur_matrice = + Gestion_stockage_et_renumerotation_avec_contact (premier_calcul,lesMail,a_changer,lesCondLim,lesRef ,tab_mato,Ass.Nb_cas_assemb(),lescontacts,niveau_substitution); matglob=tab_mato(1); @@ -607,7 +639,11 @@ void AlgoriNonDyna::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail } else {if (arret_pilotage) break; // pilotage -> arret du calcul - cout << "\n=============================================================================" + #ifdef UTILISATION_MPI + // seule le process 0 s'occupe de la sortie + if (ParaGlob::Monde()->rank() == 0) + #endif + cout << "\n=============================================================================" << "\n ....... re-analyse du contact ........ " << "\nINCREMENT DE CHARGE : " << icharge << " intensite " << charge->IntensiteCharge() << " t= " << charge->Temps_courant() @@ -693,10 +729,11 @@ void AlgoriNonDyna::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail // qui est projeté sur la facette dans le cas de l'algorithme cinématique if (pa.ContactType()) { int niveau_substitution = 0; // on intervient sur toutes les matrices - bool a_changer = lescontacts->Actualisation(); + bool a_changer = lescontacts->Actualisation(1); // mise à jour éventuelle des matrices de raideur en fonction du contact if (a_changer) - {bool changement_sur_matrice = Gestion_stockage_et_renumerotation_avec_contact + {//bool changement_sur_matrice = + Gestion_stockage_et_renumerotation_avec_contact (premier_calcul,lesMail,a_changer,lesCondLim,lesRef ,tab_mato,Ass.Nb_cas_assemb(),lescontacts,niveau_substitution); matglob=tab_mato(1); @@ -879,7 +916,12 @@ void AlgoriNonDyna::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail // calcul de la variation de ddl / delta t // delta_X = X_tdt; delta_X -= X_t; // X_tdt - X_t Algori::Cal_Transfert_delta_et_var_X(max_delta_X,max_var_delta_X); - if (permet_affichage > 3) + #ifdef UTILISATION_MPI + // cas d'un calcul //, pour l'instant seul le CPU 0 sont concerné + if ((ParaGlob::Monde()->rank() == 0)&&(permet_affichage > 3)) + #else + if (permet_affichage > 3) + #endif { cout << "\n --- |max_var_DeltaDdl|= "<< max_var_delta_X << " , |max_deltaDdl|= " << max_delta_X << flush;}; // ---dans le cas du mode debug on sort éventuellement les infos au fil du calcul (un peu bricolé) @@ -906,7 +948,13 @@ void AlgoriNonDyna::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail // en tenant compte éventuellement du contact (non decollement) decol = false systématiquement si pas de contact decol = false; // pour debugger - + + bool arret_iteration = false; + #ifdef UTILISATION_MPI + // seule le process 0 s'occupe de la convergence + if (ParaGlob::Monde()->rank() == 0) + { + #endif if (Convergence(aff_iteration,last_var_ddl_max,vglobaal,maxPuissExt,maxPuissInt,maxReaction,compteur,arret_convergence) && !decol) { // on sort de la boucle des itérations sauf si l'on est en loi simplifiée @@ -915,10 +963,19 @@ decol = false; // pour debugger { lesLoisDeComp->Loi_simplifie(false);} else // cas normal, - {break;}; + {arret_iteration = true; }; //break;}; } else if (arret_convergence) - {break;} // cas ou la méthode Convergence() demande l'arret + {arret_iteration = true; }; //break;} // cas ou la méthode Convergence() demande l'arret + #ifdef UTILISATION_MPI + }; + temps_transfert_court.Mise_en_route_du_comptage(); // comptage cpu + broadcast(*ParaGlob::Monde(), arret_iteration, 0); + temps_transfert_court.Arret_du_comptage(); // fin comptage cpu + #endif + if (arret_iteration) + break; + // sinon on continue // pour le pilotage ou pour l'accélération de convergence, sauvegarde du résidu if (pa.Line_search() || (acceleration_convergence)) @@ -929,6 +986,11 @@ decol = false; // pour debugger bool erreur_resolution_syst_lineaire = false; // init int nb_matrice_secondaire = tab_mato.Taille(); // = 1 par défaut, mais on peut en avoir d'autre int niveau_substitution = 1; // par défaut on utilise la matrice de raideur matglob = tab_mato(1) + #ifdef UTILISATION_MPI + // seule le process 0 fait la résolution globale + if (ParaGlob::Monde()->rank() == 0) + { + #endif while (niveau_substitution <= nb_matrice_secondaire) { // on sauvegarde éventuellement le second membre if (nb_matrice_secondaire > 1) // cela veut dire que l'on est suceptible de faire plusieurs boucles @@ -984,11 +1046,6 @@ decol = false; // pour debugger }; tempsResolSystemLineaire.Arret_du_comptage(); // temps cpu - // effacement du marquage de ddl bloque du au conditions lineaire imposée par l'entrée - lesCondLim->EffMarque(); - if ((pa.ContactType()==1) || (pa.ContactType()==3)) - lescontacts->EffMarque(); - // cas où on a eu au final une erreur de résolution if (erreur_resolution_syst_lineaire) {Change_PhaseDeConvergence(-9); // on signale une divergence due à la résolution @@ -1015,6 +1072,44 @@ decol = false; // pour debugger // sortie d'info sur l'increment concernant les variations de ddl if ((aff_iteration)&&(ParaGlob::NiveauImpression() > 1)) InfoIncrementDdl(lesMail,inSol,maxDeltatDdl_signe,Ass.Nb_cas_assemb()); + + #ifdef UTILISATION_MPI + } + else // s'il s'agit d'un process de calcul élémentaire + {sol = &vglobaal; // il faut affecter sol pour récupérer ensuite la solution + }; + // le process 0 transmet aux autres process le vecteur résultat + temps_transfert_long.Mise_en_route_du_comptage(); // comptage cpu + +//// essai pour remplacer broadcast +// int nb_process = ParaGlob::Monde()->size(); +// mpi::request reqs1; +// if (ParaGlob::Monde()->rank() == 0) +// // NB: le process 0 c'est le main +// {for (int i=1;iIenvoi_MPI(i, 38);} +// } +// else +// {reqs1 = sol->Irecup_MPI(0,38);}; +//// ParaGlob::Monde()->barrier(); +// reqs1.wait(); + +// mpi::request Ienvoi_MPI(int dest, int tag) const +// {return ParaGlob::Monde()->isend(dest,tag,v,taille);}; +// mpi::request Irecup_MPI(int source, int tag) const + + sol->Broadcast(0); +// broadcast(*ParaGlob::Monde(), *sol, 0); + // synchronisation ici de tous les process (à supprimer par la suite car n'est + // pas nécessaire pour le déroulementa priori ?? ) +// ParaGlob::Monde()->barrier(); + temps_transfert_long.Arret_du_comptage(); // fin comptage cpu + #endif + + // effacement du marquage de ddl bloque du au conditions lineaire imposée par l'entrée + lesCondLim->EffMarque(); + if ((pa.ContactType()==1) || (pa.ContactType()==3)) + lescontacts->EffMarque(); // suite du pilotage // ------------------------------------------------------------ @@ -1070,7 +1165,15 @@ decol = false; // pour debugger }; if ((pa.ContactType()==1) || (pa.ContactType()==3)) lescontacts->EffMarque(); - // gestion de la fin des itérations + + // === gestion de la fin des itérations === + #ifdef UTILISATION_MPI + // seule le process 0 a fait la résolution globale + // il gère seul également la convergence, mais il doit tenir au courant les autres process + Algori::Passage_indicConvergenceAuxProcCalcul(); + // ce qui permet le déroulement correct de la suite pour tous les process + #endif + if ((!Pilotage_fin_iteration_implicite(compteur))||(pa.EtatSortieEquilibreGlobal())) // if ((!Pilotage_fin_iteration_implicite(compteur)) // && (!pa.EtatSortieEtatActuelDansBI())) @@ -1097,7 +1200,7 @@ decol = false; // pour debugger lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); @@ -1118,14 +1221,15 @@ decol = false; // pour debugger << " , |max_deltaDdl|= " << max_delta_X << flush;}; if (pa.ContactType()) { // actualisation du contact en fonction du dernier incrément - bool nevez_contact = lescontacts->Actualisation(); + bool nevez_contact = lescontacts->Actualisation(0); // réexamen du contact pour voir s'il n'y a pas de nouveau element de contact // en fait on fera au plus deux passages supplémentaire, sinon la boucle peut être infini, // à la fin du second passage, on regarde s'il y a décollement, si oui on relâche et on refait un passage // sinon on valide //I)-------------- if (indicCycleContact == 0 ) - { nevez_contact = nevez_contact || lescontacts->Nouveau(lesMail->Max_var_dep_t_a_tdt()); + { bool nouveau_contact = lescontacts->Nouveau(lesMail->Max_var_dep_t_a_tdt()); + nevez_contact = nevez_contact || nouveau_contact; if (nevez_contact) {indicCycleContact=1;} // on a de nouveau contact on refait le deuxième cycle else @@ -1150,7 +1254,8 @@ decol = false; // pour debugger ) {int niveau_substitution = 0; // on intervient sur toutes les matrices bool nouveau = (nevez_contact || relachement_contact); - bool changement_sur_matrice = Gestion_stockage_et_renumerotation_avec_contact + //bool changement_sur_matrice = + Gestion_stockage_et_renumerotation_avec_contact (premier_calcul,lesMail,nouveau,lesCondLim ,lesRef,tab_mato,Ass.Nb_cas_assemb(),lescontacts,niveau_substitution); matglob=tab_mato(1); @@ -1662,6 +1767,10 @@ void AlgoriNonDyna::Calcul_Equilibre_longueur_arc // boucle sur les increments de charge icharge = 1; + // definition des elements de frontiere, ces elements sont utilises pour le contact + lesMail->CreeElemFront(); + // calcul éventuel des normales aux noeuds -> init des normales pour t=0 + lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // --- init du contact --- // doit-être avant la lecture d'un restart, car il y a une initialisation de conteneurs qui est faites // qui ensuite est utilisée en restart @@ -1669,7 +1778,6 @@ void AlgoriNonDyna::Calcul_Equilibre_longueur_arc // pour préparer la lecture de restart éventuel if (lesMail->NbEsclave() != 0) { // definition des elements de frontiere, ces elements sont utilises pour le contact - int cal_front = lesMail->CreeElemFront(); lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); // initialisation des zones de contacts éventuelles lesContacts->Init_contact(*lesMail,*lesRef,lesFonctionsnD); @@ -1683,7 +1791,8 @@ void AlgoriNonDyna::Calcul_Equilibre_longueur_arc int niveau_substitution = 0; // on intervient sur toutes les matrices bool premier_calcul = true; // mise à jour éventuelle de la matrice de raideur en fonction du contact - bool changement_sur_matrice = Gestion_stockage_et_renumerotation_avec_contact + //bool changement_sur_matrice = + Gestion_stockage_et_renumerotation_avec_contact (premier_calcul,lesMail,nevez_contact,lesCondLim ,lesRef,tab_mato,Ass.Nb_cas_assemb(),lesContacts,niveau_substitution); matglob=tab_mato(1); @@ -1718,7 +1827,7 @@ void AlgoriNonDyna::Calcul_Equilibre_longueur_arc lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); @@ -1765,7 +1874,7 @@ void AlgoriNonDyna::Calcul_Equilibre_longueur_arc // de calculer meme si l'utilisateur indique un increment de charge supérieur // au temps final bool arret_pilotage=false; // pour arrêt du calcul au niveau du pilotage - while ((!charge->Fin(icharge))||(icharge == 1) + while (((!charge->Fin(icharge))||(icharge == 1)) && (charge->Fin(icharge,true)!=2) // si on a dépassé le nombre d'incrément permis on s'arrête dans tous les cas && (charge->Fin(icharge,false)!=3) // idem si on a dépassé le nombre d'essai d'incrément permis // 1er appel avec true: pour affichage et second avec false car c'est déjà affiché @@ -1873,7 +1982,7 @@ void AlgoriNonDyna::Calcul_Equilibre_longueur_arc (aff_incr && (compteur % pa.freq_affich_iter()==0) &&(compteur!=0)) : false ; lesLoisDeComp->MiseAJour_umat_nbiter(compteur); // init pour les lois Umat éventuelles // bool sur_raideur = false; // pour l'instant pas de prise en compte sur la raideur - bool sur_raideur = true; // essai + // bool sur_raideur = true; // essai // mise en place du chargement impose, c-a-d calcul de la puissance externe // si pb on sort de la boucle if (!(charge->ChargeSMembreRaideur_Im_mecaSolid diff --git a/Algo/GalerkinContinu/AlgoStatiques/ImpliNonDynaCont.cc b/Algo/GalerkinContinu/AlgoStatiques/ImpliNonDynaCont.cc index 585c7d9..87e90e7 100644 --- a/Algo/GalerkinContinu/AlgoStatiques/ImpliNonDynaCont.cc +++ b/Algo/GalerkinContinu/AlgoStatiques/ImpliNonDynaCont.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -255,6 +255,10 @@ void ImpliNonDynaCont::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMa //--** // un premier increment pour demmarer le processus //--** charge->Avance(); // premier increment de charge ????????? différent des autres algos + // definition des elements de frontiere, ces elements sont utilises pour le contact + lesMail->CreeElemFront(); + // calcul éventuel des normales aux noeuds -> init des normales pour t=0 + lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // --- init du contact --- // doit-être avant la lecture d'un restart, car il y a une initialisation de conteneurs qui est faites // qui ensuite est utilisée en restart @@ -262,7 +266,6 @@ void ImpliNonDynaCont::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMa // pour préparer la lecture de restart éventuel if (lesMail->NbEsclave() != 0) { // definition des elements de frontiere, ces elements sont utilises pour le contact - int cal_front = lesMail->CreeElemFront(); lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); // initialisation des zones de contacts éventuelles lescontacts->Init_contact(*lesMail,*lesRef,lesFonctionsnD); @@ -478,7 +481,7 @@ void ImpliNonDynaCont::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMa // actualisation des conditions de contact qui peuvent changer // la largeur de bande, quand un noeud glisse d'une facette sur une voisine if (compteur != 0) - { lescontacts->Actualisation(); + { lescontacts->Actualisation(1); // mise à jour éventuelle de la matrice de raideur en fonction du contact Mise_a_jour_Choix_matriciel_contact(tab_mato,Ass.Nb_cas_assemb(),lescontacts,niveau_substitution); mato=tab_mato(1); diff --git a/Algo/GalerkinContinu/AlgoStatiques/ImpliNonDynaCont.h b/Algo/GalerkinContinu/AlgoStatiques/ImpliNonDynaCont.h index 05f6729..a92d1d6 100644 --- a/Algo/GalerkinContinu/AlgoStatiques/ImpliNonDynaCont.h +++ b/Algo/GalerkinContinu/AlgoStatiques/ImpliNonDynaCont.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -88,6 +88,7 @@ class ImpliNonDynaCont : public Algori << " l'algo passe en parametre est en fait : " << Nom_TypeCalcul(algo->TypeDeCalcul()) << " arret !! " << flush; Sortie(1); + return NULL; } else { ImpliNonDynaCont* inter = (ImpliNonDynaCont*) algo; diff --git a/Algo/GalerkinDiscontinu/DG_DynaExplicite/AlgoBonelli.cc b/Algo/GalerkinDiscontinu/DG_DynaExplicite/AlgoBonelli.cc index 5e41dd8..2a9d990 100644 --- a/Algo/GalerkinDiscontinu/DG_DynaExplicite/AlgoBonelli.cc +++ b/Algo/GalerkinDiscontinu/DG_DynaExplicite/AlgoBonelli.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -320,7 +320,7 @@ void AlgoBonelli::Gestion_pas_de_temps(LesMaillages * lesMail,int cas,int ) case 1 : { // ---- récup du pas de temps, proposé par l'utilisateur delta_t = pa.Deltat(); double delta_t_old = delta_t; - double delta_tSauve = delta_t; // sauvegarde de la situation actuelle +// double delta_tSauve = delta_t; // sauvegarde de la situation actuelle // ---- on calcul le pas de temps minimal pour cela on utilise // les caractéristiques dynamiques d'une biellette de longueur // valant le minimum d'un coté d'arrête @@ -647,6 +647,15 @@ void AlgoBonelli::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, tempsInitialisation.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(DYNA_EXP_BONELLI); // transfert info + #ifdef UTILISATION_MPI + // calcul de l'équilibrage initiale par le cpu 0 + if (distribution_CPU_algo.Tableau_element_CPU_en_cours()->Taille() == 0 ) + {distribution_CPU_algo.Calcul_Equilibrage_initiale(lesMail); + distribution_CPU_algo.Passage_Equilibrage_aux_CPU(); + paraGlob->Init_tableau (distribution_CPU_algo.Tableau_element_CPU_en_cours()); + }; + #endif + // avant toute chose, au cas où l'algo interviendrait après un autre algo // on inactive tous les ddl existants lesMail->Inactive_ddl(); @@ -780,6 +789,10 @@ void AlgoBonelli::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, // initialisation du compteur d'increments de charge icharge = 0; + // definition des elements de frontiere, ces elements sont utilises pour le contact + lesMail->CreeElemFront(); + // calcul éventuel des normales aux noeuds -> init des normales pour t=0 + lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // --- init du contact --- // doit-être avant la lecture d'un restart, car il y a une initialisation de conteneurs qui est faites // qui ensuite est utilisée en restart @@ -787,7 +800,8 @@ void AlgoBonelli::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, // pour préparer la lecture de restart éventuel if (lesMail->NbEsclave() != 0) { // definition des elements de frontiere, ces elements sont utilises pour le contact - int cal_front = lesMail->CreeElemFront(); +// int cal_front = + lesMail->CreeElemFront(); lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_t); // initialisation des zones de contacts éventuelles lesContacts->Init_contact(*lesMail,*lesRef,lesFonctionsnD); @@ -796,6 +810,7 @@ void AlgoBonelli::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, // definition des elements de contact eventuels lesContacts->DefElemCont(0.); // au début le déplacement des noeuds est nul }; + //--cas de restart et/ou de sauvegarde------------ // tout d'abord récup du restart si nécessaire // dans le cas ou un incrément différent de 0 est demandé -> seconde lecture à l'incrément @@ -817,7 +832,7 @@ void AlgoBonelli::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, lesMail->ChangeStatut(cas_combi_ddl,LIBRE); // dans le cas d'un calcul axisymétrique on bloque le ddl 3 if (ParaGlob::AxiSymetrie()) - lesMail->Inactive_un_type_ddl_particulier(X3); + lesMail->Inactive_un_ddl_particulier(X3); // on valide l'activité des conditions limites et condition linéaires, pour le temps initial // en conformité avec les conditions lues (qui peuvent éventuellement changé / aux calcul qui a donné le .BI) lesCondLim->Validation_blocage (lesRef,charge->Temps_courant()); @@ -857,9 +872,6 @@ void AlgoBonelli::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail, } } //--fin cas de restart et/ou de sauvegarde-------- - - // calcul éventuel des normales aux noeuds -> init des normales pour t=0 - lesMail->InitNormaleAuxNoeuds(); //utilisé pour la stabilisation des membranes par ex // ajout d'un conteneur pour les coordonnées à l'itération 0 {Coordonnee coor(ParaGlob::Dimension()); // un type coordonnee typique @@ -972,6 +984,8 @@ void AlgoBonelli::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail { tempsCalEquilibre.Mise_en_route_du_comptage(); // temps cpu Transfert_ParaGlob_ALGO_GLOBAL_ACTUEL(DYNA_EXP_BONELLI); // transfert info + // init var glob: du num d'itération. De manière arbitraire, en dynamique explicite + Transfert_ParaGlob_COMPTEUR_ITERATION_ALGO_GLOBAL(1); // on a toujours une seule itération OrdreVisu::EnumTypeIncre type_incre = OrdreVisu::PREMIER_INCRE; // pour la visualisation au fil du calcul // préparation pour les aspects validation du calcul et sortie contrôlée des incréments @@ -1424,8 +1438,8 @@ void AlgoBonelli::AvanceDDL_avec_CL(const Vecteur & phii,enuTypePhase phasage) for(ie=li_gene_asso.begin(),ih=1;ie!=iefin;ie++,ih++) {LesCondLim::Gene_asso & s = (*ie); // pour simplifier int ix=s.pointe(1); // début des Xi - int iv=s.pointe(2); // début des Vi - int ig=s.pointe(3); // début des gammai +// int iv=s.pointe(2); // début des Vi +// int ig=s.pointe(3); // début des gammai q_2(ix) = X_Bl(ih); q_1(ix) = X_t(ix); }; @@ -1474,8 +1488,8 @@ void AlgoBonelli::AvanceDDL_avec_CL(const Vecteur & phii,enuTypePhase phasage) for(ie=li_gene_asso.begin(),ih=1;ie!=iefin;ie++,ih++) {LesCondLim::Gene_asso & s = (*ie); // pour simplifier int ix=s.pointe(1); // début des Xi - int iv=s.pointe(2); // début des Vi - int ig=s.pointe(3); // début des gammai +// int iv=s.pointe(2); // début des Vi +// int ig=s.pointe(3); // début des gammai q_2(ix) = X_Bl(ih); q_1(ix) = X_t(ix); }; diff --git a/Algo/GalerkinDiscontinu/DG_DynaExplicite/AlgoBonelli.h b/Algo/GalerkinDiscontinu/DG_DynaExplicite/AlgoBonelli.h index e22c03e..e7df9f0 100644 --- a/Algo/GalerkinDiscontinu/DG_DynaExplicite/AlgoBonelli.h +++ b/Algo/GalerkinDiscontinu/DG_DynaExplicite/AlgoBonelli.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -107,6 +107,7 @@ class AlgoBonelli : public Algori << " l'algo passe en parametre est en fait : " << Nom_TypeCalcul(algo->TypeDeCalcul()) << " arret !! " << flush; Sortie(1); + return NULL; } else { AlgoBonelli* inter = (AlgoBonelli*) algo; diff --git a/Chargement/BlocCharge.cc b/Chargement/BlocCharge.cc index e28c373..fed7a9a 100644 --- a/Chargement/BlocCharge.cc +++ b/Chargement/BlocCharge.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -93,7 +93,7 @@ void BlocScalVecTypeCharge::Lecture_champ_de_valeurs(UtilLecture & entreePrinc) { list lili; // une liste de travail // on va lire tant que l'on n'aura pas trouvé le mot clé de fin de champ entreePrinc.NouvelleDonnee(); // lecture d'un nouvelle enregistrement - while (strstr(entreePrinc.tablcar,"fin_champ_de_valeurs:")!=NULL) + while (strstr(entreePrinc.tablcar,"fin_champ_de_valeurs:")==NULL) { double grandeur; *(entreePrinc.entree) >> grandeur; // on contrôle le flux @@ -873,7 +873,7 @@ void PTorseurPonct::Force(const Tableau & tab_P, Tableau Trouve(tabTorseurPonct(i).NomRef(),tabTorseurPonct(i).NomMaillage()); - const ReferenceNE & refN = ((ReferenceNE &) ref); + //const ReferenceNE & refN = ((ReferenceNE &) ref); if (ref.Indic() != 1) // cas où la référence ne correspond pas à des noeuds { cout << "\n ERREUR la reference: " << ref.Nom() diff --git a/Chargement/Charge.h b/Chargement/Charge.h index 9663f9c..778f07d 100644 --- a/Chargement/Charge.h +++ b/Chargement/Charge.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Chargement/Charge2.cc b/Chargement/Charge2.cc index 62ba1c4..a36566e 100644 --- a/Chargement/Charge2.cc +++ b/Chargement/Charge2.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -45,6 +45,11 @@ bool Charge::ChargeSecondMembre_Ex_mecaSolid (Assemblage & assemb,LesMaillages * lesMail,LesReferences* lesRef,Vecteur& vecglob ,const ParaAlgoControle & pa,LesCourbes1D* lesCourbes1D,LesFonctions_nD* lesFonctionsnD) { +#ifdef UTILISATION_MPI + // cas d'un calcul //, pour l'instant seule la (ou les) matrices du CPU 0 sont concernées + if (ParaGlob::Monde()->rank() != 0) + return true; +#endif temps_cpu_chargement.Mise_en_route_du_comptage(); // temps cpu bool retour = true; // init par défaut try @@ -1077,8 +1082,13 @@ bool Charge::ChargeSMembreRaideur_Im_mecaSolid const DdlElement& tab_ddl,const Tableau&tab_noeud) ,const ParaAlgoControle & pa ,LesCourbes1D* lesCourbes1D,LesFonctions_nD* lesFonctionsnD) - { - temps_cpu_chargement.Mise_en_route_du_comptage(); + { +#ifdef UTILISATION_MPI + // cas d'un calcul //, pour l'instant seule la (ou les) matrices du CPU 0 sont concernées + if (ParaGlob::Monde()->rank() != 0) + return true; +#endif + temps_cpu_chargement.Mise_en_route_du_comptage(); bool retour = true; // init par défaut try {// pour tous les maillages, pour tous les éléments on effectue une initialisation éventuelle diff --git a/Chargement/Charge3.cc b/Chargement/Charge3.cc index e52b99f..35d697c 100644 --- a/Chargement/Charge3.cc +++ b/Chargement/Charge3.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -1256,19 +1256,31 @@ void Charge::Precedent7() int Charge::Fin1(const int & icharge,bool affichage) { double temps = paAlgo->Variables_de_temps().TempsCourant(); if ((temps > paAlgo->Tempsfin()) || (Dabs(temps - paAlgo->Tempsfin()) <= paAlgo->Prectemps())) - { if ((ParaGlob::NiveauImpression() >= 1)&& affichage) + { + #ifdef UTILISATION_MPI + if (ParaGlob::Monde()->rank() == 0) + #endif + if ((ParaGlob::NiveauImpression() >= 1)&& affichage) { cout << "\n >>>> temps fin ("<Tempsfin()<<") atteint <<<<< " << temps << endl ;}; return 1; } // else if (icharge >= paAlgo->Maxincre()) else if (icharge > paAlgo->Maxincre()) // modif 14 sept 2015 - {if (affichage) cout << "\n maximum d'increments fixes atteint : "<< paAlgo->Maxincre() + { + #ifdef UTILISATION_MPI + if (ParaGlob::Monde()->rank() == 0) + #endif + if (affichage) cout << "\n maximum d'increments fixes atteint : "<< paAlgo->Maxincre() << "\n (pour info: maximum d'essai calcul increments = "<< paAlgo->Max_essai_incre()<<") " << endl ; return 2; } else if (compteur_essai_increment > paAlgo->Max_essai_incre()) - {if (affichage) cout << "\n maximum d'essai d'increments fixes atteint : "<< paAlgo->Max_essai_incre() << endl ; + { + #ifdef UTILISATION_MPI + if (ParaGlob::Monde()->rank() == 0) + #endif + if (affichage) cout << "\n maximum d'essai d'increments fixes atteint : "<< paAlgo->Max_essai_incre() << endl ; return 3; } else @@ -1277,17 +1289,25 @@ int Charge::Fin1(const int & icharge,bool affichage) int Charge::Fin2(const int & icharge,bool affichage) { double temps = paAlgo->Variables_de_temps().TempsCourant(); if ((temps > paAlgo->Tempsfin()) || (Dabs(temps - paAlgo->Tempsfin()) <= paAlgo->Prectemps())) - { if ((ParaGlob::NiveauImpression() >= 1)&& affichage) + { + #ifdef UTILISATION_MPI + if (ParaGlob::Monde()->rank() == 0) + #endif + if ((ParaGlob::NiveauImpression() >= 1)&& affichage) { cout << "\n >>>> temps fin ("<Tempsfin()<<") atteint <<<<< " << temps << endl ;}; return 1; - } + } // else if (icharge >= paAlgo->Maxincre()) else if (icharge > paAlgo->Maxincre()) // modif 14 sept 2015 - {if (affichage) cout << "\n maximum d'increments fixes atteint : "<< paAlgo->Maxincre() + { + #ifdef UTILISATION_MPI + if (ParaGlob::Monde()->rank() == 0) + #endif + if (affichage) cout << "\n maximum d'increments fixes atteint : "<< paAlgo->Maxincre() << "\n (pour info: maximum d'essai calcul increments = "<< paAlgo->Max_essai_incre()<<") " << endl ; return 2; - } + } else if (compteur_essai_increment >= paAlgo->Max_essai_incre()) {if (affichage) cout << "\n maximum d'essai d'increments fixes atteint : "<< paAlgo->Max_essai_incre() << endl ; return 3; @@ -1298,42 +1318,66 @@ int Charge::Fin2(const int & icharge,bool affichage) int Charge::Fin3(const int & icharge,bool affichage) { double temps = paAlgo->Variables_de_temps().TempsCourant(); if ((temps > paAlgo->Tempsfin()) || (Dabs(temps - paAlgo->Tempsfin()) <= paAlgo->Prectemps())) - { if ((ParaGlob::NiveauImpression() >= 1)&& affichage) + { + #ifdef UTILISATION_MPI + if (ParaGlob::Monde()->rank() == 0) + #endif + if ((ParaGlob::NiveauImpression() >= 1)&& affichage) { cout << "\n >>>> temps fin ("<Tempsfin()<<") atteint <<<<< " << temps << endl ;}; return 1; - } + } // else if (icharge >= paAlgo->Maxincre()) else if (icharge > paAlgo->Maxincre()) // modif 14 sept 2015 - {if (affichage) cout << "\n maximum d'increments fixes atteint : "<< paAlgo->Maxincre() + { + #ifdef UTILISATION_MPI + if (ParaGlob::Monde()->rank() == 0) + #endif + if (affichage) cout << "\n maximum d'increments fixes atteint : "<< paAlgo->Maxincre() << "\n (pour info: maximum d'essai calcul increments = "<< paAlgo->Max_essai_incre()<<") " << endl ; - return 2; + return 2; } else if (compteur_essai_increment >= paAlgo->Max_essai_incre()) - {if (affichage) cout << "\n maximum d'essai d'increments fixes atteint : "<< paAlgo->Max_essai_incre() << endl ; + { + #ifdef UTILISATION_MPI + if (ParaGlob::Monde()->rank() == 0) + #endif + if (affichage) cout << "\n maximum d'essai d'increments fixes atteint : "<< paAlgo->Max_essai_incre() << endl ; return 3; - } + } else return 0; }; int Charge::Fin4(const int & icharge,bool affichage) { double temps = paAlgo->Variables_de_temps().TempsCourant(); if ((temps > paAlgo->Tempsfin()) || (Dabs(temps - paAlgo->Tempsfin()) <= paAlgo->Prectemps())) - { if ((ParaGlob::NiveauImpression() >= 1)&& affichage) + { + #ifdef UTILISATION_MPI + if (ParaGlob::Monde()->rank() == 0) + #endif + if ((ParaGlob::NiveauImpression() >= 1)&& affichage) { cout << "\n >>>> temps fin ("<Tempsfin()<<") atteint <<<<< " << temps << endl ;}; return 1; - } + } // else if (icharge >= paAlgo->Maxincre()) else if (icharge > paAlgo->Maxincre()) // modif 14 sept 2015 - {if (affichage) cout << "\n maximum d'increments fixes atteint : "<< paAlgo->Maxincre() + { + #ifdef UTILISATION_MPI + if (ParaGlob::Monde()->rank() == 0) + #endif + if (affichage) cout << "\n maximum d'increments fixes atteint : "<< paAlgo->Maxincre() << "\n (pour info: maximum d'essai calcul increments = "<< paAlgo->Max_essai_incre()<<") " << endl ; - return 2; - } + return 2; + } else if (compteur_essai_increment >= paAlgo->Max_essai_incre()) - {if (affichage) cout << "\n maximum d'essai d'increments fixes atteint : "<< paAlgo->Max_essai_incre() << endl ; - return 3; - } + { + #ifdef UTILISATION_MPI + if (ParaGlob::Monde()->rank() == 0) + #endif + if (affichage) cout << "\n maximum d'essai d'increments fixes atteint : "<< paAlgo->Max_essai_incre() << endl ; + return 3; + } else return 0; }; @@ -1342,25 +1386,41 @@ int Charge::Fin5(const int & icharge,bool affichage) CourbePolyLineaire1D* fconnue_charge = (CourbePolyLineaire1D*) f_charge; double temps = paAlgo->Variables_de_temps().TempsCourant(); // puis le temps if ((temps > paAlgo->Tempsfin()) || (Dabs(temps - paAlgo->Tempsfin()) <= paAlgo->Prectemps())) - { if ((ParaGlob::NiveauImpression() >= 1)&& affichage) + { + #ifdef UTILISATION_MPI + if (ParaGlob::Monde()->rank() == 0) + #endif + if ((ParaGlob::NiveauImpression() >= 1)&& affichage) { cout << "\n >>>> temps fin ("<Tempsfin()<<") atteint <<<<< " << temps << endl ;}; return 1; - } + } else if ( num_pt_courant_type5 == fconnue_charge->NombrePoint()) - { if (affichage) cout << "\n >>>> dernier temps de la courbe de charge atteint <<<<< " << endl ; + { + #ifdef UTILISATION_MPI + if (ParaGlob::Monde()->rank() == 0) + #endif + if (affichage) cout << "\n >>>> dernier temps de la courbe de charge atteint <<<<< " << endl ; return 1; - } + } // else if (icharge >= paAlgo->Maxincre()) else if (icharge > paAlgo->Maxincre()) // modif 14 sept 2015 - {if (affichage) cout << "\n maximum d'increments fixes atteint : "<< paAlgo->Maxincre() + { + #ifdef UTILISATION_MPI + if (ParaGlob::Monde()->rank() == 0) + #endif + if (affichage) cout << "\n maximum d'increments fixes atteint : "<< paAlgo->Maxincre() << "\n (pour info: maximum d'essai calcul increments = "<< paAlgo->Max_essai_incre()<<") " << endl ; - return 2; + return 2; } else if (compteur_essai_increment >= paAlgo->Max_essai_incre()) - {if (affichage) cout << "\n maximum d'essai d'increments fixes atteint : "<< paAlgo->Max_essai_incre() << endl ; - return 3; - } + { + #ifdef UTILISATION_MPI + if (ParaGlob::Monde()->rank() == 0) + #endif + if (affichage) cout << "\n maximum d'essai d'increments fixes atteint : "<< paAlgo->Max_essai_incre() << endl ; + return 3; + } else return 0; }; diff --git a/Chargement/VariablesTemps.cc b/Chargement/VariablesTemps.cc index dbeac5c..20bf03e 100644 --- a/Chargement/VariablesTemps.cc +++ b/Chargement/VariablesTemps.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Chargement/VariablesTemps.h b/Chargement/VariablesTemps.h index fb00c30..a2b34f4 100644 --- a/Chargement/VariablesTemps.h +++ b/Chargement/VariablesTemps.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Element.cc b/Elements/Element.cc index 3eae09e..f1f5846 100644 --- a/Elements/Element.cc +++ b/Elements/Element.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -792,7 +792,7 @@ Element::operator= (Element& elt) // en 2D: quadrangle: racine carré de la surface; triangle: racine carré de 2*surface // en 3D: hexa: racine cubique de vol; penta: racine cub de 2*vol, tétra: racine cub 6*vol // cas = 3: 1D idem cas 2, 2D: distance mini noeud arrête opposée, 3D: distance mini noeud face opposé -double Element::LongueurGeometrique(int cas) const +double Element::LongueurGeometrique_mini(int cas) const { double longueur=0.; // valeur de retour switch (cas) { case 1: @@ -823,7 +823,7 @@ double Element::LongueurGeometrique(int cas) const // traitement d'une erreur éventuelle if (dist <= ConstMath::petit) { cout << "\n **** ERREUR une longueur d'arrête de l'element est nulle" - << "\n Element::LongueurGeometrique(int cas)" + << "\n Element::LongueurGeometrique_mini(int cas)" << "\n element: "; this->Affiche(1); #ifdef MISE_AU_POINT cout << "\n *** version mise au point: on continue neanmoins avec une longueur " @@ -837,7 +837,7 @@ double Element::LongueurGeometrique(int cas) const } default : cout << "\nErreur : cas:" << cas <<" non encore traite !\n" - << "Element::LongueurGeometrique(int cas) ) \n"; + << "Element::LongueurGeometrique_mini(int cas) ) \n"; Sortie(1); } //cout << " longueur= "<< longueur << endl; @@ -917,29 +917,34 @@ int Element::Num_de_frontiere_dans_le_type(int i) const { // on supprime les cas hors du tableau tabb if (i<1) return 0; int tailletab = tabb.Taille(); - if (i>tailletab) return 0; - // cas normal - if (i <= posi_tab_front_lin) - // cela veut dire que i est une surface car les premières frontières sont les surfaces, de plus i est directement le numéro de surface - { return i;} - else if (i <= posi_tab_front_point) - // cela veut dire que i est une ligne car les frontières après les surfaces sont les lignes - { return (i-posi_tab_front_lin); } - else - // cela veut dire que i est un point car les frontières après les lignes sont des points - { return (i-posi_tab_front_point);}; - }; + if (i>tailletab) return 0; + // cas normal + if (i <= posi_tab_front_lin) + // cela veut dire que i est une surface car les premières frontières sont les surfaces, de plus i est directement le numéro de surface + { return i;} + else if (i <= posi_tab_front_point) + // cela veut dire que i est une ligne car les frontières après les surfaces sont les lignes + { return (i-posi_tab_front_lin); } + else + // cela veut dire que i est un point car les frontières après les lignes sont des points + { return (i-posi_tab_front_point);}; + }; // ramene le numero de la frontière passée en argument si elle existe actuellement au niveau de l'élément // sinon ramène 0 // ramene également type_front: qui indique le type de frontière: POINT_G, LIGNE ou SURFACE // c'est une méthode très longue, a utiliser avec précaution -int Element::Num_frontiere(const ElFrontiere& fronti, Enum_type_geom& type_front) +int Element::Num_frontiere(const ElFrontiere& fronti, Enum_type_geom& type_front) const { int num=0; type_front = RIEN_TYPE_GEOM; // initialisation du retour // on commence par balayer toutes les frontières pour trouver le numéro global int tail_tab=tabb.Taille(); for (int i=1;i<=tail_tab;i++) - if (fronti == (*tabb(i))) {num = i; break;} + {// le tableau global peut avoir été correctement dimensionné + // mais les éléments frontières peuvent avoir été supprimés + if (tabb(i) != NULL) // cas où la frontière existe + {if (fronti == (*tabb(i))) {num = i; break;} + } + }; // si num est diff de 0 c'est ok, on recherche le type de frontière if (num != 0) { // les frontières sont rangées selon: surface, ligne, point @@ -950,7 +955,7 @@ int Element::Num_frontiere(const ElFrontiere& fronti, Enum_type_geom& type_front else if ((num > posi_tab_front_lin)&&(ind_front_lin!=0)) {type_front = LIGNE;num -= posi_tab_front_lin;} // si ce n'est ni un point ni une ligne, vue que ça doit-être quelque chose ça ne peut être qu'une surface else {type_front = SURFACE;}; // et num a directement la bonne valeur que ce sont d'abord les faces qui sont stockées - } + }; // retour des infos return num; }; diff --git a/Elements/Element.h b/Elements/Element.h index d32ab6a..889e33a 100644 --- a/Elements/Element.h +++ b/Elements/Element.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -39,6 +39,8 @@ #ifndef ELEMENT_H #define ELEMENT_H +using namespace std; + #include #include @@ -297,6 +299,8 @@ class Element // pour le schema implicite class ResRaid { public : Vecteur* res; Mat_pleine * raid ; }; virtual ResRaid Calcul_implicit (const ParaAlgoControle & pa ) = 0; + // récup uniquement du conteneur raideur (pas forcément rempli, mais de la bonne taille) + Mat_pleine * Conteneur_raideur () {return raideur; }; // Calcul du residu local a l'instant t // pour le schema explicit, resultat dans le vecteur pointe @@ -305,7 +309,9 @@ class Element // Calcul du residu local a l'instant tdt // pour le schema explicit, resultat dans le vecteur pointe virtual Vecteur* CalculResidu_tdt (const ParaAlgoControle & pa) = 0; - + // récup uniquement du conteneur résidu (pas forcément rempli, mais de la bonne taille) + Vecteur* Conteneur_Residu () {return residu;}; + // Calcul de la matrice masse pour l'élément virtual Mat_pleine * CalculMatriceMasse (Enum_calcul_masse id_calcul_masse) = 0; @@ -336,7 +342,7 @@ class Element // en 2D: quadrangle: racine carré de la surface; triangle: racine carré de 2*surface // en 3D: hexa: racine cubique de vol; penta: racine cub de 2*vol, tétra: racine cub 6*vol // cas = 3: 1D idem cas 2, 2D: distance mini noeud arrête opposée, 3D: distance mini noeud face opposé - double LongueurGeometrique(int cas) const; + double LongueurGeometrique_mini(int cas) const; // récupération du volume de l'élément (qui doit avoir été calculé dans une des classes dérivées // par exemple en mécanique via un calcul explicite ou implicite d'équilibre mécanique // pour un élément 3D: le volume au sens classique @@ -601,14 +607,14 @@ class Element // ============ Calcul des frontieres de l'element================ // tout d'abord une explication sur la terminologie - // on appelle frontières de l'éléments les frontières naturelles c'est-à-dire + // on appelle frontières minimales de l'éléments les frontières naturelles c'est-à-dire // pour les éléments 1D : les noeuds aux l'extrémitées en monde 1D // sinon également l'élément en monde 2D et 3D // pour les éléments 2D : les arrêtes de l'élément en monde 2D // sinon également la surface de l'élément en monde 2D et 3D // pour les éléments 3D : les surfaces externes de l'élément - // Calcul des frontieres de l'element et retour d'un tableau tabb des frontières + // Calcul des frontieres minimales de l'element et retour d'un tableau tabb des frontières // creation des elements frontieres et stockage dans l'element // si c'est la première fois sinon il y a seulement retour du tableau de ces elements // a moins que le paramètre force est mis a true dans ce dernier cas seul les frontière effacées sont recréée @@ -675,7 +681,22 @@ class Element // sinon ramène 0 // ramene également type_front: qui indique le type de frontière: POINT_G, LIGNE ou SURFACE // c'est une méthode très longue, a utiliser avec précaution - int Num_frontiere(const ElFrontiere& fronti, Enum_type_geom& type_front); + int Num_frontiere(const ElFrontiere& fronti, Enum_type_geom& type_front) const; + + // Calcul spécifiques des frontieres de l'element et retour d'un tableau tabb des frontières + // creation des elements frontieres et stockage dans l'element + // la création n'a lieu qu'au premier appel + // ou lorsque l'on force le paramètre force a true + // dans ce dernier cas seul les frontière effacées sont recréée + // cas : + // = 0 -> on veut toutes les frontières + // = 1 -> on veut uniquement les surfaces + // = 2 -> on veut uniquement les lignes + // = 3 -> on veut uniquement les points + // = 4 -> on veut les surfaces + les lignes + // = 5 -> on veut les surfaces + les points + // = 6 -> on veut les lignes + les points +// virtual Tableau const & Frontiere_specifique(int cas, bool force = false) = 0; // mise à jour de la boite d'encombrement de l'élément, suivant les axes I_a globales // en retour coordonnées du point mini dans retour.Premier() et du point maxi dans .Second() diff --git a/Elements/Geometrie/ElemGeom/ElemGeomC0.cc b/Elements/Geometrie/ElemGeom/ElemGeomC0.cc index 0da1c7d..cfbcdde 100644 --- a/Elements/Geometrie/ElemGeom/ElemGeomC0.cc +++ b/Elements/Geometrie/ElemGeom/ElemGeomC0.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Geometrie/ElemGeom/ElemGeomC0.h b/Elements/Geometrie/ElemGeom/ElemGeomC0.h index f189921..c5688a2 100644 --- a/Elements/Geometrie/ElemGeom/ElemGeomC0.h +++ b/Elements/Geometrie/ElemGeom/ElemGeomC0.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -114,13 +114,13 @@ class ElemGeomC0 // retourne les coordonnees du point d'integration i inline Coordonnee const & CoorPtInteg(int i) const { return ptInteg(i);}; // retourne les fonctions d'interpolation au point d'integration i - inline Vecteur const & Phi(int i) { return tabPhi(i);}; + inline Vecteur const & Phi(int i) const { return tabPhi(i);}; // retourne les tableau de fonctions d'interpolation inline Tableau const & TaPhi() const { return tabPhi;}; // retourne les derivees des fonctions d'interpolation au point d'integration i inline Mat_pleine const& Dphi(int i) { return tabDPhi(i);}; // retourne le tableau des derivees des fonctions d'interpolation - inline Tableau < Mat_pleine > const& TaDphi() { return tabDPhi;}; + inline Tableau < Mat_pleine > const& TaDphi() const { return tabDPhi;}; // retourne les poids d'integration du point d'integration i inline double Wi(int i) const { return WI(i);}; // retourne le vecteur des poids d'integration @@ -200,9 +200,9 @@ class ElemGeomC0 //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) - virtual const Vecteur& Phi(const Coordonnee& M) = 0; + virtual const Vecteur& Phi_point(const Coordonnee& M) = 0; // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) - virtual const Mat_pleine& Dphi(const Coordonnee& M) = 0; + virtual const Mat_pleine& Dphi_point(const Coordonnee& M) = 0; // en fonction de coordonnees locales, retourne true si le point est a l'interieur // de l'element, false sinon virtual bool Interieur(const Coordonnee& M) = 0; diff --git a/Elements/Geometrie/ElemGeom/ElemGeomC1.h b/Elements/Geometrie/ElemGeom/ElemGeomC1.h index d12c062..c4420cb 100644 --- a/Elements/Geometrie/ElemGeom/ElemGeomC1.h +++ b/Elements/Geometrie/ElemGeom/ElemGeomC1.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Geometrie/ElemGeom/Ligne/GeomSeg.cc b/Elements/Geometrie/ElemGeom/Ligne/GeomSeg.cc index 89bd4be..be7b48e 100644 --- a/Elements/Geometrie/ElemGeom/Ligne/GeomSeg.cc +++ b/Elements/Geometrie/ElemGeom/Ligne/GeomSeg.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -339,7 +339,7 @@ ElemGeomC0 * GeomSeg::newElemGeomC0(ElemGeomC0 * pt) //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) -const Vecteur& GeomSeg::Phi(const Coordonnee& M) +const Vecteur& GeomSeg::Phi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -381,7 +381,7 @@ const Vecteur& GeomSeg::Phi(const Coordonnee& M) return phi_M; }; // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) -const Mat_pleine& GeomSeg::Dphi(const Coordonnee& M) +const Mat_pleine& GeomSeg::Dphi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales diff --git a/Elements/Geometrie/ElemGeom/Ligne/GeomSeg.h b/Elements/Geometrie/ElemGeom/Ligne/GeomSeg.h index 84dc9ac..859cee7 100644 --- a/Elements/Geometrie/ElemGeom/Ligne/GeomSeg.h +++ b/Elements/Geometrie/ElemGeom/Ligne/GeomSeg.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -114,9 +114,9 @@ class GeomSeg : public ElemGeomC0 //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) - const Vecteur& Phi(const Coordonnee& M); + const Vecteur& Phi_point(const Coordonnee& M); // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) - const Mat_pleine& Dphi(const Coordonnee& M); + const Mat_pleine& Dphi_point(const Coordonnee& M); // en fonction de coordonnees locales, retourne true si le point est a l'interieur // de l'element, false sinon bool Interieur(const Coordonnee& M); diff --git a/Elements/Geometrie/ElemGeom/Point/GeomPoint.cc b/Elements/Geometrie/ElemGeom/Point/GeomPoint.cc index 9509dd0..eae2899 100644 --- a/Elements/Geometrie/ElemGeom/Point/GeomPoint.cc +++ b/Elements/Geometrie/ElemGeom/Point/GeomPoint.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -82,7 +82,7 @@ ElemGeomC0 * GeomPoint::newElemGeomC0(ElemGeomC0 * pt) //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) -const Vecteur& GeomPoint::Phi(const Coordonnee& M) +const Vecteur& GeomPoint::Phi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -99,7 +99,7 @@ const Vecteur& GeomPoint::Phi(const Coordonnee& M) return phi_M; }; // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) -const Mat_pleine& GeomPoint::Dphi(const Coordonnee& M) +const Mat_pleine& GeomPoint::Dphi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales diff --git a/Elements/Geometrie/ElemGeom/Point/GeomPoint.h b/Elements/Geometrie/ElemGeom/Point/GeomPoint.h index 84a956e..69f2a91 100644 --- a/Elements/Geometrie/ElemGeom/Point/GeomPoint.h +++ b/Elements/Geometrie/ElemGeom/Point/GeomPoint.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -84,9 +84,9 @@ class GeomPoint : public ElemGeomC0 //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) - const Vecteur& Phi(const Coordonnee& M); + const Vecteur& Phi_point(const Coordonnee& M); // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) - const Mat_pleine& Dphi(const Coordonnee& M); + const Mat_pleine& Dphi_point(const Coordonnee& M); // en fonction de coordonnees locales, retourne true si le point est a l'interieur // de l'element, false sinon bool Interieur(const Coordonnee& M); diff --git a/Elements/Geometrie/ElemGeom/surface/GeomQuadrangle.cc b/Elements/Geometrie/ElemGeom/surface/GeomQuadrangle.cc index 385313a..0a060dd 100644 --- a/Elements/Geometrie/ElemGeom/surface/GeomQuadrangle.cc +++ b/Elements/Geometrie/ElemGeom/surface/GeomQuadrangle.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -531,7 +531,7 @@ ElemGeomC0 * GeomQuadrangle::newElemGeomC0(ElemGeomC0 * pt) //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) -const Vecteur& GeomQuadrangle::Phi(const Coordonnee& M) +const Vecteur& GeomQuadrangle::Phi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -559,7 +559,7 @@ const Vecteur& GeomQuadrangle::Phi(const Coordonnee& M) Vecteur tabPhiT(NBNE); for (int iy = 1;iy<= nbnes; iy++) for (int ix =1;ix<=nbnes;ix++) - { tabPhiT(ne) = seg(1)->Phi(X)(ix) * seg(1)->Phi(Y)(iy); + { tabPhiT(ne) = seg(1)->Phi_point(X)(ix) * seg(1)->Phi_point(Y)(iy); ne++; } // numerotation suivant le standard habituel @@ -644,7 +644,7 @@ const Vecteur& GeomQuadrangle::Phi(const Coordonnee& M) return phi_M; }; // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) -const Mat_pleine& GeomQuadrangle::Dphi(const Coordonnee& M) +const Mat_pleine& GeomQuadrangle::Dphi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -673,8 +673,8 @@ const Mat_pleine& GeomQuadrangle::Dphi(const Coordonnee& M) Mat_pleine tabDPhiT(2,NBNE); for (int iy = 1;iy<= nbnes; iy++) for (int ix =1;ix<=nbnes;ix++) - { tabDPhiT(1,ne) = seg(1)->Dphi(X)(1,ix) * seg(1)->Phi(Y)(iy); - tabDPhiT(2,ne) = seg(1)->Phi(X)(ix) * seg(1)->Dphi(Y)(1,iy); + { tabDPhiT(1,ne) = seg(1)->Dphi_point(X)(1,ix) * seg(1)->Phi_point(Y)(iy); + tabDPhiT(2,ne) = seg(1)->Phi_point(X)(ix) * seg(1)->Dphi_point(Y)(1,iy); ne++; } // numerotation suivant le standard habituel diff --git a/Elements/Geometrie/ElemGeom/surface/GeomQuadrangle.h b/Elements/Geometrie/ElemGeom/surface/GeomQuadrangle.h index 1dc9dc0..836e7cd 100644 --- a/Elements/Geometrie/ElemGeom/surface/GeomQuadrangle.h +++ b/Elements/Geometrie/ElemGeom/surface/GeomQuadrangle.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -162,9 +162,9 @@ class GeomQuadrangle : public ElemGeomC0 //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) - const Vecteur& Phi(const Coordonnee& M); + const Vecteur& Phi_point(const Coordonnee& M); // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) - const Mat_pleine& Dphi(const Coordonnee& M); + const Mat_pleine& Dphi_point(const Coordonnee& M); // en fonction de coordonnees locales, retourne true si le point est a l'interieur // de l'element, false sinon bool Interieur(const Coordonnee& M); diff --git a/Elements/Geometrie/ElemGeom/surface/GeomTriangle.cc b/Elements/Geometrie/ElemGeom/surface/GeomTriangle.cc index f713c8b..9a3d9e5 100644 --- a/Elements/Geometrie/ElemGeom/surface/GeomTriangle.cc +++ b/Elements/Geometrie/ElemGeom/surface/GeomTriangle.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -590,7 +590,7 @@ ElemGeomC0 * GeomTriangle::newElemGeomC0(ElemGeomC0 * pt) //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) -const Vecteur& GeomTriangle::Phi(const Coordonnee& M) +const Vecteur& GeomTriangle::Phi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -692,7 +692,7 @@ const Vecteur& GeomTriangle::Phi(const Coordonnee& M) return phi_M; }; // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) -const Mat_pleine& GeomTriangle::Dphi(const Coordonnee& M) +const Mat_pleine& GeomTriangle::Dphi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales diff --git a/Elements/Geometrie/ElemGeom/surface/GeomTriangle.h b/Elements/Geometrie/ElemGeom/surface/GeomTriangle.h index 01e83c5..d03d87c 100644 --- a/Elements/Geometrie/ElemGeom/surface/GeomTriangle.h +++ b/Elements/Geometrie/ElemGeom/surface/GeomTriangle.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -147,9 +147,9 @@ class GeomTriangle : public ElemGeomC0 //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) - const Vecteur& Phi(const Coordonnee& M); + const Vecteur& Phi_point(const Coordonnee& M); // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) - const Mat_pleine& Dphi(const Coordonnee& M); + const Mat_pleine& Dphi_point(const Coordonnee& M); // en fonction de coordonnees locales, retourne true si le point est a l'interieur // de l'element, false sinon bool Interieur(const Coordonnee& M); diff --git a/Elements/Geometrie/ElemGeom/volume/GeomHexaCom.cc b/Elements/Geometrie/ElemGeom/volume/GeomHexaCom.cc index ac0c11b..5bef177 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomHexaCom.cc +++ b/Elements/Geometrie/ElemGeom/volume/GeomHexaCom.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Geometrie/ElemGeom/volume/GeomHexaCom.h b/Elements/Geometrie/ElemGeom/volume/GeomHexaCom.h index a0c2592..ab8bd60 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomHexaCom.h +++ b/Elements/Geometrie/ElemGeom/volume/GeomHexaCom.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Geometrie/ElemGeom/volume/GeomHexaCubique.cc b/Elements/Geometrie/ElemGeom/volume/GeomHexaCubique.cc index 78b1464..8cf2946 100755 --- a/Elements/Geometrie/ElemGeom/volume/GeomHexaCubique.cc +++ b/Elements/Geometrie/ElemGeom/volume/GeomHexaCubique.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -172,9 +172,9 @@ GeomHexaCubique::GeomHexaCubique(int nbi) : // on utilise les méthodes internes pour calculer les fonctions // d'interpolation aux points d'intégrations for (int ptint=1;ptint<= Nbi(); ptint++) - tabPhi(ptint) = Phi( ptInteg(ptint)); + tabPhi(ptint) = Phi_point( ptInteg(ptint)); for (int ptint=1;ptint<= Nbi(); ptint++) - tabDPhi(ptint) = Dphi( ptInteg(ptint)); + tabDPhi(ptint) = Dphi_point( ptInteg(ptint)); // ---- constitution du tableau Extrapol ----- Calcul_extrapol(nbi); @@ -246,7 +246,7 @@ ElemGeomC0 * GeomHexaCubique::newElemGeomC0(ElemGeomC0 * pt) //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) -const Vecteur& GeomHexaCubique::Phi(const Coordonnee& M) +const Vecteur& GeomHexaCubique::Phi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -274,7 +274,7 @@ const Vecteur& GeomHexaCubique::Phi(const Coordonnee& M) for (int iz = 1;iz<= nbnes; iz++) for (int iy = 1;iy<= nbnes; iy++) for (int ix =1;ix<=nbnes;ix++) - { tabPhiT(ne) = seg(1)->Phi(X)(ix) * seg(1)->Phi(Y)(iy) * seg(1)->Phi(Z)(iz); + { tabPhiT(ne) = seg(1)->Phi_point(X)(ix) * seg(1)->Phi_point(Y)(iy) * seg(1)->Phi_point(Z)(iz); ne++; } // numerotation suivant le standard habituel @@ -307,7 +307,7 @@ const Vecteur& GeomHexaCubique::Phi(const Coordonnee& M) return phi_M; }; // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) -const Mat_pleine& GeomHexaCubique::Dphi(const Coordonnee& M) +const Mat_pleine& GeomHexaCubique::Dphi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -336,9 +336,9 @@ const Mat_pleine& GeomHexaCubique::Dphi(const Coordonnee& M) for (int iz = 1;iz<= nbnes; iz++) for (int iy = 1;iy<= nbnes; iy++) for (int ix =1;ix<=nbnes;ix++) - { tabDPhiT(1,ne) = seg(1)->Dphi(X)(1,ix) * seg(1)->Phi(Y)(iy) * seg(1)->Phi(Z)(iz); - tabDPhiT(2,ne) = seg(1)->Phi(X)(ix) * seg(1)->Dphi(Y)(1,iy) * seg(1)->Phi(Z)(iz); - tabDPhiT(3,ne) = seg(1)->Phi(X)(ix) * seg(1)->Phi(Y)(iy) * seg(1)->Dphi(Z)(1,iz); + { tabDPhiT(1,ne) = seg(1)->Dphi_point(X)(1,ix) * seg(1)->Phi_point(Y)(iy) * seg(1)->Phi_point(Z)(iz); + tabDPhiT(2,ne) = seg(1)->Phi_point(X)(ix) * seg(1)->Dphi_point(Y)(1,iy) * seg(1)->Phi_point(Z)(iz); + tabDPhiT(3,ne) = seg(1)->Phi_point(X)(ix) * seg(1)->Phi_point(Y)(iy) * seg(1)->Dphi_point(Z)(1,iz); ne++; } // numerotation suivant le standard habituel diff --git a/Elements/Geometrie/ElemGeom/volume/GeomHexaCubique.h b/Elements/Geometrie/ElemGeom/volume/GeomHexaCubique.h index ca78189..991cf24 100755 --- a/Elements/Geometrie/ElemGeom/volume/GeomHexaCubique.h +++ b/Elements/Geometrie/ElemGeom/volume/GeomHexaCubique.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -59,7 +59,7 @@ // l'élément cubique complet /* -//*********************************************************************** +// *********************************************************************** // * // ELEMENT DE REFERENCE , POINTS D'INTEGRATION: * // * @@ -262,9 +262,9 @@ class GeomHexaCubique : public GeomHexaCom //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) - const Vecteur& Phi(const Coordonnee& M); + const Vecteur& Phi_point(const Coordonnee& M); // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) - const Mat_pleine& Dphi(const Coordonnee& M); + const Mat_pleine& Dphi_point(const Coordonnee& M); protected : diff --git a/Elements/Geometrie/ElemGeom/volume/GeomHexaQuad.cc b/Elements/Geometrie/ElemGeom/volume/GeomHexaQuad.cc index e160901..7b63817 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomHexaQuad.cc +++ b/Elements/Geometrie/ElemGeom/volume/GeomHexaQuad.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -146,21 +146,21 @@ GeomHexaQuad::GeomHexaQuad(int nbi) : { // on utilise les méthodes internes pour calculer les fonctions // d'interpolation aux points d'intégrations for (int ptint=1;ptint<= Nbi(); ptint++) - tabPhi(ptint) = Phi( ptInteg(ptint)); + tabPhi(ptint) = Phi_point( ptInteg(ptint)); for (int ptint=1;ptint<= Nbi(); ptint++) - tabDPhi(ptint) = Dphi( ptInteg(ptint)); + tabDPhi(ptint) = Dphi_point( ptInteg(ptint)); } // vérification suivant OK a priori // essai de calcul directe des fonctions d'interpolation for (int ptint=1;ptint<= Nbi(); ptint++) - tabPhi(ptint) = Phi( ptInteg(ptint)); + tabPhi(ptint) = Phi_point( ptInteg(ptint)); for (int ptint=1;ptint<= Nbi(); ptint++) - tabDPhi(ptint) = Dphi( ptInteg(ptint)); //*/ + tabDPhi(ptint) = Dphi_point( ptInteg(ptint)); //*/ // vérification des fonctions d'interpolation analytique et numériques for (int ptint=1;ptint<= Nbi(); ptint++) { - Vecteur a = tabPhi(ptint);Vecteur b = Phi( ptInteg(ptint)); + Vecteur a = tabPhi(ptint);Vecteur b = Phi_point( ptInteg(ptint)); for (int ne=1;ne<= NBNE;ne++) if (Dabs(a(ne) - b(ne)) >= 1.E-14) { @@ -173,7 +173,7 @@ GeomHexaQuad::GeomHexaQuad(int nbi) : // et numériques for (int ptint=1;ptint<= Nbi(); ptint++) { - Mat_pleine a = tabDPhi(ptint);Mat_pleine b = Dphi( ptInteg(ptint)); + Mat_pleine a = tabDPhi(ptint);Mat_pleine b = Dphi_point( ptInteg(ptint)); for (int ne=1;ne<= NBNE;ne++) for (int ia =1; ia<= 3; ia++) if (Dabs(a(ia,ne) - b(ia,ne)) >= 1.E-14) @@ -218,7 +218,7 @@ ElemGeomC0 * GeomHexaQuad::newElemGeomC0(ElemGeomC0 * pt) //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) -const Vecteur& GeomHexaQuad::Phi(const Coordonnee& M) +const Vecteur& GeomHexaQuad::Phi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -275,7 +275,7 @@ const Vecteur& GeomHexaQuad::Phi(const Coordonnee& M) return phi_M; }; // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) -const Mat_pleine& GeomHexaQuad::Dphi(const Coordonnee& M) +const Mat_pleine& GeomHexaQuad::Dphi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -428,7 +428,7 @@ void GeomHexaQuad::Calcul_extrapol(int nbi) // maintenant on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta - const Vecteur& phiphi = hexa.Phi(theta); + const Vecteur& phiphi = hexa.Phi_point(theta); // et on enregistre indir(ne).Change_taille(8); tab(ne).Change_taille(nbi); diff --git a/Elements/Geometrie/ElemGeom/volume/GeomHexaQuad.h b/Elements/Geometrie/ElemGeom/volume/GeomHexaQuad.h index f726766..b9dfb9f 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomHexaQuad.h +++ b/Elements/Geometrie/ElemGeom/volume/GeomHexaQuad.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -239,9 +239,9 @@ class GeomHexaQuad : public GeomHexaCom //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) - const Vecteur& Phi(const Coordonnee& M); + const Vecteur& Phi_point(const Coordonnee& M); // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) - const Mat_pleine& Dphi(const Coordonnee& M); + const Mat_pleine& Dphi_point(const Coordonnee& M); protected : diff --git a/Elements/Geometrie/ElemGeom/volume/GeomHexaQuad2.cc b/Elements/Geometrie/ElemGeom/volume/GeomHexaQuad2.cc index 7095aad..be39f01 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomHexaQuad2.cc +++ b/Elements/Geometrie/ElemGeom/volume/GeomHexaQuad2.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Geometrie/ElemGeom/volume/GeomHexaQuadComp.cc b/Elements/Geometrie/ElemGeom/volume/GeomHexaQuadComp.cc index 1c69f4a..95e41de 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomHexaQuadComp.cc +++ b/Elements/Geometrie/ElemGeom/volume/GeomHexaQuadComp.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -149,9 +149,9 @@ GeomHexaQuadComp::GeomHexaQuadComp(int nbi) : // on utilise les méthodes internes pour calculer les fonctions // d'interpolation aux points d'intégrations for (int ptint=1;ptint<= Nbi(); ptint++) - tabPhi(ptint) = Phi( ptInteg(ptint)); + tabPhi(ptint) = Phi_point( ptInteg(ptint)); for (int ptint=1;ptint<= Nbi(); ptint++) - tabDPhi(ptint) = Dphi( ptInteg(ptint)); + tabDPhi(ptint) = Dphi_point( ptInteg(ptint)); // ---- constitution du tableau Extrapol ----- Calcul_extrapol(nbi); @@ -223,7 +223,7 @@ ElemGeomC0 * GeomHexaQuadComp::newElemGeomC0(ElemGeomC0 * pt) //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) -const Vecteur& GeomHexaQuadComp::Phi(const Coordonnee& M) +const Vecteur& GeomHexaQuadComp::Phi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -251,7 +251,7 @@ const Vecteur& GeomHexaQuadComp::Phi(const Coordonnee& M) for (int iz = 1;iz<= nbnes; iz++) for (int iy = 1;iy<= nbnes; iy++) for (int ix =1;ix<=nbnes;ix++) - { tabPhiT(ne) = seg(1)->Phi(X)(ix) * seg(1)->Phi(Y)(iy) * seg(1)->Phi(Z)(iz); + { tabPhiT(ne) = seg(1)->Phi_point(X)(ix) * seg(1)->Phi_point(Y)(iy) * seg(1)->Phi_point(Z)(iz); ne++; } // numerotation suivant le standard habituel @@ -284,7 +284,7 @@ const Vecteur& GeomHexaQuadComp::Phi(const Coordonnee& M) return phi_M; }; // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) -const Mat_pleine& GeomHexaQuadComp::Dphi(const Coordonnee& M) +const Mat_pleine& GeomHexaQuadComp::Dphi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -313,9 +313,9 @@ const Mat_pleine& GeomHexaQuadComp::Dphi(const Coordonnee& M) for (int iz = 1;iz<= nbnes; iz++) for (int iy = 1;iy<= nbnes; iy++) for (int ix =1;ix<=nbnes;ix++) - { tabDPhiT(1,ne) = seg(1)->Dphi(X)(1,ix) * seg(1)->Phi(Y)(iy) * seg(1)->Phi(Z)(iz); - tabDPhiT(2,ne) = seg(1)->Phi(X)(ix) * seg(1)->Dphi(Y)(1,iy) * seg(1)->Phi(Z)(iz); - tabDPhiT(3,ne) = seg(1)->Phi(X)(ix) * seg(1)->Phi(Y)(iy) * seg(1)->Dphi(Z)(1,iz); + { tabDPhiT(1,ne) = seg(1)->Dphi_point(X)(1,ix) * seg(1)->Phi_point(Y)(iy) * seg(1)->Phi_point(Z)(iz); + tabDPhiT(2,ne) = seg(1)->Phi_point(X)(ix) * seg(1)->Dphi_point(Y)(1,iy) * seg(1)->Phi_point(Z)(iz); + tabDPhiT(3,ne) = seg(1)->Phi_point(X)(ix) * seg(1)->Phi_point(Y)(iy) * seg(1)->Dphi_point(Z)(1,iz); ne++; } // numerotation suivant le standard habituel @@ -435,7 +435,7 @@ void GeomHexaQuadComp::Calcul_extrapol(int nbi) // maintenant on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta - const Vecteur& phiphi = hexa.Phi(theta); + const Vecteur& phiphi = hexa.Phi_point(theta); // et on enregistre indir(ne).Change_taille(8); tab(ne).Change_taille(nbi); @@ -738,7 +738,7 @@ void GeomHexaQuadComp::Calcul_extrapol(int nbi) // maintenant on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta - const Vecteur& phiphi = hexa.Phi(theta); + const Vecteur& phiphi = hexa.Phi_point(theta); // et on enregistre // on boucle sur les pti de l'hexa linéaire d'interpolation tab(ne).Change_taille(nbi); @@ -991,7 +991,7 @@ void GeomHexaQuadComp::Calcul_extrapol(int nbi) } // maintenant on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta - const Vecteur& phiphi = hexa.Phi(theta); + const Vecteur& phiphi = hexa.Phi_point(theta); // et on enregistre tab(ne).Change_taille(nbi); // on boucle sur les pti de l'hexa linéaire d'interpolation diff --git a/Elements/Geometrie/ElemGeom/volume/GeomHexaQuadComp.h b/Elements/Geometrie/ElemGeom/volume/GeomHexaQuadComp.h index 83904c9..6902e72 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomHexaQuadComp.h +++ b/Elements/Geometrie/ElemGeom/volume/GeomHexaQuadComp.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -60,7 +60,7 @@ /* -//*********************************************************************** +// *********************************************************************** // * // ELEMENT DE REFERENCE , POINTS D'INTEGRATION: * // * @@ -243,9 +243,9 @@ class GeomHexaQuadComp : public GeomHexaCom //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) - const Vecteur& Phi(const Coordonnee& M); + const Vecteur& Phi_point(const Coordonnee& M); // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) - const Mat_pleine& Dphi(const Coordonnee& M); + const Mat_pleine& Dphi_point(const Coordonnee& M); protected : diff --git a/Elements/Geometrie/ElemGeom/volume/GeomHexalin.cc b/Elements/Geometrie/ElemGeom/volume/GeomHexalin.cc index 01a4e99..d927b08 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomHexalin.cc +++ b/Elements/Geometrie/ElemGeom/volume/GeomHexalin.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -114,9 +114,9 @@ GeomHexalin::GeomHexalin(int nbi ) : { // on utilise les méthodes internes pour calculer les fonctions // d'interpolation aux points d'intégrations for (int ptint=1;ptint<= Nbi(); ptint++) - tabPhi(ptint) = Phi( ptInteg(ptint)); + tabPhi(ptint) = Phi_point( ptInteg(ptint)); for (int ptint=1;ptint<= Nbi(); ptint++) - tabDPhi(ptint) = Dphi( ptInteg(ptint)); + tabDPhi(ptint) = Dphi_point( ptInteg(ptint)); }; // ---- constitution du tableau Extrapol ----- @@ -153,7 +153,7 @@ ElemGeomC0 * GeomHexalin::newElemGeomC0(ElemGeomC0 * pt) //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) -const Vecteur& GeomHexalin::Phi(const Coordonnee& M) +const Vecteur& GeomHexalin::Phi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -180,7 +180,7 @@ const Vecteur& GeomHexalin::Phi(const Coordonnee& M) for (int iz = 1;iz<= nbnes; iz++) for (int iy = 1;iy<= nbnes; iy++) for (int ix =1;ix<=nbnes;ix++) - { tabPhiT(ne) = seg(1)->Phi(X)(ix) * seg(1)->Phi(Y)(iy) * seg(1)->Phi(Z)(iz); + { tabPhiT(ne) = seg(1)->Phi_point(X)(ix) * seg(1)->Phi_point(Y)(iy) * seg(1)->Phi_point(Z)(iz); ne++; } // numerotation suivant le standard habituel @@ -202,7 +202,7 @@ const Vecteur& GeomHexalin::Phi(const Coordonnee& M) return phi_M; }; // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) -const Mat_pleine& GeomHexalin::Dphi(const Coordonnee& M) +const Mat_pleine& GeomHexalin::Dphi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -234,12 +234,12 @@ const Mat_pleine& GeomHexalin::Dphi(const Coordonnee& M) //tabDPhiT(2,ne) = seg(1)->Phi(X)(ix) * seg(1)->Dphi(Y)(1,iy) * seg(1)->Phi(Z)(iz); //tabDPhiT(3,ne) = seg(1)->Phi(X)(ix) * seg(1)->Phi(Y)(iy) * seg(1)->Dphi(Z)(1,iz); - double phi_X_ix = seg(1)->Phi(X)(ix); - double phi_Y_iy = seg(1)->Phi(Y)(iy); - double phi_Z_iz = seg(1)->Phi(Z)(iz); - tabDPhiT(1,ne) = seg(1)->Dphi(X)(1,ix) * phi_Y_iy * phi_Z_iz; - tabDPhiT(2,ne) = phi_X_ix * seg(1)->Dphi(Y)(1,iy) * phi_Z_iz; - tabDPhiT(3,ne) = phi_X_ix * phi_Y_iy * seg(1)->Dphi(Z)(1,iz); + double phi_X_ix = seg(1)->Phi_point(X)(ix); + double phi_Y_iy = seg(1)->Phi_point(Y)(iy); + double phi_Z_iz = seg(1)->Phi_point(Z)(iz); + tabDPhiT(1,ne) = seg(1)->Dphi_point(X)(1,ix) * phi_Y_iy * phi_Z_iz; + tabDPhiT(2,ne) = phi_X_ix * seg(1)->Dphi_point(Y)(1,iy) * phi_Z_iz; + tabDPhiT(3,ne) = phi_X_ix * phi_Y_iy * seg(1)->Dphi_point(Z)(1,iz); ne++; } @@ -345,7 +345,7 @@ void GeomHexalin::Calcul_extrapol(int nbi) // maintenant on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta - const Vecteur& phiphi = this->Phi(theta); + const Vecteur& phiphi = this->Phi_point(theta); // et on enregistre indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); @@ -534,7 +534,7 @@ void GeomHexalin::Calcul_extrapol(int nbi) } // maintenant on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta - const Vecteur& phiphi = this->Phi(theta); + const Vecteur& phiphi = this->Phi_point(theta); // et on enregistre tab(ne).Change_taille(nbi); // on boucle sur les pti de l'hexa linéaire d'interpolation @@ -658,7 +658,7 @@ void GeomHexalin::Calcul_extrapol(int nbi) } // maintenant on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta - const Vecteur& phiphi = this->Phi(theta); + const Vecteur& phiphi = this->Phi_point(theta); // et on enregistre tab(ne).Change_taille(nbi); // on boucle sur les pti de l'hexa linéaire d'interpolation diff --git a/Elements/Geometrie/ElemGeom/volume/GeomHexalin.h b/Elements/Geometrie/ElemGeom/volume/GeomHexalin.h index 82f3aa5..0e0a2a1 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomHexalin.h +++ b/Elements/Geometrie/ElemGeom/volume/GeomHexalin.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -234,9 +234,9 @@ class GeomHexalin : public GeomHexaCom //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) - const Vecteur& Phi(const Coordonnee& M); + const Vecteur& Phi_point(const Coordonnee& M); // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) - const Mat_pleine& Dphi(const Coordonnee& M); + const Mat_pleine& Dphi_point(const Coordonnee& M); protected : diff --git a/Elements/Geometrie/ElemGeom/volume/GeomHexalin1.cc b/Elements/Geometrie/ElemGeom/volume/GeomHexalin1.cc old mode 100644 new mode 100755 diff --git a/Elements/Geometrie/ElemGeom/volume/GeomHexalin2.cc b/Elements/Geometrie/ElemGeom/volume/GeomHexalin2.cc index c22978e..e090703 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomHexalin2.cc +++ b/Elements/Geometrie/ElemGeom/volume/GeomHexalin2.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Geometrie/ElemGeom/volume/GeomHexaqua.cc b/Elements/Geometrie/ElemGeom/volume/GeomHexaqua.cc old mode 100644 new mode 100755 diff --git a/Elements/Geometrie/ElemGeom/volume/GeomPentaCom.cc b/Elements/Geometrie/ElemGeom/volume/GeomPentaCom.cc index 51b95ed..427d4ca 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomPentaCom.cc +++ b/Elements/Geometrie/ElemGeom/volume/GeomPentaCom.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Geometrie/ElemGeom/volume/GeomPentaCom.h b/Elements/Geometrie/ElemGeom/volume/GeomPentaCom.h index a8a1566..26b79ee 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomPentaCom.h +++ b/Elements/Geometrie/ElemGeom/volume/GeomPentaCom.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Geometrie/ElemGeom/volume/GeomPentaL.cc b/Elements/Geometrie/ElemGeom/volume/GeomPentaL.cc index d1b1724..fec9020 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomPentaL.cc +++ b/Elements/Geometrie/ElemGeom/volume/GeomPentaL.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -115,10 +115,10 @@ GeomPentaL::GeomPentaL(int nbi) : }; // fonctions d'interpolation globales aux points d'intégrations for (int ptint=1;ptint<= nbi; ptint++) - tabPhi(ptint) = Phi( ptInteg(ptint)); + tabPhi(ptint) = Phi_point( ptInteg(ptint)); // derivees des fonctions d'interpolations aux points d'intégrations for (int ptint=1;ptint<= nbi; ptint++) - tabDPhi(ptint) = Dphi( ptInteg(ptint)); + tabDPhi(ptint) = Dphi_point( ptInteg(ptint)); // ---- constitution du tableau Extrapol ----- Calcul_extrapol(nbi); @@ -158,7 +158,7 @@ ElemGeomC0 * GeomPentaL::newElemGeomC0(ElemGeomC0 * pt) //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) -const Vecteur& GeomPentaL::Phi(const Coordonnee& M) +const Vecteur& GeomPentaL::Phi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -182,14 +182,14 @@ const Vecteur& GeomPentaL::Phi(const Coordonnee& M) int ne = 1; for (int iz = 1;iz<= nbnel; iz++) for (int ix = 1;ix<= nbnes; ix++) - { phi_M(ne) = seg(1)->Phi(Z)(iz) * face(1)->Phi(X)(ix) ; + { phi_M(ne) = seg(1)->Phi_point(Z)(iz) * face(1)->Phi_point(X)(ix) ; ne++; }; // retour de phi_M return phi_M; }; // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) -const Mat_pleine& GeomPentaL::Dphi(const Coordonnee& M) +const Mat_pleine& GeomPentaL::Dphi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -213,9 +213,9 @@ const Mat_pleine& GeomPentaL::Dphi(const Coordonnee& M) int ne = 1; for (int iz = 1;iz<= nbnel; iz++) for (int ix = 1;ix<= nbnes; ix++) - { dphi_M(1,ne) = seg(1)->Phi(Z)(iz) * face(1)->Dphi(X)(1,ix) ; - dphi_M(2,ne) = seg(1)->Phi(Z)(iz) * face(1)->Dphi(X)(2,ix) ; - dphi_M(3,ne) = seg(1)->Dphi(Z)(1,iz) * face(1)->Phi(X)(ix) ; + { dphi_M(1,ne) = seg(1)->Phi_point(Z)(iz) * face(1)->Dphi_point(X)(1,ix) ; + dphi_M(2,ne) = seg(1)->Phi_point(Z)(iz) * face(1)->Dphi_point(X)(2,ix) ; + dphi_M(3,ne) = seg(1)->Dphi_point(Z)(1,iz) * face(1)->Phi_point(X)(ix) ; ne++; }; // retour des derivees @@ -454,7 +454,7 @@ void GeomPentaL::Calcul_extrapol(int nbi) // maintenant on va attribuer au noeud de la facette la valeur extrapolée // maintenant on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre this - const Vecteur& phiphi = this->Phi(theta); + const Vecteur& phiphi = this->Phi_point(theta); // et on enregistre indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); @@ -504,7 +504,7 @@ void GeomPentaL::Calcul_extrapol(int nbi) // maintenant on va attribuer au noeud de la facette la valeur extrapolée // maintenant on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre this - const Vecteur& phiphi = this->Phi(theta); + const Vecteur& phiphi = this->Phi_point(theta); // et on enregistre indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); @@ -650,7 +650,7 @@ void GeomPentaL::Calcul_extrapol(int nbi) // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire - const Vecteur& phiphi = this->Phi(theta); + const Vecteur& phiphi = this->Phi_point(theta); // et on enregistre indir(ne).Change_taille(6); tab(ne).Change_taille(nbi); @@ -752,7 +752,7 @@ void GeomPentaL::Calcul_extrapol(int nbi) // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire - const Vecteur& phiphi = this->Phi(theta); + const Vecteur& phiphi = this->Phi_point(theta); // et on enregistre indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); @@ -902,7 +902,7 @@ void GeomPentaL::Calcul_extrapol(int nbi) // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire - const Vecteur& phiphi = this->Phi(theta); + const Vecteur& phiphi = this->Phi_point(theta); // et on enregistre indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); @@ -1080,7 +1080,7 @@ void GeomPentaL::Calcul_extrapol(int nbi) // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire - const Vecteur& phiphi = this->Phi(theta); + const Vecteur& phiphi = this->Phi_point(theta); // et on enregistre indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); diff --git a/Elements/Geometrie/ElemGeom/volume/GeomPentaL.h b/Elements/Geometrie/ElemGeom/volume/GeomPentaL.h index 4efe894..a289127 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomPentaL.h +++ b/Elements/Geometrie/ElemGeom/volume/GeomPentaL.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -139,9 +139,9 @@ class GeomPentaL : public GeomPentaCom //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) - const Vecteur& Phi(const Coordonnee& M); + const Vecteur& Phi_point(const Coordonnee& M); // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) - const Mat_pleine& Dphi(const Coordonnee& M); + const Mat_pleine& Dphi_point(const Coordonnee& M); protected : diff --git a/Elements/Geometrie/ElemGeom/volume/GeomPentaQ.cc b/Elements/Geometrie/ElemGeom/volume/GeomPentaQ.cc index d9314b0..56dee46 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomPentaQ.cc +++ b/Elements/Geometrie/ElemGeom/volume/GeomPentaQ.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -143,10 +143,10 @@ GeomPentaQ::GeomPentaQ(int nbi) : // fonctions d'interpolation globales aux points d'intégrations for (int ptint=1;ptint<= nbi; ptint++) - tabPhi(ptint) = Phi( ptInteg(ptint)); + tabPhi(ptint) = Phi_point( ptInteg(ptint)); // derivees des fonctions d'interpolations aux points d'intégrations for (int ptint=1;ptint<= nbi; ptint++) - tabDPhi(ptint) = Dphi( ptInteg(ptint)); + tabDPhi(ptint) = Dphi_point( ptInteg(ptint)); // ---- constitution du tableau Extrapol ----- Calcul_extrapol(nbi); @@ -186,7 +186,7 @@ ElemGeomC0 * GeomPentaQ::newElemGeomC0(ElemGeomC0 * pt) //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) -const Vecteur& GeomPentaQ::Phi(const Coordonnee& M) +const Vecteur& GeomPentaQ::Phi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -202,7 +202,7 @@ const Vecteur& GeomPentaQ::Phi(const Coordonnee& M) phi_M.Change_taille(NBNE); // si la taille est identique -> aucune action // construction à partir des triangles des faces - Vecteur phisurf=face(1)->Phi(Coordonnee(M(1),M(2))); + Vecteur phisurf=face(1)->Phi_point(Coordonnee(M(1),M(2))); double KSI = M(1); double ETA = M(2); double DZETA = M(3); double fsup=(1.+ DZETA)*DZETA/2.; double finf=-(1.-DZETA)*DZETA/2.; double LAMBDA= 1. - KSI - ETA; double C = 1. - DZETA*DZETA; @@ -250,7 +250,7 @@ const Vecteur& GeomPentaQ::Phi(const Coordonnee& M) return phi_M; }; // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) -const Mat_pleine& GeomPentaQ::Dphi(const Coordonnee& M) +const Mat_pleine& GeomPentaQ::Dphi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -266,8 +266,8 @@ const Mat_pleine& GeomPentaQ::Dphi(const Coordonnee& M) if ((dphi_M.Nb_ligne() != 3)&&(dphi_M.Nb_colonne() != NBNE)) dphi_M.Initialise (3,NBNE,0.); // construction à partir des triangles des faces - Vecteur phisurf=face(1)->Phi(Coordonnee(M(1),M(2))); - Mat_pleine dphisurf=face(1)->Dphi(Coordonnee(M(1),M(2))); + Vecteur phisurf=face(1)->Phi_point(Coordonnee(M(1),M(2))); + Mat_pleine dphisurf=face(1)->Dphi_point(Coordonnee(M(1),M(2))); double KSI = M(1); double ETA = M(2); double DZETA = M(3); double fsup=(1.+ DZETA)*DZETA/2.; double finf=-(1.-DZETA)*DZETA/2.; double dfsup=(1.+ 2.*DZETA)/2.; double dfinf=(2.*DZETA-1.)/2.; @@ -847,7 +847,7 @@ void GeomPentaQ::Calcul_extrapol(int nbi) // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire - const Vecteur& phiphi = penta.Phi(theta); + const Vecteur& phiphi = penta.Phi_point(theta); // et on enregistre indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); @@ -1013,7 +1013,7 @@ void GeomPentaQ::Calcul_extrapol(int nbi) // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire - const Vecteur& phiphi = penta.Phi(theta); + const Vecteur& phiphi = penta.Phi_point(theta); // et on enregistre indir(ne).Change_taille(6); tab(ne).Change_taille(nbi); @@ -1148,7 +1148,7 @@ void GeomPentaQ::Calcul_extrapol(int nbi) // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire - const Vecteur& phiphi = penta.Phi(theta); + const Vecteur& phiphi = penta.Phi_point(theta); // et on enregistre indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); @@ -1316,7 +1316,7 @@ void GeomPentaQ::Calcul_extrapol(int nbi) // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire - const Vecteur& phiphi = penta.Phi(theta); + const Vecteur& phiphi = penta.Phi_point(theta); // et on enregistre indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); @@ -1517,7 +1517,7 @@ void GeomPentaQ::Calcul_extrapol(int nbi) // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire - const Vecteur& phiphi = penta.Phi(theta); + const Vecteur& phiphi = penta.Phi_point(theta); // et on enregistre indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); diff --git a/Elements/Geometrie/ElemGeom/volume/GeomPentaQ.h b/Elements/Geometrie/ElemGeom/volume/GeomPentaQ.h index 39798e9..980afd0 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomPentaQ.h +++ b/Elements/Geometrie/ElemGeom/volume/GeomPentaQ.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -139,9 +139,9 @@ class GeomPentaQ : public GeomPentaCom //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) - const Vecteur& Phi(const Coordonnee& M); + const Vecteur& Phi_point(const Coordonnee& M); // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) - const Mat_pleine& Dphi(const Coordonnee& M); + const Mat_pleine& Dphi_point(const Coordonnee& M); protected : diff --git a/Elements/Geometrie/ElemGeom/volume/GeomPentaQComp.cc b/Elements/Geometrie/ElemGeom/volume/GeomPentaQComp.cc index ec37625..9a9009a 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomPentaQComp.cc +++ b/Elements/Geometrie/ElemGeom/volume/GeomPentaQComp.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -144,10 +144,10 @@ GeomPentaQComp::GeomPentaQComp(int nbi) : // fonctions d'interpolation globales aux points d'intégrations for (int ptint=1;ptint<= nbi; ptint++) - tabPhi(ptint) = Phi( ptInteg(ptint)); + tabPhi(ptint) = Phi_point( ptInteg(ptint)); // derivees des fonctions d'interpolations aux points d'intégrations for (int ptint=1;ptint<= nbi; ptint++) - tabDPhi(ptint) = Dphi( ptInteg(ptint)); + tabDPhi(ptint) = Dphi_point( ptInteg(ptint)); // ---- constitution du tableau Extrapol ----- Calcul_extrapol(nbi); @@ -187,7 +187,7 @@ ElemGeomC0 * GeomPentaQComp::newElemGeomC0(ElemGeomC0 * pt) //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) -const Vecteur& GeomPentaQComp::Phi(const Coordonnee& M) +const Vecteur& GeomPentaQComp::Phi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -214,7 +214,7 @@ const Vecteur& GeomPentaQComp::Phi(const Coordonnee& M) Vecteur tabPhiT(NBNE); for (int ifa = 1;ifa<= nbnef; ifa++) for (int iz = 1;iz<= nbnes; iz++) - { tabPhiT(ne) = face(1)->Phi(XY)(ifa) * seg(1)->Phi(Z)(iz); + { tabPhiT(ne) = face(1)->Phi_point(XY)(ifa) * seg(1)->Phi_point(Z)(iz); ne++; } // numerotation suivant le standard habituel @@ -243,7 +243,7 @@ const Vecteur& GeomPentaQComp::Phi(const Coordonnee& M) return phi_M; }; // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) -const Mat_pleine& GeomPentaQComp::Dphi(const Coordonnee& M) +const Mat_pleine& GeomPentaQComp::Dphi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -271,9 +271,9 @@ const Mat_pleine& GeomPentaQComp::Dphi(const Coordonnee& M) Mat_pleine tabDPhiT(3,NBNE); for (int ifa = 1;ifa<= nbnef; ifa++) for (int iz = 1;iz<= nbnes; iz++) - { tabDPhiT(1,ne) = face(1)->Dphi(XY)(1,ifa) * seg(1)->Phi(Z)(iz); - tabDPhiT(2,ne) = face(1)->Dphi(XY)(2,ifa) * seg(1)->Phi(Z)(iz); - tabDPhiT(3,ne) = face(1)->Phi(XY)(ifa) * seg(1)->Dphi(Z)(1,iz); + { tabDPhiT(1,ne) = face(1)->Dphi_point(XY)(1,ifa) * seg(1)->Phi_point(Z)(iz); + tabDPhiT(2,ne) = face(1)->Dphi_point(XY)(2,ifa) * seg(1)->Phi_point(Z)(iz); + tabDPhiT(3,ne) = face(1)->Phi_point(XY)(ifa) * seg(1)->Dphi_point(Z)(1,iz); ne++; } // numerotation suivant le standard habituel @@ -517,7 +517,7 @@ void GeomPentaQComp::Calcul_extrapol(int nbi) // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire - const Vecteur& phiphi = penta.Phi(theta); + const Vecteur& phiphi = penta.Phi_point(theta); // et on enregistre indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); @@ -698,7 +698,7 @@ void GeomPentaQComp::Calcul_extrapol(int nbi) // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire - const Vecteur& phiphi = penta.Phi(theta); + const Vecteur& phiphi = penta.Phi_point(theta); // et on enregistre indir(ne).Change_taille(6); tab(ne).Change_taille(nbi); @@ -843,7 +843,7 @@ void GeomPentaQComp::Calcul_extrapol(int nbi) // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire - const Vecteur& phiphi = penta.Phi(theta); + const Vecteur& phiphi = penta.Phi_point(theta); // et on enregistre indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); @@ -1018,7 +1018,7 @@ void GeomPentaQComp::Calcul_extrapol(int nbi) // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire - const Vecteur& phiphi = penta.Phi(theta); + const Vecteur& phiphi = penta.Phi_point(theta); // et on enregistre indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); @@ -1223,7 +1223,7 @@ void GeomPentaQComp::Calcul_extrapol(int nbi) // maintenant on va attribuer au noeud la valeur extrapolée // on calcule les fct d'interpolation au noeud ne // via ses coordonnées locales theta: on utilise le pentaèdre linéaire - const Vecteur& phiphi = penta.Phi(theta); + const Vecteur& phiphi = penta.Phi_point(theta); // et on enregistre indir(ne).Change_taille(nbi); tab(ne).Change_taille(nbi); diff --git a/Elements/Geometrie/ElemGeom/volume/GeomPentaQComp.h b/Elements/Geometrie/ElemGeom/volume/GeomPentaQComp.h index 475baff..bf5ca03 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomPentaQComp.h +++ b/Elements/Geometrie/ElemGeom/volume/GeomPentaQComp.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -141,9 +141,9 @@ class GeomPentaQComp : public GeomPentaCom //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) - const Vecteur& Phi(const Coordonnee& M); + const Vecteur& Phi_point(const Coordonnee& M); // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) - const Mat_pleine& Dphi(const Coordonnee& M); + const Mat_pleine& Dphi_point(const Coordonnee& M); protected : diff --git a/Elements/Geometrie/ElemGeom/volume/GeomPentaedre.cc b/Elements/Geometrie/ElemGeom/volume/GeomPentaedre.cc old mode 100644 new mode 100755 diff --git a/Elements/Geometrie/ElemGeom/volume/GeomTetra.h b/Elements/Geometrie/ElemGeom/volume/GeomTetra.h index 6330afa..e817f96 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomTetra.h +++ b/Elements/Geometrie/ElemGeom/volume/GeomTetra.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -149,9 +149,9 @@ class GeomHexalin : public ElemGeomC0 //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) - const Vecteur& Phi(const Coordonnee& M); + const Vecteur& Phi_point(const Coordonnee& M); // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) - const Mat_pleine& Dphi(const Coordonnee& M); + const Mat_pleine& Dphi_point(const Coordonnee& M); // en fonction de coordonnees locales, retourne true si le point est a l'interieur // de l'element, false sinon bool Interieur(const Coordonnee& M); diff --git a/Elements/Geometrie/ElemGeom/volume/GeomTetraCom.cc b/Elements/Geometrie/ElemGeom/volume/GeomTetraCom.cc index 9b4491c..172559b 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomTetraCom.cc +++ b/Elements/Geometrie/ElemGeom/volume/GeomTetraCom.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Geometrie/ElemGeom/volume/GeomTetraCom.h b/Elements/Geometrie/ElemGeom/volume/GeomTetraCom.h index 3952f9b..0388a8d 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomTetraCom.h +++ b/Elements/Geometrie/ElemGeom/volume/GeomTetraCom.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Geometrie/ElemGeom/volume/GeomTetraL.cc b/Elements/Geometrie/ElemGeom/volume/GeomTetraL.cc index e39ac1d..c8c7fec 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomTetraL.cc +++ b/Elements/Geometrie/ElemGeom/volume/GeomTetraL.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -106,10 +106,10 @@ GeomTetraL::GeomTetraL(int nbi) : } // calcul des fonctions d'interpolations aux points d'intégration for (int i =1;i<=Nbi();i++) - tabPhi(i)= Phi(ptInteg(i)); + tabPhi(i)= Phi_point(ptInteg(i)); // calcul des dérivées des fonctions d'interpolations aux points d'intégration for (int i =1;i<=Nbi();i++) - tabDPhi(i)= Dphi(ptInteg(i)); + tabDPhi(i)= Dphi_point(ptInteg(i)); // ---- constitution du tableau Extrapol ----- Calcul_extrapol(nbi); }; @@ -144,7 +144,7 @@ ElemGeomC0 * GeomTetraL::newElemGeomC0(ElemGeomC0 * pt) //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) -const Vecteur& GeomTetraL::Phi(const Coordonnee& M) +const Vecteur& GeomTetraL::Phi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -168,7 +168,7 @@ const Vecteur& GeomTetraL::Phi(const Coordonnee& M) return phi_M; }; // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) -const Mat_pleine& GeomTetraL::Dphi(const Coordonnee& M) +const Mat_pleine& GeomTetraL::Dphi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales diff --git a/Elements/Geometrie/ElemGeom/volume/GeomTetraL.h b/Elements/Geometrie/ElemGeom/volume/GeomTetraL.h index 13d594a..8a493c3 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomTetraL.h +++ b/Elements/Geometrie/ElemGeom/volume/GeomTetraL.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -145,9 +145,9 @@ class GeomTetraL : public GeomTetraCom //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) - const Vecteur& Phi(const Coordonnee& M); + const Vecteur& Phi_point(const Coordonnee& M); // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) - const Mat_pleine& Dphi(const Coordonnee& M); + const Mat_pleine& Dphi_point(const Coordonnee& M); // en fonction de coordonnees locales, retourne true si le point est a l'interieur // de l'element, false sinon bool Interieur(const Coordonnee& M); diff --git a/Elements/Geometrie/ElemGeom/volume/GeomTetraQ.cc b/Elements/Geometrie/ElemGeom/volume/GeomTetraQ.cc index b957fc6..52ab65b 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomTetraQ.cc +++ b/Elements/Geometrie/ElemGeom/volume/GeomTetraQ.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -122,7 +122,7 @@ GeomTetraQ::GeomTetraQ(int nbi) : // calcul des fonctions d'interpolations aux points d'intégration for (int i =1;i<=Nbi();i++) - tabPhi(i)= Phi(ptInteg(i)); + tabPhi(i)= Phi_point(ptInteg(i)); ////---debug //// for (int i =1;i<=10;i++) @@ -150,7 +150,7 @@ GeomTetraQ::GeomTetraQ(int nbi) : // calcul des dérivées des fonctions d'interpolations aux points d'intégration for (int i =1;i<=Nbi();i++) - tabDPhi(i)= Dphi(ptInteg(i)); + tabDPhi(i)= Dphi_point(ptInteg(i)); // ---- constitution du tableau Extrapol ----- Calcul_extrapol(nbi); }; @@ -185,7 +185,7 @@ ElemGeomC0 * GeomTetraQ::newElemGeomC0(ElemGeomC0 * pt) //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) -const Vecteur& GeomTetraQ::Phi(const Coordonnee& M) +const Vecteur& GeomTetraQ::Phi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales @@ -223,7 +223,7 @@ const Vecteur& GeomTetraQ::Phi(const Coordonnee& M) return phi_M; }; // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) -const Mat_pleine& GeomTetraQ::Dphi(const Coordonnee& M) +const Mat_pleine& GeomTetraQ::Dphi_point(const Coordonnee& M) { #ifdef MISE_AU_POINT // verification de la dimension des coordonnees locales diff --git a/Elements/Geometrie/ElemGeom/volume/GeomTetraQ.h b/Elements/Geometrie/ElemGeom/volume/GeomTetraQ.h index efe4776..9dd5f61 100644 --- a/Elements/Geometrie/ElemGeom/volume/GeomTetraQ.h +++ b/Elements/Geometrie/ElemGeom/volume/GeomTetraQ.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -147,9 +147,9 @@ class GeomTetraQ : public GeomTetraCom //--------- cas de coordonnees locales quelconques ---------------- // retourne les fonctions d'interpolation au point M (en coordonnees locales) - const Vecteur& Phi(const Coordonnee& M); + const Vecteur& Phi_point(const Coordonnee& M); // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales) - const Mat_pleine& Dphi(const Coordonnee& M); + const Mat_pleine& Dphi_point(const Coordonnee& M); // en fonction de coordonnees locales, retourne true si le point est a l'interieur // de l'element, false sinon bool Interieur(const Coordonnee& M); diff --git a/Elements/Geometrie/ElemGeom/volume/GeomTetraedre.cc b/Elements/Geometrie/ElemGeom/volume/GeomTetraedre.cc old mode 100644 new mode 100755 diff --git a/Elements/Geometrie/Frontiere/ElFrontiere.cc b/Elements/Geometrie/Frontiere/ElFrontiere.cc index 8e877db..7288ebb 100644 --- a/Elements/Geometrie/Frontiere/ElFrontiere.cc +++ b/Elements/Geometrie/Frontiere/ElFrontiere.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -91,7 +91,7 @@ bool ElFrontiere::operator == ( const ElFrontiere& a) const {int ta = this->tabNoeud.Taille(); // nb de noeud switch (ta) { case 1 : // cas d'une frontière point, on simplifie - if (this->tabNoeud(1) == a.tabNoeud(1)) {return true;} else {return false;} + if (this->tabNoeud(1) == a.tabNoeud(1)) {return true;} else {return false;} break; case 2 : // cas où la frontière est à 2 noeuds uniquement {if (this->tabNoeud(1) == a.tabNoeud(1)) @@ -102,84 +102,84 @@ bool ElFrontiere::operator == ( const ElFrontiere& a) const break; } default : // les autres cas - {// récup de l'élément géométrique - const ElemGeomC0 & elemgeom = this->ElementGeometrique(); - const Tableau & ind = elemgeom.Ind(); // récup du tableau des tranches - int nb_tranche = ind.Taille(); // le nombre d'intervalle de numéros de noeuds constituant la numérotation - // vérification que la taille de toutes les tranches est au moins supérieure à 1 - #ifdef MISE_AU_POINT - if (nb_tranche == 0) - {cout << "\n *** erreur, pas de tranche de nb de noeud definie " - << "\n ElFrontiere::MemeNoeud(... " << endl; - Sortie(1); - }; - for (int i1=1;i1<=nb_tranche;i1++) - if (ind(i1) < 1) - {cout << "\n *** erreur, une tranche de nb de noeud est nulle " - << " tableau ind: " << ind - << "\n ElFrontiere::MemeNoeud(... " << endl; - Sortie(1); - }; - #endif - // on balaie chaque intervalle - int deb_intervalle = 0; int fin_intervalle = 0; // init - for (int iter =1;iter<= nb_tranche;iter++) - { int tranche = ind(iter); - deb_intervalle = fin_intervalle+1; // mise à jour des bornes de l'intervalle de scrutation - fin_intervalle += tranche; // " " - // on commence par chercher un premier noeud identique dans l'intervalle - bool res = false; - int nd; // indice du cote this - Noeud * ptNoeud_a = a.tabNoeud(deb_intervalle); - for (nd=deb_intervalle; nd<= fin_intervalle; nd++) - {if (this->tabNoeud(nd) == ptNoeud_a) - { res = true; break; }; - }; - if (!res) // on arrête de suite si - {return false;}; // on n'a pas trouvé de premier noeud !! - // s'il n'y a qu'un seule noeud dans la tranche, on a finit cette tranche sinon on continue - if (tranche > 1) - { // on regarde dans quel sens il faut tourner - int ndplus = nd + 1; if (ndplus > fin_intervalle) ndplus -= tranche; - int ndmoins = nd - 1; if (ndmoins < deb_intervalle) ndmoins += tranche; - if (this->tabNoeud(ndplus) == a.tabNoeud(deb_intervalle+1)) - {// on est dans le bon sens en augmentant, et c'est ok pour le 2ième noeud, - // continue que s'il y a plus de 2 noeuds dans la tranche - if (tranche > 2) - { for (int i=1;i<= (tranche-2);i++) - { ndplus++; if (ndplus > fin_intervalle) ndplus -= tranche; - if (this->tabNoeud(ndplus) != a.tabNoeud(deb_intervalle+i+1)) - return false; - }; - }; - // sinon ok, on vient de balayer tous les noeuds, on continue - } - // le sens 1 ne marche pas , on regarde l'autre sens - else if (this->tabNoeud(ndmoins) == a.tabNoeud(deb_intervalle+1)) - {// le bon sens est finalement en diminuant - // continue que s'il y a plus de 2 noeuds dans la tranche - if (tranche > 2) - { for (int i=1;i<= (tranche-2);i++) - { ndmoins--; if (ndmoins < deb_intervalle) ndmoins += tranche; - if (this->tabNoeud(ndmoins) != a.tabNoeud(deb_intervalle+i+1)) - return false; - }; - }; - // sinon ok, on vient de balayer tous les noeuds, on continue - } - else // sinon ne marche pas dans les deux sens - { return false;}; - }; - }; // fin de la boucle sur les tranches + {// récup de l'élément géométrique + const ElemGeomC0 & elemgeom = this->ElementGeometrique(); + const Tableau & ind = elemgeom.Ind(); // récup du tableau des tranches + int nb_tranche = ind.Taille(); // le nombre d'intervalle de numéros de noeuds constituant la numérotation + // vérification que la taille de toutes les tranches est au moins supérieure à 1 + #ifdef MISE_AU_POINT + if (nb_tranche == 0) + {cout << "\n *** erreur, pas de tranche de nb de noeud definie " + << "\n ElFrontiere::MemeNoeud(... " << endl; + Sortie(1); + }; + for (int i1=1;i1<=nb_tranche;i1++) + if (ind(i1) < 1) + {cout << "\n *** erreur, une tranche de nb de noeud est nulle " + << " tableau ind: " << ind + << "\n ElFrontiere::MemeNoeud(... " << endl; + Sortie(1); + }; + #endif + // on balaie chaque intervalle + int deb_intervalle = 0; int fin_intervalle = 0; // init + for (int iter =1;iter<= nb_tranche;iter++) + { int tranche = ind(iter); + deb_intervalle = fin_intervalle+1; // mise à jour des bornes de l'intervalle de scrutation + fin_intervalle += tranche; // " " + // on commence par chercher un premier noeud identique dans l'intervalle + bool res = false; + int nd; // indice du cote this + Noeud * ptNoeud_a = a.tabNoeud(deb_intervalle); + for (nd=deb_intervalle; nd<= fin_intervalle; nd++) + {if (this->tabNoeud(nd) == ptNoeud_a) + { res = true; break; }; + }; + if (!res) // on arrête de suite si + {return false;}; // on n'a pas trouvé de premier noeud !! + // s'il n'y a qu'un seule noeud dans la tranche, on a finit cette tranche sinon on continue + if (tranche > 1) + { // on regarde dans quel sens il faut tourner + int ndplus = nd + 1; if (ndplus > fin_intervalle) ndplus -= tranche; + int ndmoins = nd - 1; if (ndmoins < deb_intervalle) ndmoins += tranche; + if (this->tabNoeud(ndplus) == a.tabNoeud(deb_intervalle+1)) + {// on est dans le bon sens en augmentant, et c'est ok pour le 2ième noeud, + // continue que s'il y a plus de 2 noeuds dans la tranche + if (tranche > 2) + { for (int i=1;i<= (tranche-2);i++) + { ndplus++; if (ndplus > fin_intervalle) ndplus -= tranche; + if (this->tabNoeud(ndplus) != a.tabNoeud(deb_intervalle+i+1)) + return false; + }; + }; + // sinon ok, on vient de balayer tous les noeuds, on continue + } + // le sens 1 ne marche pas , on regarde l'autre sens + else if (this->tabNoeud(ndmoins) == a.tabNoeud(deb_intervalle+1)) + {// le bon sens est finalement en diminuant + // continue que s'il y a plus de 2 noeuds dans la tranche + if (tranche > 2) + { for (int i=1;i<= (tranche-2);i++) + { ndmoins--; if (ndmoins < deb_intervalle) ndmoins += tranche; + if (this->tabNoeud(ndmoins) != a.tabNoeud(deb_intervalle+i+1)) + return false; + }; + }; + // sinon ok, on vient de balayer tous les noeuds, on continue + } + else // sinon ne marche pas dans les deux sens + { return false;}; + }; + }; // fin de la boucle sur les tranches }; // fin du cas courant (default du switch) }; // fin du switch sur le nombre de noeuds } else // le type est different et ou le numéro de maillage est différent return false; - // si on arrive ici, cela veut dire que toutes les égalités sont bonnes pour un cas autre que - // point ou frontière à 2 noeuds - return true; + // si on arrive ici, cela veut dire que toutes les égalités sont bonnes pour un cas autre que + // point ou frontière à 2 noeuds + return true; }; // retourne un element frontiere ayant une orientation opposee @@ -205,6 +205,101 @@ ElFrontiere * ElFrontiere::Oppose() const return pt; }; +// calcul éventuel de la normale à un noeud +// ce calcul existe pour les éléments 2D, 1D axi, et aussi pour les éléments 1D +// qui possède un repère d'orientation +// en retour coor = la normale si coor.Dimension() est = à la dimension de l'espace +// si le calcul n'existe pas --> coor.Dimension() = 0 +// ramène un entier : +// == 1 : calcul normal +// == 0 : problème de calcul -> coor.Dimension() = 0 +// == 2 : indique que le calcul n'est pas licite pour le noeud passé en paramètre +// mais il n'y a pas d'erreur, c'est seulement que l'élément n'est pas ad hoc pour +// calculer la normale à ce noeud là +// temps: indique à quel moment on veut le calcul +int ElFrontiere::CalculNormale_noeud(Enum_dure temps,const Noeud& noe,Coordonnee& coor) + { + int retour = 1; // init du retour : on part d'un bon a priori + Enum_type_geom enutygeom = Type_geom_front(); + int dima = ParaGlob::Dimension(); + // on exclue les cas à pb + if ( ((dima == 3) && (!ParaGlob::AxiSymetrie()) && ((enutygeom == LIGNE)||(enutygeom == POINT_G))) + || ((dima == 3) && (ParaGlob::AxiSymetrie()) && (enutygeom == POINT_G)) + || ((dima == 2) && (enutygeom == POINT_G)) + ) + // on n'a pas d'information particulière pour calculer la normale + // donc on ne peut pas calculer + { retour = 2; + } + else // sinon le calcul est possible + { // on commence par repérer le noeud dans la numérotation locale + int nuoe=0; + int borne_nb_noeud=tabNoeud.Taille()+1; + for (int i=1;i< borne_nb_noeud;i++) + {Noeud& noeloc = *tabNoeud(i); + if ( (noe.Num_noeud() == noeloc.Num_noeud()) + && (noe.Num_Mail() == noeloc.Num_Mail()) + ) + {nuoe = i; break; + }; + }; + // on ne continue que si on a trouvé le noeud + if (nuoe != 0) + { ElemGeomC0& elemgeom = ElementGeometrique(); // récup de la géométrie + // récup des coordonnées locales du noeuds + const Coordonnee& theta_noeud = elemgeom.PtelemRef()(nuoe); + // récup de la métrique associée à l'élément + Met_abstraite * met = this->Metrique(); + + // récup des phi et dphi au noeud + const Vecteur & phi = elemgeom.Phi_point(theta_noeud); + const Mat_pleine& dphi = elemgeom.Dphi_point(theta_noeud); + switch (temps) + {case TEMPS_0 : + {const BaseB& baseB = met->BaseNat_0(tabNoeud,dphi,phi); + coor = Util::ProdVec_coor( baseB.Coordo(1), baseB.Coordo(2)); + coor.Normer(); + break; + } + case TEMPS_t : + {const BaseB& baseB = met->BaseNat_t(tabNoeud,dphi,phi); + coor = Util::ProdVec_coor( baseB.Coordo(1), baseB.Coordo(2)); + coor.Normer(); + break; + } + case TEMPS_tdt : + {const BaseB& baseB = met->BaseNat_tdt(tabNoeud,dphi,phi); + coor = Util::ProdVec_coor( baseB.Coordo(1), baseB.Coordo(2)); + coor.Normer(); + break; + } + default : + cout << "\nErreur : valeur incorrecte du temps demande = " + << Nom_dure(temps) << " !\n"; + cout << "\n ElFrontiere::CalculNormale_noeud(Enum_dure temps... \n"; + retour = 0; + Sortie(1); + }; + } + else + {cout << "\n *** erreur le noeud demande num= "<Coord2() - tabNoeud(j)->Coord2()).Norme(); maxdiagonale = MaX(maxdiagonale,dist); }; - return maxdiagonale; - }; + return maxdiagonale; + }; // met à jour la boite d'encombrement void ElFrontiere::AjourBoiteEncombrement() diff --git a/Elements/Geometrie/Frontiere/ElFrontiere.h b/Elements/Geometrie/Frontiere/ElFrontiere.h index 41f07df..74a580c 100644 --- a/Elements/Geometrie/Frontiere/ElFrontiere.h +++ b/Elements/Geometrie/Frontiere/ElFrontiere.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -35,7 +35,7 @@ * PROJET: Herezh++ * * $ * ************************************************************************ - * BUT: Classe generique des elements frontieres * + * BUT: Classe generique des elements frontieres. * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * * VERIFICATION: * @@ -105,7 +105,7 @@ class ElFrontiere Enum_type_geom Type_geom_front() const {return Type_geom_generique(ElementGeometrique().TypeGeometrie());}; // retourne l'élément géométrique attaché à l'élément frontière - virtual ElemGeomC0 const & ElementGeometrique() const = 0; + virtual ElemGeomC0 & ElementGeometrique() const = 0; // surcharge des tests // ======================================================================== // IMPORTANT !!! @@ -140,6 +140,20 @@ class ElFrontiere // ramene et calcul les coordonnees du point de reference de l'element virtual Coordonnee Ref() = 0; + // calcul éventuel de la normale à un noeud + // ce calcul existe pour les éléments 2D, 1D axi, et aussi pour les éléments 1D + // qui possède un repère d'orientation + // en retour coor = la normale si coor.Dimension() est = à la dimension de l'espace + // si le calcul n'existe pas --> coor.Dimension() = 0 + // ramène un entier : + // == 1 : calcul normal + // == 0 : problème de calcul -> coor.Dimension() = 0 + // == 2 : indique que le calcul n'est pas licite pour le noeud passé en paramètre + // mais il n'y a pas d'erreur, c'est seulement que l'élément n'est pas ad hoc pour + // calculer la normale à ce noeud là + // temps: indique à quel moment on veut le calcul + int CalculNormale_noeud(Enum_dure temps,const Noeud& noe,Coordonnee& coor); + // ramene un plan tangent ou une droite tangente au point de reference // si indic = 1 -> une droite, =2 -> un plan // ces infos sont stocke et sauvegardees dans l'element de frontiere diff --git a/Elements/Geometrie/Frontiere/Front.cc b/Elements/Geometrie/Frontiere/Front.cc index 0540976..59c82fe 100644 --- a/Elements/Geometrie/Frontiere/Front.cc +++ b/Elements/Geometrie/Frontiere/Front.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -37,8 +37,9 @@ Front::Front() : boite_Front(),num_frontiere(0),elem(NULL) {ptEl = NULL; tabmitoyen=NULL; }; // normal -Front::Front ( const ElFrontiere& el, Element * pt, int num_front ) : +Front::Front ( const ElFrontiere& el, Element * pt, int num_front ,int ang_mort) : boite_Front(ParaGlob::Dimension()),num_frontiere(num_front) + ,angle_mort(ang_mort) ,elem(el.NevezElemFront()) { ptEl =(Element *) pt; tabmitoyen=NULL; @@ -51,7 +52,7 @@ Front::Front ( const ElFrontiere& el, Element * pt, int num_front ) : // de copie Front::Front ( const Front& a) : boite_Front(a.boite_Front),num_frontiere(a.num_frontiere) - ,elem(a.elem->NevezElemFront()) + ,elem(a.elem->NevezElemFront()),angle_mort(a.angle_mort) { ptEl = (Element *) a.ptEl; if (a.tabmitoyen != NULL) { int tabtaille = (a.tabmitoyen)->Taille(); @@ -69,34 +70,47 @@ Front::Front ( const Front& a) : Front::~Front() { if (elem != NULL) delete elem; + // on efface le tableau mais pas les objets pointés if (tabmitoyen != NULL) delete tabmitoyen; }; // ============= METHODES ========== // affichage à l'écran des informations liées au contact -void Front::Affiche() const +// cas = 0 : affichage en fonction du niveau de commentaire voulu +// cas = 1 : affichage minimal nécessaire pour repérer l'élément +void Front::Affiche(int cas) const { if (elem != NULL) - { cout << "\n element de frontiere du maillage " << ptEl->Num_maillage() <<" , cree par l'element " - << ptEl->Num_elt() << " de numero " << num_frontiere << " , de type de geometrie: " - << Nom_type_geom(elem->Type_geom_front()) << " , avec une interpolation:" - << Nom_interpol(elem->ElementGeometrique().TypeInterpolation()) - << " , constitue des noeuds: " ; - const Tableau & tabnoeud = elem->TabNoeud_const(); - int tabtaille = tabnoeud.Taille(); - for (int i=1;i<=tabtaille;i++) + {if (cas == 1) + { cout << " front " ; + if (angle_mort) + cout << "(angle mort) "; + cout << num_frontiere << " de l'EF " << ptEl->Num_elt() << " du mail. " + << ptEl->Num_maillage() << flush; + } + else + {cout << "\n element de frontiere du maillage " << ptEl->Num_maillage() <<" , cree par l'element " + << ptEl->Num_elt() << " de numero " << num_frontiere << " , de type de geometrie: " + << Nom_type_geom(elem->Type_geom_front()) << " , avec une interpolation:" + << Nom_interpol(elem->ElementGeometrique().TypeInterpolation()); + if (angle_mort) cout << " ( represente un angle mort) , "; + cout << " , constitue des noeuds: " ; + const Tableau & tabnoeud = elem->TabNoeud_const(); + int tabtaille = tabnoeud.Taille(); + for (int i=1;i<=tabtaille;i++) cout << tabnoeud(i)->Num_noeud() << " , "; - cout << " , et contiend les degres de liberte suivants: " + cout << " , et contiend les degres de liberte suivants: " << elem->DdlElem_const(); - if (this->tabmitoyen != NULL) + if (this->tabmitoyen != NULL) {int tai = this->tabmitoyen->Taille(); cout << "\n " << tai << " elements mitoyens: ( "; for (int i=1;i<=tai;i++) cout << (*tabmitoyen)(i)->PtEI()->Num_elt() << " , "; cout << ") "; } - else - cout << "\n *** aucun element mitoyen !!!! *** "; + else + cout << "\n *** aucun element mitoyen !!!! *** "; + }; } else { cout << "\n element de frontiere associe a un element fini: FRONTIERE NON DEFINIE !! "; }; @@ -130,11 +144,13 @@ Front& Front::operator = ( const Front& a) }; // boite d'encombrement boite_Front = a.boite_Front; + // angle mort + angle_mort = a.angle_mort; return *this; }; // definition des elements mitoyens -void Front::DefMitoyen(Tableau & tab) +void Front::DefMitoyen(const Tableau & tab) { int tabtaille = tab.Taille(); if (tabtaille != 0) @@ -149,7 +165,29 @@ void Front::DefMitoyen(Tableau & tab) }; }; }; - +// ajout d'un élément mitoyens (l'ajout est effectif uniquement s'il n'existe pas déjà) +void Front::AjoutMitoyen(Front * mitoyen) + { if (tabmitoyen == NULL) + // si le tableau n'existe pas, on le dimensionne à 1 et on ajoute l'unique élément + {tabmitoyen= new Tableau ; + tabmitoyen->Change_taille(1); + (*tabmitoyen)(1) = mitoyen; + } + else // sinon on commence par regarder si mitoyen existe déjà + {int tail = tabmitoyen->Taille(); + bool trouver = false; + for (int i=1;i<= tail; i++ ) + if (*(*tabmitoyen)(i) == *mitoyen) + {trouver = true; break;} + // s'il n'existe pas on l'ajoute + if (!trouver) + // on augmente la taille et on ajoute + {tabmitoyen->Change_taille(tail+1); + (*tabmitoyen)(tail+1)= mitoyen; + }; + }; + }; + // test si le point passé en argument appartient à la boite d'encombrement de la frontière // tous les points sont supposées avoir la même dimension bool Front::In_boite_emcombrement_front(const Coordonnee& M) const @@ -214,6 +252,8 @@ void Front::Lecture_base_info_front(ifstream& ent) ent >> test; if (test) {elem->Lecture_base_info_ElFrontiere_pour_projection(ent);} + // on réutilise nom_type pour lire la chaine: am= + ent >> nom_type >> angle_mort; // // la boite d'encombrement de la frontière // ent >> nom_type >> boite_Front.Premier() >> boite_Front.Second() ; @@ -229,7 +269,9 @@ void Front::Ecriture_base_info_front(ofstream& sort) // les éléments spécifiques à l'élément frontière if (elem != NULL) { sort << " 1 "; elem->Ecriture_base_info_ElFrontiere_pour_projection(sort);} - else { sort << " 0 ";}; + else { sort << " 0 ";}; + sort << " am= " << angle_mort << " "; + // la boite d'encombrement // sort << "encombrements_surf " << boite_Front.Premier() << " " << boite_Front.Second() << " \n"; }; diff --git a/Elements/Geometrie/Frontiere/Front.h b/Elements/Geometrie/Frontiere/Front.h index 73ec890..f80b510 100644 --- a/Elements/Geometrie/Frontiere/Front.h +++ b/Elements/Geometrie/Frontiere/Front.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -36,9 +36,12 @@ * $ * ************************************************************************ * BUT: definir un element de stockage de frontiere relatif à un * - * éléments finis. * + * éléments finis. * + * Ce conteneur est utilisé en dehors d'un élément, par exemple* + * pour le contact * * $ * - * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * + * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * + * * * VERIFICATION: * * * * ! date ! auteur ! but ! * @@ -71,7 +74,7 @@ class Front //par defaut Front(); // normal - Front ( const ElFrontiere& el, Element * pt, int num_front) ; + Front ( const ElFrontiere& el, Element * pt, int num_front,int angle_mort=0) ; // de copie Front ( const Front& a); // destructeur @@ -80,7 +83,9 @@ class Front // ============= METHODES ========== // affichage à l'écran des informations liées au contact - void Affiche() const ; + // cas = 0 : affichage en fonction du niveau de commentaire voulu + // cas = 1 : affichage minimal nécessaire pour repérer l'élément + void Affiche(int cas=0) const ; // operator // affectation de toute les donnees @@ -90,13 +95,16 @@ class Front inline bool operator == ( const Front& a) const { if ((*(this->elem) == *(a.elem)) && (this->ptEl == a.ptEl) && (this->tabmitoyen == a.tabmitoyen) - && (num_frontiere == a.num_frontiere) ) + && (num_frontiere == a.num_frontiere) + && (angle_mort == a.angle_mort) + ) return true; else return false; }; // test d'egalite sur les éléments originaux : // l'élément elem, ptEI, et num_frontiere, mais qui ne comprend pas tabmitoyen + // Important**: ne comprend pas angle_mort contrairement à la méthode de même nom dans Contact inline bool MemeOrigine( const Front& a) const { if ( (*(this->elem) == *(a.elem)) && (this->ptEl == a.ptEl) && (num_frontiere == a.num_frontiere)) @@ -109,7 +117,9 @@ class Front { if (*this == a) return false; else return true;}; // definition des elements mitoyens - void DefMitoyen(Tableau & tabmitoyen); + void DefMitoyen(const Tableau & tabmitoyen); + // ajout d'un élément mitoyens (l'ajout est effectif uniquement s'il n'existe pas déjà) + void AjoutMitoyen(Front * mitoyen); // retourne les donnees inline const Tableau * TabMitoyen() const { return tabmitoyen;}; @@ -165,6 +175,11 @@ class Front Element * PtEI() const { return ptEl;}; // récup du numéro de frontière associé à l'élément fini int Num_frontiere() const {return num_frontiere;}; + + // récupération de l'indicateur d'angle mort + int Angle_mort() const {return angle_mort;}; + // changement de l'indicateur d'angle mort + void Change_angle_mort(int new_angle_mort) {angle_mort= new_angle_mort;}; // test si la position d'un point est du bon cote ( c-a-d hors matiere) ou non // si le point est sur la surface, ramène false @@ -197,6 +212,9 @@ class Front DeuxCoordonnees boite_Front; // le premier le min, le second le max Tableau * tabmitoyen; // tableau des elements mitoyens + + int angle_mort; // indicateur par défaut = 0, ==1 s'il s'agit d'un front + // qui est construit pour représenter un angle mort // fonctions internes static double prop_mini; // mini proportion à ajouter à l'encombrement diff --git a/Elements/Geometrie/Frontiere/Ligne/FrontSegCub.cc b/Elements/Geometrie/Frontiere/Ligne/FrontSegCub.cc index 7f63330..42163f4 100644 --- a/Elements/Geometrie/Frontiere/Ligne/FrontSegCub.cc +++ b/Elements/Geometrie/Frontiere/Ligne/FrontSegCub.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -117,13 +117,14 @@ Coordonnee FrontSegCub::Ref() Coordonnee A0(0.); // appel de la routine de metrique, 4 noeuds if (tabNoeud(1)->ExisteCoord2()) - {refP = met->PointM_tdt(tabNoeud,segment.Phi(A0));} + {refP = met->PointM_tdt(tabNoeud,segment.Phi_point(A0));} else if (tabNoeud(1)->ExisteCoord1()) - {refP = met->PointM_t(tabNoeud,segment.Phi(A0));} + {refP = met->PointM_t(tabNoeud,segment.Phi_point(A0));} else - {refP = met->PointM_0(tabNoeud,segment.Phi(A0));}; + {refP = met->PointM_0(tabNoeud,segment.Phi_point(A0));}; return refP; }; + // ramene une droite tangente au point de reference // si indic = 1 -> une droite // ces infos sont stocke et sauvegardees dans l'element @@ -132,7 +133,7 @@ void FrontSegCub::TangentRef(Droite& dr, Plan& , int& indic) // le point de ref en coordonnees locale Coordonnee A0(0.); BaseB giB; - met->BaseND_tdt(tabNoeud,segment.Dphi(A0),segment.Phi(A0),giB,giH); + met->BaseND_tdt(tabNoeud,segment.Dphi_point(A0),segment.Phi_point(A0),giB,giH); droite.Change_ptref(Ref()); droite.Change_vect(giB(1).Coor()); theta(1) = 0.;theta_repere=theta; @@ -145,7 +146,7 @@ void FrontSegCub::TangentRef(Droite& dr, Plan& , int& indic) // ces infos sont stocke et sauvegardees dans l'element void FrontSegCub::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& dr, Plan& , int& indic) { // récup des bases au point courant projeté - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),segment.Phi(theta_repere),giB,giH); + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),segment.Phi_point(theta_repere),giB,giH); // on incremente la coordonnee curviligne Coordonnee M1M = M - droite.PointDroite(); theta(1) += M1M * giH.Coordo(1); @@ -156,16 +157,16 @@ void FrontSegCub::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& dr, Plan& // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = segment.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = segment.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),phi,giB,giH); + phi = segment.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi,giB,giH); // on recalcule les coodonnées locales theta(1) += M1M * giH.Coordo(1); } else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = segment.Phi(theta_repere); // fonctions d'interpolation au point - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),phi,giB,giH); + phi = segment.Phi_point(theta_repere); // fonctions d'interpolation au point + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant au theta_i @@ -192,14 +193,14 @@ void FrontSegCub::AutreTangent(Droite& dr, Plan& , int& indic) // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = segment.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = segment.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),phi,giB,giH); + phi = segment.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi,giB,giH); } else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = segment.Phi(theta_repere); // fonctions d'interpolation au point - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),phi,giB,giH); + phi = segment.Phi_point(theta_repere); // fonctions d'interpolation au point + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant au theta_i @@ -233,14 +234,14 @@ Tableau * FrontSegCub::DernierTangent(Droite& dr, Plan& , int& indi // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = segment.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = segment.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),phi,giB,giH); + phi = segment.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi,giB,giH); } else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = segment.Phi(theta_repere); // fonctions d'interpolation au point - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),phi,giB,giH); + phi = segment.Phi_point(theta_repere); // fonctions d'interpolation au point + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant au theta_i @@ -256,7 +257,7 @@ Tableau * FrontSegCub::DernierTangent(Droite& dr, Plan& , int& indi Tableau * pt_varT = NULL; // par défaut if (avec_var) { // calcul de la variation des vecteurs de base: donc ici d'un seul vecteur - const Tableau & d_giB_tdt = met->d_BaseNat_tdt(tabNoeud,segment.Dphi(theta_repere),phi); + const Tableau & d_giB_tdt = met->d_BaseNat_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi); // calcul de la variation de la tangente normée Util::VarUnVect_coorBN( giB(1),d_giB_tdt,giB(1).Coor().Norme(),d_T); if (ParaGlob::Dimension() == 2) @@ -277,7 +278,7 @@ Tableau * FrontSegCub::DernierTangent(Droite& dr, Plan& , int& indi // calcul les fonctions d'interpolation au dernier point de projection sauvegarde const Vecteur& FrontSegCub::Phi() - { return segment.Phi(theta);}; + { return segment.Phi_point(theta);}; // test si la position d'un point est du bon cote ( c-a-d hors matiere) ou non // si le point est sur la surface, ramène false @@ -294,9 +295,9 @@ bool FrontSegCub::BonCote_t( const Coordonnee& a,double& r) const // cas ou on {// def des infos de la droite tangente a t en theta // devrait également marcher pour l'axisymétrie en 3D int dim = ParaGlob::Dimension(); - phi = segment.Phi(theta_repere); // fonctions d'interpolation au point + phi = segment.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi,giB,giH); // def des infos du plan tangent a t en theta Coordonnee delta_theta = theta - theta_repere; Coordonnee M1 = met->PointM_t(tabNoeud,phi) + delta_theta(1) * giB.Coordo(1); diff --git a/Elements/Geometrie/Frontiere/Ligne/FrontSegCub.h b/Elements/Geometrie/Frontiere/Ligne/FrontSegCub.h index 23fed4a..1118a37 100644 --- a/Elements/Geometrie/Frontiere/Ligne/FrontSegCub.h +++ b/Elements/Geometrie/Frontiere/Ligne/FrontSegCub.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -82,7 +82,7 @@ class FrontSegCub : public ElFrontiere // retourne le type de l'element frontiere string TypeFrontiere() const ; // retourne l'élément géométrique attaché à l'élément frontière - ElemGeomC0 const & ElementGeometrique() const {return segment;}; + ElemGeomC0 & ElementGeometrique() const {return segment;}; // creation d'un nouvelle element frontiere du type FrontSegCub ElFrontiere * NevezElemFront() const ; // creation d'un nouvelle element frontiere du type FrontSegCub diff --git a/Elements/Geometrie/Frontiere/Ligne/FrontSegLine.cc b/Elements/Geometrie/Frontiere/Ligne/FrontSegLine.cc index 896c916..3060f02 100644 --- a/Elements/Geometrie/Frontiere/Ligne/FrontSegLine.cc +++ b/Elements/Geometrie/Frontiere/Ligne/FrontSegLine.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -117,11 +117,11 @@ Coordonnee FrontSegLine::Ref() Coordonnee A0(0.); // appel de la routine de metrique if (tabNoeud(1)->ExisteCoord2()) - {refP = met->PointM_tdt(tabNoeud,segment.Phi(A0));} + {refP = met->PointM_tdt(tabNoeud,segment.Phi_point(A0));} else if (tabNoeud(1)->ExisteCoord1()) - {refP = met->PointM_t(tabNoeud,segment.Phi(A0));} + {refP = met->PointM_t(tabNoeud,segment.Phi_point(A0));} else - {refP = met->PointM_0(tabNoeud,segment.Phi(A0));}; + {refP = met->PointM_0(tabNoeud,segment.Phi_point(A0));}; return refP; }; @@ -154,7 +154,7 @@ void FrontSegLine::TangentRef(Droite& dr, Plan& , int& indic) // ces infos sont stocke et sauvegardees dans l'element void FrontSegLine::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& dr, Plan& , int& indic) { // récup des bases au point courant projeté - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),segment.Phi(theta_repere),giB,giH); + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),segment.Phi_point(theta_repere),giB,giH); // on incremente la coordonnee curviligne Coordonnee M1M = M - droite.PointDroite(); theta(1) += M1M * giH.Coordo(1); @@ -162,8 +162,8 @@ void FrontSegLine::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& dr, Plan& // dans le cas où le point est externe à l'élément, ici on ne limite pas le repère de calcul // car il n'y a jamais de pb theta_repere = theta; - phi = segment.Phi(theta_repere); // fonctions d'interpolation au point - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),phi,giB,giH); + phi = segment.Phi_point(theta_repere); // fonctions d'interpolation au point + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi,giB,giH); M1 = met->PointM_tdt(tabNoeud,phi); @@ -225,8 +225,8 @@ Tableau * FrontSegLine::DernierTangent(Droite& dr, Plan& , int& ind { indic = 1; theta_repere = theta; // normalement ici theta_repere est toujours = theta - phi = segment.Phi(theta_repere); // fonctions d'interpolation au point - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),phi,giB,giH); + phi = segment.Phi_point(theta_repere); // fonctions d'interpolation au point + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi,giB,giH); // calcul du point correspondant au theta_i Coordonnee M1 = met->PointM_tdt(tabNoeud,phi); droite.Change_ptref(M1); @@ -244,7 +244,7 @@ Tableau * FrontSegLine::DernierTangent(Droite& dr, Plan& , int& ind // phi = segment.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément // met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),phi,giB,giH); // calcul de la variation des vecteurs de base: donc ici d'un seul vecteur - const Tableau & d_giB_tdt = met->d_BaseNat_tdt(tabNoeud,segment.Dphi(theta_repere),phi); + const Tableau & d_giB_tdt = met->d_BaseNat_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi); // calcul de la variation de la tangente normée Util::VarUnVect_coorBN( giB(1),d_giB_tdt,giB(1).Coor().Norme(),d_T); if (ParaGlob::Dimension() == 2) @@ -265,7 +265,7 @@ Tableau * FrontSegLine::DernierTangent(Droite& dr, Plan& , int& ind // calcul les fonctions d'interpolation au dernier point de projection sauvegarde const Vecteur& FrontSegLine::Phi() - { return segment.Phi(theta);}; + { return segment.Phi_point(theta);}; // test si la position d'un point est du bon cote ( c-a-d hors matiere) ou non diff --git a/Elements/Geometrie/Frontiere/Ligne/FrontSegLine.h b/Elements/Geometrie/Frontiere/Ligne/FrontSegLine.h index 1da204a..77f472d 100644 --- a/Elements/Geometrie/Frontiere/Ligne/FrontSegLine.h +++ b/Elements/Geometrie/Frontiere/Ligne/FrontSegLine.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -85,7 +85,7 @@ class FrontSegLine : public ElFrontiere // retourne le type de l'element frontiere string TypeFrontiere() const ; // retourne l'élément géométrique attaché à l'élément frontière - ElemGeomC0 const & ElementGeometrique() const {return segment;}; + ElemGeomC0 & ElementGeometrique() const {return segment;}; // creation d'un nouvelle element frontiere du type FrontSegLine ElFrontiere * NevezElemFront() const ; // creation d'un nouvelle element frontiere du type FrontSegLine diff --git a/Elements/Geometrie/Frontiere/Ligne/FrontSegQuad.cc b/Elements/Geometrie/Frontiere/Ligne/FrontSegQuad.cc index a3ec11e..b0b41c1 100644 --- a/Elements/Geometrie/Frontiere/Ligne/FrontSegQuad.cc +++ b/Elements/Geometrie/Frontiere/Ligne/FrontSegQuad.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -116,9 +116,10 @@ Coordonnee FrontSegQuad::Ref() { // le point de ref en coordonnees locale Coordonnee A0(0.); // appel de la routine de metrique, 3 noeuds - refP = met->PointM_tdt(tabNoeud,segment.Phi(A0)); + refP = met->PointM_tdt(tabNoeud,segment.Phi_point(A0)); return refP; }; + // ramene une droite tangente au point de reference // si indic = 1 -> une droite // ces infos sont stocke et sauvegardees dans l'element @@ -127,8 +128,17 @@ void FrontSegQuad::TangentRef(Droite& dr, Plan& , int& indic) // le point de ref en coordonnees locale Coordonnee A0(0.); BaseB giB; - met->BaseND_tdt(tabNoeud,segment.Dphi(A0),segment.Phi(A0),giB,giH); + met->BaseND_tdt(tabNoeud,segment.Dphi_point(A0),segment.Phi_point(A0),giB,giH); droite.Change_ptref(Ref()); +//// debug +//{ double d = giB(1).Coor().Norme(); +// // if (d <= ConstMath::trespetit) +// if (d <= ConstMath::petit) // *****pour test +// { cout << "\n*** debug FrontSegQuad::TangentRef( : la norme du vecteur est trop petite !"; +// cout <<"\nnorme = " << d << " newtra= " << giB(1).Coor() ; +// } +//} +//// fin debug droite.Change_vect(giB(1).Coor()); theta(1) = 0.;theta_repere=theta; dr = droite; @@ -140,10 +150,16 @@ void FrontSegQuad::TangentRef(Droite& dr, Plan& , int& indic) // ces infos sont stocke et sauvegardees dans l'element void FrontSegQuad::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& dr, Plan& , int& indic) { // récup des bases au point courant projeté - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),segment.Phi(theta_repere),giB,giH); + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),segment.Phi_point(theta_repere),giB,giH); // on incremente la coordonnee curviligne Coordonnee M1M = M - droite.PointDroite(); theta(1) += M1M * giH.Coordo(1); +//// debug +//Coordonnee M1M_save(M1M); +//Coordonnee M_save(M); +//double theta1_save = theta(1); +//double theta_repere_save = theta_repere(1); +//// fin partie debug // dans le cas où le point est externe à l'élément, on limite le repère de calcul au point externe @@ -152,16 +168,16 @@ void FrontSegQuad::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& dr, Plan& // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = segment.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = segment.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),phi,giB,giH); + phi = segment.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi,giB,giH); // on recalcule les coodonnées locales theta(1) += M1M * giH.Coordo(1); } else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = segment.Phi(theta_repere); // fonctions d'interpolation au point - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),phi,giB,giH); + phi = segment.Phi_point(theta_repere); // fonctions d'interpolation au point + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant au theta_i @@ -169,6 +185,38 @@ void FrontSegQuad::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& dr, Plan& M1 = met->PointM_tdt(tabNoeud,phi) + delta_theta(1) * giB.Coordo(1); droite.Change_ptref(M1); + +// //---debug +// if ((!isfinite(theta(1))) || (isnan(theta(1)))) +// {cout << "\n*** debug FrontSegQuad::Tangent( : theta(1) infini !"; +// cout << "\n M1M_save= " << M1M_save +// << "\n theta1_save= "<< theta1_save +// << " theta_repere_save= "<< theta_repere_save +// << "\n M_save= " << M_save; +// }; +// if ((!isfinite(theta_repere(1))) || (isnan(theta_repere(1)))) +// {cout << "\n*** debug FrontSegQuad::Tangent( : theta_repere(1) infini !"; +// }; +// //---fin debug + + +//// debug +//{ double d = giB(1).Coor().Norme(); +// // if (d <= ConstMath::trespetit) +// if (d <= ConstMath::petit) // *****pour test +// { cout << "\n*** debug FrontSegQuad::Tangent( : la norme du vecteur est trop petite !"; +// cout <<"\nnorme = " << d << " newtra= " << giB(1).Coor() ; +// cout << "\n tabNoeud "; +// for (int i=1;i<= tabNoeud.Taille();i++) +// cout << "\n noe i= " << i <<": " << (*tabNoeud(i)); +// cout << "\n theta(1)= " << theta(1); +// cout << "\n M1M_save= " << M1M_save +// << "\n theta1_save= "<< theta1_save +// << "\n M_save= " << M_save; +// } +//} +//// fin debug + droite.Change_vect(giB(1).Coor()); // retour dr = droite; @@ -189,21 +237,40 @@ void FrontSegQuad::AutreTangent(Droite& dr, Plan& , int& indic) // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = segment.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = segment.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),phi,giB,giH); + phi = segment.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi,giB,giH); } else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = segment.Phi(theta_repere); // fonctions d'interpolation au point - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),phi,giB,giH); + phi = segment.Phi_point(theta_repere); // fonctions d'interpolation au point + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi,giB,giH); }; - + +////---debug +//if ((!isfinite(theta(1))) || (isnan(theta(1)))) +// {cout << "\n*** debug FrontSegQuad::AutreTangent( : theta(1) infini !"; +// }; +//if ((!isfinite(theta_repere(1))) || (isnan(theta_repere(1)))) +//{cout << "\n*** debug FrontSegQuad::AutreTangent( : theta_repere(1) infini !"; +//}; +////---fin debug + // calcul du point correspondant au theta_i Coordonnee delta_theta = theta - theta_repere; Coordonnee M1 = met->PointM_tdt(tabNoeud,phi) + delta_theta(1) * giB.Coordo(1); droite.Change_ptref(M1); +//// debug +//{ double d = giB(1).Coor().Norme(); +// // if (d <= ConstMath::trespetit) +// if (d <= ConstMath::petit) // *****pour test +// { cout << "\n*** debug FrontSegQuad::AutreTangentRef( : la norme du vecteur est trop petite !"; +// cout <<"\nnorme = " << d << " newtra= " << giB(1).Coor() ; +// } +//} +//// fin debug + droite.Change_vect(giB(1).Coor()); // retour dr = droite; @@ -230,21 +297,38 @@ Tableau * FrontSegQuad::DernierTangent(Droite& dr, Plan& , int& ind // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = segment.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = segment.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),phi,giB,giH); + phi = segment.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi,giB,giH); } else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = segment.Phi(theta_repere); // fonctions d'interpolation au point - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),phi,giB,giH); + phi = segment.Phi_point(theta_repere); // fonctions d'interpolation au point + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi,giB,giH); }; - +// //---debug +// if ((!isfinite(theta(1))) || (isnan(theta(1)))) +// {cout << "\n*** debug FrontSegQuad::DernierTangent( : theta(1) infini !"; +// }; +// if ((!isfinite(theta_repere(1))) || (isnan(theta_repere(1)))) +// {cout << "\n*** debug FrontSegQuad::DernierTangent( : theta_repere(1) infini !"; +// }; +// //---fin debug + // calcul du point correspondant au theta_i Coordonnee delta_theta = theta - theta_repere; Coordonnee M1 = met->PointM_tdt(tabNoeud,phi) + delta_theta(1) * giB.Coordo(1); droite.Change_ptref(M1); +// // debug +// { double d = giB(1).Coor().Norme(); +// // if (d <= ConstMath::trespetit) +// if (d <= ConstMath::petit) // *****pour test +// { cout << "\n*** debug FrontSegQuad::DernierTangentRef( : la norme du vecteur est trop petite !"; +// cout <<"\nnorme = " << d << " newtra= " << giB(1).Coor() ; +// } +// } +// // fin debug droite.Change_vect(giB(1).Coor()); // prépa retour dr = droite; @@ -253,7 +337,7 @@ Tableau * FrontSegQuad::DernierTangent(Droite& dr, Plan& , int& ind Tableau * pt_varT = NULL; // par défaut if (avec_var) { // calcul de la variation des vecteurs de base: donc ici d'un seul vecteur - const Tableau & d_giB_tdt = met->d_BaseNat_tdt(tabNoeud,segment.Dphi(theta_repere),phi); + const Tableau & d_giB_tdt = met->d_BaseNat_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi); // calcul de la variation de la tangente normée Util::VarUnVect_coorBN( giB(1),d_giB_tdt,giB(1).Coor().Norme(),d_T); if (ParaGlob::Dimension() == 2) @@ -274,7 +358,7 @@ Tableau * FrontSegQuad::DernierTangent(Droite& dr, Plan& , int& ind // calcul les fonctions d'interpolation au dernier point de projection sauvegarde const Vecteur& FrontSegQuad::Phi() - { return segment.Phi(theta);}; + { return segment.Phi_point(theta);}; // test si la position d'un point est du bon cote ( c-a-d hors matiere) ou non // si le point est sur la surface, ramène false @@ -291,9 +375,9 @@ bool FrontSegQuad::BonCote_t( const Coordonnee& a,double& r) const // cas ou o { // def des infos de la droite tangente a t en theta // devrait également marcher pour l'axisymétrie en 3D int dim = ParaGlob::Dimension(); - phi = segment.Phi(theta_repere); // fonctions d'interpolation au point + phi = segment.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,segment.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,segment.Dphi_point(theta_repere),phi,giB,giH); // def des infos du plan tangent a t en theta Coordonnee delta_theta = theta - theta_repere; Coordonnee M1 = met->PointM_t(tabNoeud,phi) + delta_theta(1) * giB.Coordo(1); diff --git a/Elements/Geometrie/Frontiere/Ligne/FrontSegQuad.h b/Elements/Geometrie/Frontiere/Ligne/FrontSegQuad.h index 3436160..3a60bb0 100644 --- a/Elements/Geometrie/Frontiere/Ligne/FrontSegQuad.h +++ b/Elements/Geometrie/Frontiere/Ligne/FrontSegQuad.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -82,7 +82,7 @@ class FrontSegQuad : public ElFrontiere // retourne le type de l'element frontiere string TypeFrontiere() const ; // retourne l'élément géométrique attaché à l'élément frontière - ElemGeomC0 const & ElementGeometrique() const {return segment;}; + ElemGeomC0 & ElementGeometrique() const {return segment;}; // creation d'un nouvelle element frontiere du type FrontSegQuad ElFrontiere * NevezElemFront() const ; // creation d'un nouvelle element frontiere du type FrontSegQuad diff --git a/Elements/Geometrie/Frontiere/Point/FrontPointF.cc b/Elements/Geometrie/Frontiere/Point/FrontPointF.cc index 5ea5b5b..f34ce2d 100644 --- a/Elements/Geometrie/Frontiere/Point/FrontPointF.cc +++ b/Elements/Geometrie/Frontiere/Point/FrontPointF.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Geometrie/Frontiere/Point/FrontPointF.h b/Elements/Geometrie/Frontiere/Point/FrontPointF.h index d7358b5..dc57074 100644 --- a/Elements/Geometrie/Frontiere/Point/FrontPointF.h +++ b/Elements/Geometrie/Frontiere/Point/FrontPointF.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -79,7 +79,7 @@ class FrontPointF : public ElFrontiere // retourne le type de l'element frontiere string TypeFrontiere() const ; // retourne l'élément géométrique attaché à l'élément frontière - ElemGeomC0 const & ElementGeometrique() const { return point;}; + ElemGeomC0 & ElementGeometrique() const { return point;}; // creation d'un nouvelle element frontiere du type FrontPointF ElFrontiere * NevezElemFront() const ; // creation d'un nouvelle element frontiere du type FrontPointF diff --git a/Elements/Geometrie/Frontiere/Surface/FrontQuadCC.cc b/Elements/Geometrie/Frontiere/Surface/FrontQuadCC.cc index 362425c..8d294c4 100644 --- a/Elements/Geometrie/Frontiere/Surface/FrontQuadCC.cc +++ b/Elements/Geometrie/Frontiere/Surface/FrontQuadCC.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -115,11 +115,11 @@ Coordonnee FrontQuadCC::Ref() Coordonnee A0(0.,0.); // appel de la routine de metrique, 16 noeuds if (tabNoeud(1)->ExisteCoord2()) - {ref = met->PointM_tdt(tabNoeud,quadrangle.Phi(A0));} + {ref = met->PointM_tdt(tabNoeud,quadrangle.Phi_point(A0));} else if (tabNoeud(1)->ExisteCoord1()) - {ref = met->PointM_t(tabNoeud,quadrangle.Phi(A0));} + {ref = met->PointM_t(tabNoeud,quadrangle.Phi_point(A0));} else - {ref = met->PointM_0(tabNoeud,quadrangle.Phi(A0));}; + {ref = met->PointM_0(tabNoeud,quadrangle.Phi_point(A0));}; return ref; }; // ramene un plan tangent au point de reference @@ -131,7 +131,7 @@ void FrontQuadCC::TangentRef(Droite& , Plan& pl, int& indic) Coordonnee A0(0.,0.); // calcul des bases et du plan tangent et de giH BaseB giB; - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(A0),quadrangle.Phi(A0),giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(A0),quadrangle.Phi_point(A0),giB,giH); plan.Change_ptref(Ref()); Coordonnee Normal = Util::ProdVec_coorBN(giB(1),giB(2)); plan.Change_normal(Normal); @@ -145,7 +145,7 @@ void FrontQuadCC::TangentRef(Droite& , Plan& pl, int& indic) // ces infos sont stocke et sauvegardees dans l'element void FrontQuadCC::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& , Plan& pl, int& indic) { // récup des bases au point courant projeté - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),quadrangle.Phi(theta_repere),giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),quadrangle.Phi_point(theta_repere),giB,giH); // on incremente la coordonnee curviligne Coordonnee M1M = M - plan.PointPlan(); theta(1) += M1M * giH.Coordo(1); @@ -157,8 +157,8 @@ void FrontQuadCC::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& , Plan& pl // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = quadrangle.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); // on recalcule les coodonnées locales theta(1) += M1M * giH.Coordo(1); theta(2) += M1M * giH.Coordo(2); @@ -166,8 +166,8 @@ void FrontQuadCC::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& , Plan& pl else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant @@ -196,15 +196,15 @@ void FrontQuadCC::AutreTangent(Droite& , Plan& pl, int& indic) // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = quadrangle.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); } else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant Coordonnee delta_theta = theta - theta_repere; @@ -236,15 +236,15 @@ Tableau * FrontQuadCC::DernierTangent(Droite& , Plan& pl, int& indi // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = quadrangle.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); } else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant aux coordonnees theta Coordonnee delta_theta = theta - theta_repere; @@ -259,7 +259,7 @@ Tableau * FrontQuadCC::DernierTangent(Droite& , Plan& pl, int& indi Tableau * pt_varN = NULL; // par défaut if (avec_var) { // calcul de la variation des vecteurs de base - const Tableau & d_giB_tdt = met->d_BaseNat_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi); + const Tableau & d_giB_tdt = met->d_BaseNat_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi); // calcul de la variation de la normale // 1) variation du produit vectoriel qui a servi pour le calcul de la normale Util::VarProdVect_coorBN( giB(1),giB(2),d_giB_tdt,D_pasnormale); @@ -273,7 +273,7 @@ Tableau * FrontQuadCC::DernierTangent(Droite& , Plan& pl, int& indi // calcul les fonctions d'interpolation au dernier point de projection sauvegarde const Vecteur& FrontQuadCC::Phi() - { return quadrangle.Phi(theta);}; + { return quadrangle.Phi_point(theta);}; // test si la position d'un point est du bon cote ( c-a-d hors matiere) ou non // si le point est sur la surface, ramène false @@ -287,9 +287,9 @@ const Vecteur& FrontQuadCC::Phi() // retour de r = distance du point à la surface, ligne bool FrontQuadCC::BonCote_t( const Coordonnee& a,double& r) const // cas ou on utilise la frontiere a t { // def des infos du plan tangent a t en theta - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); // def des infos du plan tangent a t en theta Coordonnee delta_theta = theta - theta_repere; Coordonnee M1 = met->PointM_t(tabNoeud,phi) + delta_theta(1) * giB.Coordo(1) + delta_theta(2) * giB.Coordo(2); diff --git a/Elements/Geometrie/Frontiere/Surface/FrontQuadCC.h b/Elements/Geometrie/Frontiere/Surface/FrontQuadCC.h index dc7a62c..be7c011 100644 --- a/Elements/Geometrie/Frontiere/Surface/FrontQuadCC.h +++ b/Elements/Geometrie/Frontiere/Surface/FrontQuadCC.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -79,7 +79,7 @@ class FrontQuadCC : public ElFrontiere // retourne le type de l'element frontiere string TypeFrontiere() const ; // retourne l'élément géométrique attaché à l'élément frontière - ElemGeomC0 const & ElementGeometrique() const { return quadrangle;}; + ElemGeomC0 & ElementGeometrique() const { return quadrangle;}; // creation d'un nouvelle element frontiere du type FrontQuadCC ElFrontiere * NevezElemFront() const ; // creation d'un nouvelle element frontiere du type FrontQuadCC diff --git a/Elements/Geometrie/Frontiere/Surface/FrontQuadLine.cc b/Elements/Geometrie/Frontiere/Surface/FrontQuadLine.cc index 34ffb65..8675513 100644 --- a/Elements/Geometrie/Frontiere/Surface/FrontQuadLine.cc +++ b/Elements/Geometrie/Frontiere/Surface/FrontQuadLine.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -115,11 +115,11 @@ Coordonnee FrontQuadLine::Ref() const Coordonnee A0(0.,0.); // appel de la routine de metrique, 4 noeuds if (tabNoeud(1)->ExisteCoord2()) - {ref = met->PointM_tdt(tabNoeud,quadrangle.Phi(A0));} + {ref = met->PointM_tdt(tabNoeud,quadrangle.Phi_point(A0));} else if (tabNoeud(1)->ExisteCoord1()) - {ref = met->PointM_t(tabNoeud,quadrangle.Phi(A0));} + {ref = met->PointM_t(tabNoeud,quadrangle.Phi_point(A0));} else - {ref = met->PointM_0(tabNoeud,quadrangle.Phi(A0));}; + {ref = met->PointM_0(tabNoeud,quadrangle.Phi_point(A0));}; return ref; }; // ramene un plan tangent au point de reference @@ -131,7 +131,7 @@ void FrontQuadLine::TangentRef(Droite& , Plan& pl, int& indic) Coordonnee A0(0.,0.); // calcul des bases et du plan tangent et de giH BaseB giB; - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(A0),quadrangle.Phi(A0),giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(A0),quadrangle.Phi_point(A0),giB,giH); plan.Change_ptref(Ref()); Coordonnee Normal = Util::ProdVec_coorBN(giB(1),giB(2)); plan.Change_normal(Normal); @@ -145,7 +145,7 @@ void FrontQuadLine::TangentRef(Droite& , Plan& pl, int& indic) // ces infos sont stocke et sauvegardees dans l'element void FrontQuadLine::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& , Plan& pl, int& indic) { // récup des bases au point courant projeté - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),quadrangle.Phi(theta_repere),giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),quadrangle.Phi_point(theta_repere),giB,giH); // on incremente la coordonnee curviligne Coordonnee M1M = M - plan.PointPlan(); theta(1) += M1M * giH.Coordo(1); @@ -157,8 +157,8 @@ void FrontQuadLine::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& , Plan& // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = quadrangle.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); // on recalcule les coodonnées locales theta(1) += M1M * giH.Coordo(1); theta(2) += M1M * giH.Coordo(2); @@ -166,8 +166,8 @@ void FrontQuadLine::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& , Plan& else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant au theta_i @@ -196,15 +196,15 @@ void FrontQuadLine::AutreTangent(Droite& , Plan& pl, int& indic) // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = quadrangle.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); } else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant Coordonnee delta_theta = theta - theta_repere; @@ -238,15 +238,15 @@ Tableau * FrontQuadLine::DernierTangent(Droite& , Plan& pl, int& in // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = quadrangle.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); } else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant aux coordonnees theta Coordonnee delta_theta = theta - theta_repere; @@ -264,7 +264,7 @@ Tableau * FrontQuadLine::DernierTangent(Droite& , Plan& pl, int& in Tableau * pt_varN = NULL; // par défaut if (avec_var) { // calcul de la variation des vecteurs de base - const Tableau & d_giB_tdt = met->d_BaseNat_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi); + const Tableau & d_giB_tdt = met->d_BaseNat_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi); // calcul de la variation de la normale // 1) variation du produit vectoriel qui a servi pour le calcul de la normale Util::VarProdVect_coorBN( giB(1),giB(2),d_giB_tdt,D_pasnormale); @@ -278,7 +278,7 @@ Tableau * FrontQuadLine::DernierTangent(Droite& , Plan& pl, int& in // calcul les fonctions d'interpolation au dernier point de projection sauvegarde const Vecteur& FrontQuadLine::Phi() - { return quadrangle.Phi(theta);}; + { return quadrangle.Phi_point(theta);}; // test si la position d'un point est du bon cote ( c-a-d hors matiere) ou non // si le point est sur la surface, ramène false @@ -292,9 +292,9 @@ const Vecteur& FrontQuadLine::Phi() // retour de r = distance du point à la surface, ligne bool FrontQuadLine::BonCote_t( const Coordonnee& a,double& r) const // cas ou on utilise la frontiere a t { // def des infos du plan tangent a t en theta - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); // def des infos du plan tangent a t en theta Coordonnee delta_theta = theta - theta_repere; Coordonnee M1 = met->PointM_t(tabNoeud,phi) + delta_theta(1) * giB.Coordo(1) + delta_theta(2) * giB.Coordo(2); diff --git a/Elements/Geometrie/Frontiere/Surface/FrontQuadLine.h b/Elements/Geometrie/Frontiere/Surface/FrontQuadLine.h index 4039ba1..d6ee149 100644 --- a/Elements/Geometrie/Frontiere/Surface/FrontQuadLine.h +++ b/Elements/Geometrie/Frontiere/Surface/FrontQuadLine.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -79,7 +79,7 @@ class FrontQuadLine : public ElFrontiere // retourne le type de l'element frontiere string TypeFrontiere() const ; // retourne l'élément géométrique attaché à l'élément frontière - ElemGeomC0 const & ElementGeometrique() const { return quadrangle;}; + ElemGeomC0 & ElementGeometrique() const { return quadrangle;}; // creation d'un nouvelle element frontiere du type FrontQuadLine ElFrontiere * NevezElemFront() const ; // creation d'un nouvelle element frontiere du type FrontQuadLine diff --git a/Elements/Geometrie/Frontiere/Surface/FrontQuadQC.cc b/Elements/Geometrie/Frontiere/Surface/FrontQuadQC.cc index 2dbbe33..451e9f6 100644 --- a/Elements/Geometrie/Frontiere/Surface/FrontQuadQC.cc +++ b/Elements/Geometrie/Frontiere/Surface/FrontQuadQC.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -116,11 +116,11 @@ Coordonnee FrontQuadQC::Ref() Coordonnee A0(0.,0.); // appel de la routine de metrique, 9 noeuds if (tabNoeud(1)->ExisteCoord2()) - {ref = met->PointM_tdt(tabNoeud,quadrangle.Phi(A0));} + {ref = met->PointM_tdt(tabNoeud,quadrangle.Phi_point(A0));} else if (tabNoeud(1)->ExisteCoord1()) - {ref = met->PointM_t(tabNoeud,quadrangle.Phi(A0));} + {ref = met->PointM_t(tabNoeud,quadrangle.Phi_point(A0));} else - {ref = met->PointM_0(tabNoeud,quadrangle.Phi(A0));}; + {ref = met->PointM_0(tabNoeud,quadrangle.Phi_point(A0));}; return ref; }; @@ -132,7 +132,7 @@ void FrontQuadQC::TangentRef(Droite& , Plan& pl, int& indic) // le point de ref en coordonnees locale Coordonnee A0(0.,0.); // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(A0),quadrangle.Phi(A0),giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(A0),quadrangle.Phi_point(A0),giB,giH); plan.Change_ptref(Ref()); Coordonnee Normal = Util::ProdVec_coorBN(giB(1),giB(2)); plan.Change_normal(Normal); @@ -147,7 +147,7 @@ void FrontQuadQC::TangentRef(Droite& , Plan& pl, int& indic) // ces infos sont stocke et sauvegardees dans l'element void FrontQuadQC::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& , Plan& pl, int& indic) { // récup des bases au point courant projeté - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),quadrangle.Phi(theta_repere),giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),quadrangle.Phi_point(theta_repere),giB,giH); // on incremente la coordonnee curviligne Coordonnee M1M = M - plan.PointPlan(); theta(1) += M1M * giH.Coordo(1); @@ -159,8 +159,8 @@ void FrontQuadQC::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& , Plan& pl // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = quadrangle.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); // on recalcule les coodonnées locales theta(1) += M1M * giH.Coordo(1); theta(2) += M1M * giH.Coordo(2); @@ -168,8 +168,8 @@ void FrontQuadQC::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& , Plan& pl else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant au theta_i @@ -199,15 +199,15 @@ void FrontQuadQC::AutreTangent(Droite& , Plan& pl, int& indic) // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = quadrangle.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); } else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant Coordonnee delta_theta = theta - theta_repere; @@ -239,15 +239,15 @@ Tableau * FrontQuadQC::DernierTangent(Droite& , Plan& pl, int& indi // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = quadrangle.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); } else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant aux coordonnees theta Coordonnee delta_theta = theta - theta_repere; @@ -262,7 +262,7 @@ Tableau * FrontQuadQC::DernierTangent(Droite& , Plan& pl, int& indi Tableau * pt_varN = NULL; // par défaut if (avec_var) { // calcul de la variation des vecteurs de base - const Tableau & d_giB_tdt = met->d_BaseNat_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi); + const Tableau & d_giB_tdt = met->d_BaseNat_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi); // calcul de la variation de la normale // 1) variation du produit vectoriel qui a servi pour le calcul de la normale Util::VarProdVect_coorBN( giB(1),giB(2),d_giB_tdt,D_pasnormale); @@ -276,7 +276,7 @@ Tableau * FrontQuadQC::DernierTangent(Droite& , Plan& pl, int& indi // calcul les fonctions d'interpolation au dernier point de projection sauvegarde const Vecteur& FrontQuadQC::Phi() - { return quadrangle.Phi(theta);}; + { return quadrangle.Phi_point(theta);}; // test si la position d'un point est du bon cote ( c-a-d hors matiere) ou non // si le point est sur la surface, ramène false @@ -290,9 +290,9 @@ const Vecteur& FrontQuadQC::Phi() // retour de r = distance du point à la surface, ligne bool FrontQuadQC::BonCote_t( const Coordonnee& a,double& r) const // cas ou on utilise la frontiere a t { // def des infos du plan tangent a t en theta - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); // def des infos du plan tangent a t en theta Coordonnee delta_theta = theta - theta_repere; Coordonnee M1 = met->PointM_t(tabNoeud,phi) + delta_theta(1) * giB.Coordo(1) + delta_theta(2) * giB.Coordo(2); diff --git a/Elements/Geometrie/Frontiere/Surface/FrontQuadQC.h b/Elements/Geometrie/Frontiere/Surface/FrontQuadQC.h index 5b0d84c..3b8b405 100644 --- a/Elements/Geometrie/Frontiere/Surface/FrontQuadQC.h +++ b/Elements/Geometrie/Frontiere/Surface/FrontQuadQC.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -79,7 +79,7 @@ class FrontQuadQC : public ElFrontiere // retourne le type de l'element frontiere string TypeFrontiere() const ; // retourne l'élément géométrique attaché à l'élément frontière - ElemGeomC0 const & ElementGeometrique() const { return quadrangle;}; + ElemGeomC0 & ElementGeometrique() const { return quadrangle;}; // creation d'un nouvelle element frontiere du type FrontQuadQC ElFrontiere * NevezElemFront() const ; // creation d'un nouvelle element frontiere du type FrontQuadQC diff --git a/Elements/Geometrie/Frontiere/Surface/FrontQuadQuad.cc b/Elements/Geometrie/Frontiere/Surface/FrontQuadQuad.cc index 6fdacf9..d3f6c12 100644 --- a/Elements/Geometrie/Frontiere/Surface/FrontQuadQuad.cc +++ b/Elements/Geometrie/Frontiere/Surface/FrontQuadQuad.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -115,11 +115,11 @@ Coordonnee FrontQuadQuad::Ref() Coordonnee A0(0.,0.); // appel de la routine de metrique, 8 noeuds if (tabNoeud(1)->ExisteCoord2()) - {ref = met->PointM_tdt(tabNoeud,quadrangle.Phi(A0));} + {ref = met->PointM_tdt(tabNoeud,quadrangle.Phi_point(A0));} else if (tabNoeud(1)->ExisteCoord1()) - {ref = met->PointM_t(tabNoeud,quadrangle.Phi(A0));} + {ref = met->PointM_t(tabNoeud,quadrangle.Phi_point(A0));} else - {ref = met->PointM_0(tabNoeud,quadrangle.Phi(A0));}; + {ref = met->PointM_0(tabNoeud,quadrangle.Phi_point(A0));}; return ref; }; // ramene un plan tangent au point de reference @@ -130,7 +130,7 @@ void FrontQuadQuad::TangentRef(Droite& , Plan& pl, int& indic) // le point de ref en coordonnees locale Coordonnee A0(0.,0.); BaseB giB; - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(A0),quadrangle.Phi(A0),giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(A0),quadrangle.Phi_point(A0),giB,giH); plan.Change_ptref(Ref()); Coordonnee Normal = Util::ProdVec_coorBN(giB(1),giB(2)); plan.Change_normal(Normal); @@ -144,7 +144,7 @@ void FrontQuadQuad::TangentRef(Droite& , Plan& pl, int& indic) // ces infos sont stocke et sauvegardees dans l'element void FrontQuadQuad::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& , Plan& pl, int& indic) { // récup des bases au point courant projeté - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),quadrangle.Phi(theta_repere),giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),quadrangle.Phi_point(theta_repere),giB,giH); // on incremente la coordonnee curviligne Coordonnee M1M = M - plan.PointPlan(); theta(1) += M1M * giH.Coordo(1); @@ -156,8 +156,8 @@ void FrontQuadQuad::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& , Plan& // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = quadrangle.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); // on recalcule les coodonnées locales theta(1) += M1M * giH.Coordo(1); theta(2) += M1M * giH.Coordo(2); @@ -165,8 +165,8 @@ void FrontQuadQuad::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& , Plan& else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant au theta_i @@ -195,15 +195,15 @@ void FrontQuadQuad::AutreTangent(Droite& , Plan& pl, int& indic) // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = quadrangle.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); } else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant Coordonnee delta_theta = theta - theta_repere; @@ -234,15 +234,15 @@ Tableau * FrontQuadQuad::DernierTangent(Droite& , Plan& pl, int& in // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = quadrangle.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); } else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant aux coordonnees theta Coordonnee delta_theta = theta - theta_repere; @@ -257,7 +257,7 @@ Tableau * FrontQuadQuad::DernierTangent(Droite& , Plan& pl, int& in Tableau * pt_varN = NULL; // par défaut if (avec_var) { // calcul de la variation des vecteurs de base - const Tableau & d_giB_tdt = met->d_BaseNat_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi); + const Tableau & d_giB_tdt = met->d_BaseNat_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi); // calcul de la variation de la normale // 1) variation du produit vectoriel qui a servi pour le calcul de la normale Util::VarProdVect_coorBN( giB(1),giB(2),d_giB_tdt,D_pasnormale); @@ -271,7 +271,7 @@ Tableau * FrontQuadQuad::DernierTangent(Droite& , Plan& pl, int& in // calcul les fonctions d'interpolation au dernier point de projection sauvegarde const Vecteur& FrontQuadQuad::Phi() - { return quadrangle.Phi(theta);}; + { return quadrangle.Phi_point(theta);}; // test si la position d'un point est du bon cote ( c-a-d hors matiere) ou non // si le point est sur la surface, ramène false @@ -285,9 +285,9 @@ const Vecteur& FrontQuadQuad::Phi() // retour de r = distance du point à la surface, ligne bool FrontQuadQuad::BonCote_t( const Coordonnee& a,double& r) const // cas ou on utilise la frontiere a t { // def des infos du plan tangent a t en theta - phi = quadrangle.Phi(theta_repere); // fonctions d'interpolation au point + phi = quadrangle.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,quadrangle.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,quadrangle.Dphi_point(theta_repere),phi,giB,giH); // def des infos du plan tangent a t en theta Coordonnee delta_theta = theta - theta_repere; Coordonnee M1 = met->PointM_t(tabNoeud,phi) + delta_theta(1) * giB.Coordo(1) + delta_theta(2) * giB.Coordo(2); diff --git a/Elements/Geometrie/Frontiere/Surface/FrontQuadQuad.h b/Elements/Geometrie/Frontiere/Surface/FrontQuadQuad.h index 031fb84..893f031 100644 --- a/Elements/Geometrie/Frontiere/Surface/FrontQuadQuad.h +++ b/Elements/Geometrie/Frontiere/Surface/FrontQuadQuad.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -79,7 +79,7 @@ class FrontQuadQuad : public ElFrontiere // retourne le type de l'element frontiere string TypeFrontiere() const ; // retourne l'élément géométrique attaché à l'élément frontière - ElemGeomC0 const & ElementGeometrique() const { return quadrangle;}; + ElemGeomC0 & ElementGeometrique() const { return quadrangle;}; // creation d'un nouvelle element frontiere du type FrontQuadQuad ElFrontiere * NevezElemFront() const ; // creation d'un nouvelle element frontiere du type FrontQuadQuad diff --git a/Elements/Geometrie/Frontiere/Surface/FrontTriaLine.cc b/Elements/Geometrie/Frontiere/Surface/FrontTriaLine.cc index 49afe67..70f6494 100644 --- a/Elements/Geometrie/Frontiere/Surface/FrontTriaLine.cc +++ b/Elements/Geometrie/Frontiere/Surface/FrontTriaLine.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -113,11 +113,11 @@ Coordonnee FrontTriaLine::Ref() Coordonnee A0(0.,0.); // appel de la routine de metrique, 3 noeuds if (tabNoeud(1)->ExisteCoord2()) - {ref = met->PointM_tdt(tabNoeud,triangle.Phi(A0));} + {ref = met->PointM_tdt(tabNoeud,triangle.Phi_point(A0));} else if (tabNoeud(1)->ExisteCoord1()) - {ref = met->PointM_t(tabNoeud,triangle.Phi(A0));} + {ref = met->PointM_t(tabNoeud,triangle.Phi_point(A0));} else - {ref = met->PointM_0(tabNoeud,triangle.Phi(A0));}; + {ref = met->PointM_0(tabNoeud,triangle.Phi_point(A0));}; return ref; }; // ramene un plan tangent au point de reference @@ -128,7 +128,7 @@ void FrontTriaLine::TangentRef(Droite& , Plan& pl, int& indic) // le point de ref en coordonnees locale Coordonnee A0(0.,0.); BaseB giB; - met->BaseND_tdt(tabNoeud,triangle.Dphi(A0),triangle.Phi(A0),giB,giH); + met->BaseND_tdt(tabNoeud,triangle.Dphi_point(A0),triangle.Phi_point(A0),giB,giH); plan.Change_ptref(Ref()); Coordonnee Normal = Util::ProdVec_coorBN(giB(1),giB(2)); plan.Change_normal(Normal); @@ -142,7 +142,7 @@ void FrontTriaLine::TangentRef(Droite& , Plan& pl, int& indic) // ces infos sont stocke et sauvegardees dans l'element void FrontTriaLine::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& , Plan& pl, int& indic) { // récup des bases au point courant projeté - met->BaseND_tdt(tabNoeud,triangle.Dphi(theta_repere),triangle.Phi(theta_repere),giB,giH); + met->BaseND_tdt(tabNoeud,triangle.Dphi_point(theta_repere),triangle.Phi_point(theta_repere),giB,giH); // on incremente la coordonnee curviligne Coordonnee M1M = M - plan.PointPlan(); theta(1) += M1M * giH.Coordo(1); @@ -154,8 +154,8 @@ void FrontTriaLine::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& , Plan& // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = triangle.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = triangle.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,triangle.Dphi(theta_repere),phi,giB,giH); + phi = triangle.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,triangle.Dphi_point(theta_repere),phi,giB,giH); // on recalcule les coodonnées locales theta(1) += M1M * giH.Coordo(1); theta(2) += M1M * giH.Coordo(2); @@ -163,8 +163,8 @@ void FrontTriaLine::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& , Plan& else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = triangle.Phi(theta_repere); // fonctions d'interpolation au point - met->BaseND_tdt(tabNoeud,triangle.Dphi(theta_repere),phi,giB,giH); + phi = triangle.Phi_point(theta_repere); // fonctions d'interpolation au point + met->BaseND_tdt(tabNoeud,triangle.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant au theta_i @@ -193,15 +193,15 @@ void FrontTriaLine::AutreTangent(Droite& , Plan& pl, int& indic) // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = triangle.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = triangle.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,triangle.Dphi(theta_repere),phi,giB,giH); + phi = triangle.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,triangle.Dphi_point(theta_repere),phi,giB,giH); } else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = triangle.Phi(theta_repere); // fonctions d'interpolation au point + phi = triangle.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,triangle.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,triangle.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant Coordonnee delta_theta = theta - theta_repere; @@ -235,15 +235,15 @@ Tableau * FrontTriaLine::DernierTangent(Droite& , Plan& pl, int& in // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = triangle.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = triangle.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,triangle.Dphi(theta_repere),phi,giB,giH); + phi = triangle.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,triangle.Dphi_point(theta_repere),phi,giB,giH); } else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = triangle.Phi(theta_repere); // fonctions d'interpolation au point + phi = triangle.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,triangle.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,triangle.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant aux coordonnees theta Coordonnee delta_theta = theta - theta_repere; @@ -258,7 +258,7 @@ Tableau * FrontTriaLine::DernierTangent(Droite& , Plan& pl, int& in Tableau * pt_varN = NULL; // par défaut if (avec_var) {// calcul de la variation des vecteurs de base - const Tableau & d_giB_tdt = met->d_BaseNat_tdt(tabNoeud,triangle.Dphi(theta_repere),phi); + const Tableau & d_giB_tdt = met->d_BaseNat_tdt(tabNoeud,triangle.Dphi_point(theta_repere),phi); // calcul de la variation de la normale // 1) variation du produit vectoriel qui a servi pour le calcul de la normale Util::VarProdVect_coorBN( giB(1),giB(2),d_giB_tdt,D_pasnormale); @@ -272,7 +272,7 @@ Tableau * FrontTriaLine::DernierTangent(Droite& , Plan& pl, int& in // calcul les fonctions d'interpolation au dernier point de projection sauvegarde const Vecteur& FrontTriaLine::Phi() - { return triangle.Phi(theta);}; + { return triangle.Phi_point(theta);}; // test si la position d'un point est du bon cote ( c-a-d hors matiere) ou non // si le point est sur la surface, ramène false @@ -286,9 +286,9 @@ const Vecteur& FrontTriaLine::Phi() // retour de r = distance du point à la surface, ligne bool FrontTriaLine::BonCote_t( const Coordonnee& a,double& r) const // cas ou on utilise la frontiere a t { // def des infos du plan tangent a t en theta - phi = triangle.Phi(theta_repere); // fonctions d'interpolation au point + phi = triangle.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,triangle.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,triangle.Dphi_point(theta_repere),phi,giB,giH); // def des infos du plan tangent a t en theta Coordonnee delta_theta = theta - theta_repere; Coordonnee M1 = met->PointM_t(tabNoeud,phi) + delta_theta(1) * giB.Coordo(1) + delta_theta(2) * giB.Coordo(2); diff --git a/Elements/Geometrie/Frontiere/Surface/FrontTriaLine.h b/Elements/Geometrie/Frontiere/Surface/FrontTriaLine.h index 3d22547..25b0430 100644 --- a/Elements/Geometrie/Frontiere/Surface/FrontTriaLine.h +++ b/Elements/Geometrie/Frontiere/Surface/FrontTriaLine.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -78,7 +78,7 @@ class FrontTriaLine : public ElFrontiere // retourne le type de l'element frontiere string TypeFrontiere() const ; // retourne l'élément géométrique attaché à l'élément frontière - ElemGeomC0 const & ElementGeometrique() const { return triangle;}; + ElemGeomC0 & ElementGeometrique() const { return triangle;}; // creation d'un nouvelle element frontiere du type FrontTriaLine ElFrontiere * NevezElemFront() const ; // creation d'un nouvelle element frontiere du type FrontTriaLine diff --git a/Elements/Geometrie/Frontiere/Surface/FrontTriaQuad.cc b/Elements/Geometrie/Frontiere/Surface/FrontTriaQuad.cc index 4009aa6..d3666a0 100644 --- a/Elements/Geometrie/Frontiere/Surface/FrontTriaQuad.cc +++ b/Elements/Geometrie/Frontiere/Surface/FrontTriaQuad.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -116,11 +116,11 @@ Coordonnee FrontTriaQuad::Ref() Coordonnee A0(0.,0.); // appel de la routine de metrique, 6 noeuds if (tabNoeud(1)->ExisteCoord2()) - {ref = met->PointM_tdt(tabNoeud,triangle.Phi(A0));} + {ref = met->PointM_tdt(tabNoeud,triangle.Phi_point(A0));} else if (tabNoeud(1)->ExisteCoord1()) - {ref = met->PointM_t(tabNoeud,triangle.Phi(A0));} + {ref = met->PointM_t(tabNoeud,triangle.Phi_point(A0));} else - {ref = met->PointM_0(tabNoeud,triangle.Phi(A0));}; + {ref = met->PointM_0(tabNoeud,triangle.Phi_point(A0));}; return ref; }; @@ -132,7 +132,7 @@ void FrontTriaQuad::TangentRef(Droite& , Plan& pl, int& indic) // le point de ref en coordonnees locale Coordonnee A0(0.,0.); BaseB giB; - met->BaseND_tdt(tabNoeud,triangle.Dphi(A0),triangle.Phi(A0),giB,giH); + met->BaseND_tdt(tabNoeud,triangle.Dphi_point(A0),triangle.Phi_point(A0),giB,giH); plan.Change_ptref(Ref()); Coordonnee Normal = Util::ProdVec_coorBN(giB(1),giB(2)); plan.Change_normal(Normal); @@ -147,7 +147,7 @@ void FrontTriaQuad::TangentRef(Droite& , Plan& pl, int& indic) // ces infos sont stocke et sauvegardees dans l'element void FrontTriaQuad::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& , Plan& pl, int& indic) { // récup des bases au point courant projeté - met->BaseND_tdt(tabNoeud,triangle.Dphi(theta_repere),triangle.Phi(theta_repere),giB,giH); + met->BaseND_tdt(tabNoeud,triangle.Dphi_point(theta_repere),triangle.Phi_point(theta_repere),giB,giH); // on incremente la coordonnee curviligne Coordonnee M1M = M - plan.PointPlan(); theta(1) += M1M * giH.Coordo(1); @@ -159,8 +159,8 @@ void FrontTriaQuad::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& , Plan& // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = triangle.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = triangle.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,triangle.Dphi(theta_repere),phi,giB,giH); + phi = triangle.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,triangle.Dphi_point(theta_repere),phi,giB,giH); // on recalcule les coodonnées locales theta(1) += M1M * giH.Coordo(1); theta(2) += M1M * giH.Coordo(2); @@ -168,8 +168,8 @@ void FrontTriaQuad::Tangent(const Coordonnee& M,Coordonnee& M1, Droite& , Plan& else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = triangle.Phi(theta_repere); // fonctions d'interpolation au point - met->BaseND_tdt(tabNoeud,triangle.Dphi(theta_repere),phi,giB,giH); + phi = triangle.Phi_point(theta_repere); // fonctions d'interpolation au point + met->BaseND_tdt(tabNoeud,triangle.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant au theta_i @@ -199,15 +199,15 @@ void FrontTriaQuad::AutreTangent(Droite& , Plan& pl, int& indic) // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = triangle.Maxi_Coor_dans_directionGM(theta); // on recalcule le repère local - phi = triangle.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,triangle.Dphi(theta_repere),phi,giB,giH); + phi = triangle.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,triangle.Dphi_point(theta_repere),phi,giB,giH); } else // sinon le point est correcte, on peut y calculer le nouveau repère { theta_repere = theta; - phi = triangle.Phi(theta_repere); // fonctions d'interpolation au point + phi = triangle.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,triangle.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,triangle.Dphi_point(theta_repere),phi,giB,giH); }; // calcul du point correspondant Coordonnee delta_theta = theta - theta_repere; @@ -236,52 +236,48 @@ bool FrontTriaQuad::InSurf(const double& eps) const // ramène éventuellement la variation du vecteur normale pour un plan en 3D ou une ligne en 2D // dans le cas d'une ligne en 3D ramène la variation du vecteur tangent: si var_normale = true, sinon ramène NULL Tableau * FrontTriaQuad::DernierTangent(Droite& , Plan& pl, int& indic,bool avec_var) - { - if (!(triangle.Interieur(theta))) + { if (!(triangle.Interieur(theta))) // calcul d'un point extreme de l'élément dans le sens de M { theta_repere = triangle.Maxi_Coor_dans_directionGM(theta); - // on recalcule le repère local - phi = triangle.Phi(theta_repere); // fonctions d'interpolation au point limite dans l'élément - met->BaseND_tdt(tabNoeud,triangle.Dphi(theta_repere),phi,giB,giH); - } - else - // sinon le point est correcte, on peut y calculer le nouveau repère - { theta_repere = theta; - phi = triangle.Phi(theta_repere); // fonctions d'interpolation au point - // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,triangle.Dphi(theta_repere),phi,giB,giH); - }; + // on recalcule le repère local + phi = triangle.Phi_point(theta_repere); // fonctions d'interpolation au point limite dans l'élément + met->BaseND_tdt(tabNoeud,triangle.Dphi_point(theta_repere),phi,giB,giH); + } + else + // sinon le point est correcte, on peut y calculer le nouveau repère + { theta_repere = theta; + phi = triangle.Phi_point(theta_repere); // fonctions d'interpolation au point + // calcul des bases et du plan tangent et de giH + met->BaseND_tdt(tabNoeud,triangle.Dphi_point(theta_repere),phi,giB,giH); + }; // calcul du point correspondant aux coordonnees theta Coordonnee delta_theta = theta - theta_repere; - Coordonnee M1 = met->PointM_tdt(tabNoeud,phi) + delta_theta(1) * giB.Coordo(1) + delta_theta(2) * giB.Coordo(2); + Coordonnee M1 = met->PointM_tdt(tabNoeud,phi) + delta_theta(1) * giB.Coordo(1) + delta_theta(2) * giB.Coordo(2); plan.Change_ptref(M1); Coordonnee Normal = Util::ProdVec_coorBN(giB(1),giB(2)); plan.Change_normal(Normal); // retour pl = plan; indic = 2; - // prépa retour - pl = plan; - indic = 2; - // dans le cas où l'on veut la variation du vecteur normal - Tableau * pt_varN = NULL; // par défaut - if (avec_var) - { // calcul de la variation des vecteurs de base - const Tableau & d_giB_tdt = met->d_BaseNat_tdt(tabNoeud,triangle.Dphi(theta_repere),phi); + // dans le cas où l'on veut la variation du vecteur normal + Tableau * pt_varN = NULL; // par défaut + if (avec_var) + { // calcul de la variation des vecteurs de base + const Tableau & d_giB_tdt = met->d_BaseNat_tdt(tabNoeud,triangle.Dphi_point(theta_repere),phi); // calcul de la variation de la normale // 1) variation du produit vectoriel qui a servi pour le calcul de la normale Util::VarProdVect_coorBN( giB(1),giB(2),d_giB_tdt,D_pasnormale); // 2) de la normale Util::VarUnVect_coor(Normal,D_pasnormale,Normal.Norme(),d_N); - pt_varN = &d_N; - }; - // retour - return pt_varN; - }; + pt_varN = &d_N; + }; + // retour + return pt_varN; + }; // calcul les fonctions d'interpolation au dernier point de projection sauvegarde const Vecteur& FrontTriaQuad::Phi() - { return triangle.Phi(theta);}; + { return triangle.Phi_point(theta);}; // test si la position d'un point est du bon cote ( c-a-d hors matiere) ou non // si le point est sur la surface, ramène false @@ -295,9 +291,9 @@ const Vecteur& FrontTriaQuad::Phi() // retour de r = distance du point à la surface, ligne bool FrontTriaQuad::BonCote_t( const Coordonnee& a,double& r) const // cas ou on utilise la frontiere a t { // def des infos du plan tangent a t en theta - phi = triangle.Phi(theta_repere); // fonctions d'interpolation au point + phi = triangle.Phi_point(theta_repere); // fonctions d'interpolation au point // calcul des bases et du plan tangent et de giH - met->BaseND_tdt(tabNoeud,triangle.Dphi(theta_repere),phi,giB,giH); + met->BaseND_tdt(tabNoeud,triangle.Dphi_point(theta_repere),phi,giB,giH); // def des infos du plan tangent a t en theta Coordonnee delta_theta = theta - theta_repere; Coordonnee M1 = met->PointM_t(tabNoeud,phi) + delta_theta(1) * giB.Coordo(1) + delta_theta(2) * giB.Coordo(2); diff --git a/Elements/Geometrie/Frontiere/Surface/FrontTriaQuad.h b/Elements/Geometrie/Frontiere/Surface/FrontTriaQuad.h index 292855d..aa62bdd 100644 --- a/Elements/Geometrie/Frontiere/Surface/FrontTriaQuad.h +++ b/Elements/Geometrie/Frontiere/Surface/FrontTriaQuad.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -79,7 +79,7 @@ class FrontTriaQuad : public ElFrontiere // retourne le type de l'element frontiere string TypeFrontiere() const ; // retourne l'élément géométrique attaché à l'élément frontière - ElemGeomC0 const & ElementGeometrique() const { return triangle;}; + ElemGeomC0 & ElementGeometrique() const { return triangle;}; // creation d'un nouvelle element frontiere du type FrontTriaQuad ElFrontiere * NevezElemFront() const ; // creation d'un nouvelle element frontiere du type FrontTriaQuad diff --git a/Elements/Mecanique/Biellette/Biel_axi.cc b/Elements/Mecanique/Biellette/Biel_axi.cc index 5632a88..0c1613e 100755 --- a/Elements/Mecanique/Biellette/Biel_axi.cc +++ b/Elements/Mecanique/Biellette/Biel_axi.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -359,7 +359,7 @@ Coordonnee & Biel_axi::Point_physique(const Coordonnee& c_int,Coordonnee & co,En doCo->met_biellette.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCo->segment.Phi(c_int); + const Vecteur& phi = doCo->segment.Phi_point(c_int); // c) calcul du point switch (temps) { case TEMPS_0 : co = doCo->met_biellette.PointM_0(tab_noeud,phi); break; @@ -381,7 +381,7 @@ void Biel_axi::Point_physique(const Coordonnee& c_int,Tableau & t_c doCo->met_biellette.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCo->segment.Phi(c_int); + const Vecteur& phi = doCo->segment.Phi_point(c_int); // c) calcul des point switch (t_co.Taille()) { case 3 : t_co(3) = doCo->met_biellette.PointM_tdt(tab_noeud,phi); @@ -1082,10 +1082,10 @@ Vecteur Biel_axi::SM_charge_surfacique_E // retourne le second membre et la matrice de raideur correspondant Element::ResRaid Biel_axi::SMR_charge_surfacique_I (const Coordonnee& force,Fonction_nD* pt_fonct,int ,const ParaAlgoControle & pa) - { // initialisation du vecteur résidu et de la raideur - // normalement numface = 1 - ((*res_extS)(1))->Zero(); - ((*raid_extS)(1))->Zero(); + { // initialisation du vecteur résidu et de la raideur + // normalement numface = 1 + ((*res_extS)(1))->Zero(); + ((*raid_extS)(1))->Zero(); // on récupère ou on crée la frontière surfacique Frontiere_surfacique(1,true); // on pourrait utiliser la métrique des éléments de frontière @@ -1351,7 +1351,8 @@ Vecteur Biel_axi::SM_charge_lineique_E(const Coordonnee& force,Fonction_nD* pt_f { // initialisation du vecteur résidu ((*res_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf = Frontiere_lineique(1,true); + //ElFrontiere* elf = + Frontiere_lineique(1,true); Biel_axi::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique if (!atdt) @@ -1394,7 +1395,8 @@ Element::ResRaid Biel_axi::SMR_charge_lineique_I ((*res_extA)(1))->Zero(); ((*raid_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf =Frontiere_lineique(1,true); + //ElFrontiere* elf = + Frontiere_lineique(1,true); Biel_axi::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique @@ -1427,7 +1429,8 @@ Vecteur Biel_axi::SM_charge_lineique_Suiv_E(const Coordonnee& force,Fonction_nD* { // initialisation du vecteur résidu ((*res_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf = Frontiere_lineique(1,true); + //ElFrontiere* elf = + Frontiere_lineique(1,true); Biel_axi::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique if (!atdt) @@ -1470,7 +1473,8 @@ Element::ResRaid Biel_axi::SMR_charge_lineique_Suiv_I ((*res_extA)(1))->Zero(); ((*raid_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf = Frontiere_lineique(1,true); +// ElFrontiere* elf = + Frontiere_lineique(1,true); Biel_axi::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique @@ -1650,7 +1654,7 @@ const double& Biel_axi::CalEpaisseurMoyenne_et_vol_pti(bool atdt) const double& troisK = 3. * (*lesPtIntegMecaInterne)(i).ModuleCompressibilite_const(); troisK_moy += troisK; // cas des jacobiens - const double& jacobien_0 = *(tabSaveDefDon(i)->Meti_00().jacobien_); +// ? const double& jacobien_0 = *(tabSaveDefDon(i)->Meti_00().jacobien_); if (atdt) { const double& jacobien_ini = *(tabSaveDefDon(i)->Meti_t().jacobien_); jacobien_moy_ini += jacobien_ini; diff --git a/Elements/Mecanique/Biellette/Biel_axi.h b/Elements/Mecanique/Biellette/Biel_axi.h index 46a6a02..3f35a82 100755 --- a/Elements/Mecanique/Biellette/Biel_axi.h +++ b/Elements/Mecanique/Biellette/Biel_axi.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Biellette/Biel_axiQ.cc b/Elements/Mecanique/Biellette/Biel_axiQ.cc index 83acd92..2b954f5 100755 --- a/Elements/Mecanique/Biellette/Biel_axiQ.cc +++ b/Elements/Mecanique/Biellette/Biel_axiQ.cc @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -359,7 +359,7 @@ Coordonnee & Biel_axiQ::Point_physique(const Coordonnee& c_int,Coordonnee & co,E doCo->met_biellette.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCo->segment.Phi(c_int); + const Vecteur& phi = doCo->segment.Phi_point(c_int); // c) calcul du point switch (temps) { case TEMPS_0 : co = doCo->met_biellette.PointM_0(tab_noeud,phi); break; @@ -381,7 +381,7 @@ void Biel_axiQ::Point_physique(const Coordonnee& c_int,Tableau & t_ doCo->met_biellette.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCo->segment.Phi(c_int); + const Vecteur& phi = doCo->segment.Phi_point(c_int); // c) calcul des point switch (t_co.Taille()) { case 3 : t_co(3) = doCo->met_biellette.PointM_tdt(tab_noeud,phi); @@ -1348,7 +1348,7 @@ Vecteur Biel_axiQ::SM_charge_lineique_E(const Coordonnee& force,Fonction_nD* pt_ { // initialisation du vecteur résidu ((*res_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf = Frontiere_lineique(1,true); + Frontiere_lineique(1,true); Biel_axiQ::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique if (!atdt) @@ -1391,7 +1391,7 @@ Element::ResRaid Biel_axiQ::SMR_charge_lineique_I ((*res_extA)(1))->Zero(); ((*raid_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf =Frontiere_lineique(1,true); + Frontiere_lineique(1,true); Biel_axiQ::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique @@ -1424,7 +1424,7 @@ Vecteur Biel_axiQ::SM_charge_lineique_Suiv_E(const Coordonnee& force,Fonction_nD { // initialisation du vecteur résidu ((*res_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf = Frontiere_lineique(1,true); + Frontiere_lineique(1,true); Biel_axiQ::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique if (!atdt) @@ -1467,7 +1467,7 @@ Element::ResRaid Biel_axiQ::SMR_charge_lineique_Suiv_I ((*res_extA)(1))->Zero(); ((*raid_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf = Frontiere_lineique(1,true); + Frontiere_lineique(1,true); Biel_axiQ::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique @@ -1647,7 +1647,7 @@ const double& Biel_axiQ::CalEpaisseurMoyenne_et_vol_pti(bool atdt) const double& troisK = 3. * (*lesPtIntegMecaInterne)(i).ModuleCompressibilite_const(); troisK_moy += troisK; // cas des jacobiens - const double& jacobien_0 = *(tabSaveDefDon(i)->Meti_00().jacobien_); +// const double& jacobien_0 = *(tabSaveDefDon(i)->Meti_00().jacobien_); if (atdt) { const double& jacobien_ini = *(tabSaveDefDon(i)->Meti_t().jacobien_); jacobien_moy_ini += jacobien_ini; diff --git a/Elements/Mecanique/Biellette/Biel_axiQ.h b/Elements/Mecanique/Biellette/Biel_axiQ.h index e84fa47..8138b21 100755 --- a/Elements/Mecanique/Biellette/Biel_axiQ.h +++ b/Elements/Mecanique/Biellette/Biel_axiQ.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Biellette/Biellette.cc b/Elements/Mecanique/Biellette/Biellette.cc index bf199e3..0d9a14d 100644 --- a/Elements/Mecanique/Biellette/Biellette.cc +++ b/Elements/Mecanique/Biellette/Biellette.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -325,7 +325,7 @@ Coordonnee & Biellette::Point_physique(const Coordonnee& c_int,Coordonnee & co,E doCo->met_biellette.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCo->segment.Phi(c_int); + const Vecteur& phi = doCo->segment.Phi_point(c_int); // c) calcul du point switch (temps) { case TEMPS_0 : co = doCo->met_biellette.PointM_0(tab_noeud,phi); break; @@ -347,7 +347,7 @@ void Biellette::Point_physique(const Coordonnee& c_int,Tableau & t_ doCo->met_biellette.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCo->segment.Phi(c_int); + const Vecteur& phi = doCo->segment.Phi_point(c_int); // c) calcul des point switch (t_co.Taille()) { case 3 : t_co(3) = doCo->met_biellette.PointM_tdt(tab_noeud,phi); @@ -1022,7 +1022,8 @@ Vecteur Biellette::SM_charge_lineique_E(const Coordonnee& force,Fonction_nD* pt_ { // initialisation du vecteur résidu ((*res_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf = Frontiere_lineique(1,true); + //ElFrontiere* elf = + Frontiere_lineique(1,true); Biellette::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique if (!atdt) @@ -1065,7 +1066,8 @@ Element::ResRaid Biellette::SMR_charge_lineique_I ((*res_extA)(1))->Zero(); ((*raid_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf =Frontiere_lineique(1,true); + //ElFrontiere* elf = + Frontiere_lineique(1,true); Biellette::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique @@ -1098,7 +1100,8 @@ Vecteur Biellette::SM_charge_lineique_Suiv_E(const Coordonnee& force,Fonction_nD { // initialisation du vecteur résidu ((*res_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf = Frontiere_lineique(1,true); + //ElFrontiere* elf = + Frontiere_lineique(1,true); Biellette::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique if (!atdt) @@ -1141,7 +1144,8 @@ Element::ResRaid Biellette::SMR_charge_lineique_Suiv_I ((*res_extA)(1))->Zero(); ((*raid_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf = Frontiere_lineique(1,true); + //ElFrontiere* elf = + Frontiere_lineique(1,true); Biellette::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique @@ -1244,7 +1248,7 @@ const double& Biellette::CalSectionMoyenne_et_vol_pti(const bool atdt) const double& troisK = 3. * (*lesPtIntegMecaInterne)(i).ModuleCompressibilite_const(); troisK_moy += troisK; // cas des jacobiens - const double& jacobien_0 = *(tabSaveDefDon(i)->Meti_00().jacobien_); +// const double& jacobien_0 = *(tabSaveDefDon(i)->Meti_00().jacobien_); if (atdt) { const double& jacobien_ini = *(tabSaveDefDon(i)->Meti_t().jacobien_); jacobien_moy_ini += jacobien_ini; diff --git a/Elements/Mecanique/Biellette/Biellette.h b/Elements/Mecanique/Biellette/Biellette.h index e0bb02e..31fee93 100644 --- a/Elements/Mecanique/Biellette/Biellette.h +++ b/Elements/Mecanique/Biellette/Biellette.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Biellette/BielletteC1.cc b/Elements/Mecanique/Biellette/BielletteC1.cc index b0ad18c..7e4f259 100644 --- a/Elements/Mecanique/Biellette/BielletteC1.cc +++ b/Elements/Mecanique/Biellette/BielletteC1.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -292,7 +292,7 @@ Coordonnee & BielletteC1::Point_physique(const Coordonnee& c_int,Coordonnee & co doCo->met_BielletteC1.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCo->segment.Phi(c_int); + const Vecteur& phi = doCo->segment.Phi_point(c_int); // c) calcul du point switch (temps) { case TEMPS_0 : co = doCo->met_BielletteC1.PointM_0(tab_noeud,phi); break; @@ -314,7 +314,7 @@ void BielletteC1::Point_physique(const Coordonnee& c_int,Tableau & doCo->met_BielletteC1.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCo->segment.Phi(c_int); + const Vecteur& phi = doCo->segment.Phi_point(c_int); // c) calcul des point switch (t_co.Taille()) { case 3 : t_co(3) = doCo->met_BielletteC1.PointM_tdt(tab_noeud,phi); @@ -870,7 +870,7 @@ Vecteur BielletteC1::SM_charge_lineique_E(const Coordonnee& force,Fonction_nD* p { // initialisation du vecteur résidu ((*res_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf = Frontiere_lineique(1,true); + Frontiere_lineique(1,true); BielletteC1::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique if (!atdt) @@ -913,7 +913,7 @@ Element::ResRaid BielletteC1::SMR_charge_lineique_I ((*res_extA)(1))->Zero(); ((*raid_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf =Frontiere_lineique(1,true); + Frontiere_lineique(1,true); BielletteC1::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique @@ -946,7 +946,7 @@ Vecteur BielletteC1::SM_charge_lineique_Suiv_E(const Coordonnee& force,Fonction_ { // initialisation du vecteur résidu ((*res_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf = Frontiere_lineique(1,true); + Frontiere_lineique(1,true); BielletteC1::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique if (!atdt) @@ -989,7 +989,7 @@ Element::ResRaid BielletteC1::SMR_charge_lineique_Suiv_I ((*res_extA)(1))->Zero(); ((*raid_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf = Frontiere_lineique(1,true); + Frontiere_lineique(1,true); BielletteC1::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique diff --git a/Elements/Mecanique/Biellette/BielletteC1.h b/Elements/Mecanique/Biellette/BielletteC1.h index 55e037f..2ae4138 100644 --- a/Elements/Mecanique/Biellette/BielletteC1.h +++ b/Elements/Mecanique/Biellette/BielletteC1.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Biellette/BielletteQ.cc b/Elements/Mecanique/Biellette/BielletteQ.cc index 90f1ade..71de21e 100644 --- a/Elements/Mecanique/Biellette/BielletteQ.cc +++ b/Elements/Mecanique/Biellette/BielletteQ.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -293,7 +293,7 @@ Coordonnee & BielletteQ::Point_physique(const Coordonnee& c_int,Coordonnee & co, doCo->met_BielletteQ.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCo->segment.Phi(c_int); + const Vecteur& phi = doCo->segment.Phi_point(c_int); // c) calcul du point switch (temps) { case TEMPS_0 : co = doCo->met_BielletteQ.PointM_0(tab_noeud,phi); break; @@ -315,7 +315,7 @@ void BielletteQ::Point_physique(const Coordonnee& c_int,Tableau & t doCo->met_BielletteQ.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCo->segment.Phi(c_int); + const Vecteur& phi = doCo->segment.Phi_point(c_int); // c) calcul des point switch (t_co.Taille()) { case 3 : t_co(3) = doCo->met_BielletteQ.PointM_tdt(tab_noeud,phi); @@ -989,7 +989,7 @@ Vecteur BielletteQ::SM_charge_lineique_E(const Coordonnee& force,Fonction_nD* pt { // initialisation du vecteur résidu ((*res_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf = Frontiere_lineique(1,true); + Frontiere_lineique(1,true); BielletteQ::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique if (!atdt) @@ -1034,7 +1034,7 @@ Element::ResRaid BielletteQ::SMR_charge_lineique_I ((*res_extA)(1))->Zero(); ((*raid_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf =Frontiere_lineique(1,true); + Frontiere_lineique(1,true); BielletteQ::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique @@ -1067,7 +1067,7 @@ Vecteur BielletteQ::SM_charge_lineique_Suiv_E(const Coordonnee& force,Fonction_n { // initialisation du vecteur résidu ((*res_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf = Frontiere_lineique(1,true); + Frontiere_lineique(1,true); BielletteQ::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique if (!atdt) @@ -1112,7 +1112,7 @@ Element::ResRaid BielletteQ::SMR_charge_lineique_Suiv_I ((*res_extA)(1))->Zero(); ((*raid_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf = Frontiere_lineique(1,true); + Frontiere_lineique(1,true); BielletteQ::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique @@ -1215,7 +1215,7 @@ const double& BielletteQ::CalSectionMoyenne_et_vol_pti(const bool atdt) const double& troisK = 3. * (*lesPtIntegMecaInterne)(i).ModuleCompressibilite_const(); troisK_moy += troisK; // cas des jacobiens - const double& jacobien_0 = *(tabSaveDefDon(i)->Meti_00().jacobien_); +// const double& jacobien_0 = *(tabSaveDefDon(i)->Meti_00().jacobien_); if (atdt) { const double& jacobien_ini = *(tabSaveDefDon(i)->Meti_t().jacobien_); jacobien_moy_ini += jacobien_ini; diff --git a/Elements/Mecanique/Biellette/BielletteQ.h b/Elements/Mecanique/Biellette/BielletteQ.h index 6bcee19..17a6303 100644 --- a/Elements/Mecanique/Biellette/BielletteQ.h +++ b/Elements/Mecanique/Biellette/BielletteQ.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Biellette/DeformationP2D.cc b/Elements/Mecanique/Biellette/DeformationP2D.cc index 1e1f13f..edc9a74 100644 --- a/Elements/Mecanique/Biellette/DeformationP2D.cc +++ b/Elements/Mecanique/Biellette/DeformationP2D.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Biellette/DeformationP2D.h b/Elements/Mecanique/Biellette/DeformationP2D.h index 2dc225f..9adaf4b 100644 --- a/Elements/Mecanique/Biellette/DeformationP2D.h +++ b/Elements/Mecanique/Biellette/DeformationP2D.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Biellette/Met_biellette.cc b/Elements/Mecanique/Biellette/Met_biellette.cc index 86ddb0b..187012e 100644 --- a/Elements/Mecanique/Biellette/Met_biellette.cc +++ b/Elements/Mecanique/Biellette/Met_biellette.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Biellette/Met_biellette.h b/Elements/Mecanique/Biellette/Met_biellette.h index 7c95753..14fb8c5 100644 --- a/Elements/Mecanique/Biellette/Met_biellette.h +++ b/Elements/Mecanique/Biellette/Met_biellette.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Biellette/Met_bielletteC1.cc b/Elements/Mecanique/Biellette/Met_bielletteC1.cc index 3c5275c..78e88e0 100644 --- a/Elements/Mecanique/Biellette/Met_bielletteC1.cc +++ b/Elements/Mecanique/Biellette/Met_bielletteC1.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Biellette/Met_bielletteC1.h b/Elements/Mecanique/Biellette/Met_bielletteC1.h index 196df78..f1d97e8 100644 --- a/Elements/Mecanique/Biellette/Met_bielletteC1.h +++ b/Elements/Mecanique/Biellette/Met_bielletteC1.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Biellette/Met_pout2D.cc b/Elements/Mecanique/Biellette/Met_pout2D.cc index ad9cd86..90cf073 100644 --- a/Elements/Mecanique/Biellette/Met_pout2D.cc +++ b/Elements/Mecanique/Biellette/Met_pout2D.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Biellette/Met_pout2D.h b/Elements/Mecanique/Biellette/Met_pout2D.h index 86aeaea..1d96a77 100644 --- a/Elements/Mecanique/Biellette/Met_pout2D.h +++ b/Elements/Mecanique/Biellette/Met_pout2D.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Biellette/PoutSimple1.cc b/Elements/Mecanique/Biellette/PoutSimple1.cc index 12c7273..bb1f05f 100644 --- a/Elements/Mecanique/Biellette/PoutSimple1.cc +++ b/Elements/Mecanique/Biellette/PoutSimple1.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Biellette/PoutSimple1.h b/Elements/Mecanique/Biellette/PoutSimple1.h index 127b3a2..7d1c1de 100644 --- a/Elements/Mecanique/Biellette/PoutSimple1.h +++ b/Elements/Mecanique/Biellette/PoutSimple1.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Biellette/PoutTimo.cc b/Elements/Mecanique/Biellette/PoutTimo.cc index 14d15fe..d72b05b 100644 --- a/Elements/Mecanique/Biellette/PoutTimo.cc +++ b/Elements/Mecanique/Biellette/PoutTimo.cc @@ -1 +1 @@ -// FICHIER : PoutTimo.cp // CLASSE : PoutTimo // This file is part of the Herezh++ application. // // The finite element software Herezh++ is dedicated to the field // of mechanics for large transformations of solid structures. // It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600) // INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) . // // Herezh++ is distributed under GPL 3 license ou ultérieure. // // Copyright (C) 1997-2021 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // For more information, please consult: . //#include "Debug.h" #include #include #include "Sortie.h" #include "PoutTimo.h" #include "FrontPointF.h" #include "FrontSegLine.h" //---------------------------------------------------------------- // def des donnees commune a tous les elements // la taille n'est pas defini ici car elle depend de la lecture //---------------------------------------------------------------- PoutTimo::DonneeCommune * PoutTimo::doCo = NULL; int PoutTimo::CalculResidu_t_PoutTimo_met_abstraite = 0; int PoutTimo::Calcul_implicit_PoutTimo_met_abstraite = 0; int PoutTimo::Calcul_VarDualSort = 0; PoutTimo::ConstrucElementpoutTimo PoutTimo::construcElementpoutTimo; // fonction privee // dans cette fonction il ne doit y avoir que les données communes !! void PoutTimo::Def_DonneeCommune() { // interpollation GeomSeg segment(1,2) ; // element geometrique correspondant: 1 pt integ, 2 noeuds // degre de liberte int dim = ParaGlob::Dimension(); DdlElement tab_ddl(2,dim); int posi = Id_nom_ddl("X1") -1; for (int i =1; i<= ParaGlob::Dimension(); i++) {tab_ddl (1,i) = Enum_ddl(i+posi); tab_ddl (2,i) = Enum_ddl(i+posi); } // def metrique // on definit les variables a priori toujours utiles Tableau tab(15); tab(1) = iM0; tab(2) = iMt; tab(3) = iMtdt ; tab(4)=igiB_0;tab(5)=igiB_t;tab(6)=igiB_tdt; tab(7)=igiH_0;tab(8)=igiH_t;tab(9)=igiH_tdt ; tab(10)=igijBB_0;tab(11)=igijBB_t;tab(12)=igijBB_tdt; tab(13)=igijHH_0;tab(14)=igijHH_t;tab(15)=igijHH_tdt ; // dim du pb , nb de vecteur de la base , tableau de ddl et la def de variables Met_biellette metri(ParaGlob::Dimension(),tab_ddl,tab,2) ; // definition de la classe static contenant toute les variables communes aux biellettes doCo = new DonneeCommune(segment,tab_ddl,metri); }; PoutTimo::PoutTimo () : // Constructeur par defaut ElemMeca() { id_interpol=BIE1; // donnees de la classe mere id_geom=POUT; // // stockage des donnees particulieres de la loi de comportement au point d'integ tabSaveDon.Change_taille(1); section=-1.; tab_noeud.Change_taille(2); // le fait de mettre les pointeurs a null permet // de savoir que l'element n'est pas complet tab_noeud(1) = NULL;tab_noeud(2) = NULL; // definition des donnees communes aux biellettes // a la premiere definition d'une biellette if (doCo == NULL) Def_DonneeCommune(); met = &(doCo->met_biellette); // met est defini dans elemeca // def pointe sur la deformation specifique a l'element def = new Deformation(*met,*this,(doCo->segment).taDphi(),(doCo->segment).taPhi()); //dimensionnement des deformations et contraintes epsBB = NevezTenseurBB (1); sigHH = NevezTenseurHH (1); int nbddl = doCo->tab_ddl.NbDdl(); d_epsBB.Change_taille(nbddl); for (int i=1; i<= nbddl; i++) d_epsBB(i) = NevezTenseurBB (1); }; PoutTimo::PoutTimo (double sect,int num_id): // Constructeur utile si la section de l'element et // le numero de l'element sont connus ElemMeca(num_id,BIE1,POUT) { // stockage des donnees particulieres de la loi de comportement au point d'integ tabSaveDon.Change_taille(1); section=sect; tab_noeud.Change_taille(2); // le fait de mettre les pointeurs a null permet // de savoir que l'element n'est pas complet tab_noeud(1) = NULL;tab_noeud(2) = NULL; // definition des donnees communes aux biellettes // a la premiere definition d'une biellette if (doCo == NULL) Def_DonneeCommune(); met = &(doCo->met_biellette);// met est defini dans elemeca // def pointe sur la deformation specifique a l'element def = new Deformation(*met,*this,(doCo->segment).taDphi(),(doCo->segment).taPhi()); //dimensionnement des deformations et contraintes epsBB = NevezTenseurBB (1); sigHH = NevezTenseurHH (1); int nbddl = doCo->tab_ddl.NbDdl(); d_epsBB.Change_taille(nbddl); for (int i=1; i<= nbddl; i++) d_epsBB(i) = NevezTenseurBB (1); }; // Constructeur fonction d'un numero d'identification PoutTimo::PoutTimo (int num_id) : ElemMeca(num_id,BIE1,POUT) { // stockage des donnees particulieres de la loi de comportement au point d'integ tabSaveDon.Change_taille(1); section=-1.; // c-a-d non valide tab_noeud.Change_taille(2); // le fait de mettre les pointeurs a null permet // de savoir que l'element n'est pas complet tab_noeud(1) = NULL;tab_noeud(2) = NULL; // definition des donnees communes aux biellettes // a la premiere definition d'une biellette if (doCo == NULL) Def_DonneeCommune(); met = &(doCo->met_biellette);// met est defini dans elemeca // def pointe sur la deformation specifique a l'element def = new Deformation(*met,*this,(doCo->segment).taDphi(),(doCo->segment).taPhi()); //dimensionnement des deformations et contraintes epsBB = NevezTenseurBB (1); sigHH = NevezTenseurHH (1); int nbddl = doCo->tab_ddl.NbDdl(); d_epsBB.Change_taille(nbddl); for (int i=1; i<= nbddl; i++) d_epsBB(i) = NevezTenseurBB (1); }; PoutTimo::PoutTimo (double sect,int num_id,const Tableau& tab): // Constructeur utile si la section de l'element, le numero de l'element et // le tableau des noeuds sont connus ElemMeca(num_id,tab,BIE1,POUT) { // stockage des donnees particulieres de la loi de comportement au point d'integ tabSaveDon.Change_taille(1); section=sect; if (tab_noeud.Taille() != 2) { cout << "\n erreur de dimensionnement du tableau de noeud \n"; cout << " PoutTimo::PoutTimo (double sect,int num_id,const Tableau& tab)\n"; Sortie (1); } // definition des donnees communes aux biellettes // a la premiere definition d'une biellette if (doCo == NULL) Def_DonneeCommune(); met = &(doCo->met_biellette);// met est defini dans elemeca // def pointe sur la deformation specifique a l'element def = new Deformation(*met,*this,(doCo->segment).taDphi(),(doCo->segment).taPhi()); //dimensionnement des deformations et contraintes epsBB = NevezTenseurBB (1); sigHH = NevezTenseurHH (1); int nbddl = doCo->tab_ddl.NbDdl(); d_epsBB.Change_taille(nbddl); for (int i=1; i<= nbddl; i++) d_epsBB(i) = NevezTenseurBB (1); // construction du tableau de ddl des noeuds de biellette ConstTabDdl(); }; PoutTimo::PoutTimo (PoutTimo& poutTimo) : ElemMeca (poutTimo) // Constructeur de copie { // stockage des donnees particulieres de la loi de comportement au point d'integ tabSaveDon.Change_taille(1); section=poutTimo.section; *(epsBB) = *(poutTimo.epsBB); *(sigHH) = *(poutTimo.sigHH); d_epsBB=poutTimo.d_epsBB; for (int i=1; i<= d_epsBB.Taille(); i++) { d_epsBB(i) = NevezTenseurBB(1); *d_epsBB(i) = *(poutTimo.d_epsBB(i)); } *(residu) = *(poutTimo.residu); *(raideur) = *(poutTimo.raideur); *met = *(poutTimo.met); *def = *(poutTimo.def); }; PoutTimo::~PoutTimo () // Destructeur { delete epsBB; delete sigHH; for (int i=1; i<= d_epsBB.Taille(); i++) delete d_epsBB(i); LibereTenseur(); delete def; // la deformation }; // Lecture des donnees de la classe sur fichier void PoutTimo::LectureDonneesParticulieres (UtilLecture * entreePrinc,Tableau * tabMaillageNoeud) { int nb; tab_noeud.Change_taille(2); for (int i=1; i<= 2; i++) { *(entreePrinc->entree) >> nb; tab_noeud(i) = (*tabMaillageNoeud)(nb); } // construction du tableau de ddl des noeuds de biellette ConstTabDdl(); }; // Calcul du residu local Vecteur* PoutTimo::CalculResidu_t () { // dimensionnement de la metrique if( CalculResidu_t_PoutTimo_met_abstraite == 0) { Tableau tab(7); tab(1) = igiB_0; tab(2) = igiB_t; tab(3) = igijBB_0;tab(4) = igijBB_t; tab(5) = igijHH_t; tab(6) = id_giB_t; tab(7) = id_gijBB_t ; doCo->met_biellette.PlusInitVariables(tab) ; CalculResidu_t_PoutTimo_met_abstraite = 1; }; // dimensionnement du residu int nbddl = doCo->tab_ddl.NbDdl(); if ( residu == NULL) residu = new Vecteur(nbddl); // cas du premier passage else for (int i =1; i<= nbddl; i++) // cas des autres passages (*residu)(i) = 0.; // on initialise a zero Vecteur poids =(doCo->segment).taWi(); // poids d'interpolation = 2 poids(1) *= section; Tableau tabSigHH(1); tabSigHH(1) = sigHH; Tableau tabEpsBB(1); tabEpsBB(1) = epsBB; ElemMeca::Cal_explicit ( doCo->tab_ddl,tabEpsBB,d_epsBB,tabSigHH,1,poids); return residu; }; // Calcul du residu local et de la raideur locale, // pour le schema implicite Element::ResRaid PoutTimo::Calcul_implicit () { if( Calcul_implicit_PoutTimo_met_abstraite == 0) { Tableau tab(13); tab(1) = igiB_0; tab(2) = igiB_t; tab(3) = igiB_tdt; tab(4) = igijBB_0; tab(5) = igijBB_t;tab(6) = igijBB_tdt; tab(7) = igijHH_tdt; tab(8) = id_giB_tdt; tab(9) = id_gijBB_tdt ;tab(10) = igiH_tdt;tab(11) = id_giH_tdt; tab(12) = id_gijHH_tdt;tab(13) = id_jacobien_tdt; doCo->met_biellette.PlusInitVariables(tab) ; Calcul_implicit_PoutTimo_met_abstraite = 1; }; // dimensionnement du residu int nbddl = doCo->tab_ddl.NbDdl(); if ( residu == NULL) residu = new Vecteur(nbddl); // cas du premier passage else for (int i =1; i<= nbddl; i++) // cas des autres passages (*residu)(i) = 0.; // on initialise a zero // dimensionnement de la raideur if ( raideur == NULL) raideur = new Mat_pleine(nbddl,nbddl); // cas du premier passage else for (int i =1; i<= nbddl; i++) // cas des autres passages for (int j=1; j<= nbddl; j++) // (*raideur)(i,j) = 0.; // on initialise a zero Vecteur poids =(doCo->segment).taWi(); // poids d'interpolation = 2 poids(1) *= section; Tableau tabSigHH(1); tabSigHH(1) = sigHH; Tableau tabEpsBB(1); tabEpsBB(1) = epsBB; ElemMeca::Cal_implicit (doCo->tab_ddl,tabEpsBB, d_epsBB,tabSigHH,1,poids); Element::ResRaid el; el.res = residu; el.raid = raideur; return el; }; // Calcul de la matrice géométrique et initiale ElemMeca::MatGeomInit PoutTimo::MatricesGeometrique_Et_Initiale () { if( Calcul_implicit_PoutTimo_met_abstraite == 0) { Tableau tab(14); tab(1) = igiB_0; tab(2) = igiB_t; tab(3) = igiB_tdt; tab(4) = igijBB_0; tab(5) = igijBB_t;tab(6) = igijBB_tdt; tab(7) = igijHH_tdt; tab(8) = id_giB_tdt; tab(9) = id_gijBB_tdt ;tab(10) = igiH_tdt;tab(11) = id_giH_tdt; tab(12) = id_gijHH_tdt;tab(13) = id_jacobien_tdt;tab(14) = id2_gijBB_tdt; doCo->met_biellette.PlusInitVariables(tab) ; Calcul_implicit_PoutTimo_met_abstraite = 1; }; // Par simplicité Mat_pleine & matGeom = doCo->matGeom; Mat_pleine & matInit = doCo->matInit; // mise à zéro de la matrice géométrique matGeom.Initialise(); Vecteur poids =(doCo->segment).taWi(); // poids d'interpolation = 2 poids(1) *= section; Tableau tabSigHH(1); tabSigHH(1) = sigHH; Tableau tabEpsBB(1); tabEpsBB(1) = epsBB; ElemMeca::Cal_matGeom_Init (matGeom,matInit,doCo->tab_ddl,tabEpsBB, d_epsBB, doCo->d2_epsBB,tabSigHH,1,poids); return MatGeomInit(&matGeom,&matInit); } ; // retourne les tableaux de ddl gere par l'element // ce tableau et specifique a l'element DdlElement & PoutTimo::TableauDdl() { return doCo->tab_ddl; }; // liberation de la place pointee void PoutTimo::Libere () {Element::Libere (); // liberation de residu et raideur LibereTenseur() ; // liberation des tenseur intermediaires for (int i=1; i<= d_epsBB.Taille(); i++) // a priori est locale delete d_epsBB(i); }; // acquisition ou modification d'une loi de comportement void PoutTimo::DefLoi (LoiAbstraiteGeneral * NouvelleLoi) { loiComp = (Loi_comp_abstraite *) NouvelleLoi; // verification du type de loi if (loiComp->Dimension() != 1) { cout << "\n Erreur, la loi de comportement a utiliser avec des biellettes"; cout << " doit etre de type 1D, \n ici est de type = " << (NouvelleLoi->Dimension()) << " !!! " << endl; Sortie(1); } // initialisation du stockage particulier, ici 1 pt d'integ tabSaveDon(1) = loiComp->Initialise(); }; // test si l'element est complet int PoutTimo::TestComplet() { int res = ElemMeca::TestComplet(); // test dans la fonction mere if ( section == -1) { cout << "\n la section de la biellette n'est pas defini \n"; res = 0; } if ( tab_noeud(1) == NULL) { cout << "\n les noeuds de la biellette ne sont pas defini \n"; res = 0; } else { int testi =1; int posi = Id_nom_ddl("X1") -1; for (int i =1; i<= ParaGlob::Dimension(); i++) for (int j=1;j<=2;j++) if(!(tab_noeud(j)->Existe_ici(Enum_ddl(posi+i)))) testi = 0; if(testi == 0) { cout << "\n les ddls X1,X2 etc des noeuds de la biellette ne sont pas defini \n"; cout << " \n utilisez PoutTimo::ConstTabDdl() pour completer " ; res = 0; } } return res; }; // ajout du tableau de ddl des noeuds de biellette void PoutTimo::ConstTabDdl() { Tableau ta(ParaGlob::Dimension()); int posi = Id_nom_ddl("X1") -1; for (int i =1; i<= ParaGlob::Dimension(); i++) {Ddl inter((Enum_ddl(i+posi)),0.,false); ta(i) = inter; } // attribution des ddls aux noeuds tab_noeud(1)->PlusTabDdl(ta); tab_noeud(2)->PlusTabDdl(ta); }; // procesure permettant de completer l'element apres // sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois Element* PoutTimo::Complete(BlocGen & bloc,LesFonctions_nD* lesFonctionsnD) { if (bloc.Nom(1) == "sections") { section = bloc.Val(1); return this; } else return ElemMeca::Complete_ElemMeca(bloc,lesFonctionsnD); //return NULL; }; // affichage dans la sortie transmise, des variables duales "nom" // dans le cas ou nom est vide, affichage de "toute" les variables void PoutTimo::AfficheVarDual(ofstream& sort, Tableau& nom) {// affichage de l'entête de l'element sort << "\n******************************************************************"; sort << "\n Element poutTimo (2 noeuds 1 point d'integration) "; sort << "\n******************************************************************"; // appel de la procedure de elem meca Tableau tabSigHH(1); tabSigHH(1) = sigHH; Tableau tabEpsBB(1); tabEpsBB(1) = epsBB; if ((Calcul_VarDualSort == 0) && (Calcul_implicit_PoutTimo_met_abstraite != 0)) { VarDualSort(sort,nom,tabSigHH,tabEpsBB,1,1); Calcul_VarDualSort = 1; } else if ((Calcul_VarDualSort == 1) && (Calcul_implicit_PoutTimo_met_abstraite != 0)) VarDualSort(sort,nom,tabSigHH,tabEpsBB,1,11); else if ((Calcul_VarDualSort == 0) && (CalculResidu_t_PoutTimo_met_abstraite != 0)) { VarDualSort(sort,nom,tabSigHH,tabEpsBB,1,2); Calcul_VarDualSort = 1; } else if ((Calcul_VarDualSort == 1) && (CalculResidu_t_PoutTimo_met_abstraite != 0)) VarDualSort(sort,nom,tabSigHH,tabEpsBB,1,12); // sinon on ne fait rien }; // Calcul des frontieres de l'element // creation des elements frontieres et retour du tableau de ces elements Tableau & PoutTimo::Frontiere() { int cas = 6; // on veut des lignes et des points return Frontiere_elemeca(cas,force); // { // dimensionnement des tableaux intermediaires // Tableau tab(1); // les noeuds des points frontieres // DdlElement ddelem(1); // les ddlelements des points frontieres // int tail; // if (ParaGlob::Dimension() <= 2) // tail = 2; // deux points // else if (ParaGlob::Dimension() == 3) // tail = 3; // deux points et le segment lui-meme // #ifdef MISE_AU_POINT // else // { cout << "\n erreur de dimension dans PoutTimo, dim = " << ParaGlob::Dimension(); // cout << "\n alors que l'on doit avoir 1 ou 2 ou 3 !! " << endl; // Sortie (1); // } // #endif // tabb.Change_taille(tail); // // premier point // tab(1) = tab_noeud(1); // ddelem(1) = doCo->tab_ddl(1); // tabb(1) = new FrontPointF (tab,ddelem); // // second point // tab(1) = tab_noeud(2); // ddelem(1) = doCo->tab_ddl(2); // tabb(2) = new FrontPointF (tab,ddelem); // // 3 ieme cote eventuelle // if (tail == 3) // tabb(3) = new FrontSegLine(tab_noeud,doCo->tab_ddl); // // return tabb; }; \ No newline at end of file +// FICHIER : PoutTimo.cp // CLASSE : PoutTimo // 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 "Debug.h" #include #include #include "Sortie.h" #include "PoutTimo.h" #include "FrontPointF.h" #include "FrontSegLine.h" //---------------------------------------------------------------- // def des donnees commune a tous les elements // la taille n'est pas defini ici car elle depend de la lecture //---------------------------------------------------------------- PoutTimo::DonneeCommune * PoutTimo::doCo = NULL; int PoutTimo::CalculResidu_t_PoutTimo_met_abstraite = 0; int PoutTimo::Calcul_implicit_PoutTimo_met_abstraite = 0; int PoutTimo::Calcul_VarDualSort = 0; PoutTimo::ConstrucElementpoutTimo PoutTimo::construcElementpoutTimo; // fonction privee // dans cette fonction il ne doit y avoir que les données communes !! void PoutTimo::Def_DonneeCommune() { // interpollation GeomSeg segment(1,2) ; // element geometrique correspondant: 1 pt integ, 2 noeuds // degre de liberte int dim = ParaGlob::Dimension(); DdlElement tab_ddl(2,dim); int posi = Id_nom_ddl("X1") -1; for (int i =1; i<= ParaGlob::Dimension(); i++) {tab_ddl (1,i) = Enum_ddl(i+posi); tab_ddl (2,i) = Enum_ddl(i+posi); } // def metrique // on definit les variables a priori toujours utiles Tableau tab(15); tab(1) = iM0; tab(2) = iMt; tab(3) = iMtdt ; tab(4)=igiB_0;tab(5)=igiB_t;tab(6)=igiB_tdt; tab(7)=igiH_0;tab(8)=igiH_t;tab(9)=igiH_tdt ; tab(10)=igijBB_0;tab(11)=igijBB_t;tab(12)=igijBB_tdt; tab(13)=igijHH_0;tab(14)=igijHH_t;tab(15)=igijHH_tdt ; // dim du pb , nb de vecteur de la base , tableau de ddl et la def de variables Met_biellette metri(ParaGlob::Dimension(),tab_ddl,tab,2) ; // definition de la classe static contenant toute les variables communes aux biellettes doCo = new DonneeCommune(segment,tab_ddl,metri); }; PoutTimo::PoutTimo () : // Constructeur par defaut ElemMeca() { id_interpol=BIE1; // donnees de la classe mere id_geom=POUT; // // stockage des donnees particulieres de la loi de comportement au point d'integ tabSaveDon.Change_taille(1); section=-1.; tab_noeud.Change_taille(2); // le fait de mettre les pointeurs a null permet // de savoir que l'element n'est pas complet tab_noeud(1) = NULL;tab_noeud(2) = NULL; // definition des donnees communes aux biellettes // a la premiere definition d'une biellette if (doCo == NULL) Def_DonneeCommune(); met = &(doCo->met_biellette); // met est defini dans elemeca // def pointe sur la deformation specifique a l'element def = new Deformation(*met,*this,(doCo->segment).taDphi(),(doCo->segment).taPhi()); //dimensionnement des deformations et contraintes epsBB = NevezTenseurBB (1); sigHH = NevezTenseurHH (1); int nbddl = doCo->tab_ddl.NbDdl(); d_epsBB.Change_taille(nbddl); for (int i=1; i<= nbddl; i++) d_epsBB(i) = NevezTenseurBB (1); }; PoutTimo::PoutTimo (double sect,int num_id): // Constructeur utile si la section de l'element et // le numero de l'element sont connus ElemMeca(num_id,BIE1,POUT) { // stockage des donnees particulieres de la loi de comportement au point d'integ tabSaveDon.Change_taille(1); section=sect; tab_noeud.Change_taille(2); // le fait de mettre les pointeurs a null permet // de savoir que l'element n'est pas complet tab_noeud(1) = NULL;tab_noeud(2) = NULL; // definition des donnees communes aux biellettes // a la premiere definition d'une biellette if (doCo == NULL) Def_DonneeCommune(); met = &(doCo->met_biellette);// met est defini dans elemeca // def pointe sur la deformation specifique a l'element def = new Deformation(*met,*this,(doCo->segment).taDphi(),(doCo->segment).taPhi()); //dimensionnement des deformations et contraintes epsBB = NevezTenseurBB (1); sigHH = NevezTenseurHH (1); int nbddl = doCo->tab_ddl.NbDdl(); d_epsBB.Change_taille(nbddl); for (int i=1; i<= nbddl; i++) d_epsBB(i) = NevezTenseurBB (1); }; // Constructeur fonction d'un numero d'identification PoutTimo::PoutTimo (int num_id) : ElemMeca(num_id,BIE1,POUT) { // stockage des donnees particulieres de la loi de comportement au point d'integ tabSaveDon.Change_taille(1); section=-1.; // c-a-d non valide tab_noeud.Change_taille(2); // le fait de mettre les pointeurs a null permet // de savoir que l'element n'est pas complet tab_noeud(1) = NULL;tab_noeud(2) = NULL; // definition des donnees communes aux biellettes // a la premiere definition d'une biellette if (doCo == NULL) Def_DonneeCommune(); met = &(doCo->met_biellette);// met est defini dans elemeca // def pointe sur la deformation specifique a l'element def = new Deformation(*met,*this,(doCo->segment).taDphi(),(doCo->segment).taPhi()); //dimensionnement des deformations et contraintes epsBB = NevezTenseurBB (1); sigHH = NevezTenseurHH (1); int nbddl = doCo->tab_ddl.NbDdl(); d_epsBB.Change_taille(nbddl); for (int i=1; i<= nbddl; i++) d_epsBB(i) = NevezTenseurBB (1); }; PoutTimo::PoutTimo (double sect,int num_id,const Tableau& tab): // Constructeur utile si la section de l'element, le numero de l'element et // le tableau des noeuds sont connus ElemMeca(num_id,tab,BIE1,POUT) { // stockage des donnees particulieres de la loi de comportement au point d'integ tabSaveDon.Change_taille(1); section=sect; if (tab_noeud.Taille() != 2) { cout << "\n erreur de dimensionnement du tableau de noeud \n"; cout << " PoutTimo::PoutTimo (double sect,int num_id,const Tableau& tab)\n"; Sortie (1); } // definition des donnees communes aux biellettes // a la premiere definition d'une biellette if (doCo == NULL) Def_DonneeCommune(); met = &(doCo->met_biellette);// met est defini dans elemeca // def pointe sur la deformation specifique a l'element def = new Deformation(*met,*this,(doCo->segment).taDphi(),(doCo->segment).taPhi()); //dimensionnement des deformations et contraintes epsBB = NevezTenseurBB (1); sigHH = NevezTenseurHH (1); int nbddl = doCo->tab_ddl.NbDdl(); d_epsBB.Change_taille(nbddl); for (int i=1; i<= nbddl; i++) d_epsBB(i) = NevezTenseurBB (1); // construction du tableau de ddl des noeuds de biellette ConstTabDdl(); }; PoutTimo::PoutTimo (PoutTimo& poutTimo) : ElemMeca (poutTimo) // Constructeur de copie { // stockage des donnees particulieres de la loi de comportement au point d'integ tabSaveDon.Change_taille(1); section=poutTimo.section; *(epsBB) = *(poutTimo.epsBB); *(sigHH) = *(poutTimo.sigHH); d_epsBB=poutTimo.d_epsBB; for (int i=1; i<= d_epsBB.Taille(); i++) { d_epsBB(i) = NevezTenseurBB(1); *d_epsBB(i) = *(poutTimo.d_epsBB(i)); } *(residu) = *(poutTimo.residu); *(raideur) = *(poutTimo.raideur); *met = *(poutTimo.met); *def = *(poutTimo.def); }; PoutTimo::~PoutTimo () // Destructeur { delete epsBB; delete sigHH; for (int i=1; i<= d_epsBB.Taille(); i++) delete d_epsBB(i); LibereTenseur(); delete def; // la deformation }; // Lecture des donnees de la classe sur fichier void PoutTimo::LectureDonneesParticulieres (UtilLecture * entreePrinc,Tableau * tabMaillageNoeud) { int nb; tab_noeud.Change_taille(2); for (int i=1; i<= 2; i++) { *(entreePrinc->entree) >> nb; tab_noeud(i) = (*tabMaillageNoeud)(nb); } // construction du tableau de ddl des noeuds de biellette ConstTabDdl(); }; // Calcul du residu local Vecteur* PoutTimo::CalculResidu_t () { // dimensionnement de la metrique if( CalculResidu_t_PoutTimo_met_abstraite == 0) { Tableau tab(7); tab(1) = igiB_0; tab(2) = igiB_t; tab(3) = igijBB_0;tab(4) = igijBB_t; tab(5) = igijHH_t; tab(6) = id_giB_t; tab(7) = id_gijBB_t ; doCo->met_biellette.PlusInitVariables(tab) ; CalculResidu_t_PoutTimo_met_abstraite = 1; }; // dimensionnement du residu int nbddl = doCo->tab_ddl.NbDdl(); if ( residu == NULL) residu = new Vecteur(nbddl); // cas du premier passage else for (int i =1; i<= nbddl; i++) // cas des autres passages (*residu)(i) = 0.; // on initialise a zero Vecteur poids =(doCo->segment).taWi(); // poids d'interpolation = 2 poids(1) *= section; Tableau tabSigHH(1); tabSigHH(1) = sigHH; Tableau tabEpsBB(1); tabEpsBB(1) = epsBB; ElemMeca::Cal_explicit ( doCo->tab_ddl,tabEpsBB,d_epsBB,tabSigHH,1,poids); return residu; }; // Calcul du residu local et de la raideur locale, // pour le schema implicite Element::ResRaid PoutTimo::Calcul_implicit () { if( Calcul_implicit_PoutTimo_met_abstraite == 0) { Tableau tab(13); tab(1) = igiB_0; tab(2) = igiB_t; tab(3) = igiB_tdt; tab(4) = igijBB_0; tab(5) = igijBB_t;tab(6) = igijBB_tdt; tab(7) = igijHH_tdt; tab(8) = id_giB_tdt; tab(9) = id_gijBB_tdt ;tab(10) = igiH_tdt;tab(11) = id_giH_tdt; tab(12) = id_gijHH_tdt;tab(13) = id_jacobien_tdt; doCo->met_biellette.PlusInitVariables(tab) ; Calcul_implicit_PoutTimo_met_abstraite = 1; }; // dimensionnement du residu int nbddl = doCo->tab_ddl.NbDdl(); if ( residu == NULL) residu = new Vecteur(nbddl); // cas du premier passage else for (int i =1; i<= nbddl; i++) // cas des autres passages (*residu)(i) = 0.; // on initialise a zero // dimensionnement de la raideur if ( raideur == NULL) raideur = new Mat_pleine(nbddl,nbddl); // cas du premier passage else for (int i =1; i<= nbddl; i++) // cas des autres passages for (int j=1; j<= nbddl; j++) // (*raideur)(i,j) = 0.; // on initialise a zero Vecteur poids =(doCo->segment).taWi(); // poids d'interpolation = 2 poids(1) *= section; Tableau tabSigHH(1); tabSigHH(1) = sigHH; Tableau tabEpsBB(1); tabEpsBB(1) = epsBB; ElemMeca::Cal_implicit (doCo->tab_ddl,tabEpsBB, d_epsBB,tabSigHH,1,poids); Element::ResRaid el; el.res = residu; el.raid = raideur; return el; }; // Calcul de la matrice géométrique et initiale ElemMeca::MatGeomInit PoutTimo::MatricesGeometrique_Et_Initiale () { if( Calcul_implicit_PoutTimo_met_abstraite == 0) { Tableau tab(14); tab(1) = igiB_0; tab(2) = igiB_t; tab(3) = igiB_tdt; tab(4) = igijBB_0; tab(5) = igijBB_t;tab(6) = igijBB_tdt; tab(7) = igijHH_tdt; tab(8) = id_giB_tdt; tab(9) = id_gijBB_tdt ;tab(10) = igiH_tdt;tab(11) = id_giH_tdt; tab(12) = id_gijHH_tdt;tab(13) = id_jacobien_tdt;tab(14) = id2_gijBB_tdt; doCo->met_biellette.PlusInitVariables(tab) ; Calcul_implicit_PoutTimo_met_abstraite = 1; }; // Par simplicité Mat_pleine & matGeom = doCo->matGeom; Mat_pleine & matInit = doCo->matInit; // mise à zéro de la matrice géométrique matGeom.Initialise(); Vecteur poids =(doCo->segment).taWi(); // poids d'interpolation = 2 poids(1) *= section; Tableau tabSigHH(1); tabSigHH(1) = sigHH; Tableau tabEpsBB(1); tabEpsBB(1) = epsBB; ElemMeca::Cal_matGeom_Init (matGeom,matInit,doCo->tab_ddl,tabEpsBB, d_epsBB, doCo->d2_epsBB,tabSigHH,1,poids); return MatGeomInit(&matGeom,&matInit); } ; // retourne les tableaux de ddl gere par l'element // ce tableau et specifique a l'element DdlElement & PoutTimo::TableauDdl() { return doCo->tab_ddl; }; // liberation de la place pointee void PoutTimo::Libere () {Element::Libere (); // liberation de residu et raideur LibereTenseur() ; // liberation des tenseur intermediaires for (int i=1; i<= d_epsBB.Taille(); i++) // a priori est locale delete d_epsBB(i); }; // acquisition ou modification d'une loi de comportement void PoutTimo::DefLoi (LoiAbstraiteGeneral * NouvelleLoi) { loiComp = (Loi_comp_abstraite *) NouvelleLoi; // verification du type de loi if (loiComp->Dimension() != 1) { cout << "\n Erreur, la loi de comportement a utiliser avec des biellettes"; cout << " doit etre de type 1D, \n ici est de type = " << (NouvelleLoi->Dimension()) << " !!! " << endl; Sortie(1); } // initialisation du stockage particulier, ici 1 pt d'integ tabSaveDon(1) = loiComp->Initialise(); }; // test si l'element est complet int PoutTimo::TestComplet() { int res = ElemMeca::TestComplet(); // test dans la fonction mere if ( section == -1) { cout << "\n la section de la biellette n'est pas defini \n"; res = 0; } if ( tab_noeud(1) == NULL) { cout << "\n les noeuds de la biellette ne sont pas defini \n"; res = 0; } else { int testi =1; int posi = Id_nom_ddl("X1") -1; for (int i =1; i<= ParaGlob::Dimension(); i++) for (int j=1;j<=2;j++) if(!(tab_noeud(j)->Existe_ici(Enum_ddl(posi+i)))) testi = 0; if(testi == 0) { cout << "\n les ddls X1,X2 etc des noeuds de la biellette ne sont pas defini \n"; cout << " \n utilisez PoutTimo::ConstTabDdl() pour completer " ; res = 0; } } return res; }; // ajout du tableau de ddl des noeuds de biellette void PoutTimo::ConstTabDdl() { Tableau ta(ParaGlob::Dimension()); int posi = Id_nom_ddl("X1") -1; for (int i =1; i<= ParaGlob::Dimension(); i++) {Ddl inter((Enum_ddl(i+posi)),0.,false); ta(i) = inter; } // attribution des ddls aux noeuds tab_noeud(1)->PlusTabDdl(ta); tab_noeud(2)->PlusTabDdl(ta); }; // procesure permettant de completer l'element apres // sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois Element* PoutTimo::Complete(BlocGen & bloc,LesFonctions_nD* lesFonctionsnD) { if (bloc.Nom(1) == "sections") { section = bloc.Val(1); return this; } else return ElemMeca::Complete_ElemMeca(bloc,lesFonctionsnD); //return NULL; }; // affichage dans la sortie transmise, des variables duales "nom" // dans le cas ou nom est vide, affichage de "toute" les variables void PoutTimo::AfficheVarDual(ofstream& sort, Tableau& nom) {// affichage de l'entête de l'element sort << "\n******************************************************************"; sort << "\n Element poutTimo (2 noeuds 1 point d'integration) "; sort << "\n******************************************************************"; // appel de la procedure de elem meca Tableau tabSigHH(1); tabSigHH(1) = sigHH; Tableau tabEpsBB(1); tabEpsBB(1) = epsBB; if ((Calcul_VarDualSort == 0) && (Calcul_implicit_PoutTimo_met_abstraite != 0)) { VarDualSort(sort,nom,tabSigHH,tabEpsBB,1,1); Calcul_VarDualSort = 1; } else if ((Calcul_VarDualSort == 1) && (Calcul_implicit_PoutTimo_met_abstraite != 0)) VarDualSort(sort,nom,tabSigHH,tabEpsBB,1,11); else if ((Calcul_VarDualSort == 0) && (CalculResidu_t_PoutTimo_met_abstraite != 0)) { VarDualSort(sort,nom,tabSigHH,tabEpsBB,1,2); Calcul_VarDualSort = 1; } else if ((Calcul_VarDualSort == 1) && (CalculResidu_t_PoutTimo_met_abstraite != 0)) VarDualSort(sort,nom,tabSigHH,tabEpsBB,1,12); // sinon on ne fait rien }; // Calcul des frontieres de l'element // creation des elements frontieres et retour du tableau de ces elements Tableau & PoutTimo::Frontiere() { int cas = 6; // on veut des lignes et des points return Frontiere_elemeca(cas,force); // { // dimensionnement des tableaux intermediaires // Tableau tab(1); // les noeuds des points frontieres // DdlElement ddelem(1); // les ddlelements des points frontieres // int tail; // if (ParaGlob::Dimension() <= 2) // tail = 2; // deux points // else if (ParaGlob::Dimension() == 3) // tail = 3; // deux points et le segment lui-meme // #ifdef MISE_AU_POINT // else // { cout << "\n erreur de dimension dans PoutTimo, dim = " << ParaGlob::Dimension(); // cout << "\n alors que l'on doit avoir 1 ou 2 ou 3 !! " << endl; // Sortie (1); // } // #endif // tabb.Change_taille(tail); // // premier point // tab(1) = tab_noeud(1); // ddelem(1) = doCo->tab_ddl(1); // tabb(1) = new FrontPointF (tab,ddelem); // // second point // tab(1) = tab_noeud(2); // ddelem(1) = doCo->tab_ddl(2); // tabb(2) = new FrontPointF (tab,ddelem); // // 3 ieme cote eventuelle // if (tail == 3) // tabb(3) = new FrontSegLine(tab_noeud,doCo->tab_ddl); // // return tabb; }; \ No newline at end of file diff --git a/Elements/Mecanique/Biellette/PoutTimo.h b/Elements/Mecanique/Biellette/PoutTimo.h index 558e628..3c23698 100644 --- a/Elements/Mecanique/Biellette/PoutTimo.h +++ b/Elements/Mecanique/Biellette/PoutTimo.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/Def_Umat.cc b/Elements/Mecanique/Deformation_gene/Def_Umat.cc index 465f683..b4b8e00 100644 --- a/Elements/Mecanique/Deformation_gene/Def_Umat.cc +++ b/Elements/Mecanique/Deformation_gene/Def_Umat.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/Def_Umat.h b/Elements/Mecanique/Deformation_gene/Def_Umat.h index ea721c0..58fe942 100644 --- a/Elements/Mecanique/Deformation_gene/Def_Umat.h +++ b/Elements/Mecanique/Deformation_gene/Def_Umat.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/Deformation.cc b/Elements/Mecanique/Deformation_gene/Deformation.cc index efa99d3..d34924b 100644 --- a/Elements/Mecanique/Deformation_gene/Deformation.cc +++ b/Elements/Mecanique/Deformation_gene/Deformation.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -541,16 +541,57 @@ const Met_abstraite::flambe_lin& Deformation::Cal_flambe_lin // temperature_tdt,temperature_t : températures, temperature_0: température initiale // atdt : booléen qui indique si les grandeurs à tdt sont disponible ou pas // avec_repercution_sur_def_meca: si oui on met à jour la déformation méca, sinon, on ne calcul que les def thermiques -void Deformation::DeformationThermoMecanique(const double& temperature_0,const TenseurBB& gijBB,const ThermoDonnee& dTP - ,const TenseurBB & epsBB_totale - ,TenseurBB & epsBB_therm,const double& temperature_tdt,TenseurBB & epsBB_meca - ,const double& temperature_t - ,TenseurBB & DepsBB_totale,TenseurBB & DepsBB_therm,TenseurBB & DepsBB_meca, bool atdt - , bool avec_repercution_sur_def_meca) +void Deformation::DeformationThermoMecanique(const double& temperature_0,const ThermoDonnee& dTP + ,const TenseurBB & epsBB_totale,TenseurBB & epsBB_therm,const double& temperature_tdt,TenseurBB & epsBB_meca + ,const TenseurBB & delta_epsBB_totale,TenseurBB & delta_epsBB_therm,TenseurBB & delta_epsBB_meca + ,const double& temperature_t,TenseurBB & DepsBB_totale,TenseurBB & DepsBB_therm,TenseurBB & DepsBB_meca + ,const Met_abstraite::Impli* ex_impli + ,const Met_abstraite::Expli_t_tdt* ex_expli_tdt + ,const Met_abstraite::Umat_cont* ex_umat + ,bool atdt,bool avec_repercution_sur_def_meca) { // la dilatation est déterminée par l'élévation de température double coef_dila_global = dTP.Dilatation() * (temperature_tdt-temperature_0); + + // éléments de métrique + TenseurHH* gijHH;TenseurBB* gijBB;BaseB* giB; BaseH* giH_0;BaseH* giH; + BaseB* giB_0;BaseB* giB_t; + bool pas_de_metrique_dispo = false; // init + + if (ex_impli != NULL) + { gijHH = ex_impli->gijHH_tdt;gijBB = ex_impli->gijBB_tdt; + giB = ex_impli->giB_tdt; giH_0 = ex_impli->giH_0;giH = ex_impli->giH_tdt; + giB_t = ex_impli->giB_t; giB_0 = ex_impli->giB_0; + } + else if (ex_expli_tdt != NULL) + {gijHH = ex_expli_tdt->gijHH_tdt;gijBB = ex_expli_tdt->gijBB_tdt; + giB = ex_expli_tdt->giB_tdt; giH_0 = ex_expli_tdt->giH_0;giH = ex_expli_tdt->giH_tdt; + giB_t = ex_expli_tdt->giB_t; giB_0 = ex_expli_tdt->giB_0; + } + else if (ex_umat != NULL) + {gijHH = ex_umat->gijHH_t;gijBB = ex_umat->gijBB_t; + giB = giB_t = ex_umat->giB_t; giH_0 = ex_umat->giH_0;giH = ex_umat->giH_t; + giB_0 = ex_umat->giB_0; + } + else + { pas_de_metrique_dispo = true; + }; + // -- cas de la déformation - epsBB_therm = coef_dila_global * gijBB; + epsBB_therm = coef_dila_global * (*gijBB); + + // -- cas de l'incrément de déformation + if (atdt) + { // cas d'un calcul avec les grandeurs à tdt disponibles + double coef_dila_t_tdt = dTP.Dilatation() * (temperature_tdt-temperature_t); + delta_epsBB_therm = coef_dila_t_tdt * (*gijBB) ; + } + else + { // cas où les valeurs à tdt ne sont pas dispo, on considère un coef moyen sur toute la durée + // et on considère que le delta = la valeur totale de la déformation + // donc c'est le même calcul que pour la déformation totale + delta_epsBB_therm = coef_dila_global * (*gijBB) ; + }; + // -- cas de la vitesse de déformation // recup de l'incrément de temps double deltat=ParaGlob::Variables_de_temps().IncreTempsCourant(); @@ -567,7 +608,7 @@ void Deformation::DeformationThermoMecanique(const double& temperature_0,const T if (atdt) { // cas d'un calcul avec les grandeurs à tdt disponibles double coef_dila_t_tdt = dTP.Dilatation() * (temperature_tdt-temperature_t); - DepsBB_therm = coef_dila_t_tdt * gijBB * unSurDeltat; + DepsBB_therm = coef_dila_t_tdt * (*gijBB) * unSurDeltat; } else { // cas où les valeurs à tdt ne sont pas dispo, on considère un coef moyen sur toute la durée @@ -583,7 +624,7 @@ void Deformation::DeformationThermoMecanique(const double& temperature_0,const T { cout << "\n le pas de temps est négatif !! "; }; unSurttemps = ConstMath::tresgrand; }; - DepsBB_therm = coef_dila_global * gijBB * unSurttemps; + DepsBB_therm = coef_dila_global * (*gijBB) * unSurttemps; }; @@ -594,14 +635,27 @@ void Deformation::DeformationThermoMecanique(const double& temperature_0,const T // } if (avec_repercution_sur_def_meca) { epsBB_meca = epsBB_totale - epsBB_therm; // pour la déformation + delta_epsBB_meca = delta_epsBB_totale - delta_epsBB_therm; // pour la déformation DepsBB_meca = DepsBB_totale - DepsBB_therm; // pour la vitesse de déformation }; -//// -- debug -//cout << "\n debug Deformation::DeformationThermoMecanique( "; -//cout << "\n coef_dila_global= " << coef_dila_global << " epsBB_therm(1,1)= "<< epsBB_therm(1,1) -// << " delta_temp= "<< (temperature_tdt-temperature_0) -// << " epsBB_meca(1,1)= " << epsBB_meca(1,1) << endl; -//// -- fin debug +// -- debug +if (!pas_de_metrique_dispo) + {cout << "\n debug Deformation::DeformationThermoMecanique( "; + cout << "\n coef_dila_global= " << coef_dila_global + << " delta_temp total= "<< (temperature_tdt-temperature_0) + << " increment temp= "<< (temperature_tdt-temperature_t); + // on sort les tenseurs en absolue + Tenseur3BB tiutiu; + epsBB_therm.BaseAbsolue(tiutiu,*giH); + cout << "\n epsBB_therm(1,1)=" << tiutiu(1,1); + epsBB_meca.BaseAbsolue(tiutiu,*giH); + cout << " epsBB_meca(1,1)=" << tiutiu(1,1); + delta_epsBB_therm.BaseAbsolue(tiutiu,*giH); + cout << " \n delta_epsBB_therm(1,1)= "<< tiutiu(1,1); + delta_epsBB_meca.BaseAbsolue(tiutiu,*giH); + cout << " delta_epsBB_meca(1,1)=" << tiutiu(1,1) << endl; + }; +// -- fin debug }; diff --git a/Elements/Mecanique/Deformation_gene/Deformation.h b/Elements/Mecanique/Deformation_gene/Deformation.h index 4e9c2ea..9b32864 100644 --- a/Elements/Mecanique/Deformation_gene/Deformation.h +++ b/Elements/Mecanique/Deformation_gene/Deformation.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -339,12 +339,14 @@ class Deformation // temperature_tdt,temperature_t : températures, temperature_0: température initiale // atdt : booléen qui indique si les grandeurs à tdt sont disponible ou pas // avec_repercution_sur_def_meca: si oui on met à jour la déformation méca, sinon, on ne calcul que les def thermiques - virtual void DeformationThermoMecanique(const double& temperature_0,const TenseurBB& gijBB,const ThermoDonnee& dTP - ,const TenseurBB & epsBB_totale - ,TenseurBB & epsBB_therm,const double& temperature_tdt,TenseurBB & epsBB_meca - ,const double& temperature_t - ,TenseurBB & DepsBB_totale,TenseurBB & DepsBB_therm,TenseurBB & DepsBB_meca - , bool atdt, bool avec_repercution_sur_def_meca); + virtual void DeformationThermoMecanique(const double& temperature_0,const ThermoDonnee& dTP + ,const TenseurBB & epsBB_totale,TenseurBB & epsBB_therm,const double& temperature_tdt,TenseurBB & epsBB_meca + ,const TenseurBB & delta_epsBB_totale,TenseurBB & delta_epsBB_therm,TenseurBB & delta_epsBB_meca + ,const double& temperature_t,TenseurBB & DepsBB_totale,TenseurBB & DepsBB_therm,TenseurBB & DepsBB_meca + ,const Met_abstraite::Impli* ex_impli + ,const Met_abstraite::Expli_t_tdt* ex_expli_tdt + ,const Met_abstraite::Umat_cont* ex_umat + ,bool atdt, bool avec_repercution_sur_def_meca); // ----------- calcul et récupération de la dérivée de la vitesse de déformation virtuelle ---- // calcul et récupération de la dérivée de la vitesse de déformation virtuelle à tdt // dans le cas d'une discrétisation classique simple, ce calcul est indépendant des coordonnées diff --git a/Elements/Mecanique/Deformation_gene/DeformationPP.cc b/Elements/Mecanique/Deformation_gene/DeformationPP.cc index 4a0cc3c..d71c284 100644 --- a/Elements/Mecanique/Deformation_gene/DeformationPP.cc +++ b/Elements/Mecanique/Deformation_gene/DeformationPP.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/DeformationPP.h b/Elements/Mecanique/Deformation_gene/DeformationPP.h index 1f5844a..fb0f2e8 100644 --- a/Elements/Mecanique/Deformation_gene/DeformationPP.h +++ b/Elements/Mecanique/Deformation_gene/DeformationPP.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/DeformationSfe1_stockage.cc b/Elements/Mecanique/Deformation_gene/DeformationSfe1_stockage.cc index 182a6ad..b91e253 100644 --- a/Elements/Mecanique/Deformation_gene/DeformationSfe1_stockage.cc +++ b/Elements/Mecanique/Deformation_gene/DeformationSfe1_stockage.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/Deformation_2.cc b/Elements/Mecanique/Deformation_gene/Deformation_2.cc index fefe92a..4f23034 100644 --- a/Elements/Mecanique/Deformation_gene/Deformation_2.cc +++ b/Elements/Mecanique/Deformation_gene/Deformation_2.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/Deformation_Almansi.cc b/Elements/Mecanique/Deformation_gene/Deformation_Almansi.cc index 06eb46e..f3dcc41 100644 --- a/Elements/Mecanique/Deformation_gene/Deformation_Almansi.cc +++ b/Elements/Mecanique/Deformation_gene/Deformation_Almansi.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/Deformation_log.cc b/Elements/Mecanique/Deformation_gene/Deformation_log.cc index 3710233..cb8d840 100644 --- a/Elements/Mecanique/Deformation_gene/Deformation_log.cc +++ b/Elements/Mecanique/Deformation_gene/Deformation_log.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -687,12 +687,13 @@ void Deformation::VerifCal_deflog(bool gradV_instantane,const Met_abstraite::Imp TenseurBB * ddepsBB = NevezTenseurBB(epsBB_tdt); *ddepsBB = (*epsBB_tdt_n - epsBB_tdt) / delta; // la dérivée numérique for (int i1=1;i1<=dim;i1++) - for (int j1=1;j1<=dim;j1++) + for (int j1=1;j1<=dim;j1++) if (diffpourcent((*ddepsBB)(i1,j1),(*(d_epsBB_tdt(numddl)))(i1,j1), MaX(Dabs((*ddepsBB)(i1,j1)),Dabs((*(d_epsBB_tdt(numddl)))(i1,j1))),0.05)) - if (MiN(Dabs((*ddepsBB)(i1,j1)),Dabs((*(d_epsBB_tdt(numddl)))(i1,j1))) <= mini_val) + {if (MiN(Dabs((*ddepsBB)(i1,j1)),Dabs((*(d_epsBB_tdt(numddl)))(i1,j1))) <= mini_val) {if( MaX(Dabs((*ddepsBB)(i1,j1)),Dabs((*(d_epsBB_tdt(numddl)))(i1,j1))) > 50.*delta) erreur = true;} - else erreur = true; + else erreur = true; + }; /* // variation du tenseur gijHH_tdt TenseurHH * gijHH = NevezTenseurHH(*ex_n.gijHH_tdt); *gijHH = (*ex_n.gijHH_tdt - *ex.gijHH_tdt) / delta; diff --git a/Elements/Mecanique/Deformation_gene/Deformation_stockage.cc b/Elements/Mecanique/Deformation_gene/Deformation_stockage.cc index 9fd3aeb..aab758a 100644 --- a/Elements/Mecanique/Deformation_gene/Deformation_stockage.cc +++ b/Elements/Mecanique/Deformation_gene/Deformation_stockage.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/MetAxisymetrique2D.cc b/Elements/Mecanique/Deformation_gene/MetAxisymetrique2D.cc index 0cbf169..b4cd920 100644 --- a/Elements/Mecanique/Deformation_gene/MetAxisymetrique2D.cc +++ b/Elements/Mecanique/Deformation_gene/MetAxisymetrique2D.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/MetAxisymetrique2D.h b/Elements/Mecanique/Deformation_gene/MetAxisymetrique2D.h index f315c08..e95996e 100644 --- a/Elements/Mecanique/Deformation_gene/MetAxisymetrique2D.h +++ b/Elements/Mecanique/Deformation_gene/MetAxisymetrique2D.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/MetAxisymetrique3D.cc b/Elements/Mecanique/Deformation_gene/MetAxisymetrique3D.cc index 4f6830c..4f0513d 100644 --- a/Elements/Mecanique/Deformation_gene/MetAxisymetrique3D.cc +++ b/Elements/Mecanique/Deformation_gene/MetAxisymetrique3D.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/MetAxisymetrique3D.h b/Elements/Mecanique/Deformation_gene/MetAxisymetrique3D.h index f0392bc..da40479 100644 --- a/Elements/Mecanique/Deformation_gene/MetAxisymetrique3D.h +++ b/Elements/Mecanique/Deformation_gene/MetAxisymetrique3D.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/Met_PiPoCo.h b/Elements/Mecanique/Deformation_gene/Met_PiPoCo.h index 7a3dcc3..5926a63 100644 --- a/Elements/Mecanique/Deformation_gene/Met_PiPoCo.h +++ b/Elements/Mecanique/Deformation_gene/Met_PiPoCo.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/Met_PiPoCo1.cc b/Elements/Mecanique/Deformation_gene/Met_PiPoCo1.cc index 96e0199..fd13016 100644 --- a/Elements/Mecanique/Deformation_gene/Met_PiPoCo1.cc +++ b/Elements/Mecanique/Deformation_gene/Met_PiPoCo1.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/Met_PiPoCo2.cc b/Elements/Mecanique/Deformation_gene/Met_PiPoCo2.cc index 7e02aba..871fcfd 100644 --- a/Elements/Mecanique/Deformation_gene/Met_PiPoCo2.cc +++ b/Elements/Mecanique/Deformation_gene/Met_PiPoCo2.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/Met_PiPoCo3.cc b/Elements/Mecanique/Deformation_gene/Met_PiPoCo3.cc index 58a7d0d..e19dd8d 100644 --- a/Elements/Mecanique/Deformation_gene/Met_PiPoCo3.cc +++ b/Elements/Mecanique/Deformation_gene/Met_PiPoCo3.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/Met_abstraite.h b/Elements/Mecanique/Deformation_gene/Met_abstraite.h index a6d6859..6c869b9 100644 --- a/Elements/Mecanique/Deformation_gene/Met_abstraite.h +++ b/Elements/Mecanique/Deformation_gene/Met_abstraite.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/Met_abstraite1s2.cc b/Elements/Mecanique/Deformation_gene/Met_abstraite1s2.cc index 32f3f8a..bf95d52 100644 --- a/Elements/Mecanique/Deformation_gene/Met_abstraite1s2.cc +++ b/Elements/Mecanique/Deformation_gene/Met_abstraite1s2.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/Met_abstraite2s2.cc b/Elements/Mecanique/Deformation_gene/Met_abstraite2s2.cc index 9f7be4a..fa3f512 100644 --- a/Elements/Mecanique/Deformation_gene/Met_abstraite2s2.cc +++ b/Elements/Mecanique/Deformation_gene/Met_abstraite2s2.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/Met_abstraite3s2.cc b/Elements/Mecanique/Deformation_gene/Met_abstraite3s2.cc index 1c2767a..6cb90b9 100644 --- a/Elements/Mecanique/Deformation_gene/Met_abstraite3s2.cc +++ b/Elements/Mecanique/Deformation_gene/Met_abstraite3s2.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/Met_abstraite_struc_donnees.cc b/Elements/Mecanique/Deformation_gene/Met_abstraite_struc_donnees.cc index d21b32b..c550a5b 100755 --- a/Elements/Mecanique/Deformation_gene/Met_abstraite_struc_donnees.cc +++ b/Elements/Mecanique/Deformation_gene/Met_abstraite_struc_donnees.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/Met_abstraite_struc_donnees.h b/Elements/Mecanique/Deformation_gene/Met_abstraite_struc_donnees.h index 8b2f69c..1740558 100644 --- a/Elements/Mecanique/Deformation_gene/Met_abstraite_struc_donnees.h +++ b/Elements/Mecanique/Deformation_gene/Met_abstraite_struc_donnees.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/PiPoCo.cc b/Elements/Mecanique/Deformation_gene/PiPoCo.cc index d1401f6..ffc0bbc 100644 --- a/Elements/Mecanique/Deformation_gene/PiPoCo.cc +++ b/Elements/Mecanique/Deformation_gene/PiPoCo.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Deformation_gene/PiPoCo.h b/Elements/Mecanique/Deformation_gene/PiPoCo.h index f268223..a3108cd 100644 --- a/Elements/Mecanique/Deformation_gene/PiPoCo.h +++ b/Elements/Mecanique/Deformation_gene/PiPoCo.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/ElemMeca.cc b/Elements/Mecanique/ElemMeca.cc index ad24a7c..4bad79e 100644 --- a/Elements/Mecanique/ElemMeca.cc +++ b/Elements/Mecanique/ElemMeca.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -66,57 +66,78 @@ Tableau< Vecteur> ElemMeca::vec_hourglass; // tableau de vecteurs de travail, // par défaut ElemMeca::StabMembBiel::StabMembBiel() : type_stabMembrane(STABMEMBRANE_BIEL_NON_DEFINIE) - ,gamma(0.),pt_fct_gamma(NULL),stab_ref(0.) + ,gamma(0.),pt_fct_gamma(NULL),stab_ref(1.),activite_en_explicite(true) ,F_StabMembBiel(),F_StabMembBiel_t() ,E_StabMembBiel(),E_StabMembBiel_t() - ,nom_fctnD(NULL) + ,nom_fctnD(NULL),nom_fctnD_2(NULL) + ,affichage_stabilisation(0),gestion_maxi_mini(false) ,beta(1.) // valeur arbitraire pour l'instant ,f_mini(ConstMath::petit) // valeur arbitraire pour l'instant ,d_maxi(1000.) // déplacement arbitraire de 1000 + ,pt_fct_ponder_Ft(NULL) {}; // fonction du nombre de noeud ou de point d'interpolation ElemMeca::StabMembBiel::StabMembBiel(int nbnoe) : type_stabMembrane(STABMEMBRANE_BIEL_NON_DEFINIE) - ,gamma(0.),pt_fct_gamma(NULL),stab_ref(0.) + ,gamma(0.),pt_fct_gamma(NULL),stab_ref(1.),activite_en_explicite(true) ,F_StabMembBiel(nbnoe),F_StabMembBiel_t(nbnoe) ,E_StabMembBiel(nbnoe),E_StabMembBiel_t(nbnoe) - ,nom_fctnD(NULL) + ,nom_fctnD(NULL),nom_fctnD_2(NULL) + ,affichage_stabilisation(0),gestion_maxi_mini(false) ,beta(1.) // valeur arbitraire pour l'instant ,f_mini(ConstMath::petit) // valeur arbitraire pour l'instant ,d_maxi(1000.) // déplacement arbitraire de 100 + ,pt_fct_ponder_Ft(NULL) {}; -// fonction d'une valeur numérique et du nom éventuel d'une fonction -ElemMeca::StabMembBiel::StabMembBiel(double v,string * s) +// fonction d'une valeur numérique et des noms éventuels de fonction +ElemMeca::StabMembBiel::StabMembBiel(double v,string * sgamma,string* sponder) : type_stabMembrane(STABMEMBRANE_BIEL_NON_DEFINIE) ,gamma(v),pt_fct_gamma(NULL),F_StabMembBiel() ,E_StabMembBiel(),E_StabMembBiel_t() - ,nom_fctnD(NULL),stab_ref(0.) + ,nom_fctnD(NULL),nom_fctnD_2(NULL) + ,stab_ref(1.),activite_en_explicite(true) + ,affichage_stabilisation(0),gestion_maxi_mini(false) ,beta(1.) // valeur arbitraire pour l'instant ,f_mini(ConstMath::petit) // valeur arbitraire pour l'instant ,d_maxi(1000.) // déplacement arbitraire de 100 - {if (s != NULL) nom_fctnD= new string (*s);}; + ,pt_fct_ponder_Ft(NULL) + {if (sgamma != NULL) nom_fctnD= new string (*sgamma); + if (sponder != NULL) nom_fctnD_2= new string (*sponder); + }; // de copie ElemMeca::StabMembBiel::StabMembBiel(const StabMembBiel& a): type_stabMembrane(a.type_stabMembrane) ,gamma(a.gamma),pt_fct_gamma(a.pt_fct_gamma),stab_ref(a.stab_ref) + ,activite_en_explicite(a.activite_en_explicite) ,F_StabMembBiel(a.F_StabMembBiel),F_StabMembBiel_t(a.F_StabMembBiel_t) ,E_StabMembBiel(a.E_StabMembBiel),E_StabMembBiel_t(a.E_StabMembBiel_t) - ,nom_fctnD(NULL) + ,nom_fctnD(NULL),nom_fctnD_2(NULL) + ,affichage_stabilisation(a.affichage_stabilisation) + ,gestion_maxi_mini(a.gestion_maxi_mini) ,beta(a.beta) ,f_mini(a.f_mini) - ,d_maxi(a.d_maxi) - {if (a.nom_fctnD != NULL) nom_fctnD = new string (*(a.nom_fctnD));}; + ,d_maxi(a.d_maxi),pt_fct_ponder_Ft(a.pt_fct_ponder_Ft) + {if (a.nom_fctnD != NULL) nom_fctnD = new string (*(a.nom_fctnD)); + if (a.nom_fctnD_2 != NULL) nom_fctnD_2 = new string (*(a.nom_fctnD_2)); + }; ElemMeca::StabMembBiel::~StabMembBiel() {pt_fct_gamma=NULL; // la fonction est forcément globale, donc on ne la détruie pas - if (nom_fctnD != NULL) delete nom_fctnD; }; + if (nom_fctnD != NULL) delete nom_fctnD; + // idem pour la pondération + if (nom_fctnD_2 != NULL) delete nom_fctnD_2; + }; ElemMeca::StabMembBiel& ElemMeca::StabMembBiel::operator= (const ElemMeca::StabMembBiel& a) {type_stabMembrane = a.type_stabMembrane; gamma=a.gamma;pt_fct_gamma=a.pt_fct_gamma; - stab_ref=a.stab_ref; + stab_ref=a.stab_ref;activite_en_explicite = a.activite_en_explicite; F_StabMembBiel=a.F_StabMembBiel;F_StabMembBiel_t=a.F_StabMembBiel_t; E_StabMembBiel=a.E_StabMembBiel;E_StabMembBiel_t = a.E_StabMembBiel_t; - nom_fctnD=NULL; + nom_fctnD=NULL;pt_fct_ponder_Ft=a.pt_fct_ponder_Ft; + affichage_stabilisation = a.affichage_stabilisation; + gestion_maxi_mini=a.gestion_maxi_mini; + beta=a.beta;f_mini=a.f_mini;d_maxi=a.d_maxi; if (a.nom_fctnD != NULL) nom_fctnD = new string (*(a.nom_fctnD)); + if (a.nom_fctnD_2 != NULL) nom_fctnD_2 = new string (*(a.nom_fctnD_2)); return (*this); }; @@ -149,6 +170,119 @@ void ElemMeca::StabMembBiel::TversTdt() E_StabMembBiel = E_StabMembBiel_t; }; +// cas donne le niveau de la récupération +// = 1 : on récupère tout +// = 2 : on récupère uniquement les données variables (supposées comme telles) +void ElemMeca::StabMembBiel::Lecture_bas_inf(ifstream& ent,const int cas) + {string toto,nom; + switch (cas) + { case 1 : // ------- on récupère tout ------------------------- + { // récup du type de stabilisation + ent >> toto; + type_stabMembrane = Id_Enum_StabMembraneBiel(toto); + // récup pour alpha + ent >> toto; + if (toto == "par_fonction_nD") + { ent >> nom; + if (nom_fctnD == NULL) + nom_fctnD = new string(nom); + else *nom_fctnD = nom; + gamma = 0.; // init au cas ou + pt_fct_gamma = NULL; // même si diff de NULL + // il n'y a pas delete à faire car il s'agit de fonction globale + // ensuite il faudra définir la fonction de stabilisation + // au moment de compléter l'élément + } + else if (toto == "par_valeur") + {ent >> gamma;} + else + { cout << "\n *** erreur en lecture, on attendait" + << " par_fonction_nD ou par_valeur et on a lue " + << toto ; + Sortie(1); + }; + // activite_en_explicite + ent >> toto >> activite_en_explicite; + // pondération éventuelle + ent >> toto; + if (toto == "ponderation_F_t") + { ent >> nom; + if (nom_fctnD_2 == NULL) + nom_fctnD_2 = new string(nom); + else *nom_fctnD_2 = nom; + pt_fct_ponder_Ft = NULL;// même si diff de NULL + // il n'y a pas delete à faire car il s'agit de fonction globale + // ensuite il faudra définir la fonction de pondération + // au moment de compléter l'élément + }; + // affichage et les limitations + ent >> toto >> affichage_stabilisation + >> toto >> gestion_maxi_mini + >> toto >> beta >> toto >> f_mini >> toto >> d_maxi; + break; + } + case 2 : // ----------- lecture uniquement de se qui varie -------------------- + { ent >> toto >> F_StabMembBiel; + ent >> toto >> E_StabMembBiel; + break; + } + default : + { cout << "\nErreur : valeur incorrecte du type de lecture !\n"; + cout << "ElemMeca::StabMembBiel::Lecture_bas_inf(ifstream& ent,const int cas)" + << " cas= " << cas << endl; + Sortie(1); + }; + }; + + + }; +// cas donne le niveau de sauvegarde +// = 1 : on sauvegarde tout +// = 2 : on sauvegarde uniquement les données variables (supposées comme telles) +void ElemMeca::StabMembBiel::Ecriture_bas_inf(ofstream& sort,const int cas) + {switch (cas) + { case 1 : // ------- on sauvegarde tout ------------------------- + { sort << " "<NomFonction()<<" ";} + else {sort << " par_valeur " << gamma<< " ";}; + sort << " activite_en_explicite "<< activite_en_explicite; + if (pt_fct_ponder_Ft != NULL) + {sort << " ponderation_F_t " << pt_fct_ponder_Ft->NomFonction()<<" ";} + else {sort << " pas_de_ponderation_F_t " ;}; + sort << "\n affichage_stabilisation= "<Comportement_3D_CP_DP_1D()) @@ -1313,10 +1461,28 @@ void ElemMeca::Cal_explicit (DdlElement & tab_ddl,Tableau & d_epsB // stabilisation pour un calcul implicit if (type_stabHourglass) Cal_explicit_hourglass(atdt); + // --- cas éventuel d'une stabilisation membrane-biel --- - // ici il s'agit d'un calcul via les normales aux noeuds + // ici il s'agit soit du calcul approché d'initialisation, soit de la fin du calcul après la boucle + // modif: 10 janvier 2019 non c'est le calcul correct une fois la raideur calculée if (pt_StabMembBiel != NULL) - Cal_explicit_StabMembBiel(-1,*ex_final, nbint,volume,NULL); + {Cal_explicit_StabMembBiel(-1,*ex_final, nbint,volume,NULL); + }; + #ifdef MISE_AU_POINT + if (ParaGlob::NiveauImpression() > 9) + { if ((type_stabHourglass)||(pt_StabMembBiel != NULL)) + {cout << "\n apres stabilisation: Second membre local: ? (o/n) "; string rep(" "); + // procédure de lecture avec prise en charge d'un retour chariot + rep = lect_return_defaut(false,"n"); + + if ((rep == "0")||(rep == "o")) + {cout << "\n Second membre local: elem= " << Num_elt_const() + << ", maillage= " << Num_maillage(); + cout << "\n second membre: " << (*residu); + }; + }; + }; + #endif // liberation des tenseurs intermediaires LibereTenseur(); diff --git a/Elements/Mecanique/ElemMeca.h b/Elements/Mecanique/ElemMeca.h index 4a1dd4e..50f6c0b 100644 --- a/Elements/Mecanique/ElemMeca.h +++ b/Elements/Mecanique/ElemMeca.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -396,6 +396,22 @@ class ElemMeca : public Element // dans ce dernier cas la frontière effacéee est recréée // num indique le numéro de la surface à créer (numérotation EF) virtual ElFrontiere* const Frontiere_surfacique(int num,bool force); + + // Calcul spécifiques des frontieres de l'element et retour d'un tableau tabb des frontières + // creation des elements frontieres et stockage dans l'element + // la création n'a lieu qu'au premier appel + // ou lorsque l'on force le paramètre force a true + // dans ce dernier cas seul les frontière effacées sont recréée + // cas : + // = 0 -> on veut toutes les frontières + // = 1 -> on veut uniquement les surfaces + // = 2 -> on veut uniquement les lignes + // = 3 -> on veut uniquement les points + // = 4 -> on veut les surfaces + les lignes + // = 5 -> on veut les surfaces + les points + // = 6 -> on veut les lignes + les points +// virtual Tableau const & Frontiere_specifique(int cas, bool force = false) +// {return Frontiere_elemeca(cas,force);}; // -------------------- init éventuelle avant le chargement ------------------- // initialisation éventuelle, nécessaire avant d'appliquer l'ensemble des charges @@ -678,8 +694,8 @@ class ElemMeca : public Element StabMembBiel(); // fonction du nombre de noeud ou pti StabMembBiel(int nbnoe); - // fonction d'une valeur numérique et du nom éventuel d'une fonction - StabMembBiel(double v,string * s); + // fonction d'une valeur numérique et des noms éventuels de fonction + StabMembBiel(double v,string * sgamma,string* sponder); // de copie StabMembBiel(const StabMembBiel& a); ~StabMembBiel(); @@ -690,7 +706,12 @@ class ElemMeca : public Element double& Valgamma() {return gamma;}; Fonction_nD* Pt_fct_gamma() {return pt_fct_gamma;} void Change_pt_fct_gamma(Fonction_nD* fct) {pt_fct_gamma=fct;}; - + // affichage + const int& Affichage_stabilisation() const {return affichage_stabilisation;}; + void Change_affichage_stabilisation(int niveau) {affichage_stabilisation = niveau;}; + // gestion éventuelle des mini maxi + const bool& Gestion_maxi_mini() const {return gestion_maxi_mini;}; + void Change_gestion_maxi_mini(bool gestion) {gestion_maxi_mini = gestion;}; //beta const double& Beta() const {return beta;}; void Change_beta(double bet) {beta = bet;}; @@ -700,6 +721,12 @@ class ElemMeca : public Element // d_maxi const double& D_maxi() const {return d_maxi;}; void Change_d_maxi(double d) {d_maxi = d;}; + // inactif_en_explicite + const bool Activite_en_explicite() const {return activite_en_explicite;}; + void change_activite_en_explicite(bool change) {activite_en_explicite=change;}; + // pondération de F_t, utilisé dans le calcul de F(t+dt) + Fonction_nD* Pt_fct_ponder_Ft() {return pt_fct_ponder_Ft;} + void Change_pt_fct_ponder_Ft(Fonction_nD* fct) {pt_fct_ponder_Ft=fct;}; // l'intensité de la force de stabilisation au noeud i ou au pti i double& FF_StabMembBiel(int i) {return F_StabMembBiel(i);}; @@ -724,6 +751,18 @@ class ElemMeca : public Element // actualisation de la force de stabilisation de t vers tdt void TversTdt(); + // cas donne le niveau de la récupération + // = 1 : on récupère tout + // = 2 : on récupère uniquement les données variables (supposées comme telles) + void Lecture_bas_inf(ifstream& ent,const int cas) ; + // cas donne le niveau de sauvegarde + // = 1 : on sauvegarde tout + // = 2 : on sauvegarde uniquement les données variables (supposées comme telles) + void Ecriture_bas_inf(ofstream& sort,const int cas) ; + // complète en attribuant les fct nD si besoin, ceci après une lecture + // initiale base_info + void Complete_StabMembBiel(LesFonctions_nD* lesFonctionsnD); + // changement du nombre de pti ou de noeuds, suivant le type de stabilisation void Change_nb_pti(int nbnoe); // le nb de pti ou de noeud du conteneur @@ -740,8 +779,16 @@ class ElemMeca : public Element double stab_ref; // valeur de référence pour calculer l'intensité de stabilisation // (identique pour tous les pti ou noeuds), typiquement == le max de la raideur par exemple // peut changer ensuite pendant le calcul, suivant le type de stabilisation + + bool activite_en_explicite; // par défaut false, indique si oui ou non actif en explicite + Fonction_nD* pt_fct_ponder_Ft; // si non nulle, la fonction est utilisée pour pondérer + // la force de stabilisation à t, utilisée dans le calcul + // à t+dt + + int affichage_stabilisation; // niveau d'affichage spécifique //--- gestion éventuelle des maxi mini ----- + bool gestion_maxi_mini; // indique la gestion éventuelle (false par défaut) // si l'intensité de la stabilisation est supérieure à beta * intensite_Fext // on limite (cas où intensite_Fext >= F_mini) double beta; @@ -749,13 +796,15 @@ class ElemMeca : public Element double d_maxi; // limitation éventuelle sur un déplacement maxi // --- stockage des infos ----- - Tableau F_StabMembBiel; // la force généralisé de stabilisation actuelle à chaque noeud + // stockage aux noeuds "ou" aux pti: dépend du type de stabilisation + Tableau F_StabMembBiel; // la force généralisé de stabilisation actuelle Tableau F_StabMembBiel_t; // la force généralisé de stabilisation à t - Tableau E_StabMembBiel; // l'énergie développée par la stabilisation à chaque noeud - Tableau E_StabMembBiel_t; // l'énergie développée par la stabilisation à t à chaque noeud + Tableau E_StabMembBiel; // l'énergie développée par la stabilisation + Tableau E_StabMembBiel_t; // l'énergie développée par la stabilisation à t string * nom_fctnD; // sert uniquement lors de la lecture base info, en attendant de définir //pt_fct_gamma + string * nom_fctnD_2; // idem pour pt_fct_ponder_Ft }; public : // retour de l'énergie totale de stabilisation éventuelle de membrane et ou de biel diff --git a/Elements/Mecanique/ElemMeca2.cc b/Elements/Mecanique/ElemMeca2.cc index fc7e568..5e6fde5 100644 --- a/Elements/Mecanique/ElemMeca2.cc +++ b/Elements/Mecanique/ElemMeca2.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -660,18 +660,24 @@ void ElemMeca::Lecture_bas_inf // blocage éventuel transversal ent >> nom; if (nom == "stabilisation_transversale:") - { string nom1; string nom_fonction; - ent >> nom1; - double valeur = 0.; - if (nom1=="par_valeur") {ent >> valeur;} - else {ent >> nom_fonction;}; - // maintenant il faut mettre à jour le conteneur - if ((pt_StabMembBiel == NULL)&&(nom1=="par_valeur")) - {pt_StabMembBiel=new StabMembBiel(valeur,NULL);} - else - {pt_StabMembBiel=new StabMembBiel(valeur,&nom_fonction);}; - // ensuite il faudra définir la fonction de stabilisation - // au moment de compléter l'élément + { pt_StabMembBiel = new StabMembBiel; + pt_StabMembBiel->Lecture_bas_inf(ent,cas); +// string nom1; string nom_fonction; +// ent >> nom1; +// double valeur = 0.; +// if (nom1=="par_valeur") {ent >> valeur;} +// else {ent >> nom_fonction;}; +// // maintenant il faut mettre à jour le conteneur +// if ((pt_StabMembBiel == NULL)&&(nom1=="par_valeur")) +// {pt_StabMembBiel=new StabMembBiel(valeur,NULL);} +// else +// {pt_StabMembBiel=new StabMembBiel(valeur,&nom_fonction);}; +// // ensuite il faudra définir la fonction de stabilisation +// // au moment de compléter l'élément + } + else // cas sans stabilisation + {if (pt_StabMembBiel != NULL) + {delete pt_StabMembBiel; pt_StabMembBiel=NULL;} }; break; } @@ -731,20 +737,37 @@ void ElemMeca::Lecture_bas_inf E_elem_bulk_tdt = E_elem_bulk_t; // blocage éventuel transversal - if (pt_StabMembBiel == NULL) - {// pas de stabilisation active, on passe la grandeur - ent >> toto >> toto; - } - else - {// on a une stabilisation active, on lit la stabilisation - int taille=0; // init - ent >> toto >> taille; - pt_StabMembBiel->Change_nb_pti(taille); - for (int i=1;i<= taille;i++) - {ent >> pt_StabMembBiel->FF_StabMembBiel(i); - pt_StabMembBiel->FF_StabMembBiel_t(i)=pt_StabMembBiel->FF_StabMembBiel(i); - }; + {int taille = 0; + ent >> toto >> taille; + if (taille != 0) + {// cas avec stabilisation enregistrée + // on lit systématiquement le cas 2 + pt_StabMembBiel->Lecture_bas_inf(ent,2) ; +// // on considère qu'il faut la récupérer +// pt_StabMembBiel->Change_nb_pti(taille); +// for (int i=1;i<= taille;i++) +// {ent >> pt_StabMembBiel->FF_StabMembBiel(i); +// pt_StabMembBiel->FF_StabMembBiel_t(i)=pt_StabMembBiel->FF_StabMembBiel(i); +// }; }; + // dans le cas où la taille est nulle, cela signifie qu'il n'y avait pas de stabilisation + // auparavant, on laisse en l'état, car l'utilisateur a peut-être déjà définit une stabilisation + }; + +// if (pt_StabMembBiel == NULL) +// {// pas de stabilisation active, on passe la grandeur +// ent >> toto >> toto; +// } +// else +// {// on a une stabilisation enregistrée, on lit la stabilisation +// int taille=0; // init +// ent >> toto >> taille; +// pt_StabMembBiel->Change_nb_pti(taille); +// for (int i=1;i<= taille;i++) +// {ent >> pt_StabMembBiel->FF_StabMembBiel(i); +// pt_StabMembBiel->FF_StabMembBiel_t(i)=pt_StabMembBiel->FF_StabMembBiel(i); +// }; +// }; // les forces externes éventuelles int indic=0; @@ -781,9 +804,7 @@ void ElemMeca::Ecriture_bas_inf(ofstream& sort,const int cas) {sort << "\n pas_de_stabilisation_transversale ";} else {sort << "\n stabilisation_transversale: "; - if (pt_StabMembBiel->Pt_fct_gamma() != NULL) - {sort << " par_fonction_nD " << pt_StabMembBiel->Pt_fct_gamma()->NomFonction()<<" ";} - else {sort << " par_valeur " << pt_StabMembBiel->Valgamma()<< " ";}; + pt_StabMembBiel->Ecriture_bas_inf(sort,cas); }; break; } @@ -838,11 +859,9 @@ void ElemMeca::Ecriture_bas_inf(ofstream& sort,const int cas) if (pt_StabMembBiel == NULL) {sort << "\n StabTrans 0 ";} else - {int taille = pt_StabMembBiel->Taille(); - sort << "\n StabTrans " << taille << " "; - for (int i=1;i<= taille;i++) - sort << pt_StabMembBiel->FF_StabMembBiel(i) - <<" "; + {sort << "\n StabTrans 1 "; + // on sort systématiquement le cas 2 + pt_StabMembBiel->Ecriture_bas_inf(sort,2) ; }; // les forces externes éventuelles diff --git a/Elements/Mecanique/ElemMeca3.cc b/Elements/Mecanique/ElemMeca3.cc index 50ef117..7b4c93f 100644 --- a/Elements/Mecanique/ElemMeca3.cc +++ b/Elements/Mecanique/ElemMeca3.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -1925,7 +1925,13 @@ void ElemMeca::Accumul_aux_noeuds(const List_io < Ddl_enum_etendu >& lietendu // par ElemMeca, apres sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois Element* ElemMeca::Complete_ElemMeca(BlocGen & bloc,LesFonctions_nD* lesFonctionsnD) - { // cas de la masse volumique + { // avant toute chose, une complétion hors bloc, concernant la stabilisation + if (pt_StabMembBiel != NULL) // ne sert qu'après un démarrage initial sur un base_info + // donc dans la pratique ne sert pas souvent, mais existe pour que + // ElemMeca::StabMembBiel::Lecture_bas_inf soit correcte + pt_StabMembBiel->Complete_StabMembBiel(lesFonctionsnD); + + // cas de la masse volumique if (bloc.Nom(1) == "masse_volumique") { masse_volumique = bloc.Val(1); return this; @@ -2227,26 +2233,27 @@ Element* ElemMeca::Complete_ElemMeca(BlocGen & bloc,LesFonctions_nD* lesFonctio else if (bloc.Nom(3) == "une_fonction_nD_") {// il s'agit d'une fonction nD: récupération de la fonction pt_StabMembBiel->Change_pt_fct_gamma(lesFonctionsnD->Trouve(bloc.Nom(4))); - // pour l'instant seules les variables globales sont autorisées: - if (pt_StabMembBiel->Pt_fct_gamma()->Nom_variables().Taille() == 0) - // cas où il n'y a que des variables globales +// non modif 8 mai 2022 // pour l'instant seules les variables globales sont autorisées: +// if (pt_StabMembBiel->Pt_fct_gamma()->Nom_variables().Taille() == 0) +// // cas où il n'y a que des variables globales {// on vérifie qu'en retour on a un scalaire - Tableau & tava = pt_StabMembBiel->Pt_fct_gamma()->Valeur_pour_variables_globales(); // pour simplifier +// Tableau & tava = pt_StabMembBiel->Pt_fct_gamma()->Valeur_pour_variables_globales(); // pour simplifier if (pt_StabMembBiel->Pt_fct_gamma()->NbComposante() != 1) {cout << "\n *** erreur en mise en place de la stabilisation de membrane et/ou biel : " - << " la fonction nD avec grandeur(s) globale(s) ne renvoie pas un scalaire ! "; +// << " la fonction nD avec grandeur(s) globale(s) ne renvoie pas un scalaire ! "; + << " la fonction nD " << bloc.Nom(4) << " ne renvoie pas un unique scalaire ! "; cout << "\n element: "; this->Affiche(1); cout << "\n fonction nD : "; pt_StabMembBiel->Pt_fct_gamma()->Affiche(); Sortie(1); } } - else - {cout << "\n *** erreur en mise en place de la stabilisation: " - << " la fonction nD ne doit utiliser que des variables globales ! "; - cout << "\n element: "; this->Affiche(1); - cout << "\n fonction nD : "; pt_StabMembBiel->Pt_fct_gamma()->Affiche(); - Sortie(1); - }; +// else +// {cout << "\n *** erreur en mise en place de la stabilisation: " +// << " la fonction nD ne doit utiliser que des variables globales ! "; +// cout << "\n element: "; this->Affiche(1); +// cout << "\n fonction nD : "; pt_StabMembBiel->Pt_fct_gamma()->Affiche(); +// Sortie(1); +// }; } else {cout << "\n **** erreur, en mise en place de la stabilisation: " @@ -2260,12 +2267,34 @@ Element* ElemMeca::Complete_ElemMeca(BlocGen & bloc,LesFonctions_nD* lesFonctio // on passe en revue les noms s'ils existent, > 4 // on va de 2 en 2 for (int i=1;i<= nb_info;i++) - {if (bloc.Nom(3+i*2) == "beta_") + {if (bloc.Nom(3+i*2) == "affichage_stabilisation_") + {pt_StabMembBiel->Change_affichage_stabilisation(ChangeEntier(bloc.Nom(4+i*2)));} + else if (bloc.Nom(3+i*2) == "gestion_maxi_mini_") + {pt_StabMembBiel->Change_gestion_maxi_mini(bool(ChangeEntier(bloc.Nom(4+i*2))));} + else if (bloc.Nom(3+i*2) == "beta_") {pt_StabMembBiel->Change_beta(ChangeReel(bloc.Nom(4+i*2)));} else if (bloc.Nom(3+i*2) == "f_mini_") {pt_StabMembBiel->Change_f_mini(ChangeReel(bloc.Nom(4+i*2)));} else if (bloc.Nom(3+i*2) == "d_maxi_") {pt_StabMembBiel->Change_d_maxi(ChangeReel(bloc.Nom(4+i*2)));} + else if (bloc.Nom(3+i*2) == "specifique_explicite_") + {if (bloc.Nom(4+i*2) == "inactive_stabilisation_") + pt_StabMembBiel->change_activite_en_explicite(false); + else if (bloc.Nom(4+i*2) == "active_stabilisation_") + pt_StabMembBiel->change_activite_en_explicite(true); + } + else if (bloc.Nom(3+i*2) == "ponderation_f_stab_t_") + {// il s'agit d'une fonction nD: récupération de la fonction + pt_StabMembBiel->Change_pt_fct_ponder_Ft(lesFonctionsnD->Trouve(bloc.Nom(4+i*2))); + // on vérifie que c'est bien une fonction scalaire + if (pt_StabMembBiel->Pt_fct_ponder_Ft()->NbComposante() != 1) + {cout << "\n *** erreur en mise en place de la stabilisation de membrane et/ou biel : " + << " la fonction nD " << bloc.Nom(4+i*2) << " n'est pas scalaire "; + cout << "\n element: "; this->Affiche(1); + cout << "\n fonction nD : "; pt_StabMembBiel->Pt_fct_ponder_Ft()->Affiche(); + Sortie(1); + }; + } }; return this; @@ -2310,7 +2339,7 @@ DeuxDoubles ElemMeca::ModifContrainteBulk(Enum_dure temps,const TenseurHH& gijHH if ((bulk_viscosity == 2) || (IDeps < 0.)) { // calcul d'une longueur caractéristique de l'élément // cout << "\n c_carreBulk" << c_carreBulk << " c_traceBulk" << c_traceBulk << endl; - double lon=this->LongueurGeometrique(1); // cas 1 pour l'instant + double lon=this->LongueurGeometrique_mini(1); // cas 1 pour l'instant // on calcul la célérité double cc = sqrt(ElemMeca::Calcul_maxi_E_qui(temps)/masse_volumique); // calcul de la pression @@ -2351,8 +2380,8 @@ const BaseB & ElemMeca::Gib_elemeca(Enum_dure temps, const Noeud * noe) // récup de la référence des coordonnées locales du noeud num const Coordonnee & coo = elem_geom.PtelemRef()(num); // calcul de la dérivée des fonctions au point - const Mat_pleine& ddphi = elem_geom.Dphi(coo); - const Vecteur& pphi = elem_geom.Phi(coo); + const Mat_pleine& ddphi = elem_geom.Dphi_point(coo); + const Vecteur& pphi = elem_geom.Phi_point(coo); // en fonction du temps on calcul la base naturelle switch (temps) { case TEMPS_0: return (met->BaseNat_0(tab_noeud,ddphi,pphi)); break; diff --git a/Elements/Mecanique/ElemMeca4.cc b/Elements/Mecanique/ElemMeca4.cc index d78fac5..701f722 100644 --- a/Elements/Mecanique/ElemMeca4.cc +++ b/Elements/Mecanique/ElemMeca4.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/ElemMeca5.cc b/Elements/Mecanique/ElemMeca5.cc index df22071..081184b 100644 --- a/Elements/Mecanique/ElemMeca5.cc +++ b/Elements/Mecanique/ElemMeca5.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -366,13 +366,13 @@ void ElemMeca::Cal_explicit_hourglass(bool atdt) { // --- calcul de la raideur de l'élément, dans le cas implicite --- Vecteur* resHourglass = NULL; if (atdt) - {resHourglass = tab_elHourglass(1)->CalculResidu_tdt (ParaGlob::param->ParaAlgoControleActifs());} - else - {resHourglass = tab_elHourglass(1)->CalculResidu_t (ParaGlob::param->ParaAlgoControleActifs());}; - // on tiend compte du facteur de modération - (*resHourglass) *= coefStabHourglass; - // on met à jour le résidu de l'élément principal - (*residu) += (*resHourglass); + {resHourglass = tab_elHourglass(1)->CalculResidu_tdt (ParaGlob::param->ParaAlgoControleActifs());} + else + {resHourglass = tab_elHourglass(1)->CalculResidu_t (ParaGlob::param->ParaAlgoControleActifs());}; + // on tiend compte du facteur de modération + (*resHourglass) *= coefStabHourglass; + // on met à jour le résidu de l'élément principal + (*residu) += (*resHourglass); //---- debug //cout << "\n raideur locale après stabilisation d'hourglass "; @@ -538,6 +538,7 @@ double ElemMeca::Energie_Hourglass() // -------------------- stabilisation transversale de membrane ou biel ------------------- // mise à jour de "a_calculer" en fonction du contexte +// NB: pour l'instant ne concerne que le calcul en implicite void ElemMeca::Mise_a_jour_A_calculer_force_stab() {if (pt_StabMembBiel != NULL) {pt_StabMembBiel->Aa_calculer() = true; // on init par défaut @@ -634,6 +635,9 @@ void ElemMeca::Cal_implicit_StabMembBiel(int iteg,const Met_abstraite::Impli& ex ,Tableau * noeud_a_prendre_en_compte) {// l'idée est de bloquer la direction normale à l'élément pour une plaque et // les deux directions transverses pour une biel + int niveau_affichage = ParaGlob::NiveauImpression(); + if (pt_StabMembBiel->Affichage_stabilisation() > 0) + niveau_affichage = pt_StabMembBiel->Affichage_stabilisation(); //---- détermination de l'intensité de stabilisation // celle-ci n'est calculé que dans le cas ou iteg == 0 @@ -993,6 +997,12 @@ void ElemMeca::Cal_implicit_StabMembBiel(int iteg,const Met_abstraite::Impli& ex Enum_type_geom enu_type_geom = Type_geom_generique(this->Id_geometrie()); switch (enu_type_geom) { case SURFACE: +//#ifdef MISE_AU_POINT +// if (num_elt==25) // -----debug à virer +// {cout << "\n ElemMeca::Cal_implicit_StabMembBiel(.."; +// cout << "\n iteg= "<< iteg << flush; +// }; +//#endif if (!Contient_Normale_au_noeud(enu_stab)) // cas où on utilise la normale au pti {// la normale vaut le produit vectoriel des 2 premiers vecteurs @@ -1013,6 +1023,7 @@ void ElemMeca::Cal_implicit_StabMembBiel(int iteg,const Met_abstraite::Impli& ex // dimf-1 coordonnées donc on décrémente dimf--; int nbne = tab_noeud.Taille(); + double ponder_F_t = 1.; // init // si iteg == 0 ==> un seul calcul, global: correspond au calcul d'alpha: == stab_ref // si teg == 1 ==> premier calcul correspondant au premier pti @@ -1032,6 +1043,7 @@ void ElemMeca::Cal_implicit_StabMembBiel(int iteg,const Met_abstraite::Impli& ex // récup des fonctions d'interpolation const Tableau & taphi = elemGeom.TaPhi(); + int nb_noeud_pris_en_compte = 0; //pour faire la moyenne dans le cas iteg == 0 // on applique une force de stabilisation // uniquement suivant la direction de la normale int num_pti=iteg; // init @@ -1046,9 +1058,10 @@ void ElemMeca::Cal_implicit_StabMembBiel(int iteg,const Met_abstraite::Impli& ex continuer = false; if (continuer) {Noeud& noe = *(tab_noeud(ne)); // pour simplifier + nb_noeud_pris_en_compte++; - // pour chaque noeud on va rectifier la normale par rapport à celle calculée au pti - // on va bloquer le déplacement dans la direction de la normale au noeud à t + // on va bloquer le déplacement dans la direction de la normale calculée au pti + //dans un calcul implicit on utilise la position à l'itération 0 // celle-ci peut-être différente de celle à t=0, lorsque l'on a une succession d'algo sur le même incrément // on commence par récupérer les coordonnées pour l'itération 0 @@ -1058,26 +1071,55 @@ void ElemMeca::Cal_implicit_StabMembBiel(int iteg,const Met_abstraite::Impli& ex const Grandeur_coordonnee& cofo = *((Grandeur_coordonnee*) typquel.Const_Grandeur_pointee()); Coordonnee delta_X = noe.Coord2() - cofo.ConteneurCoordonnee_const(); - double normal_fois_delta_X = normale * delta_X; // le déplacement suivant la normale + double normal_fois_delta_X = normale * delta_X; // le déplacement au noeud suivant la normale au pti + // dans le cas où on veut pondérer F_t, on calcule la fonction + if (pt_StabMembBiel->Pt_fct_ponder_Ft() != NULL) + {Fonction_nD* fct = pt_StabMembBiel->Pt_fct_ponder_Ft(); // récupération de la fonction nD + // on commence par récupérer les conteneurs des grandeurs à fournir + List_io & li_enu_scal = fct->Li_enu_etendu_scalaire(); + List_io & li_quelc = fct->Li_equi_Quel_evolue(); + bool absolue = true; // on se place systématiquement en absolu + // on va utiliser la méhode Valeur_multi pour les grandeurs strictement scalaire + int cas = -1; // signifie que l'on utilise la métrique qui vient juste d'être calculée + Tableau val_ddl_enum(ElemMeca::Valeur_multi + (absolue,TEMPS_tdt,li_enu_scal,num_pti,-cas)); + // on utilise la méthode des grandeurs évoluées pour les Coordonnees et Tenseur + Valeurs_Tensorielles(absolue, TEMPS_tdt,li_quelc,num_pti,-cas); + // calcul de la valeur et retour dans tab_ret + Tableau & tab_ret = fct->Valeur_FnD_Evoluee(&val_ddl_enum,&li_enu_scal,&li_quelc,NULL,NULL); + // seule la première valeur est ok + ponder_F_t = tab_ret(1) ; + } // un - car la force doit s'opposer au déplacement double intensite = -alpha * normal_fois_delta_X - + pt_StabMembBiel->FF_StabMembBiel_t(num_pti); + + ponder_F_t * pt_StabMembBiel->FF_StabMembBiel_t(num_pti); // on enregistre le maxi de la force à t maxi_F_t = DabsMaX(maxi_F_t, pt_StabMembBiel->FF_StabMembBiel_t(num_pti)); // d'où une variation réelle d'intensité - double delta_intensite = intensite - pt_StabMembBiel->FF_StabMembBiel_t(num_pti); + double delta_intensite = intensite - ponder_F_t * pt_StabMembBiel->FF_StabMembBiel_t(num_pti); pt_StabMembBiel->EE_StabMembBiel(num_pti) += 0.5 * delta_intensite * normal_fois_delta_X; #ifdef MISE_AU_POINT - if (ParaGlob::NiveauImpression()>7) + if (niveau_affichage>5) + // if (num_elt==25) // -----debug à virer {cout << "\n ElemMeca::Cal_implicit_StabMembBiel(.."; - cout << "\n alpha= "<4) - {cout << "\n residu de stabilisation avant limitation: "<< (*resD) - << "\n residu initial (sans stabilisation): "<< (*residu) - << "\n maxi_F_t= " << maxi_F_t; - }; - if (ParaGlob::NiveauImpression()>4) - {int nb_pti = pt_StabMembBiel->Taille(); - for (int i=1;i<=nb_pti;i++) - cout << "\n F_stab("<FF_StabMembBiel(i)<< " "; - }; - #endif - - // 1) ---- on regarde s'il faut limiter la valeur de la stabilisation - // et on prend en compte dans la raideur globale et le résidu global - // la stabilisation - bool limitation = false; - double coef=1.; // coef de limitation éventuelle si limitation devient true - - // récup des limitations éventuelles - double beta = pt_StabMembBiel->Beta(); - double F_mini = pt_StabMembBiel->F_mini(); - double d_maxi = pt_StabMembBiel->D_maxi(); - - // on refait une boucle sur les pti - int ix=1; - for (int ne =1; ne<= nbne; ne++) - {bool continuer = true; - if (noeud_a_prendre_en_compte != NULL) - if (!(*noeud_a_prendre_en_compte)(ne)) - continuer = false; - if (continuer) - {Noeud& noe = *(tab_noeud(ne)); // pour simplifier - // récup de la force de stabilisation généralisée au noeud - // c'est différent de celle au pti car elle inclue la surface de l'élément - Coordonnee force_stab(dimf); // init - for (int i=1;i<= dimf;i++,ix++) - force_stab(i) = (*resD)(ix); - double intensite_generalise = force_stab.Norme(); - - // on récupère la force externe au noeud à l'instant t - TypeQuelconque_enum_etendu enu_ext(FORCE_GENE_EXT_t); - // récupération du conteneur pour lecture uniquement - const TypeQuelconque& typquel_ext = noe.Grandeur_quelconque(enu_ext); - const Grandeur_coordonnee& cofo_ext = *((Grandeur_coordonnee*) typquel_ext.Const_Grandeur_pointee()); - - // on calcule l'intensité de la force externe selon la normale - double intensite_Fext = Dabs(cofo_ext.ConteneurCoordonnee_const() * normale); - // si l'intensité de la stabilisation est supérieure à beta * intensite_Fext - // on limite - - double maxi_intensite = beta * intensite_Fext; - - // on applique l'algo théorique cf. doc théorique - if (maxi_intensite >= F_mini) - // on est dans le cas où les forces externes existent - {if ((intensite_generalise > maxi_intensite) - && (intensite_generalise > ConstMath::petit) // au cas où maxi_intensite et intensite très petites - ) - {limitation = true; - if (ParaGlob::NiveauImpression()>0) - {cout << "\n limitation stabilisation due aux forces externes, F_stab gene= "<< intensite_generalise - << " ==> " << maxi_intensite; - if (ParaGlob::NiveauImpression()>4) - cout << "\n F_mini= "<< F_mini << " intensite_Fext= "<< intensite_Fext; - }; - coef = DabsMiN(coef, maxi_intensite/intensite_generalise); - }; - // sinon pas de pb donc on ne fait rien - } - else // cas où les forces externes n'existent pas - // la limitation va s'exercée via un déplacement maxi - {maxi_intensite = Dabs(-alpha*d_maxi + maxi_F_t); - {if ((intensite_generalise > maxi_intensite) - && (intensite_generalise > ConstMath::petit) // au cas où maxi_intensite et intensite très petites - ) - {limitation = true; - if (ParaGlob::NiveauImpression()>0) - {cout << "\n limitation stabilisation due deplace maxi acceptable, F_stab gene= "<< intensite_generalise - << " ==> " << maxi_intensite; - if (ParaGlob::NiveauImpression()>4) - cout << "\n maxi_F_t= "<< maxi_F_t << " alpha*d_maxi= " - << (alpha*d_maxi) - << " alpha= " << alpha - << " d_maxi= " << d_maxi; - }; - coef = DabsMiN(coef, maxi_intensite/intensite_generalise); - }; - }; - }; - - }; // fin du test sur les noeuds à considérer - - };// fin de la boucle sur les noeuds - - if (limitation) - { (*resD) *= coef; // mise à jour de la force de stabilisation - // idem au niveau des pti - int taille = pt_StabMembBiel->Taille(); - for (int i=1;i<=taille;i++) - {pt_StabMembBiel->FF_StabMembBiel(i) *=coef; - // cas des énergies - double delta_energie_initiale = - pt_StabMembBiel->EE_StabMembBiel(i) - pt_StabMembBiel->EE_StabMembBiel_t(i); - // on coefficiente le delta - double delta_energie = delta_energie_initiale * coef; - //ce qui donne au final: - pt_StabMembBiel->EE_StabMembBiel(i) = - delta_energie + pt_StabMembBiel->EE_StabMembBiel_t(i); + if (pt_StabMembBiel->Gestion_maxi_mini()) + { + #ifdef MISE_AU_POINT + if (niveau_affichage>9) + // if (num_elt==1) // -----debug à virer + {cout << "\n residu de stabilisation avant limitation: "<< (*resD) + << "\n residu initial (sans stabilisation): "<< (*residu) + << "\n maxi_F_t= " << maxi_F_t; }; + if (niveau_affichage > 5) + // if (num_elt==25) // -----debug à virer + {int nb_pti = pt_StabMembBiel->Taille(); + for (int i=1;i<=nb_pti;i++) + cout << "\n F_stab("<FF_StabMembBiel(i)<< " "; + }; + #endif + + // 1) ---- on regarde s'il faut limiter la valeur de la stabilisation + // et on prend en compte dans la raideur globale et le résidu global + // la stabilisation + bool limitation = false; + double coef=1.; // coef de limitation éventuelle si limitation devient true + + // récup des limitations éventuelles + double beta = pt_StabMembBiel->Beta(); + double F_mini = pt_StabMembBiel->F_mini(); + double d_maxi = pt_StabMembBiel->D_maxi(); + + // on fait une boucle sur les noeuds + int ix=1; + for (int ne =1; ne<= nbne; ne++) + {bool continuer = true; + if (noeud_a_prendre_en_compte != NULL) + if (!(*noeud_a_prendre_en_compte)(ne)) + continuer = false; + if (continuer) + {Noeud& noe = *(tab_noeud(ne)); // pour simplifier + // récup de la force de stabilisation généralisée au noeud + // c'est différent de celle au pti car elle inclue la surface de l'élément + Coordonnee force_stab(dimf); // init + for (int i=1;i<= dimf;i++,ix++) + force_stab(i) = (*resD)(ix); + double intensite_generalise = force_stab.Norme(); + + // on récupère la force externe au noeud à l'instant t + TypeQuelconque_enum_etendu enu_ext(FORCE_GENE_EXT_t); + // récupération du conteneur pour lecture uniquement + const TypeQuelconque& typquel_ext = noe.Grandeur_quelconque(enu_ext); + const Grandeur_coordonnee& cofo_ext = *((Grandeur_coordonnee*) typquel_ext.Const_Grandeur_pointee()); + + // on calcule l'intensité de la force externe selon la normale + double intensite_Fext = Dabs(cofo_ext.ConteneurCoordonnee_const() * normale); + // si l'intensité de la stabilisation est supérieure à beta * intensite_Fext + // on limite + + double maxi_intensite = beta * intensite_Fext; + double max_intens_via_Fext = maxi_intensite; // on sauve pour le cas où on est dep max + + // on applique l'algo théorique cf. doc théorique + // erreur, maxi_intensité est une limitation, mais ce que l'on cherche à voir c'est + // est-ce que les forces externes sont non-nulles, donc c'est intensite_Fext qu'il faut tester + // if (maxi_intensite >= F_mini) + if (intensite_Fext >= F_mini) + // on est dans le cas où les forces externes sont à prendre en compte + {if ((intensite_generalise > maxi_intensite) + && (intensite_generalise > ConstMath::petit) // au cas où maxi_intensite et intensite très petites + ) + {limitation = true; + if (niveau_affichage>3) + {cout << "\n limitation stabilisation due aux forces externes, F_stab gene= "<< intensite_generalise + << " ==> " << maxi_intensite; + if (niveau_affichage > 5) + cout << "\n F_mini= "<< F_mini << " intensite_Fext= "<< intensite_Fext; + }; + coef = DabsMiN(coef, maxi_intensite/intensite_generalise); + }; + // sinon pas de pb donc on ne fait rien + } + else // cas où l'intensité dans la direction normale, des forces externes n'existent pas + // la limitation va s'exercée via un déplacement maxi + {maxi_intensite = Dabs(-alpha*d_maxi + maxi_F_t); + {if ((intensite_generalise > maxi_intensite) + && (intensite_generalise > ConstMath::petit) // au cas où maxi_intensite et intensite très petites + && (Dabs(alpha) > ConstMath::pasmalpetit) // il faut qu'alpha ne soit pas nul + ) + {limitation = true; + if ((niveau_affichage > 3)) + {cout << "\n limitation stabilisation due deplace maxi acceptable, F_stab gene= "<< intensite_generalise + << " ==> " << maxi_intensite + << " (max_intens_via_Fext= "< 4)) + cout << "\n maxi_F_t= "<< maxi_F_t << " alpha*d_maxi= " + << (alpha*d_maxi) + << " alpha= " << alpha + << " d_maxi= " << d_maxi; + }; + coef = DabsMiN(coef, maxi_intensite/intensite_generalise); + }; + }; + }; + + }; // fin du test sur les noeuds à considérer + + };// fin de la boucle sur les noeuds + + if (limitation) + { (*resD) *= coef; // mise à jour de la force de stabilisation + // idem au niveau des pti + int taille = pt_StabMembBiel->Taille(); + for (int i=1;i<=taille;i++) + {pt_StabMembBiel->FF_StabMembBiel(i) *=coef; + // cas des énergies + double delta_energie_initiale = + pt_StabMembBiel->EE_StabMembBiel(i) - pt_StabMembBiel->EE_StabMembBiel_t(i); + // on coefficiente le delta + double delta_energie = delta_energie_initiale * coef; + //ce qui donne au final: + pt_StabMembBiel->EE_StabMembBiel(i) = + delta_energie + pt_StabMembBiel->EE_StabMembBiel_t(i); + }; + }; }; // 2) ---- on met à jour la raideur et résidu global @@ -1304,13 +1377,14 @@ void ElemMeca::Cal_implicit_StabMembBiel(int iteg,const Met_abstraite::Impli& ex // #ifdef MISE_AU_POINT - if (ParaGlob::NiveauImpression()>9) + if ((niveau_affichage > 9)) +// if (num_elt==1) // -----debug à virer {cout << "\n residu de stabilisation: "<< (*resD); cout << "\n raideur de stabilisation: "; matD->Affiche(); cout << "\n fin ElemMeca::Cal_implicit_StabMembBiel(.."; }; #endif - }; // fin du cas iteg == 0 + }; // fin du cas iteg == 0 ou -1 } // fin du cas où on utilise la normale aux pti else @@ -1367,18 +1441,38 @@ void ElemMeca::Cal_implicit_StabMembBiel(int iteg,const Met_abstraite::Impli& ex const Grandeur_coordonnee& cofo = *((Grandeur_coordonnee*) typquel.Const_Grandeur_pointee()); Coordonnee delta_X = noe.Coord2() - cofo.ConteneurCoordonnee_const(); double normal_fois_delta_X = normale * delta_X; - + double ponder_F_t = 1.; // init + // dans le cas où on veut pondérer F_t, on calcule la fonction + if (pt_StabMembBiel->Pt_fct_ponder_Ft() != NULL) + {Fonction_nD* fct = pt_StabMembBiel->Pt_fct_ponder_Ft(); // récupération de la fonction nD + // on commence par récupérer les conteneurs des grandeurs à fournir + List_io & li_enu_scal = fct->Li_enu_etendu_scalaire(); + List_io & li_quelc = fct->Li_equi_Quel_evolue(); + bool absolue = true; // on se place systématiquement en absolu + // on va utiliser la méhode Valeur_multi pour les grandeurs strictement scalaire + int cas = -1; // signifie que l'on utilise la métrique qui vient juste d'être calculée + // au dernier pti ! + Tableau val_ddl_enum(ElemMeca::Valeur_multi + (absolue,TEMPS_tdt,li_enu_scal,nbint,-cas)); + // on utilise la méthode des grandeurs évoluées pour les Coordonnees et Tenseur + Valeurs_Tensorielles(absolue, TEMPS_tdt,li_quelc,nbint,-cas); + // calcul de la valeur et retour dans tab_ret + Tableau & tab_ret = fct->Valeur_FnD_Evoluee(&val_ddl_enum,&li_enu_scal,&li_quelc,NULL,NULL); + // seule la première valeur est ok + ponder_F_t = tab_ret(1) ; + } + // un - car la force doit s'opposer au déplacement double intensite = -alpha * normal_fois_delta_X - + pt_StabMembBiel->FF_StabMembBiel_t(ne); + + ponder_F_t * pt_StabMembBiel->FF_StabMembBiel_t(ne); // on enregistre le maxi de la force à t maxi_F_t = DabsMaX(maxi_F_t, pt_StabMembBiel->FF_StabMembBiel_t(ne)); // d'où une variation réelle d'intensité - double delta_intensite = intensite - pt_StabMembBiel->FF_StabMembBiel_t(ne); + double delta_intensite = intensite - ponder_F_t * pt_StabMembBiel->FF_StabMembBiel_t(ne); pt_StabMembBiel->EE_StabMembBiel(ne) += 0.5 * delta_intensite * normal_fois_delta_X; #ifdef MISE_AU_POINT - if (ParaGlob::NiveauImpression()>7) + if ((niveau_affichage > 5)) {cout << "\n ElemMeca::Cal_implicit_StabMembBiel(.."; cout << "\n alpha= "<Beta(); - double F_mini = pt_StabMembBiel->F_mini(); - double d_maxi = pt_StabMembBiel->D_maxi(); - // on refait une boucle sur les noeuds - int ix=1; - for (int ne =1; ne<= nbne; ne++) - {bool continuer = true; - if (noeud_a_prendre_en_compte != NULL) - if (!(*noeud_a_prendre_en_compte)(ne)) - continuer = false; - if (continuer) - {Noeud& noe = *(tab_noeud(ne)); // pour simplifier - // récup de la force de stabilisation généralisée au noeud - // c'est différent de celle au pti car elle inclue la surface de l'élément - Coordonnee force_stab(dimf); // init - for (int i=1;i<= dimf;i++,ix++) - force_stab(i) = (*resD)(ix); - double intensite_generalise = force_stab.Norme(); - - // on récupère la force externe au noeud à l'instant t - TypeQuelconque_enum_etendu enu_ext(FORCE_GENE_EXT_t); - // récupération du conteneur pour lecture uniquement - const TypeQuelconque& typquel_ext = noe.Grandeur_quelconque(enu_ext); - const Grandeur_coordonnee& cofo_ext = *((Grandeur_coordonnee*) typquel_ext.Const_Grandeur_pointee()); - // on récupère la normale au noeud - const TypeQuelconque& tiq = noe.Grandeur_quelconque(NN_SURF_t); - const Grandeur_coordonnee& gr= *((const Grandeur_coordonnee*) (tiq.Const_Grandeur_pointee())); - const Coordonnee& normale = gr.ConteneurCoordonnee_const(); - - // on calcule l'intensité de la force externe selon la normale - double intensite_Fext = Dabs(cofo_ext.ConteneurCoordonnee_const() * normale); - // si l'intensité de la stabilisation est supérieure à beta * intensite_Fext - // on limite - - double maxi_intensite = beta * intensite_Fext; - - // on applique l'algo théorique cf. doc théorique - if (maxi_intensite >= F_mini) - // on est dans le cas où les forces externes existent - {if ((intensite_generalise > maxi_intensite) - && (intensite_generalise > ConstMath::petit) // au cas où maxi_intintensite très petites - ) - {limitation = true; - if (ParaGlob::NiveauImpression()>0) - {cout << "\n limitation stabilisation due aux forces externes, F_stab gene= "<< intensite_generalise - << " ==> " << maxi_intensite; - if (ParaGlob::NiveauImpression()>4) - cout << "\n F_mini= "<< F_mini << " intensite_Fext= "<< intensite_Fext; - }; - coef = DabsMiN(coef, maxi_intensite/intensite_generalise); - }; - // sinon pas de pb donc on ne fait rien - } - else // cas où les forces externes n'existent pas - // la limitation va s'exercée via un déplacement maxi - {maxi_intensite = Dabs(-alpha*d_maxi + maxi_F_t); - {if ((intensite_generalise > maxi_intensite) - && (intensite_generalise > ConstMath::petit) // au cas où maxi_intintensite très petites - ) - {limitation = true; - if (ParaGlob::NiveauImpression()>0) - {cout << "\n limitation stabilisation due deplace maxi acceptable, F_s"<< intensite_generalise - << " ==> " << maxi_intensite; - if (ParaGlob::NiveauImpression()>4) - cout << "\n maxi_F_t= "<< maxi_F_t << " alpha*d_maxi= " - << (alpha*d_maxi) - << " alpha= " << alpha - << " d_maxi= " << d_maxi; - }; - coef = DabsMiN(coef, maxi_intensite/intensite_generalise); - }; - }; - }; - - }; // fin du test sur les noeuds à considérer - - };// fin de la boucle sur les noeuds - - if (limitation) - { (*resD) *= coef; // mise à jour de la force de stabilisation - // idem au niveau des noeuds - int taille = pt_StabMembBiel->Taille(); - for (int i=1;i<=taille;i++) - {pt_StabMembBiel->FF_StabMembBiel(i) *=coef; - // cas des énergies - double delta_energie_initiale = - pt_StabMembBiel->EE_StabMembBiel(i) - pt_StabMembBiel->EE_StabMembBiel_t(i); - // on coefficiente le delta - double delta_energie = delta_energie_initiale * coef; - //ce qui donne au final: - pt_StabMembBiel->EE_StabMembBiel(i) = - delta_energie + pt_StabMembBiel->EE_StabMembBiel_t(i); + if (pt_StabMembBiel->Gestion_maxi_mini()) + { + #ifdef MISE_AU_POINT + if ((niveau_affichage > 9)) + {cout << "\n residu de stabilisation avant limitation: "<< (*resD) + << "\n residu initial (sans stabilisation): "<< (*residu) + << "\n maxi_F_t= " << maxi_F_t; }; - - // 2) ---- on met à jour la raideur et résidu global - // en tenant compte de la stabilisation - (*residu) += (*resD); - (*raideur) += (*matD); - }; // fin du cas if (limitation) + if ((niveau_affichage > 5)) + {int taille = pt_StabMembBiel->Taille(); + for (int i=1;i<=taille;i++) + cout << "\n F_stab("<FF_StabMembBiel(i)<< " "; + }; + #endif + + // 1) ---- on regarde s'il faut limiter la valeur de la stabilisation + // et on prend en compte dans la raideur globale et le résidu global + // la stabilisation + bool limitation = false; + double coef=1.; // coef de limitation éventuelle si limitation devient true + + // récup des limitations éventuelles + double beta = pt_StabMembBiel->Beta(); + double F_mini = pt_StabMembBiel->F_mini(); + double d_maxi = pt_StabMembBiel->D_maxi(); + // on refait une boucle sur les noeuds + int ix=1; + for (int ne =1; ne<= nbne; ne++) + {bool continuer = true; + if (noeud_a_prendre_en_compte != NULL) + if (!(*noeud_a_prendre_en_compte)(ne)) + continuer = false; + if (continuer) + {Noeud& noe = *(tab_noeud(ne)); // pour simplifier + // récup de la force de stabilisation généralisée au noeud + // c'est différent de celle au pti car elle inclue la surface de l'élément + Coordonnee force_stab(dimf); // init + for (int i=1;i<= dimf;i++,ix++) + force_stab(i) = (*resD)(ix); + double intensite_generalise = force_stab.Norme(); + + // on récupère la force externe au noeud à l'instant t + TypeQuelconque_enum_etendu enu_ext(FORCE_GENE_EXT_t); + // récupération du conteneur pour lecture uniquement + const TypeQuelconque& typquel_ext = noe.Grandeur_quelconque(enu_ext); + const Grandeur_coordonnee& cofo_ext = *((Grandeur_coordonnee*) typquel_ext.Const_Grandeur_pointee()); + // on récupère la normale au noeud + const TypeQuelconque& tiq = noe.Grandeur_quelconque(NN_SURF_t); + const Grandeur_coordonnee& gr= *((const Grandeur_coordonnee*) (tiq.Const_Grandeur_pointee())); + const Coordonnee& normale = gr.ConteneurCoordonnee_const(); + + // on calcule l'intensité de la force externe selon la normale + double intensite_Fext = Dabs(cofo_ext.ConteneurCoordonnee_const() * normale); + // si l'intensité de la stabilisation est supérieure à beta * intensite_Fext + // on limite + + double maxi_intensite = beta * intensite_Fext; + double max_intens_via_Fext = maxi_intensite; // on sauve pour le cas où on est dep max + + + // on applique l'algo théorique cf. doc théorique + if (intensite_Fext >= F_mini) + // on est dans le cas où les forces externes existent + {if ((intensite_generalise > maxi_intensite) + && (intensite_generalise > ConstMath::petit) // au cas où maxi_intintensite très petites + ) + {limitation = true; + if ((niveau_affichage > 3)) + {cout << "\n limitation stabilisation due aux forces externes, F_stab gene= "<< intensite_generalise + << " ==> " << maxi_intensite; + if ((niveau_affichage>4) + || (pt_StabMembBiel->Affichage_stabilisation() > 4)) + cout << "\n F_mini= "<< F_mini << " intensite_Fext= "<< intensite_Fext; + }; + coef = DabsMiN(coef, maxi_intensite/intensite_generalise); + }; + // sinon pas de pb donc on ne fait rien + } + else // cas où les forces externes n'existent pas + // la limitation va s'exercée via un déplacement maxi + {maxi_intensite = Dabs(-alpha*d_maxi + maxi_F_t); + {if ((intensite_generalise > maxi_intensite) + && (intensite_generalise > ConstMath::petit) // au cas où maxi_intintensite très petites + && (Dabs(alpha) > ConstMath::pasmalpetit) // il faut qu'alpha ne soit pas nul + ) + {limitation = true; + if ((niveau_affichage > 3)) + {cout << "\n limitation stabilisation due deplace maxi acceptable, F_s"<< intensite_generalise + << " ==> " << maxi_intensite + << " (max_intens_via_Fext= "< 4)) + cout << "\n maxi_F_t= "<< maxi_F_t << " alpha*d_maxi= " + << (alpha*d_maxi) + << " alpha= " << alpha + << " d_maxi= " << d_maxi; + }; + coef = DabsMiN(coef, maxi_intensite/intensite_generalise); + }; + }; + }; + + }; // fin du test sur les noeuds à considérer + + };// fin de la boucle sur les noeuds + + if (limitation) + { (*resD) *= coef; // mise à jour de la force de stabilisation + // idem au niveau des noeuds + int taille = pt_StabMembBiel->Taille(); + for (int i=1;i<=taille;i++) + {pt_StabMembBiel->FF_StabMembBiel(i) *=coef; + // cas des énergies + double delta_energie_initiale = + pt_StabMembBiel->EE_StabMembBiel(i) - pt_StabMembBiel->EE_StabMembBiel_t(i); + // on coefficiente le delta + double delta_energie = delta_energie_initiale * coef; + //ce qui donne au final: + pt_StabMembBiel->EE_StabMembBiel(i) = + delta_energie + pt_StabMembBiel->EE_StabMembBiel_t(i); + }; + + // 2) ---- on met à jour la raideur et résidu global + // en tenant compte de la stabilisation + (*residu) += (*resD); + (*raideur) += (*matD); + }; // fin du cas if (limitation) }; // fin du cas ou on applique éventuellement une limitation #ifdef MISE_AU_POINT - if (ParaGlob::NiveauImpression()>9) + if ((niveau_affichage > 9)) {cout << "\n residu de stabilisation: "<< (*resD); cout << "\n raideur de stabilisation: "; matD->Affiche(); cout << "\n fin debug ElemMeca::Cal_implicit_StabMembBiel(.."; @@ -1564,6 +1665,9 @@ void ElemMeca::Cal_explicit_StabMembBiel(int iteg,const Met_abstraite::Expli_t_t // l'idée est de bloquer la direction normale à l'élément pour une plaque et // les deux directions transverses pour une biel + int niveau_affichage = ParaGlob::NiveauImpression(); + if (pt_StabMembBiel->Affichage_stabilisation() > 0) + niveau_affichage = pt_StabMembBiel->Affichage_stabilisation(); //---- détermination de l'intensité de stabilisation // ici on ne s'occupe pas de l'itération ni de l'incrément, dans tous les cas @@ -1573,12 +1677,20 @@ void ElemMeca::Cal_explicit_StabMembBiel(int iteg,const Met_abstraite::Expli_t_t double alpha = 0.; // init bool stab_utilisable = false; // init Enum_StabMembraneBiel enu_stab = pt_StabMembBiel->Type_stabMembrane(); + + if (pt_StabMembBiel != NULL) - { alpha = pt_StabMembBiel->Stab_ref(); // récup de l'intensité de stabilisation + if (pt_StabMembBiel->Activite_en_explicite()) + { //alpha = pt_StabMembBiel->Stab_ref(); // récup de l'intensité de stabilisation // ce n'est pas un pointeur, alpha est une variable locale + // stab_ref, par défaut == 1, mais dans le cas d'un passage + // implicit -> explicite : vaut la dernière valeur implicite calculée + // cela permet de profiter du passage en implicite, en récupérant l'intensité + // de raideur réelle + alpha = pt_StabMembBiel->Stab_ref(); // init // dans le cas d'une fonction multiplicatrice , - // et il faut appeler la fonction qui peut varier pendant les itérations + // et il faut appeler la fonction qui peut varier if (pt_StabMembBiel->Pt_fct_gamma() != NULL) // cas où il y a une fonction nD {Fonction_nD* fct = pt_StabMembBiel->Pt_fct_gamma(); // récupération de la fonction nD @@ -1588,9 +1700,15 @@ void ElemMeca::Cal_explicit_StabMembBiel(int iteg,const Met_abstraite::Expli_t_t bool absolue = true; // on se place systématiquement en absolu // on va utiliser la méhode Valeur_multi pour les grandeurs strictement scalaire int cas = -1; // signifie que l'on utilise la métrique qui vient juste d'être calculée - Tableau val_ddl_enum(ElemMeca::Valeur_multi(absolue,TEMPS_tdt,li_enu_scal,iteg,-cas)); + int num_iteg_a_considerer; // init + if (iteg > 0) // on est dans la boucle + num_iteg_a_considerer = iteg; + else // sinon on est à la sortie de la boucle + num_iteg_a_considerer = nbint; + Tableau val_ddl_enum(ElemMeca::Valeur_multi + (absolue,TEMPS_tdt,li_enu_scal,num_iteg_a_considerer,-cas)); // on utilise la méthode des grandeurs évoluées pour les Coordonnees et Tenseur - Valeurs_Tensorielles(absolue, TEMPS_tdt,li_quelc,iteg,-cas); + Valeurs_Tensorielles(absolue, TEMPS_tdt,li_quelc,num_iteg_a_considerer,-cas); // calcul de la valeur et retour dans tab_ret Tableau & tab_ret = fct->Valeur_FnD_Evoluee(&val_ddl_enum,&li_enu_scal,&li_quelc,NULL,NULL); // seule la première valeur est ok @@ -1598,7 +1716,8 @@ void ElemMeca::Cal_explicit_StabMembBiel(int iteg,const Met_abstraite::Expli_t_t pt_StabMembBiel->Valgamma() = alpha; // on sauvegarde la valeur d'alpha } else // sinon cela veut dire que l'intensité de stabilisation est fixe - {alpha *= pt_StabMembBiel->Valgamma();} + // en explicite c'est directement la valeur lue + {alpha *= pt_StabMembBiel->Valgamma() ;} stab_utilisable=true; }; @@ -1622,8 +1741,9 @@ void ElemMeca::Cal_explicit_StabMembBiel(int iteg,const Met_abstraite::Expli_t_t // dimf-1 coordonnées donc on décrémente dimf--; int nbne = tab_noeud.Taille(); - - // si teg == 1 ==> premier calcul correspondant au premier pti + double ponder_F_t = 1.; // init + + // si iteg == 1 ==> premier calcul correspondant au premier pti if (iteg == 1) { resD->Inita(0.); maxi_F_t = 0.; @@ -1659,7 +1779,6 @@ void ElemMeca::Cal_explicit_StabMembBiel(int iteg,const Met_abstraite::Expli_t_t // pour chaque noeud on va rectifier la normale par rapport à celle calculée au pti // on va bloquer le déplacement dans la direction de la normale au noeud à t - //dans un calcul implicit on utilise la position à l'itération 0 // celle-ci peut-être différente de celle à t=0, lorsque l'on a une succession d'algo sur le même incrément // on commence par récupérer les coordonnées pour l'itération 0 TypeQuelconque_enum_etendu enu(XI_ITER_0); @@ -1669,17 +1788,35 @@ void ElemMeca::Cal_explicit_StabMembBiel(int iteg,const Met_abstraite::Expli_t_t Coordonnee delta_X = noe.Coord2() - cofo.ConteneurCoordonnee_const(); double normal_fois_delta_X = normale * delta_X; // le déplacement suivant la normale + // dans le cas où on veut pondérer F_t, on calcule la fonction + if (pt_StabMembBiel->Pt_fct_ponder_Ft() != NULL) + {Fonction_nD* fct = pt_StabMembBiel->Pt_fct_ponder_Ft(); // récupération de la fonction nD + // on commence par récupérer les conteneurs des grandeurs à fournir + List_io & li_enu_scal = fct->Li_enu_etendu_scalaire(); + List_io & li_quelc = fct->Li_equi_Quel_evolue(); + bool absolue = true; // on se place systématiquement en absolu + // on va utiliser la méhode Valeur_multi pour les grandeurs strictement scalaire + int cas = -1; // signifie que l'on utilise la métrique qui vient juste d'être calculée + Tableau val_ddl_enum(ElemMeca::Valeur_multi + (absolue,TEMPS_tdt,li_enu_scal,num_pti,-cas)); + // on utilise la méthode des grandeurs évoluées pour les Coordonnees et Tenseur + Valeurs_Tensorielles(absolue, TEMPS_tdt,li_quelc,num_pti,-cas); + // calcul de la valeur et retour dans tab_ret + Tableau & tab_ret = fct->Valeur_FnD_Evoluee(&val_ddl_enum,&li_enu_scal,&li_quelc,NULL,NULL); + // seule la première valeur est ok + ponder_F_t = tab_ret(1) ; + } // un - car la force doit s'opposer au déplacement double intensite = -alpha * normal_fois_delta_X - + pt_StabMembBiel->FF_StabMembBiel_t(num_pti); + + ponder_F_t * pt_StabMembBiel->FF_StabMembBiel_t(num_pti); // on enregistre le maxi de la force à t maxi_F_t = DabsMaX(maxi_F_t, pt_StabMembBiel->FF_StabMembBiel_t(num_pti)); // d'où une variation réelle d'intensité - double delta_intensite = intensite - pt_StabMembBiel->FF_StabMembBiel_t(num_pti); + double delta_intensite = intensite - ponder_F_t * pt_StabMembBiel->FF_StabMembBiel_t(num_pti); pt_StabMembBiel->EE_StabMembBiel(num_pti) += 0.5 * delta_intensite * normal_fois_delta_X; #ifdef MISE_AU_POINT - if (ParaGlob::NiveauImpression()>7) + if ((niveau_affichage > 5)) {cout << "\n ElemMeca::Cal_explicit_StabMembBiel(.."; cout << "\n alpha= "<Beta(); - double F_mini = pt_StabMembBiel->F_mini(); - double d_maxi = pt_StabMembBiel->D_maxi(); - - // on refait une boucle sur les pti - int ix=1; - for (int ne =1; ne<= nbne; ne++) - {bool continuer = true; - if (noeud_a_prendre_en_compte != NULL) - if (!(*noeud_a_prendre_en_compte)(ne)) - continuer = false; - if (continuer) - {Noeud& noe = *(tab_noeud(ne)); // pour simplifier - // récup de la force de stabilisation généralisée au noeud - // c'est différent de celle au pti car elle inclue la surface de l'élément - Coordonnee force_stab(dimf); // init - for (int i=1;i<= dimf;i++,ix++) - force_stab(i) = (*resD)(ix); - double intensite_generalise = force_stab.Norme(); - - // on récupère la force externe au noeud à l'instant t - TypeQuelconque_enum_etendu enu_ext(FORCE_GENE_EXT_t); - // récupération du conteneur pour lecture uniquement - const TypeQuelconque& typquel_ext = noe.Grandeur_quelconque(enu_ext); - const Grandeur_coordonnee& cofo_ext = *((Grandeur_coordonnee*) typquel_ext.Const_Grandeur_pointee()); - - // on calcule l'intensité de la force externe selon la normale - double intensite_Fext = Dabs(cofo_ext.ConteneurCoordonnee_const() * normale); - // si l'intensité de la stabilisation est supérieure à beta * intensite_Fext - // on limite - - double maxi_intensite = beta * intensite_Fext; - - // on applique l'algo théorique cf. doc théorique - if (maxi_intensite >= F_mini) - // on est dans le cas où les forces externes existent - {if ((intensite_generalise > maxi_intensite) - && (intensite_generalise > ConstMath::petit) // au cas où maxi_intensite et intensite très petites - ) - {limitation = true; - if (ParaGlob::NiveauImpression()>0) - {cout << "\n limitation stabilisation due aux forces externes, F_stab gene= "<< intensite_generalise - << " ==> " << maxi_intensite; - if (ParaGlob::NiveauImpression()>4) - cout << "\n F_mini= "<< F_mini << " intensite_Fext= "<< intensite_Fext; - }; - coef = DabsMiN(coef, maxi_intensite/intensite_generalise); - }; - // sinon pas de pb donc on ne fait rien - } - else // cas où les forces externes n'existent pas - // la limitation va s'exercée via un déplacement maxi - {maxi_intensite = Dabs(-alpha*d_maxi + maxi_F_t); - {if ((intensite_generalise > maxi_intensite) - && (intensite_generalise > ConstMath::petit) // au cas où maxi_intensite et intensite très petites - ) - {limitation = true; - if (ParaGlob::NiveauImpression()>0) - {cout << "\n limitation stabilisation due deplace maxi acceptable, F_stab gene= "<< intensite_generalise - << " ==> " << maxi_intensite; - if (ParaGlob::NiveauImpression()>4) - cout << "\n maxi_F_t= "<< maxi_F_t << " alpha*d_maxi= " - << (alpha*d_maxi) - << " alpha= " << alpha - << " d_maxi= " << d_maxi; - }; - coef = DabsMiN(coef, maxi_intensite/intensite_generalise); - }; - }; + if (pt_StabMembBiel->Gestion_maxi_mini()) + { + #ifdef MISE_AU_POINT + if ((niveau_affichage > 5)) + {cout << "\n residu de stabilisation avant limitation: "<< (*resD) + << "\n residu initial (sans stabilisation): "<< (*residu) + << "\n maxi_F_t= " << maxi_F_t; }; - - }; // fin du test sur les noeuds à considérer + if ((niveau_affichage > 5)) + {int nb_pti = pt_StabMembBiel->Taille(); + for (int i=1;i<=nb_pti;i++) + cout << "\n F_stab("<FF_StabMembBiel(i)<< " "; + }; + #endif - };// fin de la boucle sur les noeuds - - if (limitation) - { (*resD) *= coef; // mise à jour de la force de stabilisation - // idem au niveau des pti - int taille = pt_StabMembBiel->Taille(); - for (int i=1;i<=taille;i++) - {pt_StabMembBiel->FF_StabMembBiel(i) *=coef; - // cas des énergies - double delta_energie_initiale = - pt_StabMembBiel->EE_StabMembBiel(i) - pt_StabMembBiel->EE_StabMembBiel_t(i); - // on coefficiente le delta - double delta_energie = delta_energie_initiale * coef; - //ce qui donne au final: - pt_StabMembBiel->EE_StabMembBiel(i) = - delta_energie + pt_StabMembBiel->EE_StabMembBiel_t(i); - }; - }; + // 1) ---- on regarde s'il faut limiter la valeur de la stabilisation + // et on prend en compte dans la raideur globale et le résidu global + // la stabilisation + bool limitation = false; + double coef=1.; // coef de limitation éventuelle si limitation devient true + + // récup des limitations éventuelles + double beta = pt_StabMembBiel->Beta(); + double F_mini = pt_StabMembBiel->F_mini(); + double d_maxi = pt_StabMembBiel->D_maxi(); + + // on refait une boucle sur les pti + int ix=1; + for (int ne =1; ne<= nbne; ne++) + {bool continuer = true; + if (noeud_a_prendre_en_compte != NULL) + if (!(*noeud_a_prendre_en_compte)(ne)) + continuer = false; + if (continuer) + {Noeud& noe = *(tab_noeud(ne)); // pour simplifier + // récup de la force de stabilisation généralisée au noeud + // c'est différent de celle au pti car elle inclue la surface de l'élément + Coordonnee force_stab(dimf); // init + for (int i=1;i<= dimf;i++,ix++) + force_stab(i) = (*resD)(ix); + double intensite_generalise = force_stab.Norme(); + + // on récupère la force externe au noeud à l'instant t + TypeQuelconque_enum_etendu enu_ext(FORCE_GENE_EXT_t); + // récupération du conteneur pour lecture uniquement + const TypeQuelconque& typquel_ext = noe.Grandeur_quelconque(enu_ext); + const Grandeur_coordonnee& cofo_ext = *((Grandeur_coordonnee*) typquel_ext.Const_Grandeur_pointee()); + + // on calcule l'intensité de la force externe selon la normale + double intensite_Fext = Dabs(cofo_ext.ConteneurCoordonnee_const() * normale); + // si l'intensité de la stabilisation est supérieure à beta * intensite_Fext + // on limite + + double maxi_intensite = beta * intensite_Fext; + double max_intens_via_Fext = maxi_intensite; // on sauve pour le cas où on est dep max + + + // on applique l'algo théorique cf. doc théorique + if (intensite_Fext >= F_mini) + // on est dans le cas où les forces externes existent + {if ((intensite_generalise > maxi_intensite) + && (intensite_generalise > ConstMath::petit) // au cas où maxi_intensite et intensite très petites + ) + {limitation = true; + if ((niveau_affichage > 3)) + {cout << "\n limitation stabilisation due aux forces externes, F_stab gene= "<< intensite_generalise + << " ==> " << maxi_intensite; + if ((niveau_affichage > 5)) + cout << "\n F_mini= "<< F_mini << " intensite_Fext= "<< intensite_Fext; + }; + coef = DabsMiN(coef, maxi_intensite/intensite_generalise); + }; + // sinon pas de pb donc on ne fait rien + } + else // cas où les forces externes n'existent pas + // la limitation va s'exercée via un déplacement maxi + {maxi_intensite = Dabs(-alpha*d_maxi + maxi_F_t); + {if ((intensite_generalise > maxi_intensite) + && (intensite_generalise > ConstMath::petit) // au cas où maxi_intensite et intensite très petites + && (Dabs(alpha) > ConstMath::pasmalpetit) // il faut qu'alpha ne soit pas nul + ) + {limitation = true; + if ((niveau_affichage > 3)) + {cout << "\n limitation stabilisation due deplace maxi acceptable, F_stab gene= "<< intensite_generalise + << " ==> " << maxi_intensite + << " (max_intens_via_Fext= "< 4)) + cout << "\n maxi_F_t= "<< maxi_F_t << " alpha*d_maxi= " + << (alpha*d_maxi) + << " alpha= " << alpha + << " d_maxi= " << d_maxi; + }; + coef = DabsMiN(coef, maxi_intensite/intensite_generalise); + }; + }; + }; + + }; // fin du test sur les noeuds à considérer + + };// fin de la boucle sur les noeuds + + if (limitation) + { (*resD) *= coef; // mise à jour de la force de stabilisation + // idem au niveau des pti + int taille = pt_StabMembBiel->Taille(); + for (int i=1;i<=taille;i++) + {pt_StabMembBiel->FF_StabMembBiel(i) *=coef; + // cas des énergies + double delta_energie_initiale = + pt_StabMembBiel->EE_StabMembBiel(i) - pt_StabMembBiel->EE_StabMembBiel_t(i); + // on coefficiente le delta + double delta_energie = delta_energie_initiale * coef; + //ce qui donne au final: + pt_StabMembBiel->EE_StabMembBiel(i) = + delta_energie + pt_StabMembBiel->EE_StabMembBiel_t(i); + }; + }; + }; // fin mise en place d'une limitation éventuelle // 2) ---- on met à jour le résidu global // en tenant compte de la stabilisation (*residu) += (*resD); #ifdef MISE_AU_POINT - if (ParaGlob::NiveauImpression()>9) + if ((niveau_affichage > 9)) {cout << "\n residu de stabilisation: "<< (*resD); cout << "\n fin ElemMeca::Cal_explicit_StabMembBiel(.."; }; @@ -1922,18 +2049,38 @@ void ElemMeca::Cal_explicit_StabMembBiel(int iteg,const Met_abstraite::Expli_t_t const Grandeur_coordonnee& cofo = *((Grandeur_coordonnee*) typquel.Const_Grandeur_pointee()); Coordonnee delta_X = noe.Coord2() - cofo.ConteneurCoordonnee_const(); double normal_fois_delta_X = normale * delta_X; - + double ponder_F_t = 1.; // init + // dans le cas où on veut pondérer F_t, on calcule la fonction + if (pt_StabMembBiel->Pt_fct_ponder_Ft() != NULL) + {Fonction_nD* fct = pt_StabMembBiel->Pt_fct_ponder_Ft(); // récupération de la fonction nD + // on commence par récupérer les conteneurs des grandeurs à fournir + List_io & li_enu_scal = fct->Li_enu_etendu_scalaire(); + List_io & li_quelc = fct->Li_equi_Quel_evolue(); + bool absolue = true; // on se place systématiquement en absolu + // on va utiliser la méhode Valeur_multi pour les grandeurs strictement scalaire + int cas = -1; // signifie que l'on utilise la métrique qui vient juste d'être calculée + // au dernier pti ! + Tableau val_ddl_enum(ElemMeca::Valeur_multi + (absolue,TEMPS_tdt,li_enu_scal,nbint,-cas)); + // on utilise la méthode des grandeurs évoluées pour les Coordonnees et Tenseur + Valeurs_Tensorielles(absolue, TEMPS_tdt,li_quelc,nbint,-cas); + // calcul de la valeur et retour dans tab_ret + Tableau & tab_ret = fct->Valeur_FnD_Evoluee(&val_ddl_enum,&li_enu_scal,&li_quelc,NULL,NULL); + // seule la première valeur est ok + ponder_F_t = tab_ret(1) ; + } + // un - car la force doit s'opposer au déplacement double intensite = -alpha * normal_fois_delta_X - + pt_StabMembBiel->FF_StabMembBiel_t(ne); + + ponder_F_t * pt_StabMembBiel->FF_StabMembBiel_t(ne); // on enregistre le maxi de la force à t maxi_F_t = DabsMaX(maxi_F_t, pt_StabMembBiel->FF_StabMembBiel_t(ne)); // d'où une variation réelle d'intensité - double delta_intensite = intensite - pt_StabMembBiel->FF_StabMembBiel_t(ne); + double delta_intensite = intensite - ponder_F_t * pt_StabMembBiel->FF_StabMembBiel_t(ne); pt_StabMembBiel->EE_StabMembBiel(ne) += 0.5 * delta_intensite * normal_fois_delta_X; #ifdef MISE_AU_POINT - if (ParaGlob::NiveauImpression()>7) + if ((niveau_affichage > 5)) {cout << "\n ElemMeca::Cal_explicit_StabMembBiel(.."; cout << "\n alpha= "<Beta(); - double F_mini = pt_StabMembBiel->F_mini(); - double d_maxi = pt_StabMembBiel->D_maxi(); - // on refait une boucle sur les noeuds - int ix=1; - for (int ne =1; ne<= nbne; ne++) - {bool continuer = true; - if (noeud_a_prendre_en_compte != NULL) - if (!(*noeud_a_prendre_en_compte)(ne)) - continuer = false; - if (continuer) - {Noeud& noe = *(tab_noeud(ne)); // pour simplifier - // récup de la force de stabilisation généralisée au noeud - // c'est différent de celle au pti car elle inclue la surface de l'élément - Coordonnee force_stab(dimf); // init - for (int i=1;i<= dimf;i++,ix++) - force_stab(i) = (*resD)(ix); - double intensite_generalise = force_stab.Norme(); - - // on récupère la force externe au noeud à l'instant t - TypeQuelconque_enum_etendu enu_ext(FORCE_GENE_EXT_t); - // récupération du conteneur pour lecture uniquement - const TypeQuelconque& typquel_ext = noe.Grandeur_quelconque(enu_ext); - const Grandeur_coordonnee& cofo_ext = *((Grandeur_coordonnee*) typquel_ext.Const_Grandeur_pointee()); - // on récupère la normale au noeud - const TypeQuelconque& tiq = noe.Grandeur_quelconque(NN_SURF_t); - const Grandeur_coordonnee& gr= *((const Grandeur_coordonnee*) (tiq.Const_Grandeur_pointee())); - const Coordonnee& normale = gr.ConteneurCoordonnee_const(); - - // on calcule l'intensité de la force externe selon la normale - double intensite_Fext = Dabs(cofo_ext.ConteneurCoordonnee_const() * normale); - // si l'intensité de la stabilisation est supérieure à beta * intensite_Fext - // on limite - - double maxi_intensite = beta * intensite_Fext; - - // on applique l'algo théorique cf. doc théorique - if (maxi_intensite >= F_mini) - // on est dans le cas où les forces externes existent - {if ((intensite_generalise > maxi_intensite) - && (intensite_generalise > ConstMath::petit) // au cas où maxi_intintensite très petites - ) - {limitation = true; - if (ParaGlob::NiveauImpression()>0) - {cout << "\n limitation stabilisation due aux forces externes, F_stab gene= "<< intensite_generalise - << " ==> " << maxi_intensite; - if (ParaGlob::NiveauImpression()>4) - cout << "\n F_mini= "<< F_mini << " intensite_Fext= "<< intensite_Fext; - }; - coef = DabsMiN(coef, maxi_intensite/intensite_generalise); - }; - // sinon pas de pb donc on ne fait rien - } - else // cas où les forces externes n'existent pas - // la limitation va s'exercée via un déplacement maxi - {maxi_intensite = Dabs(-alpha*d_maxi + maxi_F_t); - {if ((intensite_generalise > maxi_intensite) - && (intensite_generalise > ConstMath::petit) // au cas où maxi_intintensite très petites - ) - {limitation = true; - if (ParaGlob::NiveauImpression()>0) - {cout << "\n limitation stabilisation due deplace maxi acceptable, F_s"<< intensite_generalise - << " ==> " << maxi_intensite; - if (ParaGlob::NiveauImpression()>4) - cout << "\n maxi_F_t= "<< maxi_F_t << " alpha*d_maxi= " - << (alpha*d_maxi) - << " alpha= " << alpha - << " d_maxi= " << d_maxi; - }; - coef = DabsMiN(coef, maxi_intensite/intensite_generalise); - }; - }; - }; - - }; // fin du test sur les noeuds à considérer - - };// fin de la boucle sur les noeuds + if (pt_StabMembBiel->Gestion_maxi_mini()) + { + #ifdef MISE_AU_POINT + if ((niveau_affichage > 4)) + {cout << "\n residu de stabilisation avant limitation: "<< (*resD) + << "\n residu initial (sans stabilisation): "<< (*residu) + << "\n maxi_F_t= " << maxi_F_t; + }; + if ((niveau_affichage > 4)) + {int taille = pt_StabMembBiel->Taille(); + for (int i=1;i<=taille;i++) + cout << "\n F_stab("<FF_StabMembBiel(i)<< " "; + }; + #endif + + // 1) ---- on regarde s'il faut limiter la valeur de la stabilisation + // et on prend en compte dans la raideur globale et le résidu global + // la stabilisation + bool limitation = false; + double coef=1.; // coef de limitation éventuelle si limitation devient true + + // récup des limitations éventuelles + double beta = pt_StabMembBiel->Beta(); + double F_mini = pt_StabMembBiel->F_mini(); + double d_maxi = pt_StabMembBiel->D_maxi(); + // on refait une boucle sur les noeuds + int ix=1; + for (int ne =1; ne<= nbne; ne++) + {bool continuer = true; + if (noeud_a_prendre_en_compte != NULL) + if (!(*noeud_a_prendre_en_compte)(ne)) + continuer = false; + if (continuer) + {Noeud& noe = *(tab_noeud(ne)); // pour simplifier + // récup de la force de stabilisation généralisée au noeud + // c'est différent de celle au pti car elle inclue la surface de l'élément + Coordonnee force_stab(dimf); // init + for (int i=1;i<= dimf;i++,ix++) + force_stab(i) = (*resD)(ix); + double intensite_generalise = force_stab.Norme(); - if (limitation) - { (*resD) *= coef; // mise à jour de la force de stabilisation - // idem au niveau des noeuds - int taille = pt_StabMembBiel->Taille(); - for (int i=1;i<=taille;i++) - {pt_StabMembBiel->FF_StabMembBiel(i) *=coef; - // cas des énergies - double delta_energie_initiale = - pt_StabMembBiel->EE_StabMembBiel(i) - pt_StabMembBiel->EE_StabMembBiel_t(i); - // on coefficiente le delta - double delta_energie = delta_energie_initiale * coef; - //ce qui donne au final: - pt_StabMembBiel->EE_StabMembBiel(i) = - delta_energie + pt_StabMembBiel->EE_StabMembBiel_t(i); - }; - - // 2) ---- on met à jour la raideur et résidu global - // en tenant compte de la stabilisation - (*residu) += (*resD); - }; // fin du cas if (limitation) - }; // fin du cas ou on applique éventuellement une limitation + // on récupère la force externe au noeud à l'instant t + TypeQuelconque_enum_etendu enu_ext(FORCE_GENE_EXT_t); + // récupération du conteneur pour lecture uniquement + const TypeQuelconque& typquel_ext = noe.Grandeur_quelconque(enu_ext); + const Grandeur_coordonnee& cofo_ext = *((Grandeur_coordonnee*) typquel_ext.Const_Grandeur_pointee()); + // on récupère la normale au noeud + const TypeQuelconque& tiq = noe.Grandeur_quelconque(NN_SURF_t); + const Grandeur_coordonnee& gr= *((const Grandeur_coordonnee*) (tiq.Const_Grandeur_pointee())); + const Coordonnee& normale = gr.ConteneurCoordonnee_const(); - #ifdef MISE_AU_POINT - if (ParaGlob::NiveauImpression()>9) - {cout << "\n residu de stabilisation: "<< (*resD); - cout << "\n fin debug ElemMeca::Cal_explicit_StabMembBiel(.."; - }; - #endif + // on calcule l'intensité de la force externe selon la normale + double intensite_Fext = Dabs(cofo_ext.ConteneurCoordonnee_const() * normale); + // si l'intensité de la stabilisation est supérieure à beta * intensite_Fext + // on limite + + double maxi_intensite = beta * intensite_Fext; + double max_intens_via_Fext = maxi_intensite; // on sauve pour le cas où on est en dep max + + + // on applique l'algo théorique cf. doc théorique + if (intensite_Fext >= F_mini) + // on est dans le cas où les forces externes existent + {if ((intensite_generalise > maxi_intensite) + && (intensite_generalise > ConstMath::petit) // au cas où maxi_intintensite très petites + ) + {limitation = true; + if ((niveau_affichage > 3)) + {cout << "\n limitation stabilisation due aux forces externes, F_stab gene= "<< intensite_generalise + << " ==> " << maxi_intensite; + if ((niveau_affichage > 4)) + cout << "\n F_mini= "<< F_mini << " intensite_Fext= "<< intensite_Fext; + }; + coef = DabsMiN(coef, maxi_intensite/intensite_generalise); + }; + // sinon pas de pb donc on ne fait rien + } + else // cas où les forces externes n'existent pas + // la limitation va s'exercée via un déplacement maxi + {maxi_intensite = Dabs(-alpha*d_maxi + maxi_F_t); + {if ((intensite_generalise > maxi_intensite) + && (intensite_generalise > ConstMath::petit) // au cas où maxi_intintensite très petites + && (Dabs(alpha) > ConstMath::pasmalpetit) // il faut qu'alpha ne soit pas nul + ) + {limitation = true; + if ((niveau_affichage > 3)) + {cout << "\n limitation stabilisation due deplace maxi acceptable, F_s"<< intensite_generalise + << " ==> " << maxi_intensite << " (max_intens_via_Fext= "< 4)) + cout << "\n maxi_F_t= "<< maxi_F_t << " alpha*d_maxi= " + << (alpha*d_maxi) + << " alpha= " << alpha + << " d_maxi= " << d_maxi; + }; + coef = DabsMiN(coef, maxi_intensite/intensite_generalise); + }; + }; + }; + + }; // fin du test sur les noeuds à considérer + + };// fin de la boucle sur les noeuds + + if (limitation) + { (*resD) *= coef; // mise à jour de la force de stabilisation + // idem au niveau des noeuds + int taille = pt_StabMembBiel->Taille(); + for (int i=1;i<=taille;i++) + {pt_StabMembBiel->FF_StabMembBiel(i) *=coef; + // cas des énergies + double delta_energie_initiale = + pt_StabMembBiel->EE_StabMembBiel(i) - pt_StabMembBiel->EE_StabMembBiel_t(i); + // on coefficiente le delta + double delta_energie = delta_energie_initiale * coef; + //ce qui donne au final: + pt_StabMembBiel->EE_StabMembBiel(i) = + delta_energie + pt_StabMembBiel->EE_StabMembBiel_t(i); + }; + + }; // fin du cas if (limitation) + }; // fin du cas ou on applique éventuellement une limitation + + // 2) ---- on met à jour la raideur et résidu global + // en tenant compte de la stabilisation + (*residu) += (*resD); + + #ifdef MISE_AU_POINT + if ((niveau_affichage > 9)) + {cout << "\n residu de stabilisation: "<< (*resD); + cout << "\n fin debug ElemMeca::Cal_explicit_StabMembBiel(.."; + }; + #endif } // fin du cas où on utilise la normale aux noeuds }; @@ -2321,7 +2473,7 @@ Tableau const & ElemMeca::Frontiere_elemeca(int cas, bool force) // dans ce dernier cas la frontière effacéee est recréée // num indique le numéro du point à créer (numérotation EF) ElFrontiere* const ElemMeca::Frontiere_points(int num,bool force) -{ // -- tout d'abord on évacue le cas où il n'y a pas de frontière surfacique à calculer +{ // -- tout d'abord on évacue le cas où il n'y a pas de frontière point à calculer // récup de l'élément géométrique ElemGeomC0& el = ElementGeometrique(); int tail_po = el.Nbne(); // nombre potentiel de points @@ -2441,40 +2593,40 @@ ElFrontiere* const ElemMeca::Frontiere_lineique(int num,bool force) int tail_po = el.Nbne(); // nombre potentiel de points // dimensionnement du tableau de frontières ligne si nécessaire if (ind_front_lin == 0) - {if ((ind_front_point > 0) && (ind_front_surf == 0)) - // cas où les frontières points existent seules, on ajoute les lignes - { int taille_finale = tail_ar + tail_po; - tabb.Change_taille(taille_finale); - for (int i=1;i<= tail_po;i++) - tabb(i+tail_ar) = tabb(i); - posi_tab_front_point=tail_ar; - posi_tab_front_lin = 0; // car on n'a pas de surface - } - else if ((ind_front_point > 0) && (ind_front_surf > 0)) - // cas où les frontières points existent et surfaces et pas de ligne, donc on les rajoutes - { int taille_finale = tail_fa + tail_po+tail_ar; - tabb.Change_taille(taille_finale);// les grandeurs pour les surfaces sont conservées - for (int i=1;i<= tail_po;i++) // transfert pour les noeuds - { tabb(i+tail_ar+tail_fa) = tabb(i+tail_fa);}; - posi_tab_front_point=tail_ar+tail_fa; // après les faces et les lignes - posi_tab_front_lin = tail_fa; // après les surfaces - } - else - { // cas où il n'y a pas de frontières points - if (ind_front_surf == 0) // cas où il n'y a pas de surface - {tabb.Change_taille(tail_ar,NULL); // on n'a pas de ligne, pas de point et pas de surface - posi_tab_front_lin = 0; posi_tab_front_point = tail_ar; - } - else {tabb.Change_taille(tail_ar+tail_fa); // cas où les surfaces existent - // le redimensionnement n'affecte pas les surfaces qui sont en début de tableau - posi_tab_front_lin = tail_fa; // après les surfaces - posi_tab_front_point = tail_fa+tail_ar; - }; - }; - // et on met les pointeurs de lignes en NULL - for (int i=1;i<= tail_ar;i++) // transfert pour les noeuds - { tabb(i+posi_tab_front_lin) = NULL;} - }; + {if ((ind_front_point > 0) && (ind_front_surf == 0)) + // cas où les frontières points existent seules, on ajoute les lignes + { int taille_finale = tail_ar + tail_po; + tabb.Change_taille(taille_finale); + for (int i=1;i<= tail_po;i++) + tabb(i+tail_ar) = tabb(i); + posi_tab_front_point=tail_ar; + posi_tab_front_lin = 0; // car on n'a pas de surface + } + else if ((ind_front_point > 0) && (ind_front_surf > 0)) + // cas où les frontières points existent et surfaces et pas de ligne, donc on les rajoutes + { int taille_finale = tail_fa + tail_po+tail_ar; + tabb.Change_taille(taille_finale);// les grandeurs pour les surfaces sont conservées + for (int i=1;i<= tail_po;i++) // transfert pour les noeuds + { tabb(i+tail_ar+tail_fa) = tabb(i+tail_fa);}; + posi_tab_front_point=tail_ar+tail_fa; // après les faces et les lignes + posi_tab_front_lin = tail_fa; // après les surfaces + } + else + { // cas où il n'y a pas de frontières points + if (ind_front_surf == 0) // cas où il n'y a pas de surface + {tabb.Change_taille(tail_ar,NULL); // on n'a pas de ligne, pas de point et pas de surface + posi_tab_front_lin = 0; posi_tab_front_point = tail_ar; + } + else {tabb.Change_taille(tail_ar+tail_fa); // cas où les surfaces existent + // le redimensionnement n'affecte pas les surfaces qui sont en début de tableau + posi_tab_front_lin = tail_fa; // après les surfaces + posi_tab_front_point = tail_fa+tail_ar; + }; + }; + // et on met les pointeurs de lignes en NULL + for (int i=1;i<= tail_ar;i++) // transfert pour les noeuds + { tabb(i+posi_tab_front_lin) = NULL;} + }; // maintenant création de la ligne int nbnoe = el.NonS()(num).Taille(); // nb noeud de l'arête Tableau tab(nbnoe); // les noeuds de l'arête frontiere @@ -2973,8 +3125,8 @@ int ElemMeca::CalculNormale_noeud(Enum_dure temps,const Noeud& noe,Coordonnee& c // récup des coordonnées locales du noeuds const Coordonnee& theta_noeud = elemgeom.PtelemRef()(nuoe); // récup des phi et dphi au noeud - const Vecteur & phi = elemgeom.Phi(theta_noeud); - const Mat_pleine& dphi = elemgeom.Dphi(theta_noeud); + const Vecteur & phi = elemgeom.Phi_point(theta_noeud); + const Mat_pleine& dphi = elemgeom.Dphi_point(theta_noeud); switch (temps) {case TEMPS_0 : {const BaseB& baseB = met->BaseNat_0(tab_noeud,dphi,phi); diff --git a/Elements/Mecanique/ElemMecaGene.h b/Elements/Mecanique/ElemMecaGene.h old mode 100644 new mode 100755 diff --git a/Elements/Mecanique/ElemPoint/ElemPoint.cc b/Elements/Mecanique/ElemPoint/ElemPoint.cc index 716d7a7..066086e 100644 --- a/Elements/Mecanique/ElemPoint/ElemPoint.cc +++ b/Elements/Mecanique/ElemPoint/ElemPoint.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -362,7 +362,7 @@ Coordonnee & ElemPoint::Point_physique(const Coordonnee& c_int,Coordonnee & co,E doCo->met_ElemPoint.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCo->ptpoint.Phi(c_int); + const Vecteur& phi = doCo->ptpoint.Phi_point(c_int); // c) calcul du point switch (temps) { case TEMPS_0 : co = doCo->met_ElemPoint.PointM_0(tab_noeud,phi); break; @@ -384,7 +384,7 @@ void ElemPoint::Point_physique(const Coordonnee& c_int,Tableau & t_ doCo->met_ElemPoint.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCo->ptpoint.Phi(c_int); + const Vecteur& phi = doCo->ptpoint.Phi_point(c_int); // c) calcul des point switch (t_co.Taille()) { case 3 : t_co(3) = doCo->met_ElemPoint.PointM_tdt(tab_noeud,phi); diff --git a/Elements/Mecanique/ElemPoint/ElemPoint.h b/Elements/Mecanique/ElemPoint/ElemPoint.h index 23a6e7d..862cbad 100644 --- a/Elements/Mecanique/ElemPoint/ElemPoint.h +++ b/Elements/Mecanique/ElemPoint/ElemPoint.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/ElemPoint/ElemPoint_CP.cc b/Elements/Mecanique/ElemPoint/ElemPoint_CP.cc index 709b0a1..9a72671 100755 --- a/Elements/Mecanique/ElemPoint/ElemPoint_CP.cc +++ b/Elements/Mecanique/ElemPoint/ElemPoint_CP.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/ElemPoint/ElemPoint_CP.h b/Elements/Mecanique/ElemPoint/ElemPoint_CP.h index 0271c05..8d3fcaa 100755 --- a/Elements/Mecanique/ElemPoint/ElemPoint_CP.h +++ b/Elements/Mecanique/ElemPoint/ElemPoint_CP.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/ElemPoint/Met_ElemPoint.cc b/Elements/Mecanique/ElemPoint/Met_ElemPoint.cc index d8f1e6f..acb527f 100644 --- a/Elements/Mecanique/ElemPoint/Met_ElemPoint.cc +++ b/Elements/Mecanique/ElemPoint/Met_ElemPoint.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/ElemPoint/Met_ElemPoint.h b/Elements/Mecanique/ElemPoint/Met_ElemPoint.h index 7e26ed9..2eaa5a6 100644 --- a/Elements/Mecanique/ElemPoint/Met_ElemPoint.h +++ b/Elements/Mecanique/ElemPoint/Met_ElemPoint.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/ElemPoint/UmatAbaqus.cc b/Elements/Mecanique/ElemPoint/UmatAbaqus.cc index 001a22c..a826ef4 100644 --- a/Elements/Mecanique/ElemPoint/UmatAbaqus.cc +++ b/Elements/Mecanique/ElemPoint/UmatAbaqus.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/ElemPoint/UmatAbaqus.h b/Elements/Mecanique/ElemPoint/UmatAbaqus.h index a48b5d1..d40ceaa 100644 --- a/Elements/Mecanique/ElemPoint/UmatAbaqus.h +++ b/Elements/Mecanique/ElemPoint/UmatAbaqus.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/ElemPoint/UmatAbaqus_c.c b/Elements/Mecanique/ElemPoint/UmatAbaqus_c.c index fd94ec7..40ec0b8 100644 --- a/Elements/Mecanique/ElemPoint/UmatAbaqus_c.c +++ b/Elements/Mecanique/ElemPoint/UmatAbaqus_c.c @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/ExceptionsElemMeca.h b/Elements/Mecanique/ExceptionsElemMeca.h index 2289227..dd163a5 100644 --- a/Elements/Mecanique/ExceptionsElemMeca.h +++ b/Elements/Mecanique/ExceptionsElemMeca.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -54,17 +54,35 @@ #ifndef EXCEPTIONSELEMMECA_H #define EXCEPTIONSELEMMECA_H + +/// @addtogroup groupe_des_elements_finis +/// @{ +/// + // cas d'une erreur survenue à cause d'un jacobien négatif class ErrJacobienNegatif_ElemMeca {}; - + /// @} // end of group + + +/// @addtogroup groupe_des_elements_finis +/// @{ +/// + // cas d'une erreur survenue à cause d'une variation de jacobien trop grande class ErrVarJacobienMini_ElemMeca {}; +/// @} // end of group + + +/// @addtogroup groupe_des_elements_finis +/// @{ +/// // cas d'une erreur inconnue au niveau de l'élément méca class Err_inconnue_ElemMeca {}; +/// @} // end of group #endif diff --git a/Elements/Mecanique/Hexaedre/Hexa.cc b/Elements/Mecanique/Hexaedre/Hexa.cc index 816e63b..8ef43a8 100644 --- a/Elements/Mecanique/Hexaedre/Hexa.cc +++ b/Elements/Mecanique/Hexaedre/Hexa.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/Hexa.h b/Elements/Mecanique/Hexaedre/Hexa.h index 6344d14..1492d72 100644 --- a/Elements/Mecanique/Hexaedre/Hexa.h +++ b/Elements/Mecanique/Hexaedre/Hexa.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaLMemb.cc b/Elements/Mecanique/Hexaedre/HexaLMemb.cc index 781ffcb..c847ed3 100644 --- a/Elements/Mecanique/Hexaedre/HexaLMemb.cc +++ b/Elements/Mecanique/Hexaedre/HexaLMemb.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaLMemb.h b/Elements/Mecanique/Hexaedre/HexaLMemb.h index e271800..6737a97 100644 --- a/Elements/Mecanique/Hexaedre/HexaLMemb.h +++ b/Elements/Mecanique/Hexaedre/HexaLMemb.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaMemb.cc b/Elements/Mecanique/Hexaedre/HexaMemb.cc index d5596dc..00cacc8 100644 --- a/Elements/Mecanique/Hexaedre/HexaMemb.cc +++ b/Elements/Mecanique/Hexaedre/HexaMemb.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -274,7 +274,7 @@ Coordonnee & HexaMemb::Point_physique(const Coordonnee& c_int,Coordonnee & co,En doCoHexa->metrique.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCoHexa->hexaed->Phi(c_int); + const Vecteur& phi = doCoHexa->hexaed->Phi_point(c_int); // c) calcul du point switch (temps) { case TEMPS_0 : co = met->PointM_0(tab_noeud,phi); break; @@ -296,7 +296,7 @@ void HexaMemb::Point_physique(const Coordonnee& c_int,Tableau & t_c doCoHexa->metrique.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCoHexa->hexaed->Phi(c_int); + const Vecteur& phi = doCoHexa->hexaed->Phi_point(c_int); // c) calcul des point switch (t_co.Taille()) { case 3 : t_co(3) = met->PointM_tdt(tab_noeud,phi); diff --git a/Elements/Mecanique/Hexaedre/HexaMemb.h b/Elements/Mecanique/Hexaedre/HexaMemb.h index 3bef4cb..3e4f376 100644 --- a/Elements/Mecanique/Hexaedre/HexaMemb.h +++ b/Elements/Mecanique/Hexaedre/HexaMemb.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaQ.cc b/Elements/Mecanique/Hexaedre/HexaQ.cc index 3d9fae7..8e933f2 100644 --- a/Elements/Mecanique/Hexaedre/HexaQ.cc +++ b/Elements/Mecanique/Hexaedre/HexaQ.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaQ.h b/Elements/Mecanique/Hexaedre/HexaQ.h index 9a37e23..6158e18 100644 --- a/Elements/Mecanique/Hexaedre/HexaQ.h +++ b/Elements/Mecanique/Hexaedre/HexaQ.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaQComp.cc b/Elements/Mecanique/Hexaedre/HexaQComp.cc index ea33fe5..63bfd7a 100644 --- a/Elements/Mecanique/Hexaedre/HexaQComp.cc +++ b/Elements/Mecanique/Hexaedre/HexaQComp.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaQComp.h b/Elements/Mecanique/Hexaedre/HexaQComp.h index 0b9c5da..9220a5b 100644 --- a/Elements/Mecanique/Hexaedre/HexaQComp.h +++ b/Elements/Mecanique/Hexaedre/HexaQComp.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaQComp_1pti.cc b/Elements/Mecanique/Hexaedre/HexaQComp_1pti.cc index bbf3af5..3ccea73 100644 --- a/Elements/Mecanique/Hexaedre/HexaQComp_1pti.cc +++ b/Elements/Mecanique/Hexaedre/HexaQComp_1pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaQComp_27pti.cc b/Elements/Mecanique/Hexaedre/HexaQComp_27pti.cc index 34d7c2f..df93961 100644 --- a/Elements/Mecanique/Hexaedre/HexaQComp_27pti.cc +++ b/Elements/Mecanique/Hexaedre/HexaQComp_27pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaQComp_64pti.cc b/Elements/Mecanique/Hexaedre/HexaQComp_64pti.cc index 6e067c5..a9722e9 100644 --- a/Elements/Mecanique/Hexaedre/HexaQComp_64pti.cc +++ b/Elements/Mecanique/Hexaedre/HexaQComp_64pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaQComp_cm1pti.h b/Elements/Mecanique/Hexaedre/HexaQComp_cm1pti.h index 8455792..498422b 100644 --- a/Elements/Mecanique/Hexaedre/HexaQComp_cm1pti.h +++ b/Elements/Mecanique/Hexaedre/HexaQComp_cm1pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaQComp_cm27pti.h b/Elements/Mecanique/Hexaedre/HexaQComp_cm27pti.h index 7798108..977e466 100644 --- a/Elements/Mecanique/Hexaedre/HexaQComp_cm27pti.h +++ b/Elements/Mecanique/Hexaedre/HexaQComp_cm27pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaQComp_cm64pti.h b/Elements/Mecanique/Hexaedre/HexaQComp_cm64pti.h index 0da27ea..017ca12 100644 --- a/Elements/Mecanique/Hexaedre/HexaQComp_cm64pti.h +++ b/Elements/Mecanique/Hexaedre/HexaQComp_cm64pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaQ_cm1pti.cc b/Elements/Mecanique/Hexaedre/HexaQ_cm1pti.cc index be167b5..6183529 100644 --- a/Elements/Mecanique/Hexaedre/HexaQ_cm1pti.cc +++ b/Elements/Mecanique/Hexaedre/HexaQ_cm1pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaQ_cm1pti.h b/Elements/Mecanique/Hexaedre/HexaQ_cm1pti.h index 4f4b463..e46deab 100644 --- a/Elements/Mecanique/Hexaedre/HexaQ_cm1pti.h +++ b/Elements/Mecanique/Hexaedre/HexaQ_cm1pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaQ_cm27pti.cc b/Elements/Mecanique/Hexaedre/HexaQ_cm27pti.cc index 3fae64a..e864e36 100644 --- a/Elements/Mecanique/Hexaedre/HexaQ_cm27pti.cc +++ b/Elements/Mecanique/Hexaedre/HexaQ_cm27pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaQ_cm27pti.h b/Elements/Mecanique/Hexaedre/HexaQ_cm27pti.h index 20d0858..49e8127 100644 --- a/Elements/Mecanique/Hexaedre/HexaQ_cm27pti.h +++ b/Elements/Mecanique/Hexaedre/HexaQ_cm27pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaQ_cm64pti.cc b/Elements/Mecanique/Hexaedre/HexaQ_cm64pti.cc index 70c32b1..cc0b6a8 100644 --- a/Elements/Mecanique/Hexaedre/HexaQ_cm64pti.cc +++ b/Elements/Mecanique/Hexaedre/HexaQ_cm64pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/HexaQ_cm64pti.h b/Elements/Mecanique/Hexaedre/HexaQ_cm64pti.h index 334d375..ee41b59 100644 --- a/Elements/Mecanique/Hexaedre/HexaQ_cm64pti.h +++ b/Elements/Mecanique/Hexaedre/HexaQ_cm64pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/Hexa_cm1pti.cc b/Elements/Mecanique/Hexaedre/Hexa_cm1pti.cc index c85d157..fb092db 100644 --- a/Elements/Mecanique/Hexaedre/Hexa_cm1pti.cc +++ b/Elements/Mecanique/Hexaedre/Hexa_cm1pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/Hexa_cm1pti.h b/Elements/Mecanique/Hexaedre/Hexa_cm1pti.h index b375dec..cbd603b 100644 --- a/Elements/Mecanique/Hexaedre/Hexa_cm1pti.h +++ b/Elements/Mecanique/Hexaedre/Hexa_cm1pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/Hexa_cm27pti.cc b/Elements/Mecanique/Hexaedre/Hexa_cm27pti.cc index c68be58..b326325 100644 --- a/Elements/Mecanique/Hexaedre/Hexa_cm27pti.cc +++ b/Elements/Mecanique/Hexaedre/Hexa_cm27pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/Hexa_cm27pti.h b/Elements/Mecanique/Hexaedre/Hexa_cm27pti.h index 3aae7f6..1566079 100644 --- a/Elements/Mecanique/Hexaedre/Hexa_cm27pti.h +++ b/Elements/Mecanique/Hexaedre/Hexa_cm27pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/Hexa_cm64pti.cc b/Elements/Mecanique/Hexaedre/Hexa_cm64pti.cc index 821647b..14ba070 100644 --- a/Elements/Mecanique/Hexaedre/Hexa_cm64pti.cc +++ b/Elements/Mecanique/Hexaedre/Hexa_cm64pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Hexaedre/Hexa_cm64pti.h b/Elements/Mecanique/Hexaedre/Hexa_cm64pti.h index d470faa..3da1b38 100644 --- a/Elements/Mecanique/Hexaedre/Hexa_cm64pti.h +++ b/Elements/Mecanique/Hexaedre/Hexa_cm64pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/LesChargeExtSurElement.cc b/Elements/Mecanique/LesChargeExtSurElement.cc index fcd15c0..cd96b7a 100755 --- a/Elements/Mecanique/LesChargeExtSurElement.cc +++ b/Elements/Mecanique/LesChargeExtSurElement.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/LesChargeExtSurElement.h b/Elements/Mecanique/LesChargeExtSurElement.h index b1f9744..ce86dd9 100755 --- a/Elements/Mecanique/LesChargeExtSurElement.h +++ b/Elements/Mecanique/LesChargeExtSurElement.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/LesPtIntegMecaInterne.cc b/Elements/Mecanique/LesPtIntegMecaInterne.cc index 0a3f6cf..099f568 100644 --- a/Elements/Mecanique/LesPtIntegMecaInterne.cc +++ b/Elements/Mecanique/LesPtIntegMecaInterne.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/LesPtIntegMecaInterne.h b/Elements/Mecanique/LesPtIntegMecaInterne.h index cd9bba5..bed59ca 100644 --- a/Elements/Mecanique/LesPtIntegMecaInterne.h +++ b/Elements/Mecanique/LesPtIntegMecaInterne.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaL.cc b/Elements/Mecanique/Pentaedre/PentaL.cc index 61f0765..be56b4a 100644 --- a/Elements/Mecanique/Pentaedre/PentaL.cc +++ b/Elements/Mecanique/Pentaedre/PentaL.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaL.h b/Elements/Mecanique/Pentaedre/PentaL.h index 923594c..4bcb036 100644 --- a/Elements/Mecanique/Pentaedre/PentaL.h +++ b/Elements/Mecanique/Pentaedre/PentaL.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaL_cm1pti.cc b/Elements/Mecanique/Pentaedre/PentaL_cm1pti.cc index 2732e95..dedb92c 100644 --- a/Elements/Mecanique/Pentaedre/PentaL_cm1pti.cc +++ b/Elements/Mecanique/Pentaedre/PentaL_cm1pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaL_cm1pti.h b/Elements/Mecanique/Pentaedre/PentaL_cm1pti.h index 79ea3f7..b2d431f 100644 --- a/Elements/Mecanique/Pentaedre/PentaL_cm1pti.h +++ b/Elements/Mecanique/Pentaedre/PentaL_cm1pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaL_cm2pti.cc b/Elements/Mecanique/Pentaedre/PentaL_cm2pti.cc index 2540004..d97902e 100644 --- a/Elements/Mecanique/Pentaedre/PentaL_cm2pti.cc +++ b/Elements/Mecanique/Pentaedre/PentaL_cm2pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaL_cm2pti.h b/Elements/Mecanique/Pentaedre/PentaL_cm2pti.h index 79ea5d5..a8d6234 100644 --- a/Elements/Mecanique/Pentaedre/PentaL_cm2pti.h +++ b/Elements/Mecanique/Pentaedre/PentaL_cm2pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaL_cm6pti.cc b/Elements/Mecanique/Pentaedre/PentaL_cm6pti.cc index eeda2e7..2a37877 100644 --- a/Elements/Mecanique/Pentaedre/PentaL_cm6pti.cc +++ b/Elements/Mecanique/Pentaedre/PentaL_cm6pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaL_cm6pti.h b/Elements/Mecanique/Pentaedre/PentaL_cm6pti.h index 5054570..28b82db 100644 --- a/Elements/Mecanique/Pentaedre/PentaL_cm6pti.h +++ b/Elements/Mecanique/Pentaedre/PentaL_cm6pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaMemb.cc b/Elements/Mecanique/Pentaedre/PentaMemb.cc index 0c46c29..33da217 100644 --- a/Elements/Mecanique/Pentaedre/PentaMemb.cc +++ b/Elements/Mecanique/Pentaedre/PentaMemb.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -270,7 +270,7 @@ Coordonnee & PentaMemb::Point_physique(const Coordonnee& c_int,Coordonnee & co,E doCoPenta->metrique.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCoPenta->pentaed->Phi(c_int); + const Vecteur& phi = doCoPenta->pentaed->Phi_point(c_int); // c) calcul du point switch (temps) { case TEMPS_0 : co = met->PointM_0(tab_noeud,phi); break; @@ -292,7 +292,7 @@ void PentaMemb::Point_physique(const Coordonnee& c_int,Tableau & t_ doCoPenta->metrique.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCoPenta->pentaed->Phi(c_int); + const Vecteur& phi = doCoPenta->pentaed->Phi_point(c_int); // c) calcul des point switch (t_co.Taille()) { case 3 : t_co(3) = met->PointM_tdt(tab_noeud,phi); diff --git a/Elements/Mecanique/Pentaedre/PentaMemb.h b/Elements/Mecanique/Pentaedre/PentaMemb.h index 83b3835..8af09ff 100644 --- a/Elements/Mecanique/Pentaedre/PentaMemb.h +++ b/Elements/Mecanique/Pentaedre/PentaMemb.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaQ.cc b/Elements/Mecanique/Pentaedre/PentaQ.cc index bdd0746..39ea473 100644 --- a/Elements/Mecanique/Pentaedre/PentaQ.cc +++ b/Elements/Mecanique/Pentaedre/PentaQ.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaQ.h b/Elements/Mecanique/Pentaedre/PentaQ.h index be594eb..5c94257 100644 --- a/Elements/Mecanique/Pentaedre/PentaQ.h +++ b/Elements/Mecanique/Pentaedre/PentaQ.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaQComp.cc b/Elements/Mecanique/Pentaedre/PentaQComp.cc index d636a5c..da90f01 100644 --- a/Elements/Mecanique/Pentaedre/PentaQComp.cc +++ b/Elements/Mecanique/Pentaedre/PentaQComp.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaQComp.h b/Elements/Mecanique/Pentaedre/PentaQComp.h index 3cb8787..fa68084 100644 --- a/Elements/Mecanique/Pentaedre/PentaQComp.h +++ b/Elements/Mecanique/Pentaedre/PentaQComp.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaQComp_cm12pti.cc b/Elements/Mecanique/Pentaedre/PentaQComp_cm12pti.cc index 5181d8f..93f325a 100644 --- a/Elements/Mecanique/Pentaedre/PentaQComp_cm12pti.cc +++ b/Elements/Mecanique/Pentaedre/PentaQComp_cm12pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaQComp_cm12pti.h b/Elements/Mecanique/Pentaedre/PentaQComp_cm12pti.h index 52c2bd3..b41b774 100644 --- a/Elements/Mecanique/Pentaedre/PentaQComp_cm12pti.h +++ b/Elements/Mecanique/Pentaedre/PentaQComp_cm12pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaQComp_cm18pti.cc b/Elements/Mecanique/Pentaedre/PentaQComp_cm18pti.cc index ae0cbc2..d47d278 100644 --- a/Elements/Mecanique/Pentaedre/PentaQComp_cm18pti.cc +++ b/Elements/Mecanique/Pentaedre/PentaQComp_cm18pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaQComp_cm18pti.h b/Elements/Mecanique/Pentaedre/PentaQComp_cm18pti.h index 05c06ec..3e76583 100644 --- a/Elements/Mecanique/Pentaedre/PentaQComp_cm18pti.h +++ b/Elements/Mecanique/Pentaedre/PentaQComp_cm18pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaQComp_cm9pti.cc b/Elements/Mecanique/Pentaedre/PentaQComp_cm9pti.cc index 6652e9a..2cc9717 100644 --- a/Elements/Mecanique/Pentaedre/PentaQComp_cm9pti.cc +++ b/Elements/Mecanique/Pentaedre/PentaQComp_cm9pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaQComp_cm9pti.h b/Elements/Mecanique/Pentaedre/PentaQComp_cm9pti.h index 185dc70..42312af 100644 --- a/Elements/Mecanique/Pentaedre/PentaQComp_cm9pti.h +++ b/Elements/Mecanique/Pentaedre/PentaQComp_cm9pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaQ_cm12pti.cc b/Elements/Mecanique/Pentaedre/PentaQ_cm12pti.cc index cf4db9b..29b0194 100644 --- a/Elements/Mecanique/Pentaedre/PentaQ_cm12pti.cc +++ b/Elements/Mecanique/Pentaedre/PentaQ_cm12pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaQ_cm12pti.h b/Elements/Mecanique/Pentaedre/PentaQ_cm12pti.h index 99de5a3..889f970 100644 --- a/Elements/Mecanique/Pentaedre/PentaQ_cm12pti.h +++ b/Elements/Mecanique/Pentaedre/PentaQ_cm12pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaQ_cm18pti.cc b/Elements/Mecanique/Pentaedre/PentaQ_cm18pti.cc index 7c91166..f68297f 100644 --- a/Elements/Mecanique/Pentaedre/PentaQ_cm18pti.cc +++ b/Elements/Mecanique/Pentaedre/PentaQ_cm18pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaQ_cm18pti.h b/Elements/Mecanique/Pentaedre/PentaQ_cm18pti.h index 9cf8c94..93f1c92 100644 --- a/Elements/Mecanique/Pentaedre/PentaQ_cm18pti.h +++ b/Elements/Mecanique/Pentaedre/PentaQ_cm18pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaQ_cm3pti.cc b/Elements/Mecanique/Pentaedre/PentaQ_cm3pti.cc index e4b84ac..8066360 100755 --- a/Elements/Mecanique/Pentaedre/PentaQ_cm3pti.cc +++ b/Elements/Mecanique/Pentaedre/PentaQ_cm3pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaQ_cm3pti.h b/Elements/Mecanique/Pentaedre/PentaQ_cm3pti.h index 7fb6dbc..c3e4c23 100755 --- a/Elements/Mecanique/Pentaedre/PentaQ_cm3pti.h +++ b/Elements/Mecanique/Pentaedre/PentaQ_cm3pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaQ_cm9pti.cc b/Elements/Mecanique/Pentaedre/PentaQ_cm9pti.cc index 8aba5c7..e2fe216 100644 --- a/Elements/Mecanique/Pentaedre/PentaQ_cm9pti.cc +++ b/Elements/Mecanique/Pentaedre/PentaQ_cm9pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Pentaedre/PentaQ_cm9pti.h b/Elements/Mecanique/Pentaedre/PentaQ_cm9pti.h index 7d8bcb5..ac5318c 100644 --- a/Elements/Mecanique/Pentaedre/PentaQ_cm9pti.h +++ b/Elements/Mecanique/Pentaedre/PentaQ_cm9pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/PtIntegMecaInterne.cc b/Elements/Mecanique/PtIntegMecaInterne.cc index 9abc815..ab0a439 100644 --- a/Elements/Mecanique/PtIntegMecaInterne.cc +++ b/Elements/Mecanique/PtIntegMecaInterne.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/PtIntegMecaInterne.h b/Elements/Mecanique/PtIntegMecaInterne.h index 605e89d..175c1b8 100644 --- a/Elements/Mecanique/PtIntegMecaInterne.h +++ b/Elements/Mecanique/PtIntegMecaInterne.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Quad_asisymetrie/QuadAxiCCom.cc b/Elements/Mecanique/Quad_asisymetrie/QuadAxiCCom.cc index d2276a2..58d242c 100644 --- a/Elements/Mecanique/Quad_asisymetrie/QuadAxiCCom.cc +++ b/Elements/Mecanique/Quad_asisymetrie/QuadAxiCCom.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Quad_asisymetrie/QuadAxiCCom.h b/Elements/Mecanique/Quad_asisymetrie/QuadAxiCCom.h index 5add251..b7df082 100644 --- a/Elements/Mecanique/Quad_asisymetrie/QuadAxiCCom.h +++ b/Elements/Mecanique/Quad_asisymetrie/QuadAxiCCom.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Quad_asisymetrie/QuadAxiCCom_cm9pti.cc b/Elements/Mecanique/Quad_asisymetrie/QuadAxiCCom_cm9pti.cc index 153e3fd..14360f1 100644 --- a/Elements/Mecanique/Quad_asisymetrie/QuadAxiCCom_cm9pti.cc +++ b/Elements/Mecanique/Quad_asisymetrie/QuadAxiCCom_cm9pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Quad_asisymetrie/QuadAxiCCom_cm9pti.h b/Elements/Mecanique/Quad_asisymetrie/QuadAxiCCom_cm9pti.h index b1459cc..f860548 100644 --- a/Elements/Mecanique/Quad_asisymetrie/QuadAxiCCom_cm9pti.h +++ b/Elements/Mecanique/Quad_asisymetrie/QuadAxiCCom_cm9pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Quad_asisymetrie/QuadAxiL1.cc b/Elements/Mecanique/Quad_asisymetrie/QuadAxiL1.cc index 170af58..0964896 100644 --- a/Elements/Mecanique/Quad_asisymetrie/QuadAxiL1.cc +++ b/Elements/Mecanique/Quad_asisymetrie/QuadAxiL1.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Quad_asisymetrie/QuadAxiL1.h b/Elements/Mecanique/Quad_asisymetrie/QuadAxiL1.h index 73c45d2..8197130 100644 --- a/Elements/Mecanique/Quad_asisymetrie/QuadAxiL1.h +++ b/Elements/Mecanique/Quad_asisymetrie/QuadAxiL1.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Quad_asisymetrie/QuadAxiL1_cm1pti.cc b/Elements/Mecanique/Quad_asisymetrie/QuadAxiL1_cm1pti.cc index 17cb0d8..78c0220 100644 --- a/Elements/Mecanique/Quad_asisymetrie/QuadAxiL1_cm1pti.cc +++ b/Elements/Mecanique/Quad_asisymetrie/QuadAxiL1_cm1pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Quad_asisymetrie/QuadAxiL1_cm1pti.h b/Elements/Mecanique/Quad_asisymetrie/QuadAxiL1_cm1pti.h index 85ac420..1055289 100644 --- a/Elements/Mecanique/Quad_asisymetrie/QuadAxiL1_cm1pti.h +++ b/Elements/Mecanique/Quad_asisymetrie/QuadAxiL1_cm1pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Quad_asisymetrie/QuadAxiMemb.cc b/Elements/Mecanique/Quad_asisymetrie/QuadAxiMemb.cc index 71a20ed..c085425 100644 --- a/Elements/Mecanique/Quad_asisymetrie/QuadAxiMemb.cc +++ b/Elements/Mecanique/Quad_asisymetrie/QuadAxiMemb.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -259,7 +259,7 @@ Coordonnee & QuadAxiMemb::Point_physique(const Coordonnee& c_int,Coordonnee & co CoQuad->met_QuadAxiMemb.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = CoQuad->quad.Phi(c_int); + const Vecteur& phi = CoQuad->quad.Phi_point(c_int); // c) calcul du point switch (temps) { case TEMPS_0 : co = met->PointM_0(tab_noeud,phi); break; @@ -281,7 +281,7 @@ void QuadAxiMemb::Point_physique(const Coordonnee& c_int,Tableau & CoQuad->met_QuadAxiMemb.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = CoQuad->quad.Phi(c_int); + const Vecteur& phi = CoQuad->quad.Phi_point(c_int); // c) calcul des point switch (t_co.Taille()) { case 3 : t_co(3) = met->PointM_tdt(tab_noeud,phi); diff --git a/Elements/Mecanique/Quad_asisymetrie/QuadAxiMemb.h b/Elements/Mecanique/Quad_asisymetrie/QuadAxiMemb.h index b983a84..08fe127 100644 --- a/Elements/Mecanique/Quad_asisymetrie/QuadAxiMemb.h +++ b/Elements/Mecanique/Quad_asisymetrie/QuadAxiMemb.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Quad_asisymetrie/QuadAxiQ.cc b/Elements/Mecanique/Quad_asisymetrie/QuadAxiQ.cc index 521c3a2..91747fa 100644 --- a/Elements/Mecanique/Quad_asisymetrie/QuadAxiQ.cc +++ b/Elements/Mecanique/Quad_asisymetrie/QuadAxiQ.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Quad_asisymetrie/QuadAxiQ.h b/Elements/Mecanique/Quad_asisymetrie/QuadAxiQ.h index 3989168..188d2ba 100644 --- a/Elements/Mecanique/Quad_asisymetrie/QuadAxiQ.h +++ b/Elements/Mecanique/Quad_asisymetrie/QuadAxiQ.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Quad_asisymetrie/QuadAxiQComp.cc b/Elements/Mecanique/Quad_asisymetrie/QuadAxiQComp.cc index bf86207..b8be74f 100644 --- a/Elements/Mecanique/Quad_asisymetrie/QuadAxiQComp.cc +++ b/Elements/Mecanique/Quad_asisymetrie/QuadAxiQComp.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Quad_asisymetrie/QuadAxiQComp.h b/Elements/Mecanique/Quad_asisymetrie/QuadAxiQComp.h index 2dd1803..c5fe6cd 100644 --- a/Elements/Mecanique/Quad_asisymetrie/QuadAxiQComp.h +++ b/Elements/Mecanique/Quad_asisymetrie/QuadAxiQComp.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Quad_asisymetrie/QuadAxiQComp_cm4pti.cc b/Elements/Mecanique/Quad_asisymetrie/QuadAxiQComp_cm4pti.cc index e06e68e..7fdede9 100644 --- a/Elements/Mecanique/Quad_asisymetrie/QuadAxiQComp_cm4pti.cc +++ b/Elements/Mecanique/Quad_asisymetrie/QuadAxiQComp_cm4pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Quad_asisymetrie/QuadAxiQComp_cm4pti.h b/Elements/Mecanique/Quad_asisymetrie/QuadAxiQComp_cm4pti.h index dc64a13..c0e2c50 100644 --- a/Elements/Mecanique/Quad_asisymetrie/QuadAxiQComp_cm4pti.h +++ b/Elements/Mecanique/Quad_asisymetrie/QuadAxiQComp_cm4pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/DeformationSfe1.cc b/Elements/Mecanique/SFE/DeformationSfe1.cc index bc35db0..7c37f9f 100644 --- a/Elements/Mecanique/SFE/DeformationSfe1.cc +++ b/Elements/Mecanique/SFE/DeformationSfe1.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/DeformationSfe1.h b/Elements/Mecanique/SFE/DeformationSfe1.h index 0f59dc3..562d61a 100644 --- a/Elements/Mecanique/SFE/DeformationSfe1.h +++ b/Elements/Mecanique/SFE/DeformationSfe1.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/Met_Sfe1.h b/Elements/Mecanique/SFE/Met_Sfe1.h index 2f38400..650b183 100644 --- a/Elements/Mecanique/SFE/Met_Sfe1.h +++ b/Elements/Mecanique/SFE/Met_Sfe1.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/Met_Sfe1s1.cc b/Elements/Mecanique/SFE/Met_Sfe1s1.cc index 22c827e..330ec88 100644 --- a/Elements/Mecanique/SFE/Met_Sfe1s1.cc +++ b/Elements/Mecanique/SFE/Met_Sfe1s1.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/Met_Sfe1s2.cc b/Elements/Mecanique/SFE/Met_Sfe1s2.cc index 7f71f49..a446417 100644 --- a/Elements/Mecanique/SFE/Met_Sfe1s2.cc +++ b/Elements/Mecanique/SFE/Met_Sfe1s2.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/Met_Sfe1s3.cc b/Elements/Mecanique/SFE/Met_Sfe1s3.cc index 0b0489c..3c3811f 100644 --- a/Elements/Mecanique/SFE/Met_Sfe1s3.cc +++ b/Elements/Mecanique/SFE/Met_Sfe1s3.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/Met_Sfe1s4.cc b/Elements/Mecanique/SFE/Met_Sfe1s4.cc index 435d724..802531c 100644 --- a/Elements/Mecanique/SFE/Met_Sfe1s4.cc +++ b/Elements/Mecanique/SFE/Met_Sfe1s4.cc @@ -1 +1 @@ -// FICHIER : Met_Sfe1s3.cc // CLASSE : Met_Sfe1 // This file is part of the Herezh++ application. // // The finite element software Herezh++ is dedicated to the field // of mechanics for large transformations of solid structures. // It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600) // INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) . // // Herezh++ is distributed under GPL 3 license ou ultérieure. // // Copyright (C) 1997-2021 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // For more information, please consult: . # include using namespace std; //introduces namespace std #include #include #include "Sortie.h" #include "Util.h" #include "MathUtil.h" #include "MathUtil2.h" #include "Met_Sfe1.h" // ========================================================================================= // vu la taille des executables le fichier est decompose en quatre // le premier : Met_Sfe1s1.cp concerne les constructeurs, destructeur et // la gestion des variables // le second : Met_Sfe1s2.cp concerne le calcul des grandeurs publics // le troisieme : Met_Sfe1s3.cp concerne le calcul des grandeurs protegees, et des courbures pour SFE1 et SFE2 et QSFE1 // le quatrième : Met_Sfe1s4.cp concerne le calcul des courbures pour les éléments SFE3 et QSFE3 // ========================================================================================= // routine (4) generale de calcul de la courbure // cas 4: calcul de la courbure à partir d'un polynôme passant par les 6 points Tenseur_ns2BB Met_Sfe1::Courbure4 ( const Tableau& tab_coor, const BaseB & aiB , const BaseH & aiH ,Tableau const & tabTypeCL,Tableau const & vplan) { // calcul de la normale centrale // on utilise des expressions strictement identique ici et dans dcourbure // de manière à éviter les erreurs d'arrondis //Coordonnee3 N = (Util::ProdVec_coorBN(aiB(1),aiB(2))).Normer(); // calcul de la normale centrale Coordonnee3 NN = Util::ProdVec_coorBN(aiB(1),aiB(2)); // normale non normee double nor = NN.Norme(); // la norme Coordonnee3 N = NN / nor; Mat_pleine mat(3,3); // matrice pour calculer le tenseur de courbure Vecteur sm(3); // le second membre pour le calcul de la courbure // origine const Coordonnee3& Op=tab_coor(1);// origine du repère local // le meme calcul est effectue pour les trois cotes du triangle principale //1- on utilise indi un tableau d'indice pour ne pas etre embete par les modulos 3 // 2- on boucle sur le cotes du triangle Coordonnee3 U1,CB,V,OpA; Coordonnee3 Mm,OpMm; Coordonnee3 OpAp; // le vecteur horizontal correspondant à OpA for (int ncot=1;ncot<=3;ncot++) { // on utilise les notations : triangle principal DBC et secondaire BAC // simplification de l'ecriture (vérifiée) const Coordonnee3& D = tab_coor(indi(ncot)); const Coordonnee3& B = tab_coor(indi(ncot+1)); const Coordonnee3& C = tab_coor(indi(ncot+2)); const Coordonnee3& A = tab_coor(indi(ncot)+3); // examen de condition limite éventuelle // ncot % 3 +1: = le coté en face du noeud ncot if (tabTypeCL(ncot % 3 +1) != TANGENTE_CL) { // cas sans conditions limites particulières if (D != A) // cas ou le noeud externe existe {OpA = A - Op; double theta3 = OpA * N; // cote du point externe OpAp = OpA - theta3 * N; // projection de OpA sur la facette double theta1 = OpAp * aiH.Coordo(1); double theta2 = OpAp * aiH.Coordo(2); // les coordonnées locales de A // construction de la ligne de la matrice mat(ncot,1) = theta1 * (theta1 - 1.); mat(ncot,2) = theta2 * (theta2 - 1.); mat(ncot,3) = theta1 * theta2; // et du second membre correspondant sm(ncot) = theta3; } else // cas ou il n'y a pas de noeud externe {// On va calculer la normale non normée au coté externe // ce vecteur est dans le plan de la facette CB = B - C; U1 = CB ; V = Util::ProdVec_coor(N,U1); // maintenant on calcul les coordonnées locales de V double theta1 = V * aiH.Coordo(1); double theta2 = V * aiH.Coordo(2); // construction de la ligne de la matrice mat(ncot,1) = theta1 * theta1; mat(ncot,2) = theta2 * theta2; mat(ncot,3) = theta1 * theta2; // et du second membre correspondant sm(ncot) = 0; }; } else { // cas avec une condition de tangente imposée // on commence par définir la direction de la tangente CB = B - C; V = Util::ProdVec_coor(CB,vplan(ncot % 3 +1)); // calcul des coordonnées locales du vecteur tangent double d1 = V*aiH.Coordo(1); double d2=V*aiH.Coordo(2); double d3 = V*N; // on calcul les coordonnées du point milieu de BC que l'on nome Mm Mm = 0.5*(B+C); OpMm = Mm - Op; // les coordonnées locales de Mm double theta1 = OpMm * aiH.Coordo(1); double theta2 = OpMm * aiH.Coordo(2); // construction de la ligne de la matrice mat(ncot,1) = (2.*theta1 - 1.) * d1; mat(ncot,2) = (2.*theta2 - 1.) * d2; mat(ncot,3) = (theta1 * d2 + theta2 * d1); // et du second membre correspondant sm(ncot) = d3; }; }; // calcul du tenseur de courbure dans la base ai Mat_pleine mati = mat.Inverse(); Vecteur curbi = mati * sm; // retour de la courbure Tenseur_ns2BB curb; curb.Coor(1,1)=2. * curbi(1); curb.Coor(1,2)=curb.Coor(2,1)=curbi(3); curb.Coor(2,2)= 2. * curbi(2); return curb; }; // routine (4) generale de calcul de la courbure et de sa variation // en sortie : curb , la courbure b11,b12,b22 // dcurb , la variation de courbure. // On ne considere dans les variations que les termes relatif aux ddl qui font varier // les normales // cas 4: calcul de la courbure à partir d'un polynôme passant par les 6 points void Met_Sfe1::Dcourbure4 ( const Tableau& tab_coor, const BaseB & aiB , const Tableau & DaiB,const BaseH & aiH , const Tableau & DaiH,Tenseur_ns2BB& curb,TabOper & dcurb ,Tableau const & tabTypeCL,Tableau const & vplan) { int nbddl = (nbNoeudCentral+3)*3; //18; // nombre de ddl total Coordonnee3 Nul; // le vecteur nul de dim 3, pour les initialisations Mat_pleine mat(3,3); // matrice pour calculer le tenseur de courbure Tableau dmat(nbddl,mat); // sa variation Vecteur sm(3); // le second membre pour le calcul de la courbure Tableau dsm(nbddl,sm); // sa variation // calcul de la normale centrale Coordonnee3 NN = Util::ProdVec_coorBN(aiB(1),aiB(2)); // normale non normee double nor = NN.Norme(); // la norme Coordonnee3 N = NN / nor; Coordonnee3 DNN; // vecteur intermediaire // calcul de la variation de la normale centrale : vérifiée Tableau dN(nbddl,Nul); // on s'intéresse ici qu'aux ddl de la face centrale for (int inc=1;inc<=3;inc++) // indice du numéro de noeud de la face centrale for (int ib=1;ib<=3;ib++) { // cas de la normale int i1=(inc-1)*3+ib; DNN = Util::ProdVec_coorBN(DaiB(i1)(1),aiB(2)) + Util::ProdVec_coorBN(aiB(1),DaiB(i1)(2)); dN(i1) = Util::VarUnVect_coor(NN,DNN,nor); }; // origine const Coordonnee3& Op=tab_coor(1);// origine du repère local Tableau dOp(nbddl,Nul); dOp(1)=Ia(1);dOp(2)=Ia(2);dOp(3)=Ia(3); // et les autres dérivées sont nulles // le meme calcul est effectue pour les trois cotes du triangle principale //1- on utilise un tableau d'indice pour ne pas etre embete par les modulos 3 // 2- on boucle sur le cotes du triangle Coordonnee3 CB,U1,V,dV; Coordonnee3 OpA,OpAp; Coordonnee3 dA,dOpA,dOpAp,dB,dC; Coordonnee3 Mm,dMm,OpMm,dOpMm; for (int ncot=1;ncot<=3;ncot++) { // on utilise les notations : triangle principal DBC et secondaire BAC // simplification de l'ecriture const Coordonnee3& D = tab_coor(indi(ncot)); const Coordonnee3& B = tab_coor(indi(ncot+1)); const Coordonnee3& C = tab_coor(indi(ncot+2)); const Coordonnee3& A = tab_coor(indi(ncot)+3); // examen de condition limite éventuelle int nbcote = ncot % 3 +1; // le numéro du coté en face du noeud ncot if (tabTypeCL(nbcote) != TANGENTE_CL) { // cas sans conditions limites particulières if (D != A) // cas ou le noeud externe existe {OpA = A - Op; double theta3 = OpA * N; // cote du point externe OpAp = OpA - theta3 * N; // projection de OpA sur la facette // les coordonnées locales de A double theta1 = OpAp * aiH.Coordo(1); double theta2 = OpAp * aiH.Coordo(2); // construction de la ligne de la matrice mat(ncot,1) = theta1 * (theta1 - 1.); mat(ncot,2) = theta2 * (theta2 - 1.); mat(ncot,3) = theta1 * theta2; // et du second membre correspondant sm(ncot) = theta3; // calcul des variations for (int ia=1;ia<= 3;ia++) {{// indice de A: jnA, noeud extérieur int jnA = 9+(ncot-1)*3+ia; dA = Ia(ia); dOpA = dA; // dOp(jnA)=0 // OpA = A - Op; // la coordonnée en 3 double dtheta3 = dOpA * N; // dN(jnA)=0 car noeud externe // theta3 = OpA * N dOpAp = dOpA - dtheta3 * N ; //dN(jnA)=0; // OpAp = OpA - theta3 * N // les coordonnées locales double dtheta1 = dOpAp * aiH.Coordo(1); // DaiH(jnA).Coordo(1)=0; // theta1 = OpAp * aiH.Coordo(1) double dtheta2 = dOpAp * aiH.Coordo(2);// DaiH(jnA).Coordo(2)=0; // theta2 = OpAp * aiH.Coordo(2) // la matrice dmat(jnA)(ncot,1)= dtheta1 * (theta1 - 1.) + theta1 * dtheta1; // mat(ncot,1) = theta1 * (theta1 - 1.) dmat(jnA)(ncot,2)= dtheta2 * (theta2 - 1.) + theta2 * dtheta2; // mat(ncot,2) = theta2 * (theta2 - 1.) dmat(jnA)(ncot,3)= dtheta1 * theta2 + theta1 * dtheta2; // mat(ncot,3) = theta1 * theta2 // le second membre dsm(jnA)(ncot) = dtheta3; // sm(ncot) = theta3 } {// indice de B: jnB, noeud de la facette centrale int jnB = (indi(ncot+1)-1)*3+ia; // dA = 0 ; dOpA = - dOp(jnB); // OpA = A - Op; // la coordonnée en 3 double dtheta3 = dOpA * N + OpA * dN(jnB); // theta3 = OpA * N dOpAp = dOpA - dtheta3 * N - theta3 * dN(jnB); // OpAp = OpA - theta3 * N // les coordonnées locales // 1) à noter ici que OpAp est un vecteur de la facette, donc normale à N, et que DaiH ne contient que les // variations plane de aiH (il manque les variations suivant la normale) mais cette partie suffit car la partie // qui manque est suivant N et donc normale à OpAp (donc elle disparait au niveau du produit scalaire) double dtheta1 = dOpAp * aiH.Coordo(1) + OpAp * DaiH(jnB).Coordo(1); // theta1 = OpAp * aiH.Coordo(1) double dtheta2 = dOpAp * aiH.Coordo(2) + OpAp * DaiH(jnB).Coordo(2); // theta2 = OpAp * aiH.Coordo(2) // la matrice dmat(jnB)(ncot,1)= dtheta1 * (theta1 - 1.) + theta1 * dtheta1; // mat(ncot,1) = theta1 * (theta1 - 1.) dmat(jnB)(ncot,2)= dtheta2 * (theta2 - 1.) + theta2 * dtheta2; // mat(ncot,2) = theta2 * (theta2 - 1.) dmat(jnB)(ncot,3)= dtheta1 * theta2 + theta1 * dtheta2; // mat(ncot,3) = theta1 * theta2 // le second membre dsm(jnB)(ncot) = dtheta3; // sm(ncot) = theta3 } {// indice de C: jnC int jnC = (indi(ncot+2)-1)*3+ia; // dA = 0 ; dOpA = - dOp(jnC); // OpA = A - Op; // la coordonnée en 3 double dtheta3 = dOpA * N + OpA * dN(jnC); // theta3 = OpA * N dOpAp = dOpA - dtheta3 * N - theta3 * dN(jnC); // OpAp = OpA - theta3 * N // les coordonnées locales // mêmes remarques 1) que plus haut double dtheta1 = dOpAp * aiH.Coordo(1) + OpAp * DaiH(jnC).Coordo(1); // theta1 = OpAp * aiH.Coordo(1) double dtheta2 = dOpAp * aiH.Coordo(2) + OpAp * DaiH(jnC).Coordo(2); // theta2 = OpAp * aiH.Coordo(2) // la matrice dmat(jnC)(ncot,1)= dtheta1 * (theta1 - 1.) + theta1 * dtheta1; // mat(ncot,1) = theta1 * (theta1 - 1.) dmat(jnC)(ncot,2)= dtheta2 * (theta2 - 1.) + theta2 * dtheta2; // mat(ncot,2) = theta2 * (theta2 - 1.) dmat(jnC)(ncot,3)= dtheta1 * theta2 + theta1 * dtheta2; // mat(ncot,3) = theta1 * theta2 // le second membre dsm(jnC)(ncot) = dtheta3; // sm(ncot) = theta3 } {// indice de D: jnD int jnD = (indi(ncot)-1)*3+ia; // dA = 0 ; dOpA = - dOp(jnD); // OpA = A - Op; // la coordonnée en 3 double dtheta3 = dOpA * N + OpA * dN(jnD); // theta3 = OpA * N dOpAp = dOpA - dtheta3 * N - theta3 * dN(jnD); // OpAp = OpA - theta3 * N // les coordonnées locales // mêmes remarques 1) que plus haut double dtheta1 = dOpAp * aiH.Coordo(1) + OpAp * DaiH(jnD).Coordo(1); // theta1 = OpAp * aiH.Coordo(1) double dtheta2 = dOpAp * aiH.Coordo(2) + OpAp * DaiH(jnD).Coordo(2); // theta2 = OpAp * aiH.Coordo(2) // la matrice dmat(jnD)(ncot,1)= dtheta1 * (theta1 - 1.) + theta1 * dtheta1; // mat(ncot,1) = theta1 * (theta1 - 1.) dmat(jnD)(ncot,2)= dtheta2 * (theta2 - 1.) + theta2 * dtheta2; // mat(ncot,2) = theta2 * (theta2 - 1.) dmat(jnD)(ncot,3)= dtheta1 * theta2 + theta1 * dtheta2; // mat(ncot,3) = theta1 * theta2 // le second membre dsm(jnD)(ncot) = dtheta3; // sm(ncot) = theta3 } }; // fin du for sur ia } else // cas ou il n'y a pas de noeud externe { // On va calculer la normale non normée au coté externe // ce vecteur est dans le plan de la facette CB = B - C; U1 = CB ; V = Util::ProdVec_coor(N,U1); // maintenant on calcul les coordonnées locales de V double theta1 = V * aiH.Coordo(1); double theta2 = V * aiH.Coordo(2); // construction de la ligne de la matrice mat(ncot,1) = theta1 * theta1; mat(ncot,2) = theta2 * theta2; mat(ncot,3) = theta1 * theta2; // et du second membre correspondant sm(ncot) = 0; // calcul des variations for (int ia=1;ia<= 3;ia++) { // {// indice de A: jnA, noeud extérieur // comme il n'y a pas de noeud extérieur et que N ne dépend pas des ddl extérieur, // normalement jnA n'intervient pas !! // int jnA = 9+(ncot-1)*3+ia; // // dCB = 0.; // CB = B - C // // dU1 = 0.; // U1 = CB // dV = Util::ProdVec_coor(dN(jnA),U1); // V = Util::ProdVec_coor(N,U1) // double dtheta1 = dV * aiH.Coordo(1) + V * DaiH(jnA).Coordo(1); // theta1 = V * aiH.Coordo(1); // double dtheta2 = dV * aiH.Coordo(2) + V * DaiH(jnA).Coordo(2); // theta2 = V * aiH.Coordo(2); // dmat(jnA)(ncot,1) = 2.* dtheta1 * theta1; // mat(ncot,1) = theta1 * theta1 // dmat(jnA)(ncot,2) = 2.* dtheta2 * theta2; // mat(ncot,2) = theta2 * theta2 // dmat(jnA)(ncot,3) = (dtheta1 * theta2 + theta1 * dtheta2); // mat(ncot,3) = 2. * theta1 * theta2 // dsm(jnA)(ncot) = 0.; // sm(ncot) = 0 // } {// indice de B: jnB, noeud de la facette centrale int jnB = (indi(ncot+1)-1)*3+ia; dB = Ia(ia); // d_CB = dB // CB = B - C // dU1 = dB; // U1 = CB dV = Util::ProdVec_coor(dN(jnB),U1) + Util::ProdVec_coor(N,dB); // V = Util::ProdVec_coor(N,U1) // 2) à noter ici que V est un vecteur de la facette, donc normale à N, et que DaiH ne contient que les // variations plane de aiH (il manque les variations suivant la normale) mais cette partie suffit car la partie // qui manque est suivant N et donc normale à V (donc elle disparait au niveau du produit scalaire) double dtheta1 = dV * aiH.Coordo(1) + V * DaiH(jnB).Coordo(1); // theta1 = V * aiH.Coordo(1); double dtheta2 = dV * aiH.Coordo(2) + V * DaiH(jnB).Coordo(2); // theta2 = V * aiH.Coordo(2); dmat(jnB)(ncot,1) = 2.* dtheta1 * theta1; // mat(ncot,1) = theta1 * theta1 dmat(jnB)(ncot,2) = 2.* dtheta2 * theta2; // mat(ncot,2) = theta2 * theta2 dmat(jnB)(ncot,3) = (dtheta1 * theta2 + theta1 * dtheta2); // mat(ncot,3) = 2. * theta1 * theta2 dsm(jnB)(ncot) = 0.; // sm(ncot) = 0 } {// indice de C: jnC int jnC = (indi(ncot+2)-1)*3+ia; dC = Ia(ia); //dCB = -dC; // CB = B - C // dU1 = -dC; // U1 = CB dV = Util::ProdVec_coor(dN(jnC),U1) + Util::ProdVec_coor(N,-dC); // V = Util::ProdVec_coor(N,U1) // mêmes remarques 2) que plus haut double dtheta1 = dV * aiH.Coordo(1) + V * DaiH(jnC).Coordo(1); // theta1 = V * aiH.Coordo(1); double dtheta2 = dV * aiH.Coordo(2) + V * DaiH(jnC).Coordo(2); // theta2 = V * aiH.Coordo(2); dmat(jnC)(ncot,1) = 2.* dtheta1 * theta1; // mat(ncot,1) = theta1 * theta1 dmat(jnC)(ncot,2) = 2.* dtheta2 * theta2; // mat(ncot,2) = theta2 * theta2 dmat(jnC)(ncot,3) = (dtheta1 * theta2 + theta1 * dtheta2); // mat(ncot,3) = 2. * theta1 * theta2 dsm(jnC)(ncot) = 0.; // sm(ncot) = 0 } {// indice de D: jnD int jnD = (indi(ncot)-1)*3+ia; // dCB = 0.; // CB = B - C // dU1 = 0.; // U1 = CB dV = Util::ProdVec_coor(dN(jnD),U1); // V = Util::ProdVec_coor(N,U1) // mêmes remarques 2) que plus haut double dtheta1 = dV * aiH.Coordo(1) + V * DaiH(jnD).Coordo(1); // theta1 = V * aiH.Coordo(1); double dtheta2 = dV * aiH.Coordo(2) + V * DaiH(jnD).Coordo(2); // theta2 = V * aiH.Coordo(2); dmat(jnD)(ncot,1) = 2.* dtheta1 * theta1; // mat(ncot,1) = theta1 * theta1 dmat(jnD)(ncot,2) = 2.* dtheta2 * theta2; // mat(ncot,2) = theta2 * theta2 dmat(jnD)(ncot,3) = (dtheta1 * theta2 + theta1 * dtheta2); // mat(ncot,3) = 2. * theta1 * theta2 dsm(jnD)(ncot) = 0.; // sm(ncot) = 0 } }; // fin du for sur ia }; // fin du cas où il n'y a pas de noeud externe } else { // cas avec une condition de tangente imposée // on commence par définir la direction de la tangente CB = B - C; V = Util::ProdVec_coor(CB,vplan(nbcote)); // on calcul les coordonnées du point milieu de BC que l'on nome Mm Mm = 0.5*(B+C); OpMm = Mm - Op; // calcul des coordonnées locales du vecteur tangent double d1 = V*aiH.Coordo(1); double d2=V*aiH.Coordo(2); double d3 = V*N; // les coordonnées locales de Mm double theta1 = OpMm * aiH.Coordo(1); double theta2 = OpMm * aiH.Coordo(2); // les coordonnée sont ici des coordonnées matérielles qui dans le cas linéaires sont constantes (0.5,0) ou // (0.5,0.5) ou (0,0.5) leur variations est donc nulles // ***** donc on peut simplifier les expressions qui suivent en annulant les variations de theta_alpha // construction de la ligne de la matrice mat(ncot,1) = (2.*theta1 - 1.) * d1; mat(ncot,2) = (2.*theta2 - 1.) * d2; mat(ncot,3) = (theta1 * d2 + theta2 * d1); // et du second membre correspondant sm(ncot) = d3; // calcul des variations for (int ia=1;ia<= 3;ia++) { {// indice de B: jnB, noeud de la facette centrale int jnB = (indi(ncot+1)-1)*3+ia; dB = Ia(ia); // d_CB = dB // CB = B - C dV = Util::ProdVec_coor(dB,vplan(nbcote)); // V = Util::ProdVec_coor(CB,vplan(nbcote)) // mêmes remarques 2) que plus haut double dd1=dV*aiH.Coordo(1)+V*DaiH(jnB).Coordo(1); // d1 = V*aiH.Coordo(1) double dd2=dV*aiH.Coordo(2)+V*DaiH(jnB).Coordo(2); // d2=V*aiH.Coordo(2) double dd3=dV*N+V*dN(jnB); // d3 = V*N // dMm = 0.5 * dB ; // Mm = 0.5*(B+C); dOpMm = 0.5 * dB - dOp(jnB); // OpMm = Mm - Op; // les coordonnées locales // ici également, OpMm est dans le plan de la facette d'où mêmes remarques 2) que plus haut double dtheta1 = dOpMm * aiH.Coordo(1) + OpMm * DaiH(jnB).Coordo(1); // theta1 = OpMm * aiH.Coordo(1) double dtheta2 = dOpMm * aiH.Coordo(2) + OpMm * DaiH(jnB).Coordo(2); // theta2 = OpMm * aiH.Coordo(2) dmat(jnB)(ncot,1) = (2.*dtheta1-1.)*d1+(2.*theta1-1.)*dd1; // mat(ncot,1) = (2.*theta1 - 1.) * d1 dmat(jnB)(ncot,2) = (2.*dtheta2-1.)*d2+(2.*theta2-1.)*dd2; // mat(ncot,1) = (2.*theta1 - 1.) * d1 dmat(jnB)(ncot,3) = (dtheta1*d2+dtheta2*d1)+(theta1*dd2+theta2*dd1); // mat(ncot,3) = (theta1 * d2 + theta2 * d1); dsm(jnB)(ncot) = dd3; // sm(ncot) = d3 } {// indice de C: jnC int jnC = (indi(ncot+2)-1)*3+ia; dC = Ia(ia); //dCB = -dC; // CB = B - C dV = Util::ProdVec_coor(-dC,vplan(nbcote)); // V = Util::ProdVec_coor(CB,vplan(nbcote)) double dd1=dV*aiH.Coordo(1)+V*DaiH(jnC).Coordo(1); // d1 = V*aiH.Coordo(1) double dd2=dV*aiH.Coordo(2)+V*DaiH(jnC).Coordo(2); // d2=V*aiH.Coordo(2) double dd3=dV*N+V*dN(jnC); // d3 = V*N // dMm = 0.5 * dC ; // Mm = 0.5*(B+C); dOpMm = 0.5 * dC - dOp(jnC); // OpMm = Mm - Op; // les coordonnées locales // ici également, OpMm est dans le plan de la facette d'où mêmes remarques 2) que plus haut double dtheta1 = dOpMm * aiH.Coordo(1) + OpMm * DaiH(jnC).Coordo(1); // theta1 = OpMm * aiH.Coordo(1) double dtheta2 = dOpMm * aiH.Coordo(2) + OpMm * DaiH(jnC).Coordo(2); // theta2 = OpMm * aiH.Coordo(2) dmat(jnC)(ncot,1) = (2.*dtheta1-1.)*d1+(2.*theta1-1.)*dd1; // mat(ncot,1) = (2.*theta1 - 1.) * d1 dmat(jnC)(ncot,2) = (2.*dtheta2-1.)*d2+(2.*theta2-1.)*dd2; // mat(ncot,1) = (2.*theta1 - 1.) * d1 dmat(jnC)(ncot,3) = (dtheta1*d2+dtheta2*d1)+(theta1*dd2+theta2*dd1); // mat(ncot,3) = (theta1 * d2 + theta2 * d1); dsm(jnC)(ncot) = dd3; // sm(ncot) = d3 } {// indice de D: jnD int jnD = (indi(ncot)-1)*3+ia; // dCB = 0.; // CB = B - C dV = 0. ; // V = Util::ProdVec_coor(CB,vplan(nbcote)) double dd1=V*DaiH(jnD).Coordo(1); // d1 = V*aiH.Coordo(1) double dd2=V*DaiH(jnD).Coordo(2); // d2=V*aiH.Coordo(2) double dd3=V*dN(jnD); // d3 = V*N // dMm = 0.5 * dB ; // Mm = 0.5*(B+C); dOpMm = - dOp(jnD); // OpMm = Mm - Op; // les coordonnées locales // ici également, OpMm est dans le plan de la facette d'où mêmes remarques 2) que plus haut double dtheta1 = dOpMm * aiH.Coordo(1) + OpMm * DaiH(jnD).Coordo(1); // theta1 = OpMm * aiH.Coordo(1) double dtheta2 = dOpMm * aiH.Coordo(2) + OpMm * DaiH(jnD).Coordo(2); // theta2 = OpMm * aiH.Coordo(2) dmat(jnD)(ncot,1) = (2.*dtheta1-1.)*d1+(2.*theta1-1.)*dd1; // mat(ncot,1) = (2.*theta1 - 1.) * d1 dmat(jnD)(ncot,2) = (2.*dtheta2-1.)*d2+(2.*theta2-1.)*dd2; // mat(ncot,1) = (2.*theta1 - 1.) * d1 dmat(jnD)(ncot,3) = (dtheta1*d2+dtheta2*d1)+(theta1*dd2+theta2*dd1); // mat(ncot,3) = (theta1 * d2 + theta2 * d1); dsm(jnD)(ncot) = dd3; // sm(ncot) = d3 } }; // fin du for sur ia }; // fin du test sur les CL: condition de tangence }; // fin de la boucle sur les 3 noeuds externes // calcul du tenseur de courbure dans la base ai Mat_pleine mati = mat.Inverse(); //---- pour le debug des cas particuliers ---- #ifdef MISE_AU_POINT if (ParaGlob::NiveauImpression() > 3) { int i,j; if (mati.MaxiValAbs(i,j) > ConstMath::grand) { cout << "\n *** Met_Sfe1::Dcourbure4, mati.MaxiValAbs(i,j) est trop grand :\n mat= "; mat.Affiche(); cout << "\n inverse de mat: mati= "; mati.Affiche(); // affichage des éléments du triangle cout << "\n pour chaque cote : on utilise les notations : triangle principal DBC et secondaire BAC"; cout << "\n Op= "<< Op << "\n N= "<< N ; for (int ncot=1;ncot<=3;ncot++) { // on utilise les notations : triangle principal DBC et secondaire BAC // simplification de l'ecriture cout << "\n cote : "<< ncot ; const Coordonnee3& D = tab_coor(indi(ncot)); const Coordonnee3& B = tab_coor(indi(ncot+1)); const Coordonnee3& C = tab_coor(indi(ncot+2)); const Coordonnee3& A = tab_coor(indi(ncot)+3); cout << "\n D= "<< D << "\n B= " << B << "\n C= "<< C << "\n A= "<< A; cout << "\n aiH(1)= "<& tab_noeud,bool gradV_instantane ,Mat_pleine const & dphiS,int nombre_noeud,Vecteur const & phiS ,Mat_pleine const & tabdphiH,Vecteur const& phiH,const Epai* epas ,Tableau const & tabTypeCL,Tableau const & vplan) { // l'idée est de faire une vérification des dérivées à l'aide d'une méthode de différence finie int dim = ParaGlob::Dimension(); // dans le cas du premier passage on indique qu'il y a vérification if (indic_Verif_DcourbureSFE == 0) { cout << "\n ****verification du calcul de la variation de courbure ****"; cout << "\n Met_Sfe1::Verif_Dcourbure(.. \n"; } indic_Verif_DcourbureSFE++; // on définit 2 seconde métriques, car il faudra modifier les vecteurs ai et les vecteurs gi, donc // il vaut mieux travailler sur une copie Met_Sfe1 metrique_bis_1(*this);Met_Sfe1 metrique_bis_2(*this); // ici on considère que l'on a même nombre de ddl par noeud = dim // on va modifier chaque ddl de chaque noeud systématiquement int nbnoeud = tab_noeud.Taille(); // le deltat pour les différences finis double delta = ConstMath::unpeupetit; double mini_val = ConstMath::pasmalpetit; int numddl = 1; // le compteur de ddl int nberr = 10; Tableau erreur(nberr); double diff_admi = 0.1; bool premier_calcul=true; for (int inoeud=1;inoeud<=nbnoeud;inoeud++) // on ne fait la vérification que si le noeud externe existe if (( inoeud <= 3) || ( (tab_noeud(inoeud-3)->Num_noeud()) != (tab_noeud(inoeud)->Num_noeud()))) {// on récupère les coordonnées du noeud Coordonnee coordtdt = tab_noeud(inoeud)->Coord2(); for (int ix= 1;ix<=dim;ix++,numddl++) { Coordonnee X(dim); X(ix) += delta; tab_noeud(inoeud)->Ajout_coord2(X); // appel de la métrique metrique_bis_1.CalSfe1_explicit_tdt( tab_noeud,gradV_instantane,dphiS,nombre_noeud,phiS,premier_calcul ,tabdphiH,phiH,epas,tabTypeCL,vplan); // maintenant on remet les coordonnées du noeud à l'état initial tab_noeud(inoeud)->Change_coord2(coordtdt); // et on décale dégativement X(ix) -= 2*delta; tab_noeud(inoeud)->Ajout_coord2(X); // appel de la métrique metrique_bis_2.CalSfe1_explicit_tdt( tab_noeud,gradV_instantane,dphiS,nombre_noeud,phiS,premier_calcul ,tabdphiH,phiH,epas,tabTypeCL,vplan); // maintenant on remet les coordonnées du noeud à l'état initial tab_noeud(inoeud)->Change_coord2(coordtdt); premier_calcul=false; // calcul des dérivées numériques et vérification int nb_vecteur = 2; for (int j=1;j<=nb_vecteur;j++) { // variation des vecteurs aiB_tdt CoordonneeB daiB = ((*metrique_bis_1.aiB_tdt)(j) -(*metrique_bis_2.aiB_tdt)(j))/(2*delta); CoordonneeB toto = ((*metrique_bis_1.aiB_tdt)(j) -(*metrique_bis_2.aiB_tdt)(j)); for (int i=1;i<=dim;i++) if (diffpourcent(daiB(i),(*d_aiB_tdt)(numddl)(j)(i),MaX(Dabs(daiB(i)),Dabs((*d_aiB_tdt)(numddl)(j)(i))),diff_admi)) { if (DabsMiN(daiB(i),(*d_aiB_tdt)(numddl)(j)(i)) <= mini_val) {if ( DabsMaX(daiB(i),(*d_aiB_tdt)(numddl)(j)(i)) > 50.*delta) {erreur(1) += 1; cout << "\ndaiB("<& tab_coor, const BaseB & aiB , const BaseH & aiH ,Tableau const & tabTypeCL,Tableau const & vplan) { // calcul de la normale centrale // on utilise des expressions strictement identique ici et dans dcourbure // de manière à éviter les erreurs d'arrondis //Coordonnee3 N = (Util::ProdVec_coorBN(aiB(1),aiB(2))).Normer(); // calcul de la normale centrale Coordonnee3 NN = Util::ProdVec_coorBN(aiB(1),aiB(2)); // normale non normee double nor = NN.Norme(); // la norme Coordonnee3 N = NN / nor; Mat_pleine mat(3,3); // matrice pour calculer le tenseur de courbure Vecteur sm(3); // le second membre pour le calcul de la courbure // origine const Coordonnee3& Op=tab_coor(1);// origine du repère local // le meme calcul est effectue pour les trois cotes du triangle principale //1- on utilise indi un tableau d'indice pour ne pas etre embete par les modulos 3 // 2- on boucle sur le cotes du triangle Coordonnee3 U1,CB,V,OpA; Coordonnee3 Mm,OpMm; Coordonnee3 OpAp; // le vecteur horizontal correspondant à OpA for (int ncot=1;ncot<=3;ncot++) { // on utilise les notations : triangle principal DBC et secondaire BAC // simplification de l'ecriture (vérifiée) const Coordonnee3& D = tab_coor(indi(ncot)); const Coordonnee3& B = tab_coor(indi(ncot+1)); const Coordonnee3& C = tab_coor(indi(ncot+2)); const Coordonnee3& A = tab_coor(indi(ncot)+3); // examen de condition limite éventuelle // ncot % 3 +1: = le coté en face du noeud ncot if (tabTypeCL(ncot % 3 +1) != TANGENTE_CL) { // cas sans conditions limites particulières if (D != A) // cas ou le noeud externe existe {OpA = A - Op; double theta3 = OpA * N; // cote du point externe OpAp = OpA - theta3 * N; // projection de OpA sur la facette double theta1 = OpAp * aiH.Coordo(1); double theta2 = OpAp * aiH.Coordo(2); // les coordonnées locales de A // construction de la ligne de la matrice mat(ncot,1) = theta1 * (theta1 - 1.); mat(ncot,2) = theta2 * (theta2 - 1.); mat(ncot,3) = theta1 * theta2; // et du second membre correspondant sm(ncot) = theta3; } else // cas ou il n'y a pas de noeud externe {// On va calculer la normale non normée au coté externe // ce vecteur est dans le plan de la facette CB = B - C; U1 = CB ; V = Util::ProdVec_coor(N,U1); // maintenant on calcul les coordonnées locales de V double theta1 = V * aiH.Coordo(1); double theta2 = V * aiH.Coordo(2); // construction de la ligne de la matrice mat(ncot,1) = theta1 * theta1; mat(ncot,2) = theta2 * theta2; mat(ncot,3) = theta1 * theta2; // et du second membre correspondant sm(ncot) = 0; }; } else { // cas avec une condition de tangente imposée // on commence par définir la direction de la tangente CB = B - C; V = Util::ProdVec_coor(CB,vplan(ncot % 3 +1)); // calcul des coordonnées locales du vecteur tangent double d1 = V*aiH.Coordo(1); double d2=V*aiH.Coordo(2); double d3 = V*N; // on calcul les coordonnées du point milieu de BC que l'on nome Mm Mm = 0.5*(B+C); OpMm = Mm - Op; // les coordonnées locales de Mm double theta1 = OpMm * aiH.Coordo(1); double theta2 = OpMm * aiH.Coordo(2); // construction de la ligne de la matrice mat(ncot,1) = (2.*theta1 - 1.) * d1; mat(ncot,2) = (2.*theta2 - 1.) * d2; mat(ncot,3) = (theta1 * d2 + theta2 * d1); // et du second membre correspondant sm(ncot) = d3; }; }; // calcul du tenseur de courbure dans la base ai Mat_pleine mati = mat.Inverse(); Vecteur curbi = mati * sm; // retour de la courbure Tenseur_ns2BB curb; curb.Coor(1,1)=2. * curbi(1); curb.Coor(1,2)=curb.Coor(2,1)=curbi(3); curb.Coor(2,2)= 2. * curbi(2); return curb; }; // routine (4) generale de calcul de la courbure et de sa variation // en sortie : curb , la courbure b11,b12,b22 // dcurb , la variation de courbure. // On ne considere dans les variations que les termes relatif aux ddl qui font varier // les normales // cas 4: calcul de la courbure à partir d'un polynôme passant par les 6 points void Met_Sfe1::Dcourbure4 ( const Tableau& tab_coor, const BaseB & aiB , const Tableau & DaiB,const BaseH & aiH , const Tableau & DaiH,Tenseur_ns2BB& curb,TabOper & dcurb ,Tableau const & tabTypeCL,Tableau const & vplan) { int nbddl = (nbNoeudCentral+3)*3; //18; // nombre de ddl total Coordonnee3 Nul; // le vecteur nul de dim 3, pour les initialisations Mat_pleine mat(3,3); // matrice pour calculer le tenseur de courbure Tableau dmat(nbddl,mat); // sa variation Vecteur sm(3); // le second membre pour le calcul de la courbure Tableau dsm(nbddl,sm); // sa variation // calcul de la normale centrale Coordonnee3 NN = Util::ProdVec_coorBN(aiB(1),aiB(2)); // normale non normee double nor = NN.Norme(); // la norme Coordonnee3 N = NN / nor; Coordonnee3 DNN; // vecteur intermediaire // calcul de la variation de la normale centrale : vérifiée Tableau dN(nbddl,Nul); // on s'intéresse ici qu'aux ddl de la face centrale for (int inc=1;inc<=3;inc++) // indice du numéro de noeud de la face centrale for (int ib=1;ib<=3;ib++) { // cas de la normale int i1=(inc-1)*3+ib; DNN = Util::ProdVec_coorBN(DaiB(i1)(1),aiB(2)) + Util::ProdVec_coorBN(aiB(1),DaiB(i1)(2)); dN(i1) = Util::VarUnVect_coor(NN,DNN,nor); }; // origine const Coordonnee3& Op=tab_coor(1);// origine du repère local Tableau dOp(nbddl,Nul); dOp(1)=Ia(1);dOp(2)=Ia(2);dOp(3)=Ia(3); // et les autres dérivées sont nulles // le meme calcul est effectue pour les trois cotes du triangle principale //1- on utilise un tableau d'indice pour ne pas etre embete par les modulos 3 // 2- on boucle sur le cotes du triangle Coordonnee3 CB,U1,V,dV; Coordonnee3 OpA,OpAp; Coordonnee3 dA,dOpA,dOpAp,dB,dC; Coordonnee3 Mm,dMm,OpMm,dOpMm; for (int ncot=1;ncot<=3;ncot++) { // on utilise les notations : triangle principal DBC et secondaire BAC // simplification de l'ecriture const Coordonnee3& D = tab_coor(indi(ncot)); const Coordonnee3& B = tab_coor(indi(ncot+1)); const Coordonnee3& C = tab_coor(indi(ncot+2)); const Coordonnee3& A = tab_coor(indi(ncot)+3); // examen de condition limite éventuelle int nbcote = ncot % 3 +1; // le numéro du coté en face du noeud ncot if (tabTypeCL(nbcote) != TANGENTE_CL) { // cas sans conditions limites particulières if (D != A) // cas ou le noeud externe existe {OpA = A - Op; double theta3 = OpA * N; // cote du point externe OpAp = OpA - theta3 * N; // projection de OpA sur la facette // les coordonnées locales de A double theta1 = OpAp * aiH.Coordo(1); double theta2 = OpAp * aiH.Coordo(2); // construction de la ligne de la matrice mat(ncot,1) = theta1 * (theta1 - 1.); mat(ncot,2) = theta2 * (theta2 - 1.); mat(ncot,3) = theta1 * theta2; // et du second membre correspondant sm(ncot) = theta3; // calcul des variations for (int ia=1;ia<= 3;ia++) {{// indice de A: jnA, noeud extérieur int jnA = 9+(ncot-1)*3+ia; dA = Ia(ia); dOpA = dA; // dOp(jnA)=0 // OpA = A - Op; // la coordonnée en 3 double dtheta3 = dOpA * N; // dN(jnA)=0 car noeud externe // theta3 = OpA * N dOpAp = dOpA - dtheta3 * N ; //dN(jnA)=0; // OpAp = OpA - theta3 * N // les coordonnées locales double dtheta1 = dOpAp * aiH.Coordo(1); // DaiH(jnA).Coordo(1)=0; // theta1 = OpAp * aiH.Coordo(1) double dtheta2 = dOpAp * aiH.Coordo(2);// DaiH(jnA).Coordo(2)=0; // theta2 = OpAp * aiH.Coordo(2) // la matrice dmat(jnA)(ncot,1)= dtheta1 * (theta1 - 1.) + theta1 * dtheta1; // mat(ncot,1) = theta1 * (theta1 - 1.) dmat(jnA)(ncot,2)= dtheta2 * (theta2 - 1.) + theta2 * dtheta2; // mat(ncot,2) = theta2 * (theta2 - 1.) dmat(jnA)(ncot,3)= dtheta1 * theta2 + theta1 * dtheta2; // mat(ncot,3) = theta1 * theta2 // le second membre dsm(jnA)(ncot) = dtheta3; // sm(ncot) = theta3 } {// indice de B: jnB, noeud de la facette centrale int jnB = (indi(ncot+1)-1)*3+ia; // dA = 0 ; dOpA = - dOp(jnB); // OpA = A - Op; // la coordonnée en 3 double dtheta3 = dOpA * N + OpA * dN(jnB); // theta3 = OpA * N dOpAp = dOpA - dtheta3 * N - theta3 * dN(jnB); // OpAp = OpA - theta3 * N // les coordonnées locales // 1) à noter ici que OpAp est un vecteur de la facette, donc normale à N, et que DaiH ne contient que les // variations plane de aiH (il manque les variations suivant la normale) mais cette partie suffit car la partie // qui manque est suivant N et donc normale à OpAp (donc elle disparait au niveau du produit scalaire) double dtheta1 = dOpAp * aiH.Coordo(1) + OpAp * DaiH(jnB).Coordo(1); // theta1 = OpAp * aiH.Coordo(1) double dtheta2 = dOpAp * aiH.Coordo(2) + OpAp * DaiH(jnB).Coordo(2); // theta2 = OpAp * aiH.Coordo(2) // la matrice dmat(jnB)(ncot,1)= dtheta1 * (theta1 - 1.) + theta1 * dtheta1; // mat(ncot,1) = theta1 * (theta1 - 1.) dmat(jnB)(ncot,2)= dtheta2 * (theta2 - 1.) + theta2 * dtheta2; // mat(ncot,2) = theta2 * (theta2 - 1.) dmat(jnB)(ncot,3)= dtheta1 * theta2 + theta1 * dtheta2; // mat(ncot,3) = theta1 * theta2 // le second membre dsm(jnB)(ncot) = dtheta3; // sm(ncot) = theta3 } {// indice de C: jnC int jnC = (indi(ncot+2)-1)*3+ia; // dA = 0 ; dOpA = - dOp(jnC); // OpA = A - Op; // la coordonnée en 3 double dtheta3 = dOpA * N + OpA * dN(jnC); // theta3 = OpA * N dOpAp = dOpA - dtheta3 * N - theta3 * dN(jnC); // OpAp = OpA - theta3 * N // les coordonnées locales // mêmes remarques 1) que plus haut double dtheta1 = dOpAp * aiH.Coordo(1) + OpAp * DaiH(jnC).Coordo(1); // theta1 = OpAp * aiH.Coordo(1) double dtheta2 = dOpAp * aiH.Coordo(2) + OpAp * DaiH(jnC).Coordo(2); // theta2 = OpAp * aiH.Coordo(2) // la matrice dmat(jnC)(ncot,1)= dtheta1 * (theta1 - 1.) + theta1 * dtheta1; // mat(ncot,1) = theta1 * (theta1 - 1.) dmat(jnC)(ncot,2)= dtheta2 * (theta2 - 1.) + theta2 * dtheta2; // mat(ncot,2) = theta2 * (theta2 - 1.) dmat(jnC)(ncot,3)= dtheta1 * theta2 + theta1 * dtheta2; // mat(ncot,3) = theta1 * theta2 // le second membre dsm(jnC)(ncot) = dtheta3; // sm(ncot) = theta3 } {// indice de D: jnD int jnD = (indi(ncot)-1)*3+ia; // dA = 0 ; dOpA = - dOp(jnD); // OpA = A - Op; // la coordonnée en 3 double dtheta3 = dOpA * N + OpA * dN(jnD); // theta3 = OpA * N dOpAp = dOpA - dtheta3 * N - theta3 * dN(jnD); // OpAp = OpA - theta3 * N // les coordonnées locales // mêmes remarques 1) que plus haut double dtheta1 = dOpAp * aiH.Coordo(1) + OpAp * DaiH(jnD).Coordo(1); // theta1 = OpAp * aiH.Coordo(1) double dtheta2 = dOpAp * aiH.Coordo(2) + OpAp * DaiH(jnD).Coordo(2); // theta2 = OpAp * aiH.Coordo(2) // la matrice dmat(jnD)(ncot,1)= dtheta1 * (theta1 - 1.) + theta1 * dtheta1; // mat(ncot,1) = theta1 * (theta1 - 1.) dmat(jnD)(ncot,2)= dtheta2 * (theta2 - 1.) + theta2 * dtheta2; // mat(ncot,2) = theta2 * (theta2 - 1.) dmat(jnD)(ncot,3)= dtheta1 * theta2 + theta1 * dtheta2; // mat(ncot,3) = theta1 * theta2 // le second membre dsm(jnD)(ncot) = dtheta3; // sm(ncot) = theta3 } }; // fin du for sur ia } else // cas ou il n'y a pas de noeud externe { // On va calculer la normale non normée au coté externe // ce vecteur est dans le plan de la facette CB = B - C; U1 = CB ; V = Util::ProdVec_coor(N,U1); // maintenant on calcul les coordonnées locales de V double theta1 = V * aiH.Coordo(1); double theta2 = V * aiH.Coordo(2); // construction de la ligne de la matrice mat(ncot,1) = theta1 * theta1; mat(ncot,2) = theta2 * theta2; mat(ncot,3) = theta1 * theta2; // et du second membre correspondant sm(ncot) = 0; // calcul des variations for (int ia=1;ia<= 3;ia++) { // {// indice de A: jnA, noeud extérieur // comme il n'y a pas de noeud extérieur et que N ne dépend pas des ddl extérieur, // normalement jnA n'intervient pas !! // int jnA = 9+(ncot-1)*3+ia; // // dCB = 0.; // CB = B - C // // dU1 = 0.; // U1 = CB // dV = Util::ProdVec_coor(dN(jnA),U1); // V = Util::ProdVec_coor(N,U1) // double dtheta1 = dV * aiH.Coordo(1) + V * DaiH(jnA).Coordo(1); // theta1 = V * aiH.Coordo(1); // double dtheta2 = dV * aiH.Coordo(2) + V * DaiH(jnA).Coordo(2); // theta2 = V * aiH.Coordo(2); // dmat(jnA)(ncot,1) = 2.* dtheta1 * theta1; // mat(ncot,1) = theta1 * theta1 // dmat(jnA)(ncot,2) = 2.* dtheta2 * theta2; // mat(ncot,2) = theta2 * theta2 // dmat(jnA)(ncot,3) = (dtheta1 * theta2 + theta1 * dtheta2); // mat(ncot,3) = 2. * theta1 * theta2 // dsm(jnA)(ncot) = 0.; // sm(ncot) = 0 // } {// indice de B: jnB, noeud de la facette centrale int jnB = (indi(ncot+1)-1)*3+ia; dB = Ia(ia); // d_CB = dB // CB = B - C // dU1 = dB; // U1 = CB dV = Util::ProdVec_coor(dN(jnB),U1) + Util::ProdVec_coor(N,dB); // V = Util::ProdVec_coor(N,U1) // 2) à noter ici que V est un vecteur de la facette, donc normale à N, et que DaiH ne contient que les // variations plane de aiH (il manque les variations suivant la normale) mais cette partie suffit car la partie // qui manque est suivant N et donc normale à V (donc elle disparait au niveau du produit scalaire) double dtheta1 = dV * aiH.Coordo(1) + V * DaiH(jnB).Coordo(1); // theta1 = V * aiH.Coordo(1); double dtheta2 = dV * aiH.Coordo(2) + V * DaiH(jnB).Coordo(2); // theta2 = V * aiH.Coordo(2); dmat(jnB)(ncot,1) = 2.* dtheta1 * theta1; // mat(ncot,1) = theta1 * theta1 dmat(jnB)(ncot,2) = 2.* dtheta2 * theta2; // mat(ncot,2) = theta2 * theta2 dmat(jnB)(ncot,3) = (dtheta1 * theta2 + theta1 * dtheta2); // mat(ncot,3) = 2. * theta1 * theta2 dsm(jnB)(ncot) = 0.; // sm(ncot) = 0 } {// indice de C: jnC int jnC = (indi(ncot+2)-1)*3+ia; dC = Ia(ia); //dCB = -dC; // CB = B - C // dU1 = -dC; // U1 = CB dV = Util::ProdVec_coor(dN(jnC),U1) + Util::ProdVec_coor(N,-dC); // V = Util::ProdVec_coor(N,U1) // mêmes remarques 2) que plus haut double dtheta1 = dV * aiH.Coordo(1) + V * DaiH(jnC).Coordo(1); // theta1 = V * aiH.Coordo(1); double dtheta2 = dV * aiH.Coordo(2) + V * DaiH(jnC).Coordo(2); // theta2 = V * aiH.Coordo(2); dmat(jnC)(ncot,1) = 2.* dtheta1 * theta1; // mat(ncot,1) = theta1 * theta1 dmat(jnC)(ncot,2) = 2.* dtheta2 * theta2; // mat(ncot,2) = theta2 * theta2 dmat(jnC)(ncot,3) = (dtheta1 * theta2 + theta1 * dtheta2); // mat(ncot,3) = 2. * theta1 * theta2 dsm(jnC)(ncot) = 0.; // sm(ncot) = 0 } {// indice de D: jnD int jnD = (indi(ncot)-1)*3+ia; // dCB = 0.; // CB = B - C // dU1 = 0.; // U1 = CB dV = Util::ProdVec_coor(dN(jnD),U1); // V = Util::ProdVec_coor(N,U1) // mêmes remarques 2) que plus haut double dtheta1 = dV * aiH.Coordo(1) + V * DaiH(jnD).Coordo(1); // theta1 = V * aiH.Coordo(1); double dtheta2 = dV * aiH.Coordo(2) + V * DaiH(jnD).Coordo(2); // theta2 = V * aiH.Coordo(2); dmat(jnD)(ncot,1) = 2.* dtheta1 * theta1; // mat(ncot,1) = theta1 * theta1 dmat(jnD)(ncot,2) = 2.* dtheta2 * theta2; // mat(ncot,2) = theta2 * theta2 dmat(jnD)(ncot,3) = (dtheta1 * theta2 + theta1 * dtheta2); // mat(ncot,3) = 2. * theta1 * theta2 dsm(jnD)(ncot) = 0.; // sm(ncot) = 0 } }; // fin du for sur ia }; // fin du cas où il n'y a pas de noeud externe } else { // cas avec une condition de tangente imposée // on commence par définir la direction de la tangente CB = B - C; V = Util::ProdVec_coor(CB,vplan(nbcote)); // on calcul les coordonnées du point milieu de BC que l'on nome Mm Mm = 0.5*(B+C); OpMm = Mm - Op; // calcul des coordonnées locales du vecteur tangent double d1 = V*aiH.Coordo(1); double d2=V*aiH.Coordo(2); double d3 = V*N; // les coordonnées locales de Mm double theta1 = OpMm * aiH.Coordo(1); double theta2 = OpMm * aiH.Coordo(2); // les coordonnée sont ici des coordonnées matérielles qui dans le cas linéaires sont constantes (0.5,0) ou // (0.5,0.5) ou (0,0.5) leur variations est donc nulles // ***** donc on peut simplifier les expressions qui suivent en annulant les variations de theta_alpha // construction de la ligne de la matrice mat(ncot,1) = (2.*theta1 - 1.) * d1; mat(ncot,2) = (2.*theta2 - 1.) * d2; mat(ncot,3) = (theta1 * d2 + theta2 * d1); // et du second membre correspondant sm(ncot) = d3; // calcul des variations for (int ia=1;ia<= 3;ia++) { {// indice de B: jnB, noeud de la facette centrale int jnB = (indi(ncot+1)-1)*3+ia; dB = Ia(ia); // d_CB = dB // CB = B - C dV = Util::ProdVec_coor(dB,vplan(nbcote)); // V = Util::ProdVec_coor(CB,vplan(nbcote)) // mêmes remarques 2) que plus haut double dd1=dV*aiH.Coordo(1)+V*DaiH(jnB).Coordo(1); // d1 = V*aiH.Coordo(1) double dd2=dV*aiH.Coordo(2)+V*DaiH(jnB).Coordo(2); // d2=V*aiH.Coordo(2) double dd3=dV*N+V*dN(jnB); // d3 = V*N // dMm = 0.5 * dB ; // Mm = 0.5*(B+C); dOpMm = 0.5 * dB - dOp(jnB); // OpMm = Mm - Op; // les coordonnées locales // ici également, OpMm est dans le plan de la facette d'où mêmes remarques 2) que plus haut double dtheta1 = dOpMm * aiH.Coordo(1) + OpMm * DaiH(jnB).Coordo(1); // theta1 = OpMm * aiH.Coordo(1) double dtheta2 = dOpMm * aiH.Coordo(2) + OpMm * DaiH(jnB).Coordo(2); // theta2 = OpMm * aiH.Coordo(2) dmat(jnB)(ncot,1) = (2.*dtheta1-1.)*d1+(2.*theta1-1.)*dd1; // mat(ncot,1) = (2.*theta1 - 1.) * d1 dmat(jnB)(ncot,2) = (2.*dtheta2-1.)*d2+(2.*theta2-1.)*dd2; // mat(ncot,1) = (2.*theta1 - 1.) * d1 dmat(jnB)(ncot,3) = (dtheta1*d2+dtheta2*d1)+(theta1*dd2+theta2*dd1); // mat(ncot,3) = (theta1 * d2 + theta2 * d1); dsm(jnB)(ncot) = dd3; // sm(ncot) = d3 } {// indice de C: jnC int jnC = (indi(ncot+2)-1)*3+ia; dC = Ia(ia); //dCB = -dC; // CB = B - C dV = Util::ProdVec_coor(-dC,vplan(nbcote)); // V = Util::ProdVec_coor(CB,vplan(nbcote)) double dd1=dV*aiH.Coordo(1)+V*DaiH(jnC).Coordo(1); // d1 = V*aiH.Coordo(1) double dd2=dV*aiH.Coordo(2)+V*DaiH(jnC).Coordo(2); // d2=V*aiH.Coordo(2) double dd3=dV*N+V*dN(jnC); // d3 = V*N // dMm = 0.5 * dC ; // Mm = 0.5*(B+C); dOpMm = 0.5 * dC - dOp(jnC); // OpMm = Mm - Op; // les coordonnées locales // ici également, OpMm est dans le plan de la facette d'où mêmes remarques 2) que plus haut double dtheta1 = dOpMm * aiH.Coordo(1) + OpMm * DaiH(jnC).Coordo(1); // theta1 = OpMm * aiH.Coordo(1) double dtheta2 = dOpMm * aiH.Coordo(2) + OpMm * DaiH(jnC).Coordo(2); // theta2 = OpMm * aiH.Coordo(2) dmat(jnC)(ncot,1) = (2.*dtheta1-1.)*d1+(2.*theta1-1.)*dd1; // mat(ncot,1) = (2.*theta1 - 1.) * d1 dmat(jnC)(ncot,2) = (2.*dtheta2-1.)*d2+(2.*theta2-1.)*dd2; // mat(ncot,1) = (2.*theta1 - 1.) * d1 dmat(jnC)(ncot,3) = (dtheta1*d2+dtheta2*d1)+(theta1*dd2+theta2*dd1); // mat(ncot,3) = (theta1 * d2 + theta2 * d1); dsm(jnC)(ncot) = dd3; // sm(ncot) = d3 } {// indice de D: jnD int jnD = (indi(ncot)-1)*3+ia; // dCB = 0.; // CB = B - C dV = 0. ; // V = Util::ProdVec_coor(CB,vplan(nbcote)) double dd1=V*DaiH(jnD).Coordo(1); // d1 = V*aiH.Coordo(1) double dd2=V*DaiH(jnD).Coordo(2); // d2=V*aiH.Coordo(2) double dd3=V*dN(jnD); // d3 = V*N // dMm = 0.5 * dB ; // Mm = 0.5*(B+C); dOpMm = - dOp(jnD); // OpMm = Mm - Op; // les coordonnées locales // ici également, OpMm est dans le plan de la facette d'où mêmes remarques 2) que plus haut double dtheta1 = dOpMm * aiH.Coordo(1) + OpMm * DaiH(jnD).Coordo(1); // theta1 = OpMm * aiH.Coordo(1) double dtheta2 = dOpMm * aiH.Coordo(2) + OpMm * DaiH(jnD).Coordo(2); // theta2 = OpMm * aiH.Coordo(2) dmat(jnD)(ncot,1) = (2.*dtheta1-1.)*d1+(2.*theta1-1.)*dd1; // mat(ncot,1) = (2.*theta1 - 1.) * d1 dmat(jnD)(ncot,2) = (2.*dtheta2-1.)*d2+(2.*theta2-1.)*dd2; // mat(ncot,1) = (2.*theta1 - 1.) * d1 dmat(jnD)(ncot,3) = (dtheta1*d2+dtheta2*d1)+(theta1*dd2+theta2*dd1); // mat(ncot,3) = (theta1 * d2 + theta2 * d1); dsm(jnD)(ncot) = dd3; // sm(ncot) = d3 } }; // fin du for sur ia }; // fin du test sur les CL: condition de tangence }; // fin de la boucle sur les 3 noeuds externes // calcul du tenseur de courbure dans la base ai Mat_pleine mati = mat.Inverse(); //---- pour le debug des cas particuliers ---- #ifdef MISE_AU_POINT if (ParaGlob::NiveauImpression() > 3) { int i,j; if (mati.MaxiValAbs(i,j) > ConstMath::grand) { cout << "\n *** Met_Sfe1::Dcourbure4, mati.MaxiValAbs(i,j) est trop grand :\n mat= "; mat.Affiche(); cout << "\n inverse de mat: mati= "; mati.Affiche(); // affichage des éléments du triangle cout << "\n pour chaque cote : on utilise les notations : triangle principal DBC et secondaire BAC"; cout << "\n Op= "<< Op << "\n N= "<< N ; for (int ncot=1;ncot<=3;ncot++) { // on utilise les notations : triangle principal DBC et secondaire BAC // simplification de l'ecriture cout << "\n cote : "<< ncot ; const Coordonnee3& D = tab_coor(indi(ncot)); const Coordonnee3& B = tab_coor(indi(ncot+1)); const Coordonnee3& C = tab_coor(indi(ncot+2)); const Coordonnee3& A = tab_coor(indi(ncot)+3); cout << "\n D= "<< D << "\n B= " << B << "\n C= "<< C << "\n A= "<< A; cout << "\n aiH(1)= "<& tab_noeud,bool gradV_instantane ,Mat_pleine const & dphiS,int nombre_noeud,Vecteur const & phiS ,Mat_pleine const & tabdphiH,Vecteur const& phiH,const Epai* epas ,Tableau const & tabTypeCL,Tableau const & vplan) { // l'idée est de faire une vérification des dérivées à l'aide d'une méthode de différence finie int dim = ParaGlob::Dimension(); // dans le cas du premier passage on indique qu'il y a vérification if (indic_Verif_DcourbureSFE == 0) { cout << "\n ****verification du calcul de la variation de courbure ****"; cout << "\n Met_Sfe1::Verif_Dcourbure(.. \n"; } indic_Verif_DcourbureSFE++; // on définit 2 seconde métriques, car il faudra modifier les vecteurs ai et les vecteurs gi, donc // il vaut mieux travailler sur une copie Met_Sfe1 metrique_bis_1(*this);Met_Sfe1 metrique_bis_2(*this); // ici on considère que l'on a même nombre de ddl par noeud = dim // on va modifier chaque ddl de chaque noeud systématiquement int nbnoeud = tab_noeud.Taille(); // le deltat pour les différences finis double delta = ConstMath::unpeupetit; double mini_val = ConstMath::pasmalpetit; int numddl = 1; // le compteur de ddl int nberr = 10; Tableau erreur(nberr); double diff_admi = 0.1; bool premier_calcul=true; for (int inoeud=1;inoeud<=nbnoeud;inoeud++) // on ne fait la vérification que si le noeud externe existe if (( inoeud <= 3) || ( (tab_noeud(inoeud-3)->Num_noeud()) != (tab_noeud(inoeud)->Num_noeud()))) {// on récupère les coordonnées du noeud Coordonnee coordtdt = tab_noeud(inoeud)->Coord2(); for (int ix= 1;ix<=dim;ix++,numddl++) { Coordonnee X(dim); X(ix) += delta; tab_noeud(inoeud)->Ajout_coord2(X); // appel de la métrique metrique_bis_1.CalSfe1_explicit_tdt( tab_noeud,gradV_instantane,dphiS,nombre_noeud,phiS,premier_calcul ,tabdphiH,phiH,epas,tabTypeCL,vplan); // maintenant on remet les coordonnées du noeud à l'état initial tab_noeud(inoeud)->Change_coord2(coordtdt); // et on décale dégativement X(ix) -= 2*delta; tab_noeud(inoeud)->Ajout_coord2(X); // appel de la métrique metrique_bis_2.CalSfe1_explicit_tdt( tab_noeud,gradV_instantane,dphiS,nombre_noeud,phiS,premier_calcul ,tabdphiH,phiH,epas,tabTypeCL,vplan); // maintenant on remet les coordonnées du noeud à l'état initial tab_noeud(inoeud)->Change_coord2(coordtdt); premier_calcul=false; // calcul des dérivées numériques et vérification int nb_vecteur = 2; for (int j=1;j<=nb_vecteur;j++) { // variation des vecteurs aiB_tdt CoordonneeB daiB = ((*metrique_bis_1.aiB_tdt)(j) -(*metrique_bis_2.aiB_tdt)(j))/(2*delta); CoordonneeB toto = ((*metrique_bis_1.aiB_tdt)(j) -(*metrique_bis_2.aiB_tdt)(j)); for (int i=1;i<=dim;i++) if (diffpourcent(daiB(i),(*d_aiB_tdt)(numddl)(j)(i),MaX(Dabs(daiB(i)),Dabs((*d_aiB_tdt)(numddl)(j)(i))),diff_admi)) { if (DabsMiN(daiB(i),(*d_aiB_tdt)(numddl)(j)(i)) <= mini_val) {if ( DabsMaX(daiB(i),(*d_aiB_tdt)(numddl)(j)(i)) > 50.*delta) {erreur(1) += 1; cout << "\ndaiB("<& liTQ {// ----- def de grandeurs de travail // def de la dimension des tenseurs int dim = lesPtIntegMecaInterne->DimTens(); - PtIntegMecaInterne & ptIntegMeca = (*lesPtIntegMecaInterne)(iteg); +// PtIntegMecaInterne & ptIntegMeca = (*lesPtIntegMecaInterne)(iteg); // on recupère le tableau pour la lecture des coordonnées des tenseurs - int nbcompo = ParaGlob::NbCompTens(); - const Tableau2 & OrdreCont = OrdreContrainteR(nbcompo); +// int nbcompo = ParaGlob::NbCompTens(); +// const Tableau2 & OrdreCont = OrdreContrainteR(nbcompo); // définition des grandeurs qui sont indépendante de la boucle sur les ddl_enum_etendue def->ChangeNumInteg(iteg); // on change le num้ro de point d'int้gration courant // def du cas de sortie @@ -751,8 +752,8 @@ int SfeMembT::CalculNormale_noeud(Enum_dure temps,const Noeud& noe,Coordonnee& c // récup des coordonnées locales du noeuds const Coordonnee& theta_noeud = elemgeom.PtelemRef()(nuoe); // récup des phi et dphi au noeud - const Vecteur & phi = elemgeom.Phi(theta_noeud); - const Mat_pleine& dphi = elemgeom.Dphi(theta_noeud); + const Vecteur & phi = elemgeom.Phi_point(theta_noeud); + const Mat_pleine& dphi = elemgeom.Dphi_point(theta_noeud); switch (temps) {case TEMPS_0 : {const BaseB& baseB = met->BaseNat_0(tab_noeud,dphi,phi); diff --git a/Elements/Mecanique/SFE/Sfeg.cc b/Elements/Mecanique/SFE/Sfeg.cc old mode 100644 new mode 100755 diff --git a/Elements/Mecanique/SFE/Sfeg.h b/Elements/Mecanique/SFE/Sfeg.h old mode 100644 new mode 100755 diff --git a/Elements/Mecanique/SFE/TriaQSfe1.cc b/Elements/Mecanique/SFE/TriaQSfe1.cc index 8806fbc..f929dc6 100755 --- a/Elements/Mecanique/SFE/TriaQSfe1.cc +++ b/Elements/Mecanique/SFE/TriaQSfe1.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaQSfe1.h b/Elements/Mecanique/SFE/TriaQSfe1.h index a953b56..ccded57 100755 --- a/Elements/Mecanique/SFE/TriaQSfe1.h +++ b/Elements/Mecanique/SFE/TriaQSfe1.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaQSfe3.cc b/Elements/Mecanique/SFE/TriaQSfe3.cc index a644028..8fc1e47 100755 --- a/Elements/Mecanique/SFE/TriaQSfe3.cc +++ b/Elements/Mecanique/SFE/TriaQSfe3.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaQSfe3.h b/Elements/Mecanique/SFE/TriaQSfe3.h index 5a2b10e..d129101 100755 --- a/Elements/Mecanique/SFE/TriaQSfe3.h +++ b/Elements/Mecanique/SFE/TriaQSfe3.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe1.cc b/Elements/Mecanique/SFE/TriaSfe1.cc index 1f7b9c6..8b312f1 100644 --- a/Elements/Mecanique/SFE/TriaSfe1.cc +++ b/Elements/Mecanique/SFE/TriaSfe1.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe1.h b/Elements/Mecanique/SFE/TriaSfe1.h index c043b78..27213b7 100644 --- a/Elements/Mecanique/SFE/TriaSfe1.h +++ b/Elements/Mecanique/SFE/TriaSfe1.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe1_cm5pti.cc b/Elements/Mecanique/SFE/TriaSfe1_cm5pti.cc index fad20ed..a6e5526 100755 --- a/Elements/Mecanique/SFE/TriaSfe1_cm5pti.cc +++ b/Elements/Mecanique/SFE/TriaSfe1_cm5pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe1_cm5pti.h b/Elements/Mecanique/SFE/TriaSfe1_cm5pti.h index 1c5f41e..40639ba 100755 --- a/Elements/Mecanique/SFE/TriaSfe1_cm5pti.h +++ b/Elements/Mecanique/SFE/TriaSfe1_cm5pti.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe2.cc b/Elements/Mecanique/SFE/TriaSfe2.cc index fcae6ef..d09d594 100644 --- a/Elements/Mecanique/SFE/TriaSfe2.cc +++ b/Elements/Mecanique/SFE/TriaSfe2.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe2.h b/Elements/Mecanique/SFE/TriaSfe2.h index dbd2686..a10ac52 100644 --- a/Elements/Mecanique/SFE/TriaSfe2.h +++ b/Elements/Mecanique/SFE/TriaSfe2.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe3.cc b/Elements/Mecanique/SFE/TriaSfe3.cc index 6bda250..c37e676 100644 --- a/Elements/Mecanique/SFE/TriaSfe3.cc +++ b/Elements/Mecanique/SFE/TriaSfe3.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe3.h b/Elements/Mecanique/SFE/TriaSfe3.h index 81bcbfe..da37b7d 100644 --- a/Elements/Mecanique/SFE/TriaSfe3.h +++ b/Elements/Mecanique/SFE/TriaSfe3.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe3C.cc b/Elements/Mecanique/SFE/TriaSfe3C.cc index 9c7fadd..c3c1d2d 100644 --- a/Elements/Mecanique/SFE/TriaSfe3C.cc +++ b/Elements/Mecanique/SFE/TriaSfe3C.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe3C.h b/Elements/Mecanique/SFE/TriaSfe3C.h index 1009d0a..440b430 100644 --- a/Elements/Mecanique/SFE/TriaSfe3C.h +++ b/Elements/Mecanique/SFE/TriaSfe3C.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe3_3D.cc b/Elements/Mecanique/SFE/TriaSfe3_3D.cc index bccfe42..3e9702f 100644 --- a/Elements/Mecanique/SFE/TriaSfe3_3D.cc +++ b/Elements/Mecanique/SFE/TriaSfe3_3D.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe3_3D.h b/Elements/Mecanique/SFE/TriaSfe3_3D.h index 017608e..b52f9bf 100644 --- a/Elements/Mecanique/SFE/TriaSfe3_3D.h +++ b/Elements/Mecanique/SFE/TriaSfe3_3D.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe3_cm12pti.cc b/Elements/Mecanique/SFE/TriaSfe3_cm12pti.cc index 6711b53..51af5ab 100755 --- a/Elements/Mecanique/SFE/TriaSfe3_cm12pti.cc +++ b/Elements/Mecanique/SFE/TriaSfe3_cm12pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe3_cm12pti.h b/Elements/Mecanique/SFE/TriaSfe3_cm12pti.h index 5e3743a..80f5d99 100755 --- a/Elements/Mecanique/SFE/TriaSfe3_cm12pti.h +++ b/Elements/Mecanique/SFE/TriaSfe3_cm12pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -61,11 +61,11 @@ // // l'interpolation est SFE, // (4) -// / \ -// / \ +// / \\ +// / \\ // (3)-----(2) -// / \ / \ -// / \ / \ +// / \ / \\ +// / \ / \\ // (5)----(1)----(6) diff --git a/Elements/Mecanique/SFE/TriaSfe3_cm13pti.cc b/Elements/Mecanique/SFE/TriaSfe3_cm13pti.cc index 23bf89b..05fb4bb 100755 --- a/Elements/Mecanique/SFE/TriaSfe3_cm13pti.cc +++ b/Elements/Mecanique/SFE/TriaSfe3_cm13pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe3_cm13pti.h b/Elements/Mecanique/SFE/TriaSfe3_cm13pti.h index 9f7803e..f613029 100755 --- a/Elements/Mecanique/SFE/TriaSfe3_cm13pti.h +++ b/Elements/Mecanique/SFE/TriaSfe3_cm13pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -61,11 +61,11 @@ // // l'interpolation est SFE, // (4) -// / \ -// / \ +// / \\ +// / \\ // (3)-----(2) -// / \ / \ -// / \ / \ +// / \ / \\ +// / \ / \\ // (5)----(1)----(6) diff --git a/Elements/Mecanique/SFE/TriaSfe3_cm3pti.cc b/Elements/Mecanique/SFE/TriaSfe3_cm3pti.cc index 283a196..afd4124 100755 --- a/Elements/Mecanique/SFE/TriaSfe3_cm3pti.cc +++ b/Elements/Mecanique/SFE/TriaSfe3_cm3pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe3_cm3pti.h b/Elements/Mecanique/SFE/TriaSfe3_cm3pti.h index 7d6353e..0df90a6 100755 --- a/Elements/Mecanique/SFE/TriaSfe3_cm3pti.h +++ b/Elements/Mecanique/SFE/TriaSfe3_cm3pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe3_cm4pti.cc b/Elements/Mecanique/SFE/TriaSfe3_cm4pti.cc index 7ca297e..982051a 100644 --- a/Elements/Mecanique/SFE/TriaSfe3_cm4pti.cc +++ b/Elements/Mecanique/SFE/TriaSfe3_cm4pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe3_cm4pti.h b/Elements/Mecanique/SFE/TriaSfe3_cm4pti.h index 6c3e376..59e4326 100644 --- a/Elements/Mecanique/SFE/TriaSfe3_cm4pti.h +++ b/Elements/Mecanique/SFE/TriaSfe3_cm4pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe3_cm5pti.cc b/Elements/Mecanique/SFE/TriaSfe3_cm5pti.cc index e8dc70c..20f435c 100755 --- a/Elements/Mecanique/SFE/TriaSfe3_cm5pti.cc +++ b/Elements/Mecanique/SFE/TriaSfe3_cm5pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe3_cm5pti.h b/Elements/Mecanique/SFE/TriaSfe3_cm5pti.h index f2e57ef..2da275c 100755 --- a/Elements/Mecanique/SFE/TriaSfe3_cm5pti.h +++ b/Elements/Mecanique/SFE/TriaSfe3_cm5pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe3_cm6pti.cc b/Elements/Mecanique/SFE/TriaSfe3_cm6pti.cc index 411dcce..a562678 100644 --- a/Elements/Mecanique/SFE/TriaSfe3_cm6pti.cc +++ b/Elements/Mecanique/SFE/TriaSfe3_cm6pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe3_cm6pti.h b/Elements/Mecanique/SFE/TriaSfe3_cm6pti.h index 130e380..1db9cf4 100644 --- a/Elements/Mecanique/SFE/TriaSfe3_cm6pti.h +++ b/Elements/Mecanique/SFE/TriaSfe3_cm6pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe3_cm7pti.cc b/Elements/Mecanique/SFE/TriaSfe3_cm7pti.cc index 1381c6f..4fa3394 100755 --- a/Elements/Mecanique/SFE/TriaSfe3_cm7pti.cc +++ b/Elements/Mecanique/SFE/TriaSfe3_cm7pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/SFE/TriaSfe3_cm7pti.h b/Elements/Mecanique/SFE/TriaSfe3_cm7pti.h index 8543420..c69d45b 100755 --- a/Elements/Mecanique/SFE/TriaSfe3_cm7pti.h +++ b/Elements/Mecanique/SFE/TriaSfe3_cm7pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -61,11 +61,11 @@ // // l'interpolation est SFE, // (4) -// / \ -// / \ +// / \\ +// / \\ // (3)-----(2) -// / \ / \ -// / \ / \ +// / \ / \\ +// / \ / \\ // (5)----(1)----(6) diff --git a/Elements/Mecanique/Tetraedre/Tetra.cc b/Elements/Mecanique/Tetraedre/Tetra.cc index 387b90c..8727fdc 100644 --- a/Elements/Mecanique/Tetraedre/Tetra.cc +++ b/Elements/Mecanique/Tetraedre/Tetra.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Tetraedre/Tetra.h b/Elements/Mecanique/Tetraedre/Tetra.h index 93839f1..742706d 100644 --- a/Elements/Mecanique/Tetraedre/Tetra.h +++ b/Elements/Mecanique/Tetraedre/Tetra.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Tetraedre/TetraMemb.cc b/Elements/Mecanique/Tetraedre/TetraMemb.cc index accd576..103baee 100644 --- a/Elements/Mecanique/Tetraedre/TetraMemb.cc +++ b/Elements/Mecanique/Tetraedre/TetraMemb.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -273,7 +273,7 @@ Coordonnee & TetraMemb::Point_physique(const Coordonnee& c_int,Coordonnee & co,E doCoTetra->metrique.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCoTetra->tetraed->Phi(c_int); + const Vecteur& phi = doCoTetra->tetraed->Phi_point(c_int); // c) calcul du point switch (temps) { case TEMPS_0 : co = met->PointM_0(tab_noeud,phi); break; @@ -295,7 +295,7 @@ void TetraMemb::Point_physique(const Coordonnee& c_int,Tableau & t_ doCoTetra->metrique.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCoTetra->tetraed->Phi(c_int); + const Vecteur& phi = doCoTetra->tetraed->Phi_point(c_int); // c) calcul des point switch (t_co.Taille()) { case 3 : t_co(3) = met->PointM_tdt(tab_noeud,phi); @@ -1610,7 +1610,7 @@ TetraMemb::DonnComTetra* TetraMemb::Init lesPtMecaInt(ni).Change_Nb_pti(ni); }; - int nbddl = doCoTetra->tab_ddl.NbDdl(); +// int nbddl = doCoTetra->tab_ddl.NbDdl(); // stockage des donnees particulieres de la loi de comportement mécanique au point d'integ tabSaveDon.Change_taille(nombre->nbi); // stockage des donnees particulieres de la loi de comportement thermo physique au point d'integ diff --git a/Elements/Mecanique/Tetraedre/TetraMemb.h b/Elements/Mecanique/Tetraedre/TetraMemb.h index 16d019c..380d249 100644 --- a/Elements/Mecanique/Tetraedre/TetraMemb.h +++ b/Elements/Mecanique/Tetraedre/TetraMemb.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Tetraedre/TetraQ.cc b/Elements/Mecanique/Tetraedre/TetraQ.cc index 8a8843e..7f299a9 100644 --- a/Elements/Mecanique/Tetraedre/TetraQ.cc +++ b/Elements/Mecanique/Tetraedre/TetraQ.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Tetraedre/TetraQ.h b/Elements/Mecanique/Tetraedre/TetraQ.h index 5a18223..302744e 100644 --- a/Elements/Mecanique/Tetraedre/TetraQ.h +++ b/Elements/Mecanique/Tetraedre/TetraQ.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Tetraedre/TetraQ_cm15pti.cc b/Elements/Mecanique/Tetraedre/TetraQ_cm15pti.cc index ee4a39a..4ec931e 100755 --- a/Elements/Mecanique/Tetraedre/TetraQ_cm15pti.cc +++ b/Elements/Mecanique/Tetraedre/TetraQ_cm15pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Tetraedre/TetraQ_cm15pti.h b/Elements/Mecanique/Tetraedre/TetraQ_cm15pti.h index 04e0b10..61311ab 100755 --- a/Elements/Mecanique/Tetraedre/TetraQ_cm15pti.h +++ b/Elements/Mecanique/Tetraedre/TetraQ_cm15pti.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Tetraedre/TetraQ_cm1pti.cc b/Elements/Mecanique/Tetraedre/TetraQ_cm1pti.cc index 58b4a3c..04e3198 100755 --- a/Elements/Mecanique/Tetraedre/TetraQ_cm1pti.cc +++ b/Elements/Mecanique/Tetraedre/TetraQ_cm1pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Tetraedre/TetraQ_cm1pti.h b/Elements/Mecanique/Tetraedre/TetraQ_cm1pti.h index 287c8a3..d758d08 100755 --- a/Elements/Mecanique/Tetraedre/TetraQ_cm1pti.h +++ b/Elements/Mecanique/Tetraedre/TetraQ_cm1pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Tria_axisymetrie/TriaAxiL1.cc b/Elements/Mecanique/Tria_axisymetrie/TriaAxiL1.cc index 3d945e0..2108bf5 100644 --- a/Elements/Mecanique/Tria_axisymetrie/TriaAxiL1.cc +++ b/Elements/Mecanique/Tria_axisymetrie/TriaAxiL1.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Tria_axisymetrie/TriaAxiL1.h b/Elements/Mecanique/Tria_axisymetrie/TriaAxiL1.h index a107ef8..18a5066 100644 --- a/Elements/Mecanique/Tria_axisymetrie/TriaAxiL1.h +++ b/Elements/Mecanique/Tria_axisymetrie/TriaAxiL1.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Tria_axisymetrie/TriaAxiMemb.cc b/Elements/Mecanique/Tria_axisymetrie/TriaAxiMemb.cc index 9a0c0b8..9f41a18 100644 --- a/Elements/Mecanique/Tria_axisymetrie/TriaAxiMemb.cc +++ b/Elements/Mecanique/Tria_axisymetrie/TriaAxiMemb.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -259,7 +259,7 @@ Coordonnee & TriaAxiMemb::Point_physique(const Coordonnee& c_int,Coordonnee & co CoTria->met_TriaAxiMemb.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = CoTria->tria.Phi(c_int); + const Vecteur& phi = CoTria->tria.Phi_point(c_int); // c) calcul du point switch (temps) { case TEMPS_0 : co = met->PointM_0(tab_noeud,phi); break; @@ -281,7 +281,7 @@ void TriaAxiMemb::Point_physique(const Coordonnee& c_int,Tableau & CoTria->met_TriaAxiMemb.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = CoTria->tria.Phi(c_int); + const Vecteur& phi = CoTria->tria.Phi_point(c_int); // c) calcul des point switch (t_co.Taille()) { case 3 : t_co(3) = met->PointM_tdt(tab_noeud,phi); @@ -1253,7 +1253,7 @@ Element::ResRaid TriaAxiMemb::SMR_charge_hydrodynamique_I( Courbe1D* frot_fluid else // dime 2: il s'agit de ligne // initialisation du vecteur résidu et de la raideur pour une arrête {((*res_extA)(numface))->Zero(); ((*raid_extA)(numface))->Zero(); - ElFrontiere* elf = Frontiere_lineique(numface,true);// on récupère ou on crée la frontière lineique +// ElFrontiere* elf = Frontiere_lineique(numface,true);// on récupère ou on crée la frontière lineique meta= tabb(posi_tab_front_lin + numface)->Metrique(); elemGeom = &(CoTria->segS); // récup de l'élément géométrique }; diff --git a/Elements/Mecanique/Tria_axisymetrie/TriaAxiMemb.h b/Elements/Mecanique/Tria_axisymetrie/TriaAxiMemb.h index 87041e7..5b28bcb 100644 --- a/Elements/Mecanique/Tria_axisymetrie/TriaAxiMemb.h +++ b/Elements/Mecanique/Tria_axisymetrie/TriaAxiMemb.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3.cc b/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3.cc index eac11b8..4224884 100644 --- a/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3.cc +++ b/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3.h b/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3.h index 30f41b8..c5c6b5a 100644 --- a/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3.h +++ b/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3_cm1pti.cc b/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3_cm1pti.cc index 69b99cf..4380992 100644 --- a/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3_cm1pti.cc +++ b/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3_cm1pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3_cm1pti.h b/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3_cm1pti.h index 58d6317..4a1abfb 100644 --- a/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3_cm1pti.h +++ b/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3_cm1pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3_cmpti1003.cc b/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3_cmpti1003.cc index 3ce6bdf..d7acccf 100755 --- a/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3_cmpti1003.cc +++ b/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3_cmpti1003.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3_cmpti1003.h b/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3_cmpti1003.h index 66fcc6b..c2cd442 100755 --- a/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3_cmpti1003.h +++ b/Elements/Mecanique/Tria_axisymetrie/TriaAxiQ3_cmpti1003.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Triangle/Met_triaMemb.cc b/Elements/Mecanique/Triangle/Met_triaMemb.cc old mode 100644 new mode 100755 diff --git a/Elements/Mecanique/Triangle/Met_triaMemb.h b/Elements/Mecanique/Triangle/Met_triaMemb.h old mode 100644 new mode 100755 diff --git a/Elements/Mecanique/Triangle/TriaCub.cc b/Elements/Mecanique/Triangle/TriaCub.cc index 62b49a0..72ff916 100644 --- a/Elements/Mecanique/Triangle/TriaCub.cc +++ b/Elements/Mecanique/Triangle/TriaCub.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Triangle/TriaCub.h b/Elements/Mecanique/Triangle/TriaCub.h index 7013443..bc92f92 100644 --- a/Elements/Mecanique/Triangle/TriaCub.h +++ b/Elements/Mecanique/Triangle/TriaCub.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Triangle/TriaCub_cm4pti.cc b/Elements/Mecanique/Triangle/TriaCub_cm4pti.cc index 4ebaf27..b6b8d2e 100644 --- a/Elements/Mecanique/Triangle/TriaCub_cm4pti.cc +++ b/Elements/Mecanique/Triangle/TriaCub_cm4pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Triangle/TriaCub_cm4pti.h b/Elements/Mecanique/Triangle/TriaCub_cm4pti.h index 70fb7d4..64ca526 100644 --- a/Elements/Mecanique/Triangle/TriaCub_cm4pti.h +++ b/Elements/Mecanique/Triangle/TriaCub_cm4pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Triangle/TriaMemb.cc b/Elements/Mecanique/Triangle/TriaMemb.cc index 5f2d996..3d206f2 100644 --- a/Elements/Mecanique/Triangle/TriaMemb.cc +++ b/Elements/Mecanique/Triangle/TriaMemb.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -263,7 +263,7 @@ Coordonnee & TriaMemb::Point_physique(const Coordonnee& c_int,Coordonnee & co,En CoTria->met_triaMemb.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = CoTria->tria.Phi(c_int); + const Vecteur& phi = CoTria->tria.Phi_point(c_int); // c) calcul du point switch (temps) { case TEMPS_0 : co = met->PointM_0(tab_noeud,phi); break; @@ -285,7 +285,7 @@ void TriaMemb::Point_physique(const Coordonnee& c_int,Tableau & t_c CoTria->met_triaMemb.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = CoTria->tria.Phi(c_int); + const Vecteur& phi = CoTria->tria.Phi_point(c_int); // c) calcul des point switch (t_co.Taille()) { case 3 : t_co(3) = met->PointM_tdt(tab_noeud,phi); diff --git a/Elements/Mecanique/Triangle/TriaMemb.h b/Elements/Mecanique/Triangle/TriaMemb.h index 4c2f52b..2897097 100644 --- a/Elements/Mecanique/Triangle/TriaMemb.h +++ b/Elements/Mecanique/Triangle/TriaMemb.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Triangle/TriaMembL1.cc b/Elements/Mecanique/Triangle/TriaMembL1.cc index c0de897..b96b542 100644 --- a/Elements/Mecanique/Triangle/TriaMembL1.cc +++ b/Elements/Mecanique/Triangle/TriaMembL1.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Triangle/TriaMembL1.h b/Elements/Mecanique/Triangle/TriaMembL1.h index 896f111..262f6c6 100644 --- a/Elements/Mecanique/Triangle/TriaMembL1.h +++ b/Elements/Mecanique/Triangle/TriaMembL1.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Triangle/TriaMembQ3.cc b/Elements/Mecanique/Triangle/TriaMembQ3.cc index 7f49bf5..158e7cf 100644 --- a/Elements/Mecanique/Triangle/TriaMembQ3.cc +++ b/Elements/Mecanique/Triangle/TriaMembQ3.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Triangle/TriaMembQ3.h b/Elements/Mecanique/Triangle/TriaMembQ3.h index b2600da..c2c3c37 100644 --- a/Elements/Mecanique/Triangle/TriaMembQ3.h +++ b/Elements/Mecanique/Triangle/TriaMembQ3.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Triangle/TriaMembQ3_cm1pti.cc b/Elements/Mecanique/Triangle/TriaMembQ3_cm1pti.cc index 84e9e3d..e6141fa 100644 --- a/Elements/Mecanique/Triangle/TriaMembQ3_cm1pti.cc +++ b/Elements/Mecanique/Triangle/TriaMembQ3_cm1pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Triangle/TriaMembQ3_cm1pti.h b/Elements/Mecanique/Triangle/TriaMembQ3_cm1pti.h index e7abb73..f7ec86a 100644 --- a/Elements/Mecanique/Triangle/TriaMembQ3_cm1pti.h +++ b/Elements/Mecanique/Triangle/TriaMembQ3_cm1pti.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Triangle/TriaQ3_cmpti1003.cc b/Elements/Mecanique/Triangle/TriaQ3_cmpti1003.cc index 3c922dd..d47dca5 100644 --- a/Elements/Mecanique/Triangle/TriaQ3_cmpti1003.cc +++ b/Elements/Mecanique/Triangle/TriaQ3_cmpti1003.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/Triangle/TriaQ3_cmpti1003.h b/Elements/Mecanique/Triangle/TriaQ3_cmpti1003.h index 320754c..cd8e77f 100644 --- a/Elements/Mecanique/Triangle/TriaQ3_cmpti1003.h +++ b/Elements/Mecanique/Triangle/TriaQ3_cmpti1003.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/quadrangle/Quad.cc b/Elements/Mecanique/quadrangle/Quad.cc index 909438e..4b0003d 100644 --- a/Elements/Mecanique/quadrangle/Quad.cc +++ b/Elements/Mecanique/quadrangle/Quad.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/quadrangle/Quad.h b/Elements/Mecanique/quadrangle/Quad.h index c1c94d1..27914e5 100644 --- a/Elements/Mecanique/quadrangle/Quad.h +++ b/Elements/Mecanique/quadrangle/Quad.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/quadrangle/QuadCCom.cc b/Elements/Mecanique/quadrangle/QuadCCom.cc index 732465c..0856811 100644 --- a/Elements/Mecanique/quadrangle/QuadCCom.cc +++ b/Elements/Mecanique/quadrangle/QuadCCom.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/quadrangle/QuadCCom.h b/Elements/Mecanique/quadrangle/QuadCCom.h index 4d54e99..7eb9809 100644 --- a/Elements/Mecanique/quadrangle/QuadCCom.h +++ b/Elements/Mecanique/quadrangle/QuadCCom.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/quadrangle/QuadCCom_cm9pti.cc b/Elements/Mecanique/quadrangle/QuadCCom_cm9pti.cc index 7f53ac9..000b354 100644 --- a/Elements/Mecanique/quadrangle/QuadCCom_cm9pti.cc +++ b/Elements/Mecanique/quadrangle/QuadCCom_cm9pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/quadrangle/QuadCCom_cm9pti.h b/Elements/Mecanique/quadrangle/QuadCCom_cm9pti.h index 978ac26..4bceeb5 100644 --- a/Elements/Mecanique/quadrangle/QuadCCom_cm9pti.h +++ b/Elements/Mecanique/quadrangle/QuadCCom_cm9pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/quadrangle/QuadQ.cc b/Elements/Mecanique/quadrangle/QuadQ.cc index f2e75cc..de60c1a 100644 --- a/Elements/Mecanique/quadrangle/QuadQ.cc +++ b/Elements/Mecanique/quadrangle/QuadQ.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/quadrangle/QuadQ.h b/Elements/Mecanique/quadrangle/QuadQ.h index feb7020..caf7a95 100644 --- a/Elements/Mecanique/quadrangle/QuadQ.h +++ b/Elements/Mecanique/quadrangle/QuadQ.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/quadrangle/QuadQCom.cc b/Elements/Mecanique/quadrangle/QuadQCom.cc index 73fd604..47ea443 100644 --- a/Elements/Mecanique/quadrangle/QuadQCom.cc +++ b/Elements/Mecanique/quadrangle/QuadQCom.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/quadrangle/QuadQCom.h b/Elements/Mecanique/quadrangle/QuadQCom.h index 8b7bb1d..094be36 100644 --- a/Elements/Mecanique/quadrangle/QuadQCom.h +++ b/Elements/Mecanique/quadrangle/QuadQCom.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/quadrangle/QuadQCom_cm4pti.cc b/Elements/Mecanique/quadrangle/QuadQCom_cm4pti.cc index c17bf9a..f719ed0 100644 --- a/Elements/Mecanique/quadrangle/QuadQCom_cm4pti.cc +++ b/Elements/Mecanique/quadrangle/QuadQCom_cm4pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/quadrangle/QuadQCom_cm4pti.h b/Elements/Mecanique/quadrangle/QuadQCom_cm4pti.h index 2ca9a30..5000716 100644 --- a/Elements/Mecanique/quadrangle/QuadQCom_cm4pti.h +++ b/Elements/Mecanique/quadrangle/QuadQCom_cm4pti.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/quadrangle/Quad_cm1pti.cc b/Elements/Mecanique/quadrangle/Quad_cm1pti.cc index 75da006..4c06b30 100644 --- a/Elements/Mecanique/quadrangle/Quad_cm1pti.cc +++ b/Elements/Mecanique/quadrangle/Quad_cm1pti.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/quadrangle/Quad_cm1pti.h b/Elements/Mecanique/quadrangle/Quad_cm1pti.h index e45c84e..019512f 100644 --- a/Elements/Mecanique/quadrangle/Quad_cm1pti.h +++ b/Elements/Mecanique/quadrangle/Quad_cm1pti.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Mecanique/quadrangle/QuadraMemb.cc b/Elements/Mecanique/quadrangle/QuadraMemb.cc index b221804..61c49e1 100644 --- a/Elements/Mecanique/quadrangle/QuadraMemb.cc +++ b/Elements/Mecanique/quadrangle/QuadraMemb.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -264,7 +264,7 @@ Coordonnee & QuadraMemb::Point_physique(const Coordonnee& c_int,Coordonnee & co, CoQuadra->met_quadraMemb.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = CoQuadra->quadra.Phi(c_int); + const Vecteur& phi = CoQuadra->quadra.Phi_point(c_int); // c) calcul du point switch (temps) { case TEMPS_0 : co = met->PointM_0(tab_noeud,phi); break; @@ -286,7 +286,7 @@ void QuadraMemb::Point_physique(const Coordonnee& c_int,Tableau & t CoQuadra->met_quadraMemb.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = CoQuadra->quadra.Phi(c_int); + const Vecteur& phi = CoQuadra->quadra.Phi_point(c_int); // c) calcul des point switch (t_co.Taille()) { case 3 : t_co(3) = met->PointM_tdt(tab_noeud,phi); diff --git a/Elements/Mecanique/quadrangle/QuadraMemb.h b/Elements/Mecanique/quadrangle/QuadraMemb.h index da0e4f0..47d488c 100644 --- a/Elements/Mecanique/quadrangle/QuadraMemb.h +++ b/Elements/Mecanique/quadrangle/QuadraMemb.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Thermique/Biellette/BielletteThermi.cc b/Elements/Thermique/Biellette/BielletteThermi.cc index 031fea9..7730c0f 100755 --- a/Elements/Thermique/Biellette/BielletteThermi.cc +++ b/Elements/Thermique/Biellette/BielletteThermi.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -110,7 +110,7 @@ BielletteThermi::DonneeCommune::DonneeCommune(DonneeCommune& a) : ,matrice_masse(a.matrice_masse),segmentMas(a.segmentMas) {}; BielletteThermi::DonneeCommune::~DonneeCommune() - { int nbddl = tab_ddl.NbDdl(); + { //int nbddl = tab_ddl.NbDdl(); int nbi = d2_gradTB.Taille(); for (int ni=1;ni<=nbi;ni++) { if (d2_gradTB(ni)!= NULL) @@ -305,7 +305,7 @@ Coordonnee & BielletteThermi::Point_physique(const Coordonnee& c_int,Coordonnee doCo->met_biellette.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCo->segment.Phi(c_int); + const Vecteur& phi = doCo->segment.Phi_point(c_int); // c) calcul du point switch (temps) { case TEMPS_0 : co = doCo->met_biellette.PointM_0(tab_noeud,phi); break; @@ -327,7 +327,7 @@ void BielletteThermi::Point_physique(const Coordonnee& c_int,Tableau met_biellette.PlusInitVariables(tab) ; }; // b) calcul de l'interpolation - const Vecteur& phi = doCo->segment.Phi(c_int); + const Vecteur& phi = doCo->segment.Phi_point(c_int); // c) calcul des point switch (t_co.Taille()) { case 3 : t_co(3) = doCo->met_biellette.PointM_tdt(tab_noeud,phi); @@ -987,7 +987,7 @@ Vecteur BielletteThermi::SM_charge_lineique_E(const Coordonnee& force,int ,bool { // initialisation du vecteur résidu ((*res_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf = Frontiere_lineique(1,true); + Frontiere_lineique(1,true); BielletteThermi::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique if (!atdt) @@ -1030,7 +1030,7 @@ Element::ResRaid BielletteThermi::SMR_charge_lineique_I ((*res_extA)(1))->Zero(); ((*raid_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf =Frontiere_lineique(1,true); + Frontiere_lineique(1,true); BielletteThermi::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique @@ -1063,7 +1063,7 @@ Vecteur BielletteThermi::SM_charge_lineique_Suiv_E(const Coordonnee& force,int , { // initialisation du vecteur résidu ((*res_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf = Frontiere_lineique(1,true); + Frontiere_lineique(1,true); BielletteThermi::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique if (!atdt) @@ -1106,7 +1106,7 @@ Element::ResRaid BielletteThermi::SMR_charge_lineique_Suiv_I ((*res_extA)(1))->Zero(); ((*raid_extA)(1))->Zero(); // on récupère ou on crée la frontière arrête - ElFrontiere* elf = Frontiere_lineique(1,true); + Frontiere_lineique(1,true); BielletteThermi::DonneeCommune* doCo = unefois.doCoMemb; // pour simplifier l'écriture // dimensionnement de la metrique @@ -1151,7 +1151,7 @@ Vecteur BielletteThermi::SM_charge_hydrodynamique_E( Courbe1D* frot_fluid,const // dimensions de la section, d'où la surface frontale approximativement s'en déduie double section = donnee_specif.secti.section_tdt; if (!atdt) section = donnee_specif.secti.section_t; - double dimension_transversale = sqrt(section/ConstMath::Pi); +// double dimension_transversale = sqrt(section/ConstMath::Pi); // on utilise l'élément géométique de l'élément, pour TaPhi et TaWi pour les passages de paramètres, // mais ces infos ne sont pas utilisées car pour les frontières points, pas de points d'integ // appel du programme général d'ElemThermi et retour du vecteur second membre @@ -1200,6 +1200,10 @@ const double& BielletteThermi::CalSectionMoyenne_et_vol_pti(const bool atdt) Sect& sect = donnee_specif.secti; // pour simplifier return sect.section0; }; + cout << "\n *** probleme: la section moyenne de la biellette thermique n'est pas dispo " + << "\n BielletteThermi::CalSectionMoyenne_et_vol_pti(..." << endl; + Sortie(1); + return ConstMath::trespetit; // normalement on ne passe pas ici, // // // diff --git a/Elements/Thermique/Biellette/BielletteThermi.h b/Elements/Thermique/Biellette/BielletteThermi.h index 4126c3d..bdb10d5 100755 --- a/Elements/Thermique/Biellette/BielletteThermi.h +++ b/Elements/Thermique/Biellette/BielletteThermi.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Thermique/ElemThermi.cc b/Elements/Thermique/ElemThermi.cc index 338524b..4676e65 100755 --- a/Elements/Thermique/ElemThermi.cc +++ b/Elements/Thermique/ElemThermi.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -469,8 +469,8 @@ int ElemThermi::Interne(Enum_dure temps,const Coordonnee& M,Coordonnee* coor_loc if (coor_locales != NULL) {pt_ret = coor_locales;} else {pt_ret = &theta_local;}; Coordonnee& theta = *pt_ret; // init de AL qui representera les coordonnes locales de M // - fin construction du point local - Vecteur ph_i = elgeom.Phi(refL); // fonctions d'interpolation en refL - Mat_pleine dph_i = elgeom.Dphi(refL); // derivees des fonctions d'interpolation en refL + Vecteur ph_i = elgeom.Phi_point(refL); // fonctions d'interpolation en refL + Mat_pleine dph_i = elgeom.Dphi_point(refL); // derivees des fonctions d'interpolation en refL // l'image de theta par l'interpolation, de dimension : espace géométrique Coordonnee A = (met->*PointM) (tab_noeud,ph_i); // // calcul de la base naturelle et duale en refL, en fonction des coord a t @@ -489,7 +489,7 @@ int ElemThermi::Interne(Enum_dure temps,const Coordonnee& M,Coordonnee* coor_loc theta_repere = elgeom.Maxi_Coor_dans_directionGM(theta); } // calcul du point correspondant à theta dans l'element, qui remplace A - ph_i = elgeom.Phi(theta_repere); // fonctions d'interpolation en A + ph_i = elgeom.Phi_point(theta_repere); // fonctions d'interpolation en A Coordonnee A_sauve= A; A = (met->*PointM) (tab_noeud,ph_i); AM = M-A; // nouveau gap @@ -506,8 +506,8 @@ int ElemThermi::Interne(Enum_dure temps,const Coordonnee& M,Coordonnee* coor_loc // - boucle de recherche des thetai while (delta_theta.Norme() >= delta_thetai_maxi) - {dph_i = elgeom.Dphi(theta_repere); // derivees des fonctions d'interpolation en theta_repere - ph_i = elgeom.Phi(theta_repere); // fonctions d'interpolation en theta_repere (déjà calculé la première fois) + {dph_i = elgeom.Dphi_point(theta_repere); // derivees des fonctions d'interpolation en theta_repere + ph_i = elgeom.Phi_point(theta_repere); // fonctions d'interpolation en theta_repere (déjà calculé la première fois) // calcul de la base naturelle et duale en fonction des coord a t (met->*BaseND)(tab_noeud,dph_i,ph_i,bB,bH); // amelioration des coordonnees locales du point M dans le repere en theta @@ -529,7 +529,7 @@ int ElemThermi::Interne(Enum_dure temps,const Coordonnee& M,Coordonnee* coor_loc // si cela fait nb_max_a_l_exterieur fois que l'on est à l'extérieur on arrête if ( nb_exterieur >= nb_max_a_l_exterieur) break; // calcul du point correspondant dans l'element, qui remplace theta - ph_i = elgeom.Phi(theta_repere); // fonctions d'interpolation en theta + ph_i = elgeom.Phi_point(theta_repere); // fonctions d'interpolation en theta A = (met->*PointM) (tab_noeud,ph_i); AM = M-A; // nouveau gap compteur++; diff --git a/Elements/Thermique/ElemThermi.h b/Elements/Thermique/ElemThermi.h index 28e5466..deebc0d 100755 --- a/Elements/Thermique/ElemThermi.h +++ b/Elements/Thermique/ElemThermi.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -348,7 +348,6 @@ class ElemThermi : public Element virtual void Prise_en_compte_des_consequences_suppression_une_frontiere(ElFrontiere* elemFront); // -------------------- calcul de frontières ------------------- - // ramène la frontière point // éventuellement création des frontieres points de l'element et stockage dans l'element @@ -373,11 +372,28 @@ class ElemThermi : public Element // dans ce dernier cas la frontière effacéee est recréée // num indique le numéro de la surface à créer (numérotation EF) virtual ElFrontiere* const Frontiere_surfacique(int num,bool force); + + + // Calcul spécifiques des frontieres de l'element et retour d'un tableau tabb des frontières + // creation des elements frontieres et stockage dans l'element + // la création n'a lieu qu'au premier appel + // ou lorsque l'on force le paramètre force a true + // dans ce dernier cas seul les frontière effacées sont recréée + // cas : + // = 0 -> on veut toutes les frontières + // = 1 -> on veut uniquement les surfaces + // = 2 -> on veut uniquement les lignes + // = 3 -> on veut uniquement les points + // = 4 -> on veut les surfaces + les lignes + // = 5 -> on veut les surfaces + les points + // = 6 -> on veut les lignes + les points +// virtual Tableau const & Frontiere_specifique(int cas, bool force = false) +// {return Frontiere_elethermi(cas,force);}; - // -------------------- init éventuelle avant le chargement ------------------- - // initialisation éventuelle, nécessaire avant d'appliquer l'ensemble des charges - // par exemple des stockages intermédiaires - virtual void Initialisation_avant_chargement() {}; + // -------------------- init éventuelle avant le chargement ------------------- + // initialisation éventuelle, nécessaire avant d'appliquer l'ensemble des charges + // par exemple des stockages intermédiaires + virtual void Initialisation_avant_chargement() {}; //===================================================================================== protected : diff --git a/Elements/Thermique/ElemThermi2.cc b/Elements/Thermique/ElemThermi2.cc index 567663b..68d2c44 100755 --- a/Elements/Thermique/ElemThermi2.cc +++ b/Elements/Thermique/ElemThermi2.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Thermique/ElemThermi3.cc b/Elements/Thermique/ElemThermi3.cc index 57de24b..2945c97 100755 --- a/Elements/Thermique/ElemThermi3.cc +++ b/Elements/Thermique/ElemThermi3.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -574,8 +574,8 @@ const BaseB & ElemThermi::Gib_elemeca(Enum_dure temps, const Noeud * noe) // récup de la référence des coordonnées locales du noeud num const Coordonnee & coo = elem_geom.PtelemRef()(num); // calcul de la dérivée des fonctions au point - const Mat_pleine& ddphi = elem_geom.Dphi(coo); - const Vecteur& pphi = elem_geom.Phi(coo); + const Mat_pleine& ddphi = elem_geom.Dphi_point(coo); + const Vecteur& pphi = elem_geom.Phi_point(coo); // en fonction du temps on calcul la base naturelle switch (temps) { case TEMPS_0: return (met->BaseNat_0(tab_noeud,ddphi,pphi)); break; diff --git a/Elements/Thermique/ElemThermi4.cc b/Elements/Thermique/ElemThermi4.cc index cc987e4..2485882 100755 --- a/Elements/Thermique/ElemThermi4.cc +++ b/Elements/Thermique/ElemThermi4.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Thermique/ElemThermi5.cc b/Elements/Thermique/ElemThermi5.cc index 43e3a23..7ece1a0 100755 --- a/Elements/Thermique/ElemThermi5.cc +++ b/Elements/Thermique/ElemThermi5.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -801,8 +801,8 @@ ElFrontiere* const ElemThermi::Frontiere_surfacique(int num,bool force) // récup des coordonnées locales du noeuds const Coordonnee& theta_noeud = elemgeom.PtelemRef()(nuoe); // récup des phi et dphi au noeud - const Vecteur & phi = elemgeom.Phi(theta_noeud); - const Mat_pleine& dphi = elemgeom.Dphi(theta_noeud); + const Vecteur & phi = elemgeom.Phi_point(theta_noeud); + const Mat_pleine& dphi = elemgeom.Dphi_point(theta_noeud); switch (temps) {case TEMPS_0 : {const BaseB& baseB = met->BaseNat_0(tab_noeud,dphi,phi); diff --git a/Elements/Thermique/ExceptionsElemThermi.h b/Elements/Thermique/ExceptionsElemThermi.h index 58b90b3..f9e5eb8 100755 --- a/Elements/Thermique/ExceptionsElemThermi.h +++ b/Elements/Thermique/ExceptionsElemThermi.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Thermique/LesPtIntegThermiInterne.cc b/Elements/Thermique/LesPtIntegThermiInterne.cc index b60c3dc..7742734 100755 --- a/Elements/Thermique/LesPtIntegThermiInterne.cc +++ b/Elements/Thermique/LesPtIntegThermiInterne.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Elements/Thermique/LesPtIntegThermiInterne.h b/Elements/Thermique/LesPtIntegThermiInterne.h index d1647aa..53dd96d 100755 --- a/Elements/Thermique/LesPtIntegThermiInterne.h +++ b/Elements/Thermique/LesPtIntegThermiInterne.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/EnuTypeCL.cc b/Enumeration/EnuTypeCL.cc index 8a57e5c..834a090 100644 --- a/Enumeration/EnuTypeCL.cc +++ b/Enumeration/EnuTypeCL.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/EnuTypeCL.h b/Enumeration/EnuTypeCL.h index 8c313c9..91e0089 100644 --- a/Enumeration/EnuTypeCL.h +++ b/Enumeration/EnuTypeCL.h @@ -13,7 +13,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/EnuTypeQuelParticulier.cc b/Enumeration/EnuTypeQuelParticulier.cc index f8ab0bf..384e76b 100644 --- a/Enumeration/EnuTypeQuelParticulier.cc +++ b/Enumeration/EnuTypeQuelParticulier.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/EnuTypeQuelParticulier.h b/Enumeration/EnuTypeQuelParticulier.h index 7d51339..c6ba4ee 100644 --- a/Enumeration/EnuTypeQuelParticulier.h +++ b/Enumeration/EnuTypeQuelParticulier.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/EnumCourbe1D.cc b/Enumeration/EnumCourbe1D.cc index 19fe150..13066c3 100644 --- a/Enumeration/EnumCourbe1D.cc +++ b/Enumeration/EnumCourbe1D.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/EnumCourbe1D.h b/Enumeration/EnumCourbe1D.h index 4e2b188..246bfd3 100644 --- a/Enumeration/EnumCourbe1D.h +++ b/Enumeration/EnumCourbe1D.h @@ -14,7 +14,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/EnumElemTypeProblem.cc b/Enumeration/EnumElemTypeProblem.cc index 59cf272..5e6a887 100644 --- a/Enumeration/EnumElemTypeProblem.cc +++ b/Enumeration/EnumElemTypeProblem.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/EnumElemTypeProblem.h b/Enumeration/EnumElemTypeProblem.h index 070a2b2..63899e4 100644 --- a/Enumeration/EnumElemTypeProblem.h +++ b/Enumeration/EnumElemTypeProblem.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/EnumFonction_nD.cc b/Enumeration/EnumFonction_nD.cc index 3d615df..5411bf4 100755 --- a/Enumeration/EnumFonction_nD.cc +++ b/Enumeration/EnumFonction_nD.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/EnumFonction_nD.h b/Enumeration/EnumFonction_nD.h index ee89c85..6278bc2 100755 --- a/Enumeration/EnumFonction_nD.h +++ b/Enumeration/EnumFonction_nD.h @@ -13,7 +13,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/EnumLangue.cc b/Enumeration/EnumLangue.cc index 067a8f3..3a4ec98 100644 --- a/Enumeration/EnumLangue.cc +++ b/Enumeration/EnumLangue.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -51,12 +51,12 @@ using namespace std; //introduces namespace std -char* Nom_EnumLangue (EnumLangue id_EnumLangue) +string Nom_EnumLangue (EnumLangue id_EnumLangue) // Retourne le nom du type de EnumLangue correspondant a l'identificateur // de type enumere id_EnumLangue { - char* result; + string result; switch (id_EnumLangue) { case FRANCAIS : diff --git a/Enumeration/EnumLangue.h b/Enumeration/EnumLangue.h index e75a67c..a7404a8 100644 --- a/Enumeration/EnumLangue.h +++ b/Enumeration/EnumLangue.h @@ -14,7 +14,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -76,7 +76,7 @@ const int nombre_maxi_de_type_de_EnumLangue = 2; // Retourne un nom de type de EnumLangue a partir de son identificateur de // type enumere id_EnumLangue correspondant -char* Nom_EnumLangue (EnumLangue id_EnumLangue); +string Nom_EnumLangue (EnumLangue id_EnumLangue); // Retourne l'identificateur de type enumere associe au nom du type // de EnumLangue nom_EnumLangue diff --git a/Enumeration/EnumTypeCalcul.cc b/Enumeration/EnumTypeCalcul.cc index 927b1eb..586ca72 100644 --- a/Enumeration/EnumTypeCalcul.cc +++ b/Enumeration/EnumTypeCalcul.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/EnumTypeCalcul.h b/Enumeration/EnumTypeCalcul.h index b198f55..bc72a6f 100644 --- a/Enumeration/EnumTypeCalcul.h +++ b/Enumeration/EnumTypeCalcul.h @@ -13,7 +13,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/EnumTypeGradient.cc b/Enumeration/EnumTypeGradient.cc index 0743f12..5482191 100644 --- a/Enumeration/EnumTypeGradient.cc +++ b/Enumeration/EnumTypeGradient.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -53,20 +53,20 @@ using namespace std; //introduces namespace std #ifndef MISE_AU_POINT inline #endif -char* Nom_type_gradient (Enum_type_gradient id_nom) +string Nom_type_gradient (Enum_type_gradient id_nom) // Retourne le nom du type de gradient associe // a l'identificateur de type enumere id_nom -{ char* result=""; - switch (id_nom) - { case GRADVITESSE_V_TDT : result=" GRADVITESSE_V_TDT"; break; - case GRADVITESSE_VCONST : result="GRADVITESSE_VCONST"; break; - case GRADVITESSE_VT_VTDT : result="GRADVITESSE_VT_VTDT"; break; - default : - cout << "\nErreur : valeur incorrecte du type Enum_type_gradient !\n"; - cout << "Nom_type_gradient(Enum_type_gradient ) \n"; - Sortie(1); - }; - return result; +{ string result=""; + switch (id_nom) + { case GRADVITESSE_V_TDT : result=" GRADVITESSE_V_TDT"; break; + case GRADVITESSE_VCONST : result="GRADVITESSE_VCONST"; break; + case GRADVITESSE_VT_VTDT : result="GRADVITESSE_VT_VTDT"; break; + default : + cout << "\nErreur : valeur incorrecte du type Enum_type_gradient !\n"; + cout << "Nom_type_gradient(Enum_type_gradient ) \n"; + Sortie(1); + }; + return result; }; #ifndef MISE_AU_POINT diff --git a/Enumeration/EnumTypeGradient.h b/Enumeration/EnumTypeGradient.h index d037e69..33db9ad 100644 --- a/Enumeration/EnumTypeGradient.h +++ b/Enumeration/EnumTypeGradient.h @@ -14,7 +14,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -87,7 +87,7 @@ enum Enum_type_gradient { GRADVITESSE_V_TDT=1, GRADVITESSE_VCONST, GRADVITESSE_V // Retourne le nom du type de gradient a partir de son identificateur de // type enumere id_ddl correspondant -char* Nom_type_gradient ( Enum_type_gradient id_ddl); +string Nom_type_gradient ( Enum_type_gradient id_ddl); // Retourne l'identificateur de type enumere associe au nom du type de gradient Enum_type_gradient Id_nom_type_gradient (char* nom_ddl); diff --git a/Enumeration/EnumTypeGrandeur.cc b/Enumeration/EnumTypeGrandeur.cc index 2aea685..06aac14 100644 --- a/Enumeration/EnumTypeGrandeur.cc +++ b/Enumeration/EnumTypeGrandeur.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/EnumTypeGrandeur.h b/Enumeration/EnumTypeGrandeur.h index 93dbc08..4b633f5 100644 --- a/Enumeration/EnumTypeGrandeur.h +++ b/Enumeration/EnumTypeGrandeur.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/EnumTypePilotage.cc b/Enumeration/EnumTypePilotage.cc index 7309233..a091da6 100644 --- a/Enumeration/EnumTypePilotage.cc +++ b/Enumeration/EnumTypePilotage.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -49,12 +49,12 @@ using namespace std; //introduces namespace std #include "UtilLecture.h" -char* Nom_TypePilotage (const EnumTypePilotage id_TypePilotage) +string Nom_TypePilotage (const EnumTypePilotage id_TypePilotage) // Retourne le nom de la loi de TypePilotage correspondant a l'identificateur // de type enumere id_TypePilotage { - char* result; + string result; switch (id_TypePilotage) { case PILOTAGE_BASIQUE : result="PILOTAGE_BASIQUE"; break; diff --git a/Enumeration/EnumTypePilotage.h b/Enumeration/EnumTypePilotage.h index 38352b0..6106048 100644 --- a/Enumeration/EnumTypePilotage.h +++ b/Enumeration/EnumTypePilotage.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -53,7 +53,7 @@ enum EnumTypePilotage { PILOTAGE_BASIQUE=1,PILOT_GRADIENT,AUCUN_PILOTAGE}; // Retourne le nom du type de pilotage a partir de son identificateur de // type enumere id_TypePilotage correspondant -char* Nom_TypePilotage (const EnumTypePilotage id_TypePilotage); +string Nom_TypePilotage (const EnumTypePilotage id_TypePilotage); // Retourne l'identificateur de type enumere associe au nom du type de pilotage EnumTypePilotage Id_nom_TypePilotage (const char* nom_TypePilotage); diff --git a/Enumeration/EnumTypeViteRotat.cc b/Enumeration/EnumTypeViteRotat.cc index 100d6b1..80bef8e 100644 --- a/Enumeration/EnumTypeViteRotat.cc +++ b/Enumeration/EnumTypeViteRotat.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -49,11 +49,11 @@ using namespace std; //introduces namespace std -char* Nom_TypeViteRotat (const EnumTypeViteRotat id_TypeViteRotat) +string Nom_TypeViteRotat (const EnumTypeViteRotat id_TypeViteRotat) // Retourne le nom du type de vitesse de rotation correspondant a l'identificateur // de type enumere id_TypeViteRotat { - char* result; + string result; switch (id_TypeViteRotat) { case R_CORROTATIONNEL : result="R_CORROTATIONNEL"; break; diff --git a/Enumeration/EnumTypeViteRotat.h b/Enumeration/EnumTypeViteRotat.h index 814efa9..e24d8f4 100644 --- a/Enumeration/EnumTypeViteRotat.h +++ b/Enumeration/EnumTypeViteRotat.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -54,7 +54,7 @@ enum EnumTypeViteRotat { R_CORROTATIONNEL = 1,R_REF_ROT_PROPRE,R_ROT_LOGARITHMIQ // Retourne un nom de type de vitesse de rotation a partir de son identificateur de // type enumere id_TypeViteRotat correspondant -char* Nom_TypeViteRotat (const EnumTypeViteRotat id_TypeViteRotat) ; +string Nom_TypeViteRotat (const EnumTypeViteRotat id_TypeViteRotat) ; // Retourne l'identificateur de type enumere associe au nom du type // de vitesse de rotation nom_TypeViteRotat diff --git a/Enumeration/EnumTypeVitesseDefor.cc b/Enumeration/EnumTypeVitesseDefor.cc index 2dd3f24..c4b4705 100644 --- a/Enumeration/EnumTypeVitesseDefor.cc +++ b/Enumeration/EnumTypeVitesseDefor.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -49,11 +49,11 @@ using namespace std; //introduces namespace std -char* Nom_TypeVitDef (const Enum_TypeVitDef id_TypeVitDef) +string Nom_TypeVitDef (const Enum_TypeVitDef id_TypeVitDef) // Retourne le nom du type de vitesse de déformation correspondant a l'identificateur // de type enumere id_TypeVitDef { - char* result; + string result; switch (id_TypeVitDef) { case D_MOY_EPS_SUR_DT : result="D_MOY_EPS_SUR_DT"; break; diff --git a/Enumeration/EnumTypeVitesseDefor.h b/Enumeration/EnumTypeVitesseDefor.h index 4d51c55..f3426e8 100644 --- a/Enumeration/EnumTypeVitesseDefor.h +++ b/Enumeration/EnumTypeVitesseDefor.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -55,7 +55,7 @@ enum Enum_TypeVitDef { D_MOY_EPS_SUR_DT = 1,D_AVEC_V_A_T_PLUS_DT, // Retourne un nom de type de vitesse de déformation a partir de son identificateur de // type enumere id_TypeVitDef correspondant -char* Nom_TypeVitDef (const Enum_TypeVitDef id_TypeVitDef) ; +string Nom_TypeVitDef (const Enum_TypeVitDef id_TypeVitDef) ; // Retourne l'identificateur de type enumere associe au nom du type // de vitesse de déformation nom_TypeVitDef diff --git a/Enumeration/Enum_Critere_loi.cc b/Enumeration/Enum_Critere_loi.cc index ca0b8cf..5355b4a 100755 --- a/Enumeration/Enum_Critere_loi.cc +++ b/Enumeration/Enum_Critere_loi.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -30,7 +30,7 @@ // For more information, please consult: . -#include "Enum_Critere_Loi.h" +#include "Enum_Critere_loi.h" # include diff --git a/Enumeration/Enum_Critere_loi.h b/Enumeration/Enum_Critere_loi.h index 39f0feb..c879d74 100755 --- a/Enumeration/Enum_Critere_loi.h +++ b/Enumeration/Enum_Critere_loi.h @@ -14,7 +14,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_GrandeurGlobale.cc b/Enumeration/Enum_GrandeurGlobale.cc index bdbc120..94bb90c 100755 --- a/Enumeration/Enum_GrandeurGlobale.cc +++ b/Enumeration/Enum_GrandeurGlobale.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_GrandeurGlobale.h b/Enumeration/Enum_GrandeurGlobale.h index 2804f2f..5b03cad 100755 --- a/Enumeration/Enum_GrandeurGlobale.h +++ b/Enumeration/Enum_GrandeurGlobale.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_IO_XML.cc b/Enumeration/Enum_IO_XML.cc index f529ad5..db9acfb 100644 --- a/Enumeration/Enum_IO_XML.cc +++ b/Enumeration/Enum_IO_XML.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_IO_XML.h b/Enumeration/Enum_IO_XML.h index cd3e8b3..20a63cb 100644 --- a/Enumeration/Enum_IO_XML.h +++ b/Enumeration/Enum_IO_XML.h @@ -14,7 +14,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_PiPoCo.cc b/Enumeration/Enum_PiPoCo.cc index 415a17b..4b0c973 100644 --- a/Enumeration/Enum_PiPoCo.cc +++ b/Enumeration/Enum_PiPoCo.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_PiPoCo.h b/Enumeration/Enum_PiPoCo.h index 2a79fb2..31067d8 100644 --- a/Enumeration/Enum_PiPoCo.h +++ b/Enumeration/Enum_PiPoCo.h @@ -13,7 +13,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_StabHourglass.cc b/Enumeration/Enum_StabHourglass.cc index a439f27..ebaad64 100644 --- a/Enumeration/Enum_StabHourglass.cc +++ b/Enumeration/Enum_StabHourglass.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_StabHourglass.h b/Enumeration/Enum_StabHourglass.h index 69b2f86..049fcd5 100644 --- a/Enumeration/Enum_StabHourglass.h +++ b/Enumeration/Enum_StabHourglass.h @@ -14,7 +14,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_StabMembrane.cc b/Enumeration/Enum_StabMembrane.cc index 596f033..83f5e12 100755 --- a/Enumeration/Enum_StabMembrane.cc +++ b/Enumeration/Enum_StabMembrane.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_StabMembrane.h b/Enumeration/Enum_StabMembrane.h index 61e568b..3cf0f3b 100755 --- a/Enumeration/Enum_StabMembrane.h +++ b/Enumeration/Enum_StabMembrane.h @@ -13,7 +13,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_Suite.cc b/Enumeration/Enum_Suite.cc index 36f95bf..735bd0c 100644 --- a/Enumeration/Enum_Suite.cc +++ b/Enumeration/Enum_Suite.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -30,7 +30,7 @@ // For more information, please consult: . -#include "Enum_Suite.h" +#include "Enum_suite.h" # include @@ -49,12 +49,12 @@ using namespace std; //introduces namespace std -char* Nom_Suite (Enum_Suite id_Suite) +string Nom_Suite (Enum_Suite id_Suite) // Retourne le nom de la suite correspondant a l'identificateur // de type enumere id_Suite { - char* result; + string result; switch (id_Suite) { case SUITE_EQUIDISTANTE :result="SUITE_EQUIDISTANTE";break; diff --git a/Enumeration/Enum_TypeQuelconque.cc b/Enumeration/Enum_TypeQuelconque.cc index 91eaa4d..97fdfe6 100644 --- a/Enumeration/Enum_TypeQuelconque.cc +++ b/Enumeration/Enum_TypeQuelconque.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -175,6 +175,8 @@ using namespace std; //introduces namespace std map_EnumTypeQuelconque["DELTA_EPS_TRANSPORTEE_ANISO"]=DELTA_EPS_TRANSPORTEE_ANISO; map_EnumTypeQuelconque["DELTA_SIGMA_DANS_ANISO"]=DELTA_SIGMA_DANS_ANISO; map_EnumTypeQuelconque["PARA_ORTHO"]=PARA_ORTHO; + map_EnumTypeQuelconque["PARA_LOI_FAVIER"]=PARA_LOI_FAVIER; + map_EnumTypeQuelconque["PARA_LOI_TYPE_MOONEY"]=PARA_LOI_TYPE_MOONEY; map_EnumTypeQuelconque["SPHERIQUE_EPS"]=SPHERIQUE_EPS; map_EnumTypeQuelconque["Q_EPS"]=Q_EPS; map_EnumTypeQuelconque["COS3PHI_EPS"]=COS3PHI_EPS; @@ -239,6 +241,9 @@ using namespace std; //introduces namespace std map_EnumTypeQuelconque["NN_SURF"]=NN_SURF; map_EnumTypeQuelconque["NN_SURF_t"]=NN_SURF_t; map_EnumTypeQuelconque["NN_SURF_t0"]=NN_SURF_t0; + map_EnumTypeQuelconque["N_FRONT"]=N_FRONT; + map_EnumTypeQuelconque["N_FRONT_t"]=N_FRONT_t; + map_EnumTypeQuelconque["N_FRONT_t0"]=N_FRONT_t0; map_EnumTypeQuelconque["NOEUD_PROJECTILE_EN_CONTACT"]=NOEUD_PROJECTILE_EN_CONTACT; map_EnumTypeQuelconque["NOEUD_FACETTE_EN_CONTACT"]=NOEUD_FACETTE_EN_CONTACT; map_EnumTypeQuelconque["GLISSEMENT_CONTACT"]=GLISSEMENT_CONTACT; @@ -285,7 +290,7 @@ using namespace std; //introduces namespace std map_EnumTypeQuelconque["NUM_ARETE"]=NUM_ARETE; // remplissage de tt_GLOB - tt_GLOB.Change_taille(218); // ****** ne pas oublier de redéfinir la taille si l'on ajoute des termes enum + tt_GLOB.Change_taille(223); // ****** ne pas oublier de redéfinir la taille si l'on ajoute des termes enum tt_GLOB(RIEN_TYPEQUELCONQUE)=1; tt_GLOB(SIGMA_BARRE_BH_T)=0; tt_GLOB(CONTRAINTE_INDIVIDUELLE_A_CHAQUE_LOI_A_T_SANS_PROPORTION)=0; @@ -398,6 +403,8 @@ using namespace std; //introduces namespace std tt_GLOB(DELTA_EPS_TRANSPORTEE_ANISO)=1; tt_GLOB(DELTA_SIGMA_DANS_ANISO)=1; tt_GLOB(PARA_ORTHO)=1; + tt_GLOB(PARA_LOI_FAVIER)=1; + tt_GLOB(PARA_LOI_TYPE_MOONEY)=1; tt_GLOB(SPHERIQUE_EPS)=1; tt_GLOB(Q_EPS)=1; tt_GLOB(COS3PHI_EPS)=1; @@ -462,6 +469,9 @@ using namespace std; //introduces namespace std tt_GLOB(NN_SURF)=1; tt_GLOB(NN_SURF_t)=1; tt_GLOB(NN_SURF_t0)=1; + tt_GLOB(N_FRONT)=1; + tt_GLOB(N_FRONT_t)=1; + tt_GLOB(N_FRONT_t0)=1; tt_GLOB(NOEUD_PROJECTILE_EN_CONTACT)=1; tt_GLOB(NOEUD_FACETTE_EN_CONTACT)=1; tt_GLOB(GLISSEMENT_CONTACT)=1; @@ -506,7 +516,7 @@ using namespace std; //introduces namespace std tt_GLOB(NUM_ARETE)=1; // remplissage de tt_TQ_temps - tt_TQ_temps.Change_taille(218); // ****** ne pas oublier de redéfinir la taille si l'on ajoute des termes enum + tt_TQ_temps.Change_taille(223); // ****** ne pas oublier de redéfinir la taille si l'on ajoute des termes enum tt_TQ_temps(RIEN_TYPEQUELCONQUE)=TEMPS_0; tt_TQ_temps(SIGMA_BARRE_BH_T)=TEMPS_t; tt_TQ_temps(CONTRAINTE_INDIVIDUELLE_A_CHAQUE_LOI_A_T_SANS_PROPORTION)=TEMPS_tdt; @@ -619,6 +629,8 @@ using namespace std; //introduces namespace std tt_TQ_temps(DELTA_EPS_TRANSPORTEE_ANISO)=TEMPS_tdt; tt_TQ_temps(DELTA_SIGMA_DANS_ANISO)=TEMPS_tdt; tt_TQ_temps(PARA_ORTHO)=TEMPS_tdt; + tt_TQ_temps(PARA_LOI_FAVIER)=TEMPS_tdt; + tt_TQ_temps(PARA_LOI_TYPE_MOONEY)=TEMPS_tdt; tt_TQ_temps(SPHERIQUE_EPS)=TEMPS_tdt; tt_TQ_temps(Q_EPS)=TEMPS_tdt; tt_TQ_temps(COS3PHI_EPS)=TEMPS_tdt; @@ -683,6 +695,9 @@ using namespace std; //introduces namespace std tt_TQ_temps(NN_SURF)=TEMPS_tdt; tt_TQ_temps(NN_SURF_t)=TEMPS_t; tt_TQ_temps(NN_SURF_t0)=TEMPS_0; + tt_TQ_temps(N_FRONT)=TEMPS_tdt; + tt_TQ_temps(N_FRONT_t)=TEMPS_t; + tt_TQ_temps(N_FRONT_t0)=TEMPS_0; tt_TQ_temps(NOEUD_PROJECTILE_EN_CONTACT)=TEMPS_tdt; tt_TQ_temps(NOEUD_FACETTE_EN_CONTACT)=TEMPS_tdt; tt_TQ_temps(GLISSEMENT_CONTACT)=TEMPS_tdt; @@ -845,6 +860,8 @@ string NomTypeQuelconque(EnumTypeQuelconque id_TypeQuelconque) case DELTA_EPS_TRANSPORTEE_ANISO : result="DELTA_EPS_TRANSPORTEE_ANISO"; break; case DELTA_SIGMA_DANS_ANISO : result="DELTA_SIGMA_DANS_ANISO"; break; case PARA_ORTHO : result="PARA_ORTHO"; break; + case PARA_LOI_FAVIER : result="PARA_LOI_FAVIER"; break; + case PARA_LOI_TYPE_MOONEY : result="PARA_LOI_TYPE_MOONEY"; break; case SPHERIQUE_EPS : result="SPHERIQUE_EPS"; break; case Q_EPS : result="Q_EPS"; break; case COS3PHI_EPS : result="COS3PHI_EPS"; break; @@ -912,6 +929,9 @@ string NomTypeQuelconque(EnumTypeQuelconque id_TypeQuelconque) case NN_SURF : result="NN_SURF"; break; case NN_SURF_t : result="NN_SURF_t"; break; case NN_SURF_t0 : result="NN_SURF_t0"; break; + case N_FRONT : result="N_FRONT"; break; + case N_FRONT_t : result="N_FRONT_t"; break; + case N_FRONT_t0 : result="N_FRONT_t0"; break; case NOEUD_PROJECTILE_EN_CONTACT : result="NOEUD_PROJECTILE_EN_CONTACT"; break; case NOEUD_FACETTE_EN_CONTACT : result="NOEUD_FACETTE_EN_CONTACT"; break; case GLISSEMENT_CONTACT : result="GLISSEMENT_CONTACT"; break; @@ -1083,6 +1103,8 @@ string NomTypeQuelconque_court (EnumTypeQuelconque id_TypeQuelconque) case DELTA_EPS_TRANSPORTEE_ANISO : result="DELTA_EPS_TRANS_ANISO"; break; case DELTA_SIGMA_DANS_ANISO : result="DELTA_SIGMA_DANS_ANISO"; break; case PARA_ORTHO : result="PARA_ORTHO"; break; + case PARA_LOI_FAVIER : result="PARA_LOI_FAVIER"; break; + case PARA_LOI_TYPE_MOONEY : result="PARA_LOI_TYPE_MOONEY"; break; case SPHERIQUE_EPS : result="SPHERIQUE_EPS"; break; case Q_EPS : result="Q_EPS"; break; case COS3PHI_EPS : result="COS3PHI_EPS"; break; @@ -1150,6 +1172,9 @@ string NomTypeQuelconque_court (EnumTypeQuelconque id_TypeQuelconque) case NN_SURF : result="NN_SURF"; break; case NN_SURF_t : result="NN_SURF_t"; break; case NN_SURF_t0 : result="NN_SURF_t0"; break; + case N_FRONT : result="N_FRONT"; break; + case N_FRONT_t : result="N_FRONT_t"; break; + case N_FRONT_t0 : result="N_FRONT_t0"; break; case NOEUD_PROJECTILE_EN_CONTACT : result="NOE_PR_CONTACT"; break; case NOEUD_FACETTE_EN_CONTACT : result="NOE_F_CONTACT"; break; case GLISSEMENT_CONTACT : result="GLISSE_CONTACT"; break; @@ -1318,6 +1343,8 @@ string NomGeneriqueTypeQuelconque(EnumTypeQuelconque id_TypeQuelconque) case DELTA_EPS_TRANSPORTEE_ANISO : result="DELTA_EPS_TRANS_ANISO"; break; case DELTA_SIGMA_DANS_ANISO : result="DELTA_SIGMA_DANS_ANISO"; break; case PARA_ORTHO : result="PARA_ORTHO"; break; + case PARA_LOI_FAVIER : result="PARA_LOI_FAVIER"; break; + case PARA_LOI_TYPE_MOONEY : result="PARA_LOI_TYPE_MOONEY"; break; case SPHERIQUE_EPS : result="SPHERIQUE_EPS"; break; case Q_EPS : result="Q_EPS"; break; case COS3PHI_EPS : result="COS3PHI_EPS"; break; @@ -1379,6 +1406,9 @@ string NomGeneriqueTypeQuelconque(EnumTypeQuelconque id_TypeQuelconque) case NN_SURF : result="NN_SURF"; break; case NN_SURF_t : result="NN_SURF_t"; break; case NN_SURF_t0 : result="NN_SURF_t0"; break; + case N_FRONT : result="N_FRONT"; break; + case N_FRONT_t : result="N_FRONT_t"; break; + case N_FRONT_t0 : result="N_FRONT_t0"; break; case NOEUD_PROJECTILE_EN_CONTACT : result="NOE_PR_CONTACT"; break; case NOEUD_FACETTE_EN_CONTACT : result="NOE_F_CONTACT"; break; case GLISSEMENT_CONTACT : result="GLISSE_CONTACT"; break; @@ -1597,6 +1627,8 @@ EnumTypeGrandeur Type_de_grandeur_associee(EnumTypeQuelconque typa) case DELTA_EPS_TRANSPORTEE_ANISO : return TENSEURHH; break; case DELTA_SIGMA_DANS_ANISO : return TENSEURHH; break; case PARA_ORTHO : return VECTEUR; break; + case PARA_LOI_FAVIER : return VECTEUR; break; + case PARA_LOI_TYPE_MOONEY : return VECTEUR; break; case SPHERIQUE_EPS : return SCALAIRE; break; case Q_EPS : return SCALAIRE; break; case COS3PHI_EPS : return SCALAIRE; break; @@ -1661,6 +1693,9 @@ EnumTypeGrandeur Type_de_grandeur_associee(EnumTypeQuelconque typa) case NN_SURF : return COORDONNEE; break; case NN_SURF_t : return COORDONNEE; break; case NN_SURF_t0 : return COORDONNEE; break; + case N_FRONT : return COORDONNEE; break; + case N_FRONT_t : return COORDONNEE; break; + case N_FRONT_t0 : return COORDONNEE; break; case NOEUD_PROJECTILE_EN_CONTACT : return SCALAIRE; break; case NOEUD_FACETTE_EN_CONTACT : return SCALAIRE; break; case GLISSEMENT_CONTACT : return COORDONNEE; break; diff --git a/Enumeration/Enum_TypeQuelconque.h b/Enumeration/Enum_TypeQuelconque.h index 17d241c..3a419a8 100644 --- a/Enumeration/Enum_TypeQuelconque.h +++ b/Enumeration/Enum_TypeQuelconque.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -93,7 +93,7 @@ enum EnumTypeQuelconque { RIEN_TYPEQUELCONQUE = 1, SIGMA_BARRE_BH_T ,REPERE_LOCAL_ORTHO, REPERE_LOCAL_H, REPERE_LOCAL_B ,REPERE_D_ANISOTROPIE,EPS_TRANSPORTEE_ANISO,SIGMA_DANS_ANISO ,DELTA_EPS_TRANSPORTEE_ANISO,DELTA_SIGMA_DANS_ANISO - ,PARA_ORTHO + ,PARA_ORTHO,PARA_LOI_FAVIER,PARA_LOI_TYPE_MOONEY ,SPHERIQUE_EPS,Q_EPS,COS3PHI_EPS,SPHERIQUE_SIG,Q_SIG,COS3PHI_SIG ,SPHERIQUE_DEPS,V_vol,Q_DEPS,COS3PHI_DEPS,POTENTIEL,FCT_POTENTIEL_ND ,INVAR_B1,INVAR_B2,INVAR_B3,INVAR_J1,INVAR_J2,INVAR_J3 @@ -107,7 +107,7 @@ enum EnumTypeQuelconque { RIEN_TYPEQUELCONQUE = 1, SIGMA_BARRE_BH_T ,VECT_LINE,VECT_LINE_SUIV,VECT_REAC,VECT_REAC_N ,NN_11,NN_22,NN_33,NN_12,NN_13,NN_23,MM_11,MM_22,MM_33,MM_12,MM_13,MM_23 ,DIRECTION_PLI,DIRECTION_PLI_NORMEE,INDIC_CAL_PLIS - ,NN_SURF,NN_SURF_t,NN_SURF_t0 + ,NN_SURF,NN_SURF_t,NN_SURF_t0,N_FRONT,N_FRONT_t,N_FRONT_t0 ,NOEUD_PROJECTILE_EN_CONTACT,NOEUD_FACETTE_EN_CONTACT ,GLISSEMENT_CONTACT,PENETRATION_CONTACT ,GLISSEMENT_CONTACT_T,PENETRATION_CONTACT_T diff --git a/Enumeration/Enum_boolddl.cc b/Enumeration/Enum_boolddl.cc index d3c55e2..8d4ad30 100644 --- a/Enumeration/Enum_boolddl.cc +++ b/Enumeration/Enum_boolddl.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_boolddl.h b/Enumeration/Enum_boolddl.h index 958fa6b..d9f73ad 100644 --- a/Enumeration/Enum_boolddl.h +++ b/Enumeration/Enum_boolddl.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_calcul_masse.cc b/Enumeration/Enum_calcul_masse.cc index 2945fa7..7d70328 100755 --- a/Enumeration/Enum_calcul_masse.cc +++ b/Enumeration/Enum_calcul_masse.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -49,12 +49,12 @@ using namespace std; //introduces namespace std -char* Nom_calcul_masse (Enum_calcul_masse id_calcul_masse) +string Nom_calcul_masse (Enum_calcul_masse id_calcul_masse) // Retourne le nom du type de calcul_masse correspondant a l'identificateur // de type enumere id_calcul_masse { - char* result; + string result; switch (id_calcul_masse) { case MASSE_DIAG_COEF_EGAUX : diff --git a/Enumeration/Enum_calcul_masse.h b/Enumeration/Enum_calcul_masse.h index fb3a88c..654621b 100644 --- a/Enumeration/Enum_calcul_masse.h +++ b/Enumeration/Enum_calcul_masse.h @@ -13,7 +13,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -74,7 +74,7 @@ enum Enum_calcul_masse { MASSE_DIAG_COEF_EGAUX = 1, MASSE_DIAG_COEF_VAR , MASSE_ // Retourne un nom de type de calcul_masse a partir de son identificateur de // type enumere id_calcul_masse correspondant -char* Nom_calcul_masse (Enum_calcul_masse id_calcul_masse); +string Nom_calcul_masse (Enum_calcul_masse id_calcul_masse); // Retourne l'identificateur de type enumere associe au nom du type // de calcul_masse nom_calcul_masse diff --git a/Enumeration/Enum_categorie_loi_comp.cc b/Enumeration/Enum_categorie_loi_comp.cc index 83e53af..f525554 100644 --- a/Enumeration/Enum_categorie_loi_comp.cc +++ b/Enumeration/Enum_categorie_loi_comp.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -49,25 +49,25 @@ using namespace std; //introduces namespace std -char* Nom_categorie_loi_comp (const Enum_categorie_loi_comp id_comport) +string Nom_categorie_loi_comp (const Enum_categorie_loi_comp id_comport) // Retourne le nom de la loi de comportement correspondant a l'identificateur // de type enumere id_comport { - char* result; - switch (id_comport) - { - case CAT_MECANIQUE : result="CAT_MECANIQUE"; break; - case CAT_THERMO_MECANIQUE : result="CAT_THERMO_MECANIQUE"; break; - case CAT_THERMO_PHYSIQUE : result="CAT_THERMO_PHYSIQUE"; break; - case CAT_FROTTEMENT : result="CAT_FROTTEMENT"; break; - case RIEN_CATEGORIE_LOI_COMP :result="RIEN_CATEGORIE_LOI_COMP"; break; - default : - cout << "\nErreur : valeur incorrecte du type Enum_categorie_loi_comp !: " << id_comport << " \n"; - cout << "Nom_categorie_loi_comp(Enum_categorie_loi_comp ) \n"; - Sortie(1); - }; - return result; + string result; + switch (id_comport) + { + case CAT_MECANIQUE : result="CAT_MECANIQUE"; break; + case CAT_THERMO_MECANIQUE : result="CAT_THERMO_MECANIQUE"; break; + case CAT_THERMO_PHYSIQUE : result="CAT_THERMO_PHYSIQUE"; break; + case CAT_FROTTEMENT : result="CAT_FROTTEMENT"; break; + case RIEN_CATEGORIE_LOI_COMP :result="RIEN_CATEGORIE_LOI_COMP"; break; + default : + cout << "\nErreur : valeur incorrecte du type Enum_categorie_loi_comp !: " << id_comport << " \n"; + cout << "Nom_categorie_loi_comp(Enum_categorie_loi_comp ) \n"; + Sortie(1); + }; + return result; }; @@ -114,7 +114,7 @@ bool GroupeFrottement(const Enum_categorie_loi_comp id_comport) Enum_categorie_loi_comp Categorie_loi_comp_la_plus_complete(const Enum_categorie_loi_comp id_comport1, const Enum_categorie_loi_comp id_comport2) {// tout d'abord on vérifie qu'ils sont du même groupe - bool meme_groupe=false; +// bool meme_groupe=false; if (id_comport1 == id_comport2) return id_comport1; // cas pas de pb if (GroupeMecanique(id_comport1) && GroupeMecanique(id_comport2)) // cas du groupe méca { if (id_comport1 > id_comport2) {return id_comport1;} else {return id_comport2;};} diff --git a/Enumeration/Enum_categorie_loi_comp.h b/Enumeration/Enum_categorie_loi_comp.h index 3f6fbfe..252c351 100644 --- a/Enumeration/Enum_categorie_loi_comp.h +++ b/Enumeration/Enum_categorie_loi_comp.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -64,7 +64,7 @@ const int nbmax_caractere_Enum_categorie_loi_comp = 26; // Retourne le nom d'une loi de comportement a partir de son identificateur de // type enumere id_categorie_loi_comp correspondant -char* Nom_categorie_loi_comp (const Enum_categorie_loi_comp id_comport); +string Nom_categorie_loi_comp (const Enum_categorie_loi_comp id_comport); // Retourne l'identificateur de type enumere associe au nom de la loi de // comportement nom_comport diff --git a/Enumeration/Enum_chargement.cc b/Enumeration/Enum_chargement.cc index 7aecaa8..41933f1 100755 --- a/Enumeration/Enum_chargement.cc +++ b/Enumeration/Enum_chargement.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_chargement.h b/Enumeration/Enum_chargement.h index 191767d..643b888 100755 --- a/Enumeration/Enum_chargement.h +++ b/Enumeration/Enum_chargement.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_comp.cc b/Enumeration/Enum_comp.cc index 5905c5d..1a20f30 100644 --- a/Enumeration/Enum_comp.cc +++ b/Enumeration/Enum_comp.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_comp.h b/Enumeration/Enum_comp.h index 4bc8cff..5901824 100644 --- a/Enumeration/Enum_comp.h +++ b/Enumeration/Enum_comp.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_contrainte_mathematique.cc b/Enumeration/Enum_contrainte_mathematique.cc index 9140e3c..42ace20 100755 --- a/Enumeration/Enum_contrainte_mathematique.cc +++ b/Enumeration/Enum_contrainte_mathematique.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_contrainte_mathematique.h b/Enumeration/Enum_contrainte_mathematique.h index 070b249..ecce86b 100755 --- a/Enumeration/Enum_contrainte_mathematique.h +++ b/Enumeration/Enum_contrainte_mathematique.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_crista.cc b/Enumeration/Enum_crista.cc index a751133..9b38b57 100644 --- a/Enumeration/Enum_crista.cc +++ b/Enumeration/Enum_crista.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -49,12 +49,12 @@ using namespace std; //introduces namespace std -char* Nom_Enum_crista (Enum_crista id_Enum_crista) +string Nom_Enum_crista (Enum_crista id_Enum_crista) // Retourne le nom du type de Enum_crista correspondant a l'identificateur // de type enumere id_Enum_crista { - char* result; + string result; switch (id_Enum_crista) { case HOFFMAN : diff --git a/Enumeration/Enum_crista.h b/Enumeration/Enum_crista.h index 25d81bd..532d4b8 100644 --- a/Enumeration/Enum_crista.h +++ b/Enumeration/Enum_crista.h @@ -14,7 +14,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -77,7 +77,7 @@ const int nombre_maxi_de_type_de_Enum_crista = 2; // Retourne un nom de type de Enum_crista a partir de son identificateur de // type enumere id_Enum_crista correspondant -char* Nom_Enum_crista (Enum_crista id_Enum_crista); +string Nom_Enum_crista (Enum_crista id_Enum_crista); // Retourne l'identificateur de type enumere associe au nom du type // de Enum_crista nom_Enum_crista diff --git a/Enumeration/Enum_ddl (copy: conflict on 2017-11-21).h b/Enumeration/Enum_ddl (copy: conflict on 2017-11-21).h old mode 100644 new mode 100755 diff --git a/Enumeration/Enum_ddl.cc b/Enumeration/Enum_ddl.cc index ea0a55f..ceb9cef 100644 --- a/Enumeration/Enum_ddl.cc +++ b/Enumeration/Enum_ddl.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_ddl.h b/Enumeration/Enum_ddl.h index a3541ea..476d78d 100644 --- a/Enumeration/Enum_ddl.h +++ b/Enumeration/Enum_ddl.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_ddl_var_static.cc b/Enumeration/Enum_ddl_var_static.cc index a090efd..4dafe39 100644 --- a/Enumeration/Enum_ddl_var_static.cc +++ b/Enumeration/Enum_ddl_var_static.cc @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_dure.cc b/Enumeration/Enum_dure.cc index 8d5ce79..086d64a 100644 --- a/Enumeration/Enum_dure.cc +++ b/Enumeration/Enum_dure.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_dure.h b/Enumeration/Enum_dure.h index f70df4c..0f25a75 100644 --- a/Enumeration/Enum_dure.h +++ b/Enumeration/Enum_dure.h @@ -14,7 +14,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_geom.cc b/Enumeration/Enum_geom.cc index 0add713..5a2f215 100644 --- a/Enumeration/Enum_geom.cc +++ b/Enumeration/Enum_geom.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_geom.h b/Enumeration/Enum_geom.h index d7623b6..8f1c818 100644 --- a/Enumeration/Enum_geom.h +++ b/Enumeration/Enum_geom.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_interpol.cc b/Enumeration/Enum_interpol.cc index 7a85faa..3ce4295 100644 --- a/Enumeration/Enum_interpol.cc +++ b/Enumeration/Enum_interpol.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_interpol.h b/Enumeration/Enum_interpol.h index 270f22b..48bd0e6 100644 --- a/Enumeration/Enum_interpol.h +++ b/Enumeration/Enum_interpol.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_liaison_noeud.cc b/Enumeration/Enum_liaison_noeud.cc index b0e294f..c54280c 100755 --- a/Enumeration/Enum_liaison_noeud.cc +++ b/Enumeration/Enum_liaison_noeud.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_liaison_noeud.h b/Enumeration/Enum_liaison_noeud.h index 3534c20..07d0cf0 100755 --- a/Enumeration/Enum_liaison_noeud.h +++ b/Enumeration/Enum_liaison_noeud.h @@ -14,7 +14,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_mat.cc b/Enumeration/Enum_mat.cc index ff5d8cf..66257a1 100644 --- a/Enumeration/Enum_mat.cc +++ b/Enumeration/Enum_mat.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -49,12 +49,12 @@ using namespace std; //introduces namespace std -char* Nom_mat (Enum_mat id_mater) +string Nom_mat (Enum_mat id_mater) // Retourne le nom du materiau correspondant a l'identificateur // de type enumere id_mater { - char* result; + string result; switch (id_mater) { case ACIER : diff --git a/Enumeration/Enum_mat.h b/Enumeration/Enum_mat.h index 058bd7c..2a52b99 100644 --- a/Enumeration/Enum_mat.h +++ b/Enumeration/Enum_mat.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -56,7 +56,7 @@ enum Enum_mat { ACIER=1, BETON, COMPOSITE }; // Retourne le nom d'un materiau a partir de son identificateur de // type enumere id_mater correspondant -char* Nom_mat (Enum_mat id_mater); +string Nom_mat (Enum_mat id_mater); // Retourne l'identificateur de type enumere associe au nom de // materiau nom_mater diff --git a/Enumeration/Enum_matrice.cc b/Enumeration/Enum_matrice.cc index ec3eade..2a75b3e 100755 --- a/Enumeration/Enum_matrice.cc +++ b/Enumeration/Enum_matrice.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_matrice.h b/Enumeration/Enum_matrice.h index 9506344..6665af9 100644 --- a/Enumeration/Enum_matrice.h +++ b/Enumeration/Enum_matrice.h @@ -14,7 +14,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_proj_aniso.cc b/Enumeration/Enum_proj_aniso.cc index 8786364..22a0e7c 100755 --- a/Enumeration/Enum_proj_aniso.cc +++ b/Enumeration/Enum_proj_aniso.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_proj_aniso.h b/Enumeration/Enum_proj_aniso.h index d38505c..8a5fe50 100755 --- a/Enumeration/Enum_proj_aniso.h +++ b/Enumeration/Enum_proj_aniso.h @@ -14,7 +14,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_suite.h b/Enumeration/Enum_suite.h index b6c3887..1aac9f5 100644 --- a/Enumeration/Enum_suite.h +++ b/Enumeration/Enum_suite.h @@ -14,7 +14,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -79,7 +79,7 @@ enum Enum_Suite { SUITE_EQUIDISTANTE = 1, SUITE_ARITHMETIQUE, SUITE_GEOMETRIQUE // Retourne le nom d'une Suite a partir de son identificateur de // type enumere id_Suite correspondant -char* Nom_Suite (Enum_Suite id_Suite); +string Nom_Suite (Enum_Suite id_Suite); // Retourne l'identificateur de type enumere associe au nom d'une Suite Enum_Suite Id_Nom_Suite (const char* nom_Suite) ; diff --git a/Enumeration/Enum_type_deformation.cc b/Enumeration/Enum_type_deformation.cc index a1fc681..35144f9 100644 --- a/Enumeration/Enum_type_deformation.cc +++ b/Enumeration/Enum_type_deformation.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_type_deformation.h b/Enumeration/Enum_type_deformation.h index 7eda062..8827e47 100644 --- a/Enumeration/Enum_type_deformation.h +++ b/Enumeration/Enum_type_deformation.h @@ -14,7 +14,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_type_geom.cc b/Enumeration/Enum_type_geom.cc index 8a9e1dc..f7eabe0 100644 --- a/Enumeration/Enum_type_geom.cc +++ b/Enumeration/Enum_type_geom.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_type_geom.h b/Enumeration/Enum_type_geom.h index 595aa1b..c49724f 100644 --- a/Enumeration/Enum_type_geom.h +++ b/Enumeration/Enum_type_geom.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_type_pt_integ.cc b/Enumeration/Enum_type_pt_integ.cc index 770bb27..81f6b58 100644 --- a/Enumeration/Enum_type_pt_integ.cc +++ b/Enumeration/Enum_type_pt_integ.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_type_pt_integ.h b/Enumeration/Enum_type_pt_integ.h index 9fa7893..06dd25f 100644 --- a/Enumeration/Enum_type_pt_integ.h +++ b/Enumeration/Enum_type_pt_integ.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_type_resolution_matri.cc b/Enumeration/Enum_type_resolution_matri.cc index d2247f2..91c2720 100755 --- a/Enumeration/Enum_type_resolution_matri.cc +++ b/Enumeration/Enum_type_resolution_matri.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_type_resolution_matri.h b/Enumeration/Enum_type_resolution_matri.h index 688aab6..42db06a 100644 --- a/Enumeration/Enum_type_resolution_matri.h +++ b/Enumeration/Enum_type_resolution_matri.h @@ -14,7 +14,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/Enum_type_stocke_deformation.cc b/Enumeration/Enum_type_stocke_deformation.cc index 6aea8b7..3117d36 100644 --- a/Enumeration/Enum_type_stocke_deformation.cc +++ b/Enumeration/Enum_type_stocke_deformation.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -54,12 +54,12 @@ using namespace std; //introduces namespace std #ifndef MISE_AU_POINT inline #endif -char* Nom_type_stockage_def (Enum_type_stocke_deformation id_nom) +string Nom_type_stockage_def (Enum_type_stocke_deformation id_nom) // Retourne le nom du type associe // a l'identificateur de type enumere id_nom { - char* result=""; + string result=""; switch (id_nom) { case SAVEDEFRESUL_GENERAL : diff --git a/Enumeration/Enum_type_stocke_deformation.h b/Enumeration/Enum_type_stocke_deformation.h index 7def5d6..de464e4 100644 --- a/Enumeration/Enum_type_stocke_deformation.h +++ b/Enumeration/Enum_type_stocke_deformation.h @@ -14,7 +14,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -81,7 +81,7 @@ enum Enum_type_stocke_deformation { SAVEDEFRESUL_GENERAL = 0, SAVEDEFRESUL_SFE1 // Retourne le nom du type a partir de son identificateur de // type enumere id_ddl correspondant -char* Nom_type_stockage_def ( Enum_type_stocke_deformation id_ddl); +string Nom_type_stockage_def ( Enum_type_stocke_deformation id_ddl); // Retourne l'identificateur de type enumere associe au nom du type Enum_type_stocke_deformation Id_nom_type_stockage_def (char* nom_ddl); diff --git a/Enumeration/Enum_variable_metrique.cc b/Enumeration/Enum_variable_metrique.cc index df9cd6d..ec55e05 100644 --- a/Enumeration/Enum_variable_metrique.cc +++ b/Enumeration/Enum_variable_metrique.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -47,12 +47,12 @@ using namespace std; //introduces namespace std #endif #include -char* Nom_Enum_variable_metrique (Enum_variable_metrique id_nom) +string Nom_Enum_variable_metrique (Enum_variable_metrique id_nom) // Retourne le nom en caractère correspondant a l'identificateur // de type enumere id_mater { - char* result; + string result; switch (id_nom) { case iM0 :result="iM0";break; @@ -178,12 +178,12 @@ ostream & operator << (ostream & sort, const Enum_variable_metrique& a) }; -char* Nom_Enum_variable_metsfe (Enum_variable_metsfe id_nom) +string Nom_Enum_variable_metsfe (Enum_variable_metsfe id_nom) // Retourne le nom en caractère correspondant a l'identificateur // de type enumere id_mater { - char* result; + string result; switch (id_nom) { case iP0 :result="iP0";break; diff --git a/Enumeration/Enum_variable_metrique.h b/Enumeration/Enum_variable_metrique.h index 82c6e99..1741fed 100644 --- a/Enumeration/Enum_variable_metrique.h +++ b/Enumeration/Enum_variable_metrique.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -82,14 +82,14 @@ enum Enum_variable_metsfe { iP0 =1, iPt, idPt, iPtdt, idPtdt // Retourne la chaine a partir de son identificateur de // type enumere id_nom correspondant -char* Nom_Enum_variable_metrique (Enum_variable_metrique id_nom); +string Nom_Enum_variable_metrique (Enum_variable_metrique id_nom); // Retourne l'identificateur de type enumere associe au nom Enum_variable_metrique Id_nom_Enum_variable_metrique (char* nom); // Retourne la chaine a partir de son identificateur de // type enumere id_nom correspondant -char* Nom_Enum_variable_metsfe (Enum_variable_metsfe id_nom); +string Nom_Enum_variable_metsfe (Enum_variable_metsfe id_nom); // Retourne l'identificateur de type enumere associe au nom Enum_variable_metsfe Id_nom_Enum_variable_metsfe (char* nom); diff --git a/Enumeration/MotCle.cc b/Enumeration/MotCle.cc index 434b91f..37a9f26 100644 --- a/Enumeration/MotCle.cc +++ b/Enumeration/MotCle.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Enumeration/MotCle.h b/Enumeration/MotCle.h index 18b9d8a..6913b80 100644 --- a/Enumeration/MotCle.h +++ b/Enumeration/MotCle.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Flambage/LesValVecPropres.cc b/Flambage/LesValVecPropres.cc index ab75f3b..e450011 100644 --- a/Flambage/LesValVecPropres.cc +++ b/Flambage/LesValVecPropres.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -29,6 +29,11 @@ #include "LesValVecPropres.h" +#include +// s'il manque, il y a un pb dans LesValVecPropres::Affiche(ofstream& sort) const + + + // CONSTRUCTEURS : // par defaut LesValVecPropres::LesValVecPropres () : @@ -58,7 +63,7 @@ void LesValVecPropres::Affiche(ofstream& sort) const { sort << "\n -> valeurs et vecteurs propres associés \n"; sort << " <----------------------> \n"; for (int i=1;i<= VaeP.Taille(); i++) - { sort << "\n valeur propre nb ",i," = ", VaeP(i).Val(),'\n'; + { sort << "\n valeur propre nb " << i << " = " << VaeP(i).Val() << '\n'; sort << " le vecteur propre : \n"; VaeP(i).Pv().Affiche(); sort << " <----------------------> \n"; diff --git a/Flambage/LesValVecPropres.h b/Flambage/LesValVecPropres.h index b37561c..6b41632 100644 --- a/Flambage/LesValVecPropres.h +++ b/Flambage/LesValVecPropres.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/General/Projet.cc b/General/Projet.cc index f0e981c..f679395 100644 --- a/General/Projet.cc +++ b/General/Projet.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -29,24 +29,16 @@ #include "Projet.h" -//#include "AlgoriNonDyna.h" -//#include "ImpliNonDynaCont.h" -//#include "AlgoriFlambLineaire.h" -//#include "AlgoInformations.h" -//#include "AlgoUtils.h" -//#include "AlgoriDynaExpli.h" -//#include "AlgoriNewmark.h" -//#include "Algori_chung_lee.h" -//#include "AlgoriDynaExpli_zhai.h" -//#include "Algori_tchamwa.h" -//#include "AlgoUmatAbaqus.h" -//#include "AlgoRungeKutta.h" -//#include "AlgoBonelli.h" -//#include "Algori_relax_dyna.h" -//#include "AlgoriCombine.h" #include "CharUtil.h" #include "MotCle.h" #include "Banniere.h" +#ifdef UTILISATION_MPI + #include + #include + #include + #include + namespace mpi = boost::mpi; +#endif // Constructeur par defaut (car les arguments sont par défauts // il y a passage éventuelle d'argument : argc=le nombre d'argument @@ -58,7 +50,7 @@ ,lesCondLim(NULL),lescontacts(NULL),resultats(NULL) ,varExpor(NULL),tabAlgo() ,tempsMiseEnDonnees() - + { tempsMiseEnDonnees.Mise_en_route_du_comptage(); // comptage cpu // initialisation par defaut de la classe des utilitaires de lecture @@ -74,7 +66,22 @@ }; entreePrinc->OuvrirFichier(); // ouverture du fichier principal int lec_ent_info = entreePrinc->Lec_ent_info(); - // traitement suivant le type d'entrée de données + // ---- traitement suivant le type d'entrée de données + #ifdef UTILISATION_MPI + // si calcul //, on ne continue que si on a une entrée via .info + // ou via base-info + // def global d'un communicator + mpi::communicator* world = ParaGlob::Monde(); + if (world->rank() != 0) + {if (!((lec_ent_info==0)||(lec_ent_info==1))) + {cout << "\n *** Erreur : en execution parallele, seules les entrees via .info ou base-info sont possible "; + // on envoie un signal d'erreur au process 0 + world->send(0, 2, std::string("erreur_en_lecture")); + Sortie(1); + }; + }; + #endif + switch (lec_ent_info) {case -12 : // --------- cas de la construction shema XML d'entrée de données .info ---- { InitConstructionSchemaXml(retour); @@ -654,49 +661,6 @@ void Projet::InitConstructionSchemaXml(string & retour) (paraGlob->Avec_typeDeCalcul(),paraGlob->LesSousTypesDeCalcul() ,paraGlob->Avec_soustypeDeCalcul(),(UtilLecture&) *entreePrinc); algori = tabAlgo(1); - -{ /* - algori = new AlgoriNonDyna - (paraGlob->Avec_typeDeCalcul(),paraGlob->LesSousTypesDeCalcul() - ,paraGlob->Avec_soustypeDeCalcul(),(UtilLecture&) *entreePrinc); - tabAlgo(1)=algori; - tabAlgo(2) = new ImpliNonDynaCont - (paraGlob->Avec_typeDeCalcul(),paraGlob->LesSousTypesDeCalcul() - ,paraGlob->Avec_soustypeDeCalcul(),(UtilLecture&) *entreePrinc); - tabAlgo(3) = new AlgoriFlambLineaire - (paraGlob->Avec_typeDeCalcul(),paraGlob->LesSousTypesDeCalcul() - ,paraGlob->Avec_soustypeDeCalcul(),(UtilLecture&) *entreePrinc); - tabAlgo(4) = new AlgoInformations - (paraGlob->Avec_typeDeCalcul(),paraGlob->LesSousTypesDeCalcul() - ,paraGlob->Avec_soustypeDeCalcul(),(UtilLecture&) *entreePrinc); - tabAlgo(5) = new AlgoUtils - (paraGlob->Avec_typeDeCalcul(),paraGlob->LesSousTypesDeCalcul() - ,paraGlob->Avec_soustypeDeCalcul(),(UtilLecture&) *entreePrinc); - tabAlgo(6) = new AlgoriDynaExpli - (paraGlob->Avec_typeDeCalcul(),paraGlob->LesSousTypesDeCalcul() - ,paraGlob->Avec_soustypeDeCalcul() ,(UtilLecture&) *entreePrinc); - tabAlgo(7) = new AlgoriTchamwa - (paraGlob->Avec_typeDeCalcul(),paraGlob->LesSousTypesDeCalcul() - ,paraGlob->Avec_soustypeDeCalcul() ,(UtilLecture&) *entreePrinc); - tabAlgo(8) = new Algori_chung_lee - (paraGlob->Avec_typeDeCalcul(),paraGlob->LesSousTypesDeCalcul() - ,paraGlob->Avec_soustypeDeCalcul() ,(UtilLecture&) *entreePrinc); - tabAlgo(9) = new AlgoriDynaExpli_zhai - (paraGlob->Avec_typeDeCalcul(),paraGlob->LesSousTypesDeCalcul() - ,paraGlob->Avec_soustypeDeCalcul() ,(UtilLecture&) *entreePrinc); - tabAlgo(10) = new AlgoriNewmark - (paraGlob->Avec_typeDeCalcul(),paraGlob->LesSousTypesDeCalcul() - ,paraGlob->Avec_soustypeDeCalcul() ,(UtilLecture&) *entreePrinc); - tabAlgo(11) = new AlgoUmatAbaqus - (paraGlob->Avec_typeDeCalcul(),paraGlob->LesSousTypesDeCalcul() - ,paraGlob->Avec_soustypeDeCalcul() ,(UtilLecture&) *entreePrinc); - tabAlgo(12) = new AlgoriRungeKutta - (paraGlob->Avec_typeDeCalcul(),paraGlob->LesSousTypesDeCalcul() - ,paraGlob->Avec_soustypeDeCalcul() ,(UtilLecture&) *entreePrinc); - tabAlgo(13) = new AlgoriCombine - (paraGlob->Avec_typeDeCalcul(),paraGlob->LesSousTypesDeCalcul() - ,paraGlob->Avec_soustypeDeCalcul() ,(UtilLecture&) *entreePrinc); - */ }; // def des classes generales lesRef = new LesReferences ; //def des reference @@ -733,6 +697,7 @@ void Projet::InitConstructionFichierCommande(string & retour) // indiquant qu'il y a par exemple // un calcul d'erreur, remonté au contrainte, relocation etc... paraGlob->Info_commande_TypeCalcul((UtilLecture&) *entreePrinc); + // définition d'un algorithme pour l'affichage des données particulières algori = Algori::New_Agori (paraGlob->TypeCalcul_maitre(),paraGlob->Avec_typeDeCalcul() @@ -783,6 +748,7 @@ void Projet::InitEntreeFichierInfo(string & retour) // un calcul d'erreur, remonté au contrainte, relocation etc... // lecture du type de calcul sans modification du flux d'entree paraGlob->LecTypeCalcul((UtilLecture&) *entreePrinc) ; + // def de l'algorithme algori = Algori::New_Agori (paraGlob->TypeCalcul_maitre(),paraGlob->Avec_typeDeCalcul() @@ -794,7 +760,7 @@ void Projet::InitEntreeFichierInfo(string & retour) // est stocké de manière externe sur un fichier // exemple : calcul d'erreur a partir // d'un champ d'information stocké de manière externe sur un fichier - // l'acquisition du (ou des) lieu(x) (flot) où sont stocké ces infos est effectuée + // l'acquisition du (ou des) lieu(x) (flot) où sont stockées ces infos est effectuée // ce lieu fait parti des paramètres de l'algorithme //// entreePrinc->NouvelleDonnee(); // preparation du flot sur un nouveau mot clé s'il n'est pas déjà sur un mot clé @@ -860,6 +826,7 @@ void Projet::InitEntreeFichierBaseInfo(string & retour) int dim = paraGlob->Dimension (); // récup de la dimension // def des valeurs des constantes en fonction de la dimension ConstantesTenseur(dim); + // def de l'algorithme algori = Algori::New_Agori (paraGlob->TypeCalcul_maitre(),paraGlob->Avec_typeDeCalcul() diff --git a/General/Projet.h b/General/Projet.h index 1d99c00..76ebe6a 100644 --- a/General/Projet.h +++ b/General/Projet.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -88,6 +88,10 @@ #include "LesContacts.h" #include "Enum_IO_XML.h" #include "VariablesExporter.h" +#ifdef UTILISATION_MPI + #include "Distribution_CPU.h" +#endif + //------------------------------------------------------------------ //! definition des operations de haut niveau : Lecture, Calcul, Sortie des Resultats. @@ -116,7 +120,13 @@ // lectures secondaires éventuelles: ramène true s'il y a effectivement // une lecture secondaire, qui donc modifie la lecture initiale bool Lecture_secondaire(); - + + // dans le cas MPI, transmission au sous_process des infos nécessaire à la + // lecture initiale + #ifdef UTILISATION_MPI + void Transmission_process_Lecture(int process); + #endif + // calculs void Calcul (); @@ -171,7 +181,6 @@ VariablesExporter* varExpor; // variables exportées globalement Tableau tabAlgo; // pour le schema XML - Temps_CPU_HZpp tempsMiseEnDonnees; // TempsCpu // METHODES PROTEGEES : diff --git a/General/Projet2.cc b/General/Projet2.cc index 51ccf83..fe3bcc7 100644 --- a/General/Projet2.cc +++ b/General/Projet2.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -70,6 +70,11 @@ lesMaillages->LectureLesMaillages(); // lecture des maillages et des references lesCourbes1D->Lecture(*entreePrinc); // lecture des courbes 1D lesFonctionsnD->Lecture(*entreePrinc); // lecture des courbes nD +// //------- debug +// cout << "\n debug Projet::Lecture "; +// lesMaillages->Noeud_LesMaille(1,120).Affiche(9); +// cout << endl; +// //-------- fin debug lesLoisDeComp->LecturelesLoisDeComp(*entreePrinc,*lesRef,*lesCourbes1D,*lesFonctionsnD); // lecture des lois diversStockage->Lecture1(*entreePrinc,*lesRef); // premiere lecture des stockages divers // lecture éventuelle des zones de contact et auto-contact si nécessaire @@ -308,6 +313,14 @@ bool Projet::Lecture_secondaire() return lecture_secondaire; }; +// dans le cas MPI, transmission au sous_process des infos nécessaire à la +// lecture initiale +#ifdef UTILISATION_MPI + void Projet::Transmission_process_Lecture(int process) + { + }; +#endif + // resolution du probleme void Projet::Calcul() { if (!(paraGlob->EtatDeLaLecturePointInfo())) // cas d'une première exécution @@ -346,7 +359,6 @@ bool Projet::Lecture_secondaire() cout << " Projet::Calcul () "; Sortie(1); }; - // vérification de la cohérence du critère d'arrêt de calcul algori->Coherence_Algo_typeConvergence(); } diff --git a/General/herezh.cc b/General/herezh.cc index 10e3e0c..a48e5ba 100644 --- a/General/herezh.cc +++ b/General/herezh.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -178,6 +178,7 @@ using namespace std; //introduces namespace std #include "ElemPoint.h" #include "ElemPoint_CP.h" #include "BielletteThermi.h" +#include //#ifdef ENLINUX_STREAM // #include "Profiler.h" @@ -188,6 +189,15 @@ using namespace std; //introduces namespace std #include #include #endif +#ifdef UTILISATION_MPI + #include "mpi.h" + #include + #include + #include + #include + namespace mpi = boost::mpi; +#endif + #include "Temps_CPU_HZpp.h" #include "Temps_CPU_HZpp_3.h" @@ -209,18 +219,69 @@ int main (int argc, const char * argv[]) { #endif #endif +#ifdef UTILISATION_MPI + #ifdef EN_DEBUG_MPI + // intro d'une boucle infinie pour mettre en place les process en debug + {volatile int i = 0; + char hostname[256]; + gethostname(hostname, sizeof(hostname)); + printf("PID %d on %s ready for attach\n", getpid(), hostname); + fflush(stdout); + while (0 == i) + sleep(5); + } + #endif + + // --- mise en route de la parallèlisation + mpi::environment env; + // def global d'un communicator + mpi::communicator world; + // on renseigne paraglob + ParaGlob::Init_boost_environnement(&env); + ParaGlob::Init_boost_communicator (& world); +#endif + + // gestion du temps cpu global Temps_CPU_HZpp_3 temps_CPU_Herezh_total; temps_CPU_Herezh_total.Mise_en_route_du_comptage(); // comptage cpu UtilLecture* pt_UtilLecture = NULL; // un pointeur qui doit-être renseigné par le projet // écriture de l'entête du programme -Presentation(); +#ifdef UTILISATION_MPI + if (world.rank() == 0) +#endif + Presentation(); // definition d'un projet string retour ; try - { // par la définition du projet, est définit également l'algo + { + #ifdef UTILISATION_MPI + // on dit à tous les process d'attendre sauf le master + world.barrier(); // synchronisation ici de tous les process + std::string message_mpi; + if (world.rank() == 0) + { cout << " ==> execution parallele (MPI) "<< world.size() << " proc "; + message_mpi = "process_en_attente"; +// broadcast(world, message_mpi, 0); // 0 cas c'est le rang 0 qui cause + }; + // envoi pour le maitre et réception pour les autres via broadcast + broadcast(world, message_mpi, 0); // 0 cas c'est le rang 0 qui cause + world.barrier(); // synchronisation ici de tous les process + if (world.rank() == 0) + { cout << "\n process 0: creation du projet "; + } + else + { cout << "\n " << message_mpi << " " << world.rank() ; + // attente jusqu'à ce que l'on récupère de 0 le tag 1 + // ce qui est effectué plus bas, juste après: projet.Lecture(); + world.probe(0, 1); + }; + #endif + + + // par la définition du projet, est définit également l'algo // on définit le projet en dehors du try qui suit, pour le projet demeure valide même s'il y a // une exception, ce qui permet quand même d'utiliser des fonction du projet, // par exemple l'acces aux fichier qui sont définit dans UtilLecture @@ -339,6 +400,38 @@ try // if (!ProfilerInit(collectDetailed, bestTimeBase,8000, 100)) // { // #endif + #ifdef UTILISATION_MPI +//int rank = world.rank(); +//cout << "\n *** je suis le process " << rank << endl; + if (world.rank() == 0) + // on va demander successivement à tous les process de lire le .info + // il s'agit d'un procédé séquentiel, + // NB: je pense que c'est plus rapide et plus sûr de passer par le .info + // pour construire et remplir dans chaque process la structure de stockage, que de le faire + // en passant les données via mpi entre le master et les sous_process + {int nb_process = world.size(); + // NB: le process 0 c'est le main + for (int i=1;i> (istream & entree, BlocScal_ou_fctnD & coo) diff --git a/Lecture/Bloc.h b/Lecture/Bloc.h index 5bc4f5e..405f109 100644 --- a/Lecture/Bloc.h +++ b/Lecture/Bloc.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Lecture/LectBlocMot.cc b/Lecture/LectBlocMot.cc index ed1369c..cd715e3 100644 --- a/Lecture/LectBlocMot.cc +++ b/Lecture/LectBlocMot.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Lecture/LectBlocMot.h b/Lecture/LectBlocMot.h index f620622..a1022d8 100644 --- a/Lecture/LectBlocMot.h +++ b/Lecture/LectBlocMot.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Lecture/LectBloc_T.h b/Lecture/LectBloc_T.h index 149d98a..0b6c79f 100644 --- a/Lecture/LectBloc_T.h +++ b/Lecture/LectBloc_T.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Lecture/UtilLecture.cc b/Lecture/UtilLecture.cc index d853d0f..b6858fd 100644 --- a/Lecture/UtilLecture.cc +++ b/Lecture/UtilLecture.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -104,7 +104,7 @@ istream & operator >> (istream & entree, UtilLecture::Position_BI& a) // argv : donne un tableau correspondant de mots clés // ---> lecture de la racine du nom du fichier princial UtilLecture::UtilLecture (int argc, const char * argv[]) : - longueur(1500) // longueur maxi du tableau de travail + longueur(2500) // longueur maxi du tableau de travail ,nomCourant(),nomRacine(),ptrfich(NULL),tablcar(NULL),tableau(NULL),lec_ent_info(-10) ,ent_BI(NULL),sort_BI(NULL),ent_PI(NULL),sort_PI(NULL),liste_posi_BI() ,dernier_increment_lu(0),ptrcommandefich(NULL),ptrschemaXMLfich(NULL) @@ -117,7 +117,11 @@ istream & operator >> (istream & entree, UtilLecture::Position_BI& a) ,ptnomCVisu(NULL),pteurnom(NULL),nomRacineCVisu() ,sort_initial_Gmsh(NULL),sort_resultat_Gmsh(),noms_base_fichiers_gmsh() ,tabMultiLignes(NULL) - + #ifdef UTILISATION_MPI + // cas d'un calcul //, num du cpu en cours dans les opérations + ,num_cpu_en_cours_BI(0) // d'i/o sur .BI et .PI + #endif + { bool fr = ParaGlob::Francais(); // pour simplifier // information concernant l'entrée des données if (fr){cout << "\n -- initialisation de l'entree des donnees ";} @@ -406,7 +410,7 @@ void UtilLecture::fermetureSchemaXML() void UtilLecture::NouvelleDonnee() { int indicboucle = 0; // indicateur pour sortir de la boucle globale - int indicfichier = 0 ; // indicateur pour la fermeture de fichier +// int indicfichier = 0 ; // indicateur pour la fermeture de fichier try { while (indicboucle == 0) @@ -458,7 +462,7 @@ void UtilLecture::fermetureSchemaXML() void UtilLecture::NouvelleDonneeSansInf() { int indicboucle = 0; // indicateur pour sortir de la boucle globale - int indicfichier = 0 ; // indicateur pour la fermeture de fichier +// int indicfichier = 0 ; // indicateur pour la fermeture de fichier try { while (indicboucle == 0) diff --git a/Lecture/UtilLecture.h b/Lecture/UtilLecture.h index 75f3add..eb200ed 100644 --- a/Lecture/UtilLecture.h +++ b/Lecture/UtilLecture.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -522,6 +522,10 @@ class UtilLecture fstream * sort_BI ; //fichier base_info de sauvegarde fstream * ent_PI ; //fichier de la liste des pointeurs d'incréments de base info fstream * sort_PI ; //fichier base_info de sauvegarde + #ifdef UTILISATION_MPI + // cas d'un calcul //, num du cpu en cours dans les opérations + int num_cpu_en_cours_BI; // d'i/o sur .BI et .PI + #endif // -------cas des temps de calcul ---------------- ofstream * sort__temps_cpu; // ------ pour la visualisation ----- diff --git a/Lecture/nouvelle_enreg.cc b/Lecture/nouvelle_enreg.cc index 78ed21c..dbc0ffa 100644 --- a/Lecture/nouvelle_enreg.cc +++ b/Lecture/nouvelle_enreg.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Lecture/utilLecture2.cc b/Lecture/utilLecture2.cc index c8d1c04..8fba042 100644 --- a/Lecture/utilLecture2.cc +++ b/Lecture/utilLecture2.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -51,27 +51,55 @@ void UtilLecture::Ouverture_base_info(string type_entree) { char nomm[132]; char*fileName = nomm; strcpy(fileName, pteurnom); + // on définit des noms explicites + std::string nom_BI(pteurnom); + std::string nom_PI(pteurnom); + #ifdef UTILISATION_MPI + // cas d'un calcul //, + // on prend en compte le numéro du CPU + int num_cpu = ParaGlob::Monde()->rank(); + nom_BI += ChangeEntierSTring(num_cpu); + nom_PI += ChangeEntierSTring(num_cpu); + #endif + nom_BI += ".BI"; + nom_PI += ".PI"; + if (type_entree == "lecture") // cas d'une lecture // on regarde si on a déjà une ouverture en écriture si oui on ferme { if (sort_BI != NULL) Fermeture_base_info(); - // maintenant on regarde si la lecture est déjà en cours si oui on ne fait rien - // sinon on ouvre + // maintenant on regarde si la lecture est déjà en cours + #ifdef UTILISATION_MPI + // cas d'un calcul //, et que l'on a une lecture en cours + // on regarde si on a changé de CPU + // si oui, on ferme tout + if (ent_BI != NULL) + {if (num_cpu_en_cours_BI != num_cpu) + {Fermeture_base_info(); + // on met à jour le numéro en cours + num_cpu_en_cours_BI = num_cpu; + }; + }; + #endif + + // si pas de fichier ouvert, on ouvre if (ent_BI == NULL) - { ent_BI = new fstream(strcat(fileName,".BI"), ios::out | ios::in); + { //ent_BI = new fstream(strcat(fileName,".BI"), ios::out | ios::in); + ent_BI = new fstream(nom_BI.c_str(), ios::out | ios::in); if(!(ent_BI->is_open())) // le fichier ne peut être ouvert, message d'erreur - { cout << "\n erreur en ouverture pour la lecture du fichier " << fileName << "\n" + { cout << "\n erreur en ouverture pour la lecture du fichier " << nom_BI << "\n" << " UtilLecture::Ouverture_base_info() " << endl; Sortie(1); }; // cas du fichier de pointeur, traitement presque analogue - strcpy(fileName, pteurnom); - ent_PI = new fstream(strcat(fileName,".PI"), ios::out | ios::in); +// strcpy(fileName, pteurnom); +// ent_PI = new fstream(strcat(fileName,".PI"), ios::out | ios::in); + ent_PI = new fstream(nom_PI.c_str(), ios::out | ios::in); if(!(ent_PI->is_open())) // le fichier ne peut être ouvert, message d'erreur - { cout << "\n erreur en ouverture pour la lecture du fichier " << fileName << "\n" + { cout << "\n erreur en ouverture pour la lecture du fichier " << nom_PI << "\n" << " le fichier de pointeur ne peut etre lu, on essaie de faire uniquement avec le .BI " << endl; ent_PI = NULL; @@ -98,8 +126,8 @@ void UtilLecture::Ouverture_base_info(string type_entree) }; }; positionPI = true; - } } + } // si les positions n'ont pas été validé, on essaie de les recréer if (!positionPI) // le fichier de pointeur n'est pas exploitable @@ -125,14 +153,16 @@ void UtilLecture::Ouverture_base_info(string type_entree) ent_BI->seekg(ios::beg); dernier_increment_lu = 0; // on sauvegarde les positions pour une prochaine utilisation - strcpy(fileName, pteurnom); - sort_PI = new fstream(strcat(fileName,".PI"), ios::out | ios::in); +// strcpy(fileName, pteurnom); +// sort_PI = new fstream(strcat(fileName,".PI"), ios::out | ios::in); + sort_PI = new fstream(nom_PI.c_str(), ios::out | ios::in); if(!(sort_PI->is_open())) // le fichier ne peut être ouvert, il n'existe pas donc on l'ouvre - { sort_PI = new fstream(fileName, ios::out | ios::ate); + { //sort_PI = new fstream(fileName, ios::out | ios::ate); + sort_PI = new fstream(nom_PI.c_str(), ios::out | ios::in); if(!(sort_PI->is_open())) // le fichier ne peut être ouvert, message d'erreur - { cout << "\n erreur en ouverture pour la lecture du fichier " << fileName << "\n" + { cout << "\n erreur en ouverture pour la lecture du fichier " << nom_PI << "\n" << " UtilLecture::Ouverture_base_info() " << endl; Sortie(1); }; @@ -147,36 +177,50 @@ void UtilLecture::Ouverture_base_info(string type_entree) }; } } + } else if (type_entree == "ecriture") // cas d'une ecriture // on regarde si on a déjà une ouverture en lecture si oui on ferme { if (ent_BI != NULL) Fermeture_base_info(); + + #ifdef UTILISATION_MPI + // cas d'un calcul //, et que l'on a une écriture en cours + // on regarde si on a changé de CPU + // si oui, on ferme tout + if (sort_BI != NULL) + {if (num_cpu_en_cours_BI != num_cpu) + {Fermeture_base_info(); + // on met à jour le numéro en cours + num_cpu_en_cours_BI = num_cpu; + }; + }; + #endif + // maintenant on regarde si la lecture est déjà en cours si oui on ne fait rien // sinon on ouvre et on se place à la fin if (sort_BI == NULL) - { sort_BI = new fstream(strcat(fileName,".BI"), ios::out | ios::in | ios::ate); + { sort_BI = new fstream(nom_BI.c_str(), ios::out | ios::in | ios::ate); if(!(sort_BI->is_open())) // le fichier ne peut être ouvert, il n'existe pas donc on l'ouvre - { sort_BI = new fstream(fileName, ios::out | ios::ate); + { sort_BI = new fstream(nom_BI.c_str(), ios::out | ios::ate); if(!(sort_BI->is_open())) // le fichier ne peut être ouvert, message d'erreur - { cout << "\n erreur en ouverture pour la lecture du fichier " << fileName << "\n" + { cout << "\n erreur en ouverture pour la lecture du fichier " << nom_BI << "\n" << " UtilLecture::Ouverture_base_info() " << endl; Sortie(1); } } // même traitement pour le fichier de pointeur d'incrément // qui est cependant systématiquement mis à 0, on écrit du début - strcpy(fileName, pteurnom); - sort_PI = new fstream(strcat(fileName,".PI"), ios::out | ios::in); + sort_PI = new fstream(nom_PI.c_str(), ios::out | ios::in); if(!(sort_PI->is_open())) // le fichier ne peut être ouvert, il n'existe pas donc on l'ouvre - { sort_PI = new fstream(fileName, ios::out | ios::ate); + { sort_PI = new fstream(nom_PI.c_str(), ios::out | ios::ate); if(!(sort_PI->is_open())) // le fichier ne peut être ouvert, message d'erreur - { cout << "\n erreur en ouverture pour la lecture du fichier " << fileName << "\n" + { cout << "\n erreur en ouverture pour la lecture du fichier " << nom_PI << "\n" << " UtilLecture::Ouverture_base_info() " << endl; Sortie(1); } @@ -245,6 +289,9 @@ ifstream * UtilLecture::Ent_BI() { // cas ou le fichier n'est pas ouvert on l'ouvre Ouverture_base_info("lecture"); } + + + return (ifstream*) ent_BI; }; // et pour l'écriture @@ -491,10 +538,21 @@ void UtilLecture::Ouverture_fichier_temps_cpu() char nomm[132]; char*fileName = nomm; strcpy(fileName, ptnomCVisu); - sort__temps_cpu = new ofstream(strcat(fileName,"_temps.cpu")); + + // on définit des noms explicites + std::string nom_CPU(ptnomCVisu); + #ifdef UTILISATION_MPI + // cas d'un calcul //, + // on prend en compte le numéro du CPU + int num_cpu = ParaGlob::Monde()->rank(); + nom_CPU += ChangeEntierSTring(num_cpu); + #endif + nom_CPU += "_temps.cpu"; + + sort__temps_cpu = new ofstream(nom_CPU.c_str()); if(!(sort__temps_cpu->is_open())) // le fichier ne peut être ouvert, message d'erreur - { cout << "\n erreur en ouverture pour l'ecriture du fichier " << fileName << "\n" + { cout << "\n erreur en ouverture pour l'ecriture du fichier " << nom_CPU << "\n" << " UtilLecture::Ouverture_fichier_temps_cpu() " << endl; Sortie(1); }; @@ -957,7 +1015,7 @@ void UtilLecture::Changement_NomCVisu(string nouveauNomCvisu) // car il n'y a pas de fichier inclus) void UtilLecture::NouvelleDonneeCVisu() { // on lit jusqu'à la fin de fichier(boucle infini) - int boucle=0; +// int boucle=0; try { Nouvel_enregCvisu (); // lecture d'un enreg ds le fichier courant diff --git a/Maillage/BlocDdlLim.h b/Maillage/BlocDdlLim.h index 4b93340..760616b 100644 --- a/Maillage/BlocDdlLim.h +++ b/Maillage/BlocDdlLim.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Maillage/Ddl.cc b/Maillage/Ddl.cc index 296470d..866fd89 100644 --- a/Maillage/Ddl.cc +++ b/Maillage/Ddl.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Maillage/Ddl.h b/Maillage/Ddl.h index 548b073..495c8c5 100644 --- a/Maillage/Ddl.h +++ b/Maillage/Ddl.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Maillage/DdlElement.cc b/Maillage/DdlElement.cc index 5c1fe98..ded2da8 100644 --- a/Maillage/DdlElement.cc +++ b/Maillage/DdlElement.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Maillage/DdlElement.h b/Maillage/DdlElement.h index c059f73..f596f7e 100644 --- a/Maillage/DdlElement.h +++ b/Maillage/DdlElement.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Maillage/DdlLim.cc b/Maillage/DdlLim.cc index bb3ef4b..649ca86 100644 --- a/Maillage/DdlLim.cc +++ b/Maillage/DdlLim.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Maillage/DdlLim.h b/Maillage/DdlLim.h index 37762ee..b2ab92e 100644 --- a/Maillage/DdlLim.h +++ b/Maillage/DdlLim.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -165,8 +165,8 @@ class DdlLim // 3 : tmin et tmax int Temps_depend_nD() const - {int retour = 0; if (nom_fnD_t_min != "") {if (nom_fnD_t_max != "") return 3;else return 1;} - else {if (nom_fnD_t_max != "") return 2;else return 0;}; + {if (nom_fnD_t_min != "") {if (nom_fnD_t_max != "") return 3;else return 1;} + else {if (nom_fnD_t_max != "") return 2;else return 0;}; }; // retour du nom de la fonction nD qui pilote tmin diff --git a/Maillage/DdlNoeudElement.cc b/Maillage/DdlNoeudElement.cc index f0eb872..02528f8 100644 --- a/Maillage/DdlNoeudElement.cc +++ b/Maillage/DdlNoeudElement.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Maillage/DdlNoeudElement.h b/Maillage/DdlNoeudElement.h index 6962112..4484e74 100644 --- a/Maillage/DdlNoeudElement.h +++ b/Maillage/DdlNoeudElement.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Maillage/Ddl_etendu.cc b/Maillage/Ddl_etendu.cc index 1af1975..83da7a6 100644 --- a/Maillage/Ddl_etendu.cc +++ b/Maillage/Ddl_etendu.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Maillage/Ddl_etendu.h b/Maillage/Ddl_etendu.h index ef0582a..3293960 100644 --- a/Maillage/Ddl_etendu.h +++ b/Maillage/Ddl_etendu.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Maillage/DiversStockage.cc b/Maillage/DiversStockage.cc index 7ea740c..18478e1 100644 --- a/Maillage/DiversStockage.cc +++ b/Maillage/DiversStockage.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Maillage/DiversStockage.h b/Maillage/DiversStockage.h index 5111f33..e6bad54 100644 --- a/Maillage/DiversStockage.h +++ b/Maillage/DiversStockage.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Maillage/I_O_Condilineaire.cc b/Maillage/I_O_Condilineaire.cc index f296b3b..ae62c0d 100644 --- a/Maillage/I_O_Condilineaire.cc +++ b/Maillage/I_O_Condilineaire.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Maillage/I_O_Condilineaire.h b/Maillage/I_O_Condilineaire.h index 9bb0a6e..adfcbc5 100644 --- a/Maillage/I_O_Condilineaire.h +++ b/Maillage/I_O_Condilineaire.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Maillage/LesCondLim.cc b/Maillage/LesCondLim.cc index 1674df4..f98774a 100644 --- a/Maillage/LesCondLim.cc +++ b/Maillage/LesCondLim.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // - // Copyright (C) 1997-2021 Université Bretagne Sud (France) + // Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -1865,6 +1865,11 @@ void LesCondLim::ImposeConLimtdt(LesMaillages * lesMail,LesReferences* lesRef, Mat_abstraite & matglob,Vecteur& vecglob ,const Nb_assemb& nb_casAssemb,int cas,Vecteur* vec2) { +#ifdef UTILISATION_MPI + // cas d'un calcul //, seule la (ou les) matrices du CPU 0 sont concernées + if (ParaGlob::Monde()->rank() != 0) + return ; +#endif tempsCL.Mise_en_route_du_comptage(); // temps cpu int tabBloqTaille =tabBloq.Taille(); int nb_casAss = nb_casAssemb.n; // recup du numéro du cas d'assemblage @@ -1935,10 +1940,16 @@ void LesCondLim::ImposeConLimtdt(LesMaillages * lesMail,LesReferences* lesRef, // a été fixé par l'utilisateur // vec2 : est un second vecteur éventuel (si != NULL) sur lequel on impose les mêmes CL que vecglob // mais sans sauvegarde (correspond par exemple à une partie de vecglob) -void LesCondLim::ImposeConLimtdt(LesMaillages * lesMail,LesReferences* lesRef, - Vecteur& vecglob,const Nb_assemb& nb_casAssemb - ,int cas,Vecteur* vec2) +void LesCondLim::ImposeConLimtdt(LesMaillages * lesMail,LesReferences* lesRef + ,Vecteur& vecglob,const Nb_assemb& nb_casAssemb + ,int cas,Vecteur* vec2) { +#ifdef UTILISATION_MPI + // cas d'un calcul //, seule la (ou les) matrices du CPU 0 sont concernées + if (ParaGlob::Monde()->rank() != 0) + return ; +#endif + tempsCL.Mise_en_route_du_comptage(); // temps cpu int tabBloqTaille =tabBloq.Taille(); int nb_casAss = nb_casAssemb.n; // recup du numéro du cas d'assemblage @@ -2008,6 +2019,12 @@ void LesCondLim::ImpConLimtdt2Mat(LesMaillages * lesMail,LesReferences* lesRef, Mat_abstraite & matglob,Mat_abstraite & matgeom ,const Nb_assemb& nb_casAssemb,int cas) { +#ifdef UTILISATION_MPI + // cas d'un calcul //, seule la (ou les) matrices du CPU 0 sont concernées + if (ParaGlob::Monde()->rank() != 0) + return ; +#endif + tempsCL.Mise_en_route_du_comptage(); // temps cpu int tabBloqTaille =tabBloq.Taille(); int nb_casAss = nb_casAssemb.n; // recup du numéro du cas d'assemblage @@ -2075,6 +2092,11 @@ void LesCondLim::ImpConLimtdt2Mat(LesMaillages * lesMail,LesReferences* lesRef, void LesCondLim::ReacAvantCHrepere(Vecteur& residu,LesMaillages * lesMail, LesReferences* lesRef,const Nb_assemb& nb_casAssemb,int cas) { +#ifdef UTILISATION_MPI + // cas d'un calcul //, pour l'instant seule la (ou les) matrices du CPU 0 sont concernées + if (ParaGlob::Monde()->rank() != 0) + return ; +#endif int nb_casAss = nb_casAssemb.n; // recup du numéro du cas d'assemblage Tableau tmc; // tableau de travail // on cree une liste de stockage intermediaire @@ -2388,6 +2410,11 @@ void LesCondLim::ReacAvantCHrepere(Vecteur& residu,LesMaillages * lesMail, void LesCondLim::CalculReaction(LesMaillages * lesMail,LesReferences* lesRef ,const Nb_assemb& nb_casAssemb,int cas) { +#ifdef UTILISATION_MPI + // cas d'un calcul //, pour l'instant seule la (ou les) matrices du CPU 0 sont concernées + if (ParaGlob::Monde()->rank() != 0) + return ; +#endif int nb_casAss = nb_casAssemb.n; // recup du numéro du cas d'assemblage Tableau tmc; // tableau de travail // on cree une liste de stockage intermediaire @@ -2545,6 +2572,12 @@ void LesCondLim::CalculReaction(LesMaillages * lesMail,LesReferences* lesRef void LesCondLim::ReacApresCHrepere(Vecteur& residu,LesMaillages * lesMail, LesReferences* ,const Nb_assemb& nb_casAssemb,int ) { +#ifdef UTILISATION_MPI + // cas d'un calcul //, pour l'instant seule la (ou les) matrices du CPU 0 sont concernées + if (ParaGlob::Monde()->rank() != 0) + return ; +#endif + int nb_casAss = nb_casAssemb.n; // recup du numéro du cas d'assemblage Tableau tmc; // tableau de travail // on cree une liste de stockage intermediaire @@ -2607,7 +2640,14 @@ void LesCondLim::ReacApresCHrepere(Vecteur& residu,LesMaillages * lesMail, // affichage sur la sortie sort des reactions void LesCondLim::Affiche_reaction(ofstream& sort,const LesMaillages * lesMail) const - { // l'entete + { + #ifdef UTILISATION_MPI + // cas d'un calcul //, seule le CPU 0 est concerné + if (ParaGlob::Monde()->rank() != 0) + return ; + #endif + + // l'entete sort << "\n=========================================================================="; sort << "\n sortie des efforts generes par l\'exterieur sur les noeuds "; sort << "\n==========================================================================\n"; @@ -2817,6 +2857,12 @@ void LesCondLim::Affiche_reaction(ofstream& sort,const LesMaillages * lesMail) c bool LesCondLim::CoLinCHrepere_ext(Mat_abstraite & matglob,Vecteur& vecglob ,const Tableau & tab,const Nb_assemb& nb_casAssemb,Vecteur* vec2) { + #ifdef UTILISATION_MPI + // cas d'un calcul //, seule la (ou les) matrices du CPU 0 sont concernées + if (ParaGlob::Monde()->rank() != 0) + return false ; + #endif + tempsCLL.Mise_en_route_du_comptage(); // temps cpu // on boucle sur le tableau et pour chaque element on impose une condition lineaire @@ -2852,6 +2898,12 @@ bool LesCondLim::CoLinUneOpe_ext(Mat_abstraite & matglob,Vecteur& vecglob ,const Tableau & tab ,const Nb_assemb& nb_casAssemb,Vecteur* vec2) { + #ifdef UTILISATION_MPI + // cas d'un calcul //, seule la (ou les) matrices du CPU 0 sont concernées + if (ParaGlob::Monde()->rank() != 0) + return false; + #endif + tempsCLL.Mise_en_route_du_comptage(); // temps cpu // on boucle sur le tableau et pour chaque element on impose une condition lineaire diff --git a/Maillage/LesCondLim.h b/Maillage/LesCondLim.h index c02b480..1088c17 100644 --- a/Maillage/LesCondLim.h +++ b/Maillage/LesCondLim.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Maillage/LesCondLim2.cc b/Maillage/LesCondLim2.cc index b32132b..80b3f49 100644 --- a/Maillage/LesCondLim2.cc +++ b/Maillage/LesCondLim2.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -798,7 +798,14 @@ void LesCondLim::CalculTorseurReaction(TorseurReac& tr, const Noeud& noe, ReactS // mais sans sauvegarde (correspond par exemple à une partie de vecglob) bool LesCondLim::CoLinCHrepere_int(Mat_abstraite & matglob,Vecteur& vecglob ,const Nb_assemb& nb_casAssemb,Vecteur* vec2) - { // on boucle sur le tableau de conditions limites linéaires enregistré + { + #ifdef UTILISATION_MPI + // cas d'un calcul //, pour l'instant seule la (ou les) matrices du CPU 0 sont concernées + if (ParaGlob::Monde()->rank() != 0) + return true; + #endif + + // on boucle sur le tableau de conditions limites linéaires enregistré // et pour chaque element on impose une condition lineaire bool modification = false; // init du retour int tabTaille = tab_CLinApplique.Taille(); diff --git a/Maillage/LesMaillages.cc b/Maillage/LesMaillages.cc index 672f152..6c1fc90 100644 --- a/Maillage/LesMaillages.cc +++ b/Maillage/LesMaillages.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -1453,111 +1453,111 @@ void LesMaillages::Completer(DiversStockage* divers,LesLoisDeComp* lesLois // }; }; - // cas des statistiques sur des ref de noeuds avec cumul en temps - int divers_TabStatistique_et_temps_Taille=divers->TabStatistique_et_temps().Taille(); - // on redimentionne les tableaux de sauvegardes - statistique_t_typeQuel.Change_taille(divers_TabStatistique_et_temps_Taille); - statistique_t_typeQuel_t.Change_taille(divers_TabStatistique_et_temps_Taille); - ref_statistique_t.Change_taille(divers_TabStatistique_et_temps_Taille); - pour_statistique_t_de_ddl.Change_taille(divers_TabStatistique_et_temps_Taille,NU_DDL); - for (int ii=1;ii<= divers_TabStatistique_et_temps_Taille;ii++) - { string nomStatistique = (divers->TabStatistique_et_temps())(ii).NomRef(); // recup du nom de la ref - const BlocDdlLim& div_Statistique = (divers->TabStatistique_et_temps())(ii); - const Reference & refG = lesRef->Trouve(nomStatistique,div_Statistique.NomMaillage()); // recup de la reference - // vérif que la référence s'adresse à des noeuds - if ( refG.Indic() != 1) - { // erreur la référence ne concerne pas des noeuds - cout << "\n erreur la reference " << refG.Nom() << " ne concerne pas des noeuds "; - cout << " \n cas des donnees relatives aux statistiques de ref de noeuds avec cumul en temps "; - cout << "\n LesMaillages::Completer( .... "; - Sortie(1); - }; - const ReferenceNE & ref = (ReferenceNE &) refG; - int ref_Taille=ref.Taille(); - // creation d'un bloc general contenant des informations - // n= nombre de string, m nombre de double - BlocGen bloc(4,1) ; // par defaut - string nom_inter("statistique_et_temps_"); - bloc.Change_nom(1,nom_inter); // le type de statistique - bloc.Change_nom(2,div_Statistique.Nom(2)); - bloc.Change_nom(3,div_Statistique.Nom(3)); - // construction d'un nom qui servira à discriminer les différents conteneurs - string nom_ref("statistique_temps_");// init - if ((div_Statistique.NomMaillage() == NULL) // cas d'un seule maillage - && (nbMaillageTotal==1)) // enregistré - {nom_ref +=(refG.Nom());} - else if (div_Statistique.NomMaillage() != NULL) // cas de plusieurs maillages - {nom_ref += (*div_Statistique.NomMaillage())+"_"+(refG.Nom());} - else // sinon pb - { cout << "\n erreur il manque le nom de maillage alors qu'il y a plusieurs maillages en cours "; - cout << " \n cas des données relatives aux statistiques sur des ref de noeuds avec cumul en temps "; - cout << "\n LesMaillages::Completer( .... "; - Sortie(1); - }; - bloc.Change_val(1,ii); // on indique le numéro du stockage global - // on commence par définir le conteneur global qui sera stocké dans LesMaillages - ref_statistique_t(ii) = &refG; - if (bloc.Nom(2) == "un_ddl_etendu_") - { // il s'agit d'une statistique d'un ddl étendu de nom: bloc.Nom(3) - nom_ref += "_ddl_etendu_"+bloc.Nom(3); - // on sauvegarde le Ddl_enum_etendu associé - pour_statistique_t_de_ddl(ii) = Ddl_enum_etendu(bloc.Nom(3)); - // on définit le conteneur résultat: on stocke un vecteur, car pour un ddl -> 10 valeurs - Grandeur_Vecteur_Nommer gvec_courant(nom_ref,10); - // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas - // et on récupère un exemplaire - TypeQuelconque_enum_etendu enuType = - TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu - (STATISTIQUE_ET_TEMPS,nom_ref,VECTEUR); - TypeQuelconque typQ(enuType,X1,gvec_courant); - statistique_t_typeQuel(ii) = (typQ); // stockage interne à LesMaillages - // et on ajoute une grandeur globale qui sera indexée par le nom de référence - ParaGlob::param->Ajout_grandeur_consultable(&typQ,nom_ref); - // idem pour la grandeur à t - string nom_ref_t = nom_ref + "__t_"; - // on définit le conteneur résultat: on stocke un vecteur, car pour un ddl -> 10 valeurs - Grandeur_Vecteur_Nommer gvec_courant_t(nom_ref_t,10); - // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas - // et on récupère un exemplaire - TypeQuelconque_enum_etendu enuType_t = - TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu - (STATISTIQUE_ET_TEMPS,nom_ref_t,VECTEUR); - TypeQuelconque typQ_t(enuType_t,X1,gvec_courant_t); - statistique_t_typeQuel_t(ii) = (typQ_t); // stockage interne à LesMaillages - // et on ajoute une grandeur globale qui sera indexée par le nom de référence - ParaGlob::param->Ajout_grandeur_consultable(&typQ_t,nom_ref_t); - } - else if (bloc.Nom(2) == "une_fonction_nD_") - { // il s'agit d'une statistique d'une fonction nD de nom: bloc.Nom(3) - nom_ref += "_fct_nD_"+bloc.Nom(3); - // on récupère le pointeur de fonction correspondant: - Fonction_nD * fct = lesFonctionsnD->Trouve(bloc.Nom(3)); - int nb_composante = fct->NbComposante(); - int dim_necessaire = (6*nb_composante + 4); // cf. la méthode CalStatistique() - Grandeur_Vecteur_Nommer grand_courant(nom_ref,dim_necessaire,fct); - // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas - // et on récupère un exemplaire - TypeQuelconque_enum_etendu enuType = - TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu - (STATISTIQUE_ET_TEMPS,nom_ref,VECTEUR); - TypeQuelconque typQ(enuType,X1,grand_courant); - statistique_t_typeQuel(ii) = (typQ); - // et on ajoute une grandeur globale qui sera indexée par le nom de référence - ParaGlob::param->Ajout_grandeur_consultable(&typQ,nom_ref); - // idem pour la grandeur à t - string nom_ref_t = nom_ref + "__t_"; - Grandeur_Vecteur_Nommer grand_courant_t(nom_ref_t,dim_necessaire,fct); - // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas - // et on récupère un exemplaire - TypeQuelconque_enum_etendu enuType_t = - TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu - (STATISTIQUE_ET_TEMPS,nom_ref_t,VECTEUR); - TypeQuelconque typQ_t(enuType_t,X1,grand_courant_t); - statistique_t_typeQuel_t(ii) = (typQ_t); // stockage interne à LesMaillages - // et on ajoute une grandeur globale qui sera indexée par le nom de référence - ParaGlob::param->Ajout_grandeur_consultable(&typQ_t,nom_ref_t); - }; - bloc.Change_nom(4,nom_ref); // on indique le nom de référencement global + // cas des statistiques sur des ref de noeuds avec cumul en temps + int divers_TabStatistique_et_temps_Taille=divers->TabStatistique_et_temps().Taille(); + // on redimentionne les tableaux de sauvegardes + statistique_t_typeQuel.Change_taille(divers_TabStatistique_et_temps_Taille); + statistique_t_typeQuel_t.Change_taille(divers_TabStatistique_et_temps_Taille); + ref_statistique_t.Change_taille(divers_TabStatistique_et_temps_Taille); + pour_statistique_t_de_ddl.Change_taille(divers_TabStatistique_et_temps_Taille,NU_DDL); + for (int ii=1;ii<= divers_TabStatistique_et_temps_Taille;ii++) + { string nomStatistique = (divers->TabStatistique_et_temps())(ii).NomRef(); // recup du nom de la ref + const BlocDdlLim& div_Statistique = (divers->TabStatistique_et_temps())(ii); + const Reference & refG = lesRef->Trouve(nomStatistique,div_Statistique.NomMaillage()); // recup de la reference + // vérif que la référence s'adresse à des noeuds + if ( refG.Indic() != 1) + { // erreur la référence ne concerne pas des noeuds + cout << "\n erreur la reference " << refG.Nom() << " ne concerne pas des noeuds "; + cout << " \n cas des donnees relatives aux statistiques de ref de noeuds avec cumul en temps "; + cout << "\n LesMaillages::Completer( .... "; + Sortie(1); + }; + const ReferenceNE & ref = (ReferenceNE &) refG; + int ref_Taille=ref.Taille(); + // creation d'un bloc general contenant des informations + // n= nombre de string, m nombre de double + BlocGen bloc(4,1) ; // par defaut + string nom_inter("statistique_et_temps_"); + bloc.Change_nom(1,nom_inter); // le type de statistique + bloc.Change_nom(2,div_Statistique.Nom(2)); + bloc.Change_nom(3,div_Statistique.Nom(3)); + // construction d'un nom qui servira à discriminer les différents conteneurs + string nom_ref("statistique_temps_");// init + if ((div_Statistique.NomMaillage() == NULL) // cas d'un seule maillage + && (nbMaillageTotal==1)) // enregistré + {nom_ref +=(refG.Nom());} + else if (div_Statistique.NomMaillage() != NULL) // cas de plusieurs maillages + {nom_ref += (*div_Statistique.NomMaillage())+"_"+(refG.Nom());} + else // sinon pb + { cout << "\n erreur il manque le nom de maillage alors qu'il y a plusieurs maillages en cours "; + cout << " \n cas des données relatives aux statistiques sur des ref de noeuds avec cumul en temps "; + cout << "\n LesMaillages::Completer( .... "; + Sortie(1); + }; + bloc.Change_val(1,ii); // on indique le numéro du stockage global + // on commence par définir le conteneur global qui sera stocké dans LesMaillages + ref_statistique_t(ii) = &refG; + if (bloc.Nom(2) == "un_ddl_etendu_") + { // il s'agit d'une statistique d'un ddl étendu de nom: bloc.Nom(3) + nom_ref += "_ddl_etendu_"+bloc.Nom(3); + // on sauvegarde le Ddl_enum_etendu associé + pour_statistique_t_de_ddl(ii) = Ddl_enum_etendu(bloc.Nom(3)); + // on définit le conteneur résultat: on stocke un vecteur, car pour un ddl -> 10 valeurs + Grandeur_Vecteur_Nommer gvec_courant(nom_ref,10); + // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas + // et on récupère un exemplaire + TypeQuelconque_enum_etendu enuType = + TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu + (STATISTIQUE_ET_TEMPS,nom_ref,VECTEUR); + TypeQuelconque typQ(enuType,X1,gvec_courant); + statistique_t_typeQuel(ii) = (typQ); // stockage interne à LesMaillages + // et on ajoute une grandeur globale qui sera indexée par le nom de référence + ParaGlob::param->Ajout_grandeur_consultable(&typQ,nom_ref); + // idem pour la grandeur à t + string nom_ref_t = nom_ref + "__t_"; + // on définit le conteneur résultat: on stocke un vecteur, car pour un ddl -> 10 valeurs + Grandeur_Vecteur_Nommer gvec_courant_t(nom_ref_t,10); + // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas + // et on récupère un exemplaire + TypeQuelconque_enum_etendu enuType_t = + TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu + (STATISTIQUE_ET_TEMPS,nom_ref_t,VECTEUR); + TypeQuelconque typQ_t(enuType_t,X1,gvec_courant_t); + statistique_t_typeQuel_t(ii) = (typQ_t); // stockage interne à LesMaillages + // et on ajoute une grandeur globale qui sera indexée par le nom de référence + ParaGlob::param->Ajout_grandeur_consultable(&typQ_t,nom_ref_t); + } + else if (bloc.Nom(2) == "une_fonction_nD_") + { // il s'agit d'une statistique d'une fonction nD de nom: bloc.Nom(3) + nom_ref += "_fct_nD_"+bloc.Nom(3); + // on récupère le pointeur de fonction correspondant: + Fonction_nD * fct = lesFonctionsnD->Trouve(bloc.Nom(3)); + int nb_composante = fct->NbComposante(); + int dim_necessaire = (6*nb_composante + 4); // cf. la méthode CalStatistique() + Grandeur_Vecteur_Nommer grand_courant(nom_ref,dim_necessaire,fct); + // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas + // et on récupère un exemplaire + TypeQuelconque_enum_etendu enuType = + TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu + (STATISTIQUE_ET_TEMPS,nom_ref,VECTEUR); + TypeQuelconque typQ(enuType,X1,grand_courant); + statistique_t_typeQuel(ii) = (typQ); + // et on ajoute une grandeur globale qui sera indexée par le nom de référence + ParaGlob::param->Ajout_grandeur_consultable(&typQ,nom_ref); + // idem pour la grandeur à t + string nom_ref_t = nom_ref + "__t_"; + Grandeur_Vecteur_Nommer grand_courant_t(nom_ref_t,dim_necessaire,fct); + // on ajoute éventuellement un TypeQuelconque_enum_etendu s'il n'existe pas + // et on récupère un exemplaire + TypeQuelconque_enum_etendu enuType_t = + TypeQuelconque_enum_etendu::Ajout_un_TypeQuelconque_enum_etendu + (STATISTIQUE_ET_TEMPS,nom_ref_t,VECTEUR); + TypeQuelconque typQ_t(enuType_t,X1,grand_courant_t); + statistique_t_typeQuel_t(ii) = (typQ_t); // stockage interne à LesMaillages + // et on ajoute une grandeur globale qui sera indexée par le nom de référence + ParaGlob::param->Ajout_grandeur_consultable(&typQ_t,nom_ref_t); + }; + bloc.Change_nom(4,nom_ref); // on indique le nom de référencement global // // puis on alimente les éléments concernés par ces calculs // ////--- debug // //cout << "\n -- debug LesMaillages::Completer( "; @@ -1580,7 +1580,7 @@ void LesMaillages::Completer(DiversStockage* divers,LesLoisDeComp* lesLois // Sortie(1); // }; // }; - }; + }; @@ -2655,6 +2655,8 @@ void LesMaillages::MiseAJourPointeurAssemblage(const Nb_assemb& casAssemb) } } // construction du tableau t_i_n pour le cas d'assemblage + // NB: t_i_n (i)(j) -> donne les infos pour retrouver le ddl numéro j du cas de charge i + // le numéro j correspond au pointeur d'assemblage c-a-d la position du ddl dans l'assemblage Tableau & t_in = t_i_n(nb_assemb); // pour simplifier int taille_tab = (int) list_in.size(); // la taille finale t_in.Change_taille(taille_tab); int i; @@ -2668,8 +2670,16 @@ void LesMaillages::MiseAJourPointeurAssemblage(const Nb_assemb& casAssemb) // casAssemb : donne le cas d'assemblage qui est a considérer // ici, l'assemblage suit l'ordre du tableau de noeud passé en paramètre // le tableau de noeuds rassemble tous les noeuds des maillages mais avec une numérotation propre +// NB: t_i_n (i)(j) -> donne les infos pour retrouver le ddl numéro j du cas de charge i +// le numéro j correspond au pointeur d'assemblage c-a-d la position du ddl dans l'assemblage +// verif_maillage: si true: on vérifie que les numéros de noeuds sont possibles pour le maillage +// mais cette vérification n'est pas effectuée si verif_maillage est false: c'est utile +// dans une phase transitoire de fabrication de t_i_n: bien noter que dans ce cas le tableau +// t_i_n n'est pas utilisable + void LesMaillages::MiseAJourPointeurAssemblage_interne - (const Nb_assemb& casAssemb,Tableau & tab_N_final) + (const Nb_assemb& casAssemb,Tableau & tab_N_final + ,bool verif_maillage) { // pour la construction du tableau t_i_n pour le cas d'assemblage // on utilise une liste intermédiaire car on ne connait pas le nombre d'élément final list list_in ; @@ -2679,6 +2689,7 @@ void LesMaillages::MiseAJourPointeurAssemblage_interne bool absolue = true; // par défaut on travaille en absolu, mais en fait // cela n'a pas d'importance ici, car on n'utilise que le type int nb_noeud = tab_N_final.Taille(); + for (int i = 1; i<= nb_noeud; i++) { // recup du noeud Noeud * noo = tab_N_final(i); @@ -2709,13 +2720,41 @@ void LesMaillages::MiseAJourPointeurAssemblage_interne t_in.Change_taille(taille_tab); int i; list::iterator ile; for (i=1,ile=list_in.begin();i<=taille_tab;i++,ile++) - t_in(i) = (*ile); + { t_in(i) = (*ile); +// debug +// // on vérifie que le maillage correspondant contient bien le noeud pointé +// if (t_in(i).Nb_noeud() > tabMaillage(t_in(i).Nb_maillage())->Nombre_noeud()) +// cout << "\n debug LesMaillages::MiseAJourPointeurAssemblage_interne " +// << " (t_in(i).Nb_noeud() > tabMaillage(t_in(i).Nb_maillage())->Nombre_noeud()) " +// << " t_in(i).Nb_noeud()= "<< t_in(i).Nb_noeud() +// << " tabMaillage(t_in(i).Nb_maillage())->Nombre_noeud()= "<< tabMaillage(t_in(i).Nb_maillage())->Nombre_noeud(); +// fin debug + }; + + // vérification éventuelle du tableau t_i_n + if (verif_maillage) + {for (int j=1;j<=taille_tab;j++) + if (t_in(j).Nb_noeud() > tabMaillage(t_in(j).Nb_maillage())->Nombre_noeud()) + { cout << "\n erreur !! LesMaillages::MiseAJourPointeurAssemblage_interne " + << " le tableau t_i_n est incorrecte -> il y aura des problemes d'assemblage "; + #ifdef MISE_AU_POINT + cout << "\n cas d'assemblage nb= " << nb_assemb << ", ddl nb_global= " << j + << " \n (t_in(j).Nb_noeud() > tabMaillage(t_in(j).Nb_maillage())->Nombre_noeud()) " + << " \n t_in(j).Nb_noeud()= "<< t_in(j).Nb_noeud() + << " tabMaillage(t_in(j).Nb_maillage())->Nombre_noeud()= "<< tabMaillage(t_in(j).Nb_maillage())->Nombre_noeud(); + Sortie(1); + #endif + }; + }; + }; // remise à jour des tableaux de pointeurs t_i_n uniquement, due à un changement de numéro de noeud // en fonction d'un changement de num de noeud (mais pas de changement de pointeur d'assemblage // pour chaque noeud, tab_N_final(i) correspond au noeud qui avait le numéro i ancien // et qui a maintenant le numéro tab_N_final(i)->Num_noeud() +// NB: t_i_n (i)(j) -> donne les infos pour retrouver le ddl numéro j du cas de charge i +// le numéro j correspond au pointeur d'assemblage c-a-d la position du ddl dans l'assemblage void LesMaillages::MiseAJourTableau_t_i_n(const Nb_assemb& nb_casAssemb,Tableau & tab_N_final) { int nb_assemb = nb_casAssemb.n; // le tableau t_i_n pour le cas d'assemblage @@ -2735,6 +2774,20 @@ void LesMaillages::MiseAJourTableau_t_i_n(const Nb_assemb& nb_casAssemb,Tableau //if (i==taille_tab) // cout << "\n debug LesMaillages::MiseAJourTableau_t_i_n "<< co << endl; ////-- fin debug + + // on vérifie que le maillage correspondant contient bien le noeud pointé + if (nouveau_num_noeud > tabMaillage(t_in(i).Nb_maillage())->Nombre_noeud()) + { cout << "\n erreur** LesMaillages::MiseAJourTableau_t_i_n " + << " le tableau t_i_n est incorrecte -> il y aura des problemes d'assemblage "; + #ifdef MISE_AU_POINT + cout << "\n cas d'assemblage nb= " << nb_assemb << ", ddl nb_global= " << i + << " \n (t_in(i).Nb_noeud() > tabMaillage(t_in(i).Nb_maillage())->Nombre_noeud()) " + << " \n t_in(i).Nb_noeud()= "<< t_in(i).Nb_noeud() + << " tabMaillage(t_in(i).Nb_maillage())->Nombre_noeud()= "<< tabMaillage(t_in(i).Nb_maillage())->Nombre_noeud(); + Sortie(1); + #endif + }; + }; }; @@ -3390,6 +3443,58 @@ const Tableau LesMaillages::Esclave() return tab; }; +// création forcée en 3D de toutes les frontières lignes (non traités par CreeElemFront()) +// qui appartiennent à la frontière globales, ceci uniquement pour les éléments volumiques +// - Ces frontières ne sont pas intégrées dans la liste de frontière minimale +// - une même ligne peut appartenir à plusieurs éléments finis, elle n'est donc pas ici +// définit de manière unique (contrairement aux frontières minimales) +// NB: cela n'a lieu qu'une seule fois +// si les frontières existent déjà, --> aucune action, --> ramène 0 +// sinon il y a réellement création, et --> ramène 1 +int LesMaillages::CreeListFrontiere_ligne_3D() + { int retour = 0; + + if (listFrontiere_ligne_3D.Taille() == 0) + { for (int nbmail=1;nbmail<=nbMaillageTotal;nbmail++) + tabMaillage(nbmail)->CreeListFrontiere_ligne_3D(); + listFrontiere_ligne_3D.Change_taille(nbMaillageTotal); + for (int nbmail=1;nbmail<=nbMaillageTotal;nbmail++) + {listFrontiere_ligne_3D(nbmail) = tabMaillage(nbmail)->ListFront_ligne_3D(); + }; + retour = 1; + } + else + {retour = 0;}; + //// pour le débug + //for (int nbmail=1;nbmail<=nbMaillageTotal;nbmail++) + // {int nbfront = listFrontiere(nbmail)->size(); + // cout << "\n maillage " << nbmail << " -------- "; + // LaLIST ::iterator iff,iffin = listFrontiere(nbmail)->end(); + // iff=listFrontiere(nbmail)->begin(); + //// for (iff=listFrontiere(nbmail)->begin();iff !=iffin;iff++) + // Front& titi = (*iff); + // titi.Affiche(); cout << "\n"; + // + // }; + // + // Sortie(1); + //// fin débug + + //// pour le débug + //for (int nbmail=1;nbmail<=nbMaillageTotal;nbmail++) + // {int nbfront = listFrontiere(nbmail)->size(); + // cout << "\n maillage " << nbmail << " -------- "; + // LaLIST ::iterator iff,iffin = listFrontiere(nbmail)->end(); + // for (iff=listFrontiere(nbmail)->begin();iff !=iffin;iff++) + // {(*iff).Affiche(); cout << "\n";}; + // }; + // Sortie(1); + //// fin débug + + // retour + return retour; + }; + // inactive tous les ddl et les données void LesMaillages::Inactive_ddl_et_donnees() { for (int i1 = 1; i1<= nbMaillageTotal; i1++) @@ -3508,6 +3613,37 @@ void LesMaillages::Active_ddl_Erreur() } }; + +// active un ddl particulier +void LesMaillages::Active_un_ddl_particulier(Enum_ddl en) +{ for (int i1 = 1; i1<= nbMaillageTotal; i1++) + { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); + for (int i2 = 1; i2 <= nbnoeudmax; i2++) + { // recup du noeud + Noeud * noo = & Noeud_LesMaille(i1,i2); + // on regarde si le ddl existe + if (noo->Existe_ici(en)) + // si oui on l'active + noo->Met_en_service(en); + }; + }; +}; + +// inactive un ddl particulier +void LesMaillages::Inactive_un_ddl_particulier(Enum_ddl en) +{ for (int i1 = 1; i1<= nbMaillageTotal; i1++) + { int nbnoeudmax = tabMaillage(i1)->Nombre_noeud(); + for (int i2 = 1; i2 <= nbnoeudmax; i2++) + { // recup du noeud + Noeud * noo = & Noeud_LesMaille(i1,i2); + // on regarde si le ddl existe + if (noo->Existe_ici(en)) + // si oui on l'active + noo->Met_hors_service(en); + }; + }; +}; + // d'une manière plus générique une fonction pour activer une série de ddl // donnée par un identificateur, si c'est une grandeur vectoriel c'est l'ensemble // des ddl du vecteur qui sont inactivé. diff --git a/Maillage/LesMaillages.h b/Maillage/LesMaillages.h index 4b7c9fd..25673e1 100644 --- a/Maillage/LesMaillages.h +++ b/Maillage/LesMaillages.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -631,10 +631,24 @@ class LesMaillages // creation des elements frontiere: cela n'a lieu qu'une seule fois // si les frontières existent déjà, --> aucune action, --> ramène 0 // sinon il y a réellement création, et --> ramène 1 + // NB: il s'agit ici des frontière minimales permettant de représenter toute la frontière + // Ainsi: + // en 1D on retrouve: + // - des points uniquement + // en 2D on retrouve : + // - des segments dans le cas d'une surface (les noeuds sont exclus car intégrés aux lignes) + // - points et segment pour les lignes + // en 2D axi, on retrouve : + // - des segments dans le cas d'une surface (les noeuds sont exclus car intégrés aux lignes) + // - points et segment pour les lignes + // en 3D, on retrouve + // - des faces pour les éléments volumique (noeuds et lignes sont exclus) + // - une face et des lignes pour les éléments 2D (pas de noeuds) + int CreeElemFront(); // ramene le nombre de maillage esclave inline int NbEsclave() { return domEsclave;}; - // ramene le tableau des list des elements frontiere + // ramene le tableau des list des elements frontiere minimales (cf. explication dans CreeElemFront()) inline Tableau *>& ListFrontiere() { return listFrontiere;}; // ramene un tableau des noeuds des frontières des maillages esclaves Tableau < Tableau *> Tab_noeud_frontiere_esclave(); @@ -645,6 +659,19 @@ class LesMaillages // s'ils existent, sinon le tableau est vide // le tableau n'est pas sauvegarde const Tableau Esclave(); + + // création forcée en 3D de toutes les frontières lignes (non traités par CreeElemFront()) + // qui appartiennent à la frontière globales, ceci uniquement pour les éléments volumiques + // - Ces frontières ne sont pas intégrées dans la liste de frontière minimale + // - une même ligne peut appartenir à plusieurs éléments finis, elle n'est donc pas ici + // définit de manière unique (contrairement aux frontières minimales) + // NB: cela n'a lieu qu'une seule fois + // si les frontières existent déjà, --> aucune action, --> ramène 0 + // sinon il y a réellement création, et --> ramène 1 + int CreeListFrontiere_ligne_3D(); + // ramène le tableau de pointeurs de frontières ligne 3D créées par CreeListFrontiere_ligne_3D + inline Tableau *>& ListFront_ligne_3D() { return listFrontiere_ligne_3D;}; + // mise à jour des boites d'encombrements des éléments, qui contiennent des éléments frontières // et des éléments frontières eux-même void Mise_a_jour_boite_encombrement_elem_front(Enum_dure temps); @@ -682,6 +709,11 @@ class LesMaillages // activation des ddls d'erreur si cela veut dire quelques chose // pour l'élément void Active_ddl_Erreur(); + + // active un ddl particulier + void Active_un_ddl_particulier(Enum_ddl en); + // inactive un ddl particulier + void Inactive_un_ddl_particulier(Enum_ddl en); // d'une manière plus générique une fonction pour activer une série de ddl // donnée par un identificateur, si c'est une grandeur vectoriel c'est l'ensemble @@ -920,15 +952,37 @@ class LesMaillages // idem au niveau des types de problèmes gérés par les éléments list types_de_problemes; - // stockage des pointeurd de listes d'element frontiere + // stockage des pointeurd de listes d'element frontiere minimal + // NB: il s'agit ici des frontière minimales permettant de représenter toute la frontière + // Ainsi: + // en 1D on retrouve: + // - des points uniquement + // en 2D on retrouve : + // - des segments dans le cas d'une surface (les noeuds sont exclus car intégrés aux lignes) + // - points et segment pour les lignes + // en 2D axi, on retrouve : + // - des segments dans le cas d'une surface (les noeuds sont exclus car intégrés aux lignes) + // - points et segment pour les lignes + // en 3D, on retrouve + // - des faces pour les éléments volumique (noeuds et lignes sont exclus) + // - une face et des lignes pour les éléments 2D (pas de noeuds) Tableau *> listFrontiere; // idem pour les noeuds des frontières Tableau *> tt_noeud_front; + + // en 3D liste de toutes les frontières lignes (non traités par CreeElemFront()) + // qui appartiennent à la frontière globales, ceci uniquement pour les éléments volumiques + // - Ces frontières ne sont pas intégrées dans la liste de frontière minimale + // - une même ligne peut appartenir à plusieurs éléments finis, elle n'est donc pas ici + // définit de manière unique (contrairement aux frontières minimales) + Tableau *> listFrontiere_ligne_3D; + // crée et ramene pour tous les maillages, la liste des éléments qui contiennent chaque noeud - // mis à jour lorsque lors de la création des frontières + // mis à jour lorsque lors de la création des frontières minimales Tableau < const Tableau > *> tous_indices; // tableau d'indexage des ddl géré par les noeuds - // t_i_n (i)(j) -> donne les infos pour retrouver le ddl numéro j du cas de charge i + // t_i_n (i)(j) -> donne les infos pour retrouver le ddl numéro j du cas de charge i + // le numéro j correspond au pointeur d'assemblage c-a-d la position du ddl dans l'assemblage Tableau < Tableau > t_i_n; // nombre actuellement de cas d'assemblage initialisé int tab_nb_assemb; @@ -942,7 +996,12 @@ class LesMaillages // casAssemb : donne le cas d'assemblage qui est a considérer // ici, l'assemblage suit l'ordre du tableau de noeud passé en paramètre // le tableau de noeuds rassemble tous les noeuds des maillages mais avec une numérotation propre - void MiseAJourPointeurAssemblage_interne(const Nb_assemb& nb_casAssemb,Tableau & tab_N_final); + // verif_maillage: si true: on vérifie que les numéros de noeuds sont possibles pour le maillage + // mais cette vérification n'est pas effectuée si verif_maillage est false: c'est utile + // dans une phase transitoire de fabrication de t_i_n: bien noter que dans ce cas le tableau + // t_i_n n'est pas utilisable + void MiseAJourPointeurAssemblage_interne(const Nb_assemb& nb_casAssemb,Tableau & tab_N_final + ,bool verif_maillage); // remise à jour des tableaux de pointeurs t_i_n uniquement, due à un changement de numéro de noeud // en fonction d'un changement de num de noeud (mais pas de changement de pointeur d'assemblage diff --git a/Maillage/LesMaillages2.cc b/Maillage/LesMaillages2.cc index 7470c62..44d22ce 100644 --- a/Maillage/LesMaillages2.cc +++ b/Maillage/LesMaillages2.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -1620,23 +1620,16 @@ void LesMaillages::CreationMaillageSFE() // on passe en revue les différents m // globale des pointeurs d'assemblages (ce qui est différent de la méthode : MiseAJourPointeurAssemblage( // qui agit maillage après maillage) // si le pointeur d'assemblage est non nulle et le drapeau: sans_changement_num_noeud = true - // cela signifie que l'on désire uniquement une renumérotation de pointeur sans les noeuds + // cela signifie que l'on désire uniquement une renumérotation de pointeur sans celle des noeuds // ramène dans tous les cas les nouvelles largeurs en ddl // nouvelles_largeur_en_ddl.un = la largeur totale // nouvelles_largeur_en_ddl.deux = la demie largeur // nouvelles_largeur_en_ddl.trois = la demie largeur maximale pour la partie éléments finis // uniquement (sans les CLL) - - // ramène dans tous les cas les nouvelles largeurs en ddl - // nouvelles_largeur_en_ddl.un = la largeur totale résultante - // nouvelles_largeur_en_ddl.deux = la demie largeur totale résultante - // nouvelles_largeur_en_ddl.trois = la demie largeur maximale pour la partie éléments finis - // uniquement (sans les CLL) - // bool LesMaillages::Renumerotation(LesReferences& lesRef,const Tableau >& tab_condCLL ,TroisEntiers& nouvelles_largeur_en_ddl ,const Nb_assemb* nb_casAssemb,bool sans_changement_num_noeud) -{ // pour effectuer la renumérotation il est nécessaire de créer un tableau global de tous les noeuds et +{ // pour effectuer la renumérotation il est nécessaire de créer un tableau global de tous les noeuds et // de tous les éléments, de manière à pouvoir les gérer en même temps // a1) on calcul les nombres maxi int nb_noeud = 0; int nb_element = 0; @@ -1658,21 +1651,24 @@ bool LesMaillages::Renumerotation(LesReferences& lesRef,const Tableau t_elem(nb_element); // le tableau global des éléments // c) on rempli les tableaux en changeant les numéros des noeuds (pour avoir une seule numérotation) // normalement cela n'influe pas sur les éléments car eux ils contiennent des tableaux de pointeur de noeuds - int numGlobNoeud=1; int numGlobEle = 1; - for (int imil=1;imil<=nbMaillageTotal;imil++) - { int nbn = tabMaillage(imil)->Nombre_noeud(); - Tableau& tab_noeud = tabMaillage(imil)->Tab_noeud(); - for (int inoe = 1; inoe <= nbn; inoe++,numGlobNoeud++) - { t_noe(numGlobNoeud) = tab_noeud(inoe); - t_oldNumNoeud(numGlobNoeud) = tab_noeud(inoe)->Num_noeud(); - t_noe(numGlobNoeud)->Change_num_noeud(numGlobNoeud); - }; - int nb_ele = tabMaillage(imil)->Nombre_element(); - Tableau& tab_element = tabMaillage(imil)->Tab_element(); - for (int iel = 1; iel <= nb_ele; iel++,numGlobEle++) - { t_elem(numGlobEle) = tab_element(iel); - }; - }; + {int numGlobNoeud=1; int numGlobEle = 1; + for (int imil=1;imil<=nbMaillageTotal;imil++) + { int nbn = tabMaillage(imil)->Nombre_noeud(); + Tableau& tab_noeud = tabMaillage(imil)->Tab_noeud(); + for (int inoe = 1; inoe <= nbn; inoe++,numGlobNoeud++) + { t_noe(numGlobNoeud) = tab_noeud(inoe); + t_oldNumNoeud(numGlobNoeud) = tab_noeud(inoe)->Num_noeud(); + t_noe(numGlobNoeud)->Change_num_noeud(numGlobNoeud); + }; + int nb_ele = tabMaillage(imil)->Nombre_element(); + Tableau& tab_element = tabMaillage(imil)->Tab_element(); + for (int iel = 1; iel <= nb_ele; iel++,numGlobEle++) + { t_elem(numGlobEle) = tab_element(iel); + }; + }; + }; // on encapsule pour isoler les variables numGlobNoeud et numGlobEle qui ne + // doivent exister que dans la boucle + // avant tout changement on calcul la largeur initiale due aux conditions linéaires // celle-ci n'est valide que dans le cas où tous les noeuds ont des numéros différents // ce qui est le cas maintenant @@ -1807,7 +1803,7 @@ bool LesMaillages::Renumerotation(LesReferences& lesRef,const Tableau Num_noeud()) = tab_N_final(i); // on met à jour les pointeurs d'assemblage en suivant le nouvel ordre de noeud - MiseAJourPointeurAssemblage_interne(*nb_casAssemb,tab_N_final_final); + MiseAJourPointeurAssemblage_interne(*nb_casAssemb,tab_N_final_final,false); // on calcul la largeur finale int demi = 0; int total = 0; int cumule = 0; @@ -2016,6 +2012,14 @@ bool LesMaillages::Renumerotation(LesReferences& lesRef,const Tableau 2) + cout << "\n calcul du demarrage infructeux de l'algorithme de Gibbs (voisins, descendance etc.) " + << " on conserve l'ancienne renumerotation "; + for (int nue =1; nue<= nb_noeud; nue++) + t_noe(nue)->Change_num_noeud(t_oldNumNoeud(nue)); }; // retour return (calcul_ok && nouvelle_numerotation); diff --git a/Maillage/Maillage.cc b/Maillage/Maillage.cc index f67dcd8..9ae2b34 100755 --- a/Maillage/Maillage.cc +++ b/Maillage/Maillage.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -58,7 +58,7 @@ using namespace std; //introduces namespace std Maillage::Maillage (map < string, int , std::less > & lisNomMail,int nmail,int dim ,const string& nom_maill): listeNomMail(lisNomMail),nomDuMaillage(),idmail(nmail),dimension(dim) - ,tab_noeud(),tab_element(),listFrontiere(),tab_noeud_front(),indice() + ,tab_noeud(),tab_element(),listFrontiere(),tab_noeud_front(),indice(),indice_NFr() , list_refIn(),list_refOut(),lesRefin(NULL),mitoyen_de_chaque_element() ,ddl_representatifs_des_physiques(),types_de_problemes() , ind_elem(),tab_sens_element() // tableaux internes utilisés par Orientation_elements_mitoyens_recursif @@ -86,7 +86,7 @@ Maillage::Maillage (map < string, int , std::less > & lisNomMail // Constructeur utile quand la dimension, le nombre de noeuds // et le nombre d'elements du maillage sont connus listeNomMail(lisNomMail),tab_noeud(n_noeud),tab_element(n_elt),listFrontiere(),tab_noeud_front() - ,indice(),list_refIn(),list_refOut(),lesRefin(NULL),mitoyen_de_chaque_element() + ,indice(),indice_NFr(),list_refIn(),list_refOut(),lesRefin(NULL),mitoyen_de_chaque_element() ,ddl_representatifs_des_physiques(),types_de_problemes() , ind_elem(),tab_sens_element() // tableaux internes utilisés par Orientation_elements_mitoyens_recursif ,detruire_les_noeuds_et_elements(true) @@ -139,7 +139,7 @@ Maillage::Maillage (map < string, int , std::less > & lisNomMail ,int dim,list & li_noeud, list li_element ,int nmail,const string& nom_maill ): listeNomMail(lisNomMail),tab_noeud(),tab_element(),listFrontiere(),tab_noeud_front() - ,indice(),list_refIn(),list_refOut(),lesRefin(NULL),mitoyen_de_chaque_element() + ,indice(),indice_NFr(),list_refIn(),list_refOut(),lesRefin(NULL),mitoyen_de_chaque_element() ,ddl_representatifs_des_physiques(),types_de_problemes() , ind_elem(),tab_sens_element() // tableaux internes utilisés par Orientation_elements_mitoyens_recursif ,detruire_les_noeuds_et_elements(true) @@ -273,7 +273,7 @@ Maillage::Maillage (const Maillage& mail): listeNomMail(mail.listeNomMail),idmail(mail.idmail),nomDuMaillage(mail.nomDuMaillage),dimension(mail.dimension) ,tab_noeud(mail.tab_noeud),tab_element(mail.tab_element) ,listFrontiere(mail.listFrontiere),tab_noeud_front(mail.tab_noeud_front) - ,indice(),list_refIn(),list_refOut(),lesRefin(NULL) + ,indice(),indice_NFr(),list_refIn(),list_refOut(),lesRefin(NULL) ,mitoyen_de_chaque_element(mail.mitoyen_de_chaque_element) ,ddl_representatifs_des_physiques(mail.ddl_representatifs_des_physiques) ,types_de_problemes(mail.types_de_problemes) @@ -299,7 +299,7 @@ Maillage::Maillage (map < string, int , std::less > & lisNomMail ,int nmail, const string& nomDu,const Maillage& mail): listeNomMail(lisNomMail),idmail(nmail),nomDuMaillage(nomDu),dimension(mail.dimension) ,tab_noeud(),tab_element(),listFrontiere(),tab_noeud_front() - ,indice(),list_refIn(),list_refOut(),lesRefin(NULL) + ,indice(),indice_NFr(),list_refIn(),list_refOut(),lesRefin(NULL) ,mitoyen_de_chaque_element() ,ddl_representatifs_des_physiques(mail.ddl_representatifs_des_physiques) ,types_de_problemes(mail.types_de_problemes) @@ -1223,11 +1223,44 @@ void Maillage::Calcul_indice() }; +// création pour chaque noeud de la liste des éléments frontières qui contiennent le noeud +void Maillage::Calcul_indice_NFr() +{ // le tableau indice_NFr (indice des noeuds frontières) va permettre une recherche plus rapide + // on le construit: + int tab_noeud_taille= tab_noeud.Taille(); + indice_NFr.Change_taille(tab_noeud_taille); + // au cas où le tableau existait auparavant on initialise les éléments du tableau + for (int i=1;i<= tab_noeud_taille;i++) + indice_NFr(i).clear(); + + // indice_NFr contiend les front succeptible d'avoir des frontières géométriques communes + LaLIST ::iterator iF; + LaLIST ::iterator iFfin = listFrontiere.end(); + for (iF = listFrontiere.begin();iF!=iFfin; iF++) + { Front* fro = &(*iF); + ElFrontiere * efem1 = fro->Eleme(); // recup de l'element géométrique qui a créé la frontière + // récup de son tableau de noeud + Tableau& tabn = efem1->TabNoeud(); + int tabntaille = tabn.Taille(); + for (int ij=1;ij<= tabntaille;ij++) + // on balaie ses noeuds + indice_NFr((tabn(ij)->Num_noeud())).push_back(fro); + }; + // on supprime les doublons + for (int i=1;i<=tab_noeud_taille;i++) + { List_io & intertab = indice_NFr(i); // pour allèger l'écriture + intertab.sort(); // on ordonne + intertab.unique(); // on supprime les doublons + }; +}; + + // calcule des normales aux noeuds: dans le cas d'éléments 1D ou 2D uniquement // a priori le calcul s'effectue par une moyenne des normales des éléments qui // entourent le noeud. // init -> calcul des normales à t=0 // et ajout conteneur aux noeuds des normales à t = 0 et t +// init par défaut des valeurs à t == celle à t=0 void Maillage::InitNormaleAuxNoeuds() { // on va parcourir les noeuds et on n'intervient que si le noeud // appartient à un élément 1D et/ou 2D @@ -1329,6 +1362,151 @@ void Maillage::InitNormaleAuxNoeuds() // ce qui fini la mise à jour de la normale au noeud }; }; + + // on fait de même pour les éléments frontières minimals + // calcul éventuel du tableau indice_NFr + this->Indice_NFr(); + int dima = ParaGlob::Dimension(); + for (int ine =1; ine < borne_max_nbNoeud;ine++ ) + {Noeud & noe = *tab_noeud(ine); // pour simplifier + // on regarde si le conteneur de la normale à un noeud frontière existe au noeud + // et création éventuelle + if (!noe.Existe_ici(N_FRONT_t0)) + { Grandeur_coordonnee grandCoordonnee(ParaGlob::Dimension()); // un type courant + TypeQuelconque typQ4(N_FRONT_t0,EPS11,grandCoordonnee); + noe.AjoutUnTypeQuelconque(typQ4); + }; + // on fait la même chose à t ce qui évitera de tester à la mise à jour + if (!noe.Existe_ici(N_FRONT_t)) + { Grandeur_coordonnee grandCoordonnee(ParaGlob::Dimension()); // un type courant + TypeQuelconque typQ4(N_FRONT_t,EPS11,grandCoordonnee); + noe.AjoutUnTypeQuelconque(typQ4); + }; + + // on récupère le conteneur au noeud après création éventuelle + TypeQuelconque& tiq = noe.ModifGrandeur_quelconque(N_FRONT_t0); + Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) (tiq.Grandeur_pointee())); + Coordonnee& normale = *gr.ConteneurCoordonnee(); + normale.Zero(); // init + + List_io & li_elem = indice_NFr(ine);// la liste des Front qui contiennent le noeud + List_io ::iterator il,ilfin = li_elem.end(); + // on balaie les éléments + int nb_normale=0; // le nombre de normales trouvées + for (il = li_elem.begin(); il != ilfin; il++) + {Front& elem = *(*il); + Enum_type_geom enutygeom = elem.Eleme_const()->Type_geom_front(); + int cas = elem.Eleme()->CalculNormale_noeud(TEMPS_0,*tab_noeud(ine),coor_inter); +// //------ debug +// if ((noe.Num_noeud() == 6) && (noe.Num_Mail()==2)) +// { cout << "\n debug Maillage::InitNormaleAuxNoeuds():" +// << " noe "<< noe.Num_noeud() << " N= "; coor_inter.Affiche(); +// }; +// // ----- end debug + + if (cas == 0) + {cout << "\n *** erreur, le calcul de la normale n'est pas possible " + << " pour le noeud "<Num_noeud() + << " du maillage " << tab_noeud(ine)->Num_Mail() + << " par rapport a l'element de frontiere "; + elem.Affiche(1); + cout << "\n Maillage::InitNormaleAuxNoeuds() "; + Sortie(1); + } + else if (cas == 2) + {// le calcul n'est pas licite, mais ce n'est pas une erreur + // simplement, l'élément n'est pas rusé pour ce noeud, on ne fait rien + } + else // sinon c'est ok + {// on peut avoir des directions très proches mais de sens inverse ... ce qui va + // conduire à une somme nulle, +// double intens_normale = normale.Norme(); // l'intensité actuelle +// Coordonnee inter_co = normale + coor_inter; +// if ((intens_normale > ConstMath::unpeupetit) && (inter_co.Norme() < ConstMath::petit)) +// // normalement ne devrait pas arriver +// { +// +// } + normale += coor_inter; // ici cela me semble plus juste: on ne doit pas avoir de pb d'inversion de normale + + + +// //pour éviter cela, on regarde le produit scalaire +// // s'il est négatif on utilise l'inverse de la normale +// // donc en définitif on gardera globalement la direction précédente +// if ((normale * coor_inter) > 0.) +// {normale += coor_inter;} +// else +// {normale -= coor_inter;}; + nb_normale++; + }; + }; + if (nb_normale != 0) + {normale /= nb_normale; + // enfin on normalise la normale + normale.Normer(); + // ce qui fini la mise à jour de la normale au noeud +// //------ debug +// if ((noe.Num_noeud() == 6) && (noe.Num_Mail()==2)) +// { cout << "\n debug Maillage::InitNormaleAuxNoeuds():" +// << " noe "<< noe.Num_noeud() << " N= "; normale.Affiche(); +// }; +// // ----- end debug + }; + }; + #ifdef MISE_AU_POINT + // on vérifie que tous les noeuds des frontières possèdent une normales + {LaLIST ::iterator il,ilfin = listFrontiere.end(); + for (il = listFrontiere.begin(); il != ilfin; il++) + { Front& elem = (*il); // pour simplifier + ElFrontiere* elfro = elem.Eleme(); + Tableau & tabNFront = elfro->TabNoeud(); + int nbnoefront_et1 = 1+tabNFront.Taille(); + for (int inoe = 1; inoeNum_noeud() + << " du maillage " << tab_noeud(ine)->Num_Mail() + << " par rapport a l'element de frontiere "; + elem.Affiche(1); + cout << "\n Maillage::InitNormaleAuxNoeuds() "; + Sortie(1); + } + else if (cas == 2) + {// le calcul n'est pas licite, mais ce n'est pas une erreur + // simplement, l'élément n'est pas rusé pour ce noeud, on ne fait rien + } + else // sinon c'est ok + {// on peut avoir des directions très proches mais de sens inverse ... ce qui va + // conduire à une somme nulle, pour éviter cela, on regarde le produit scalaire + // s'il est négatif on utilise l'inverse de la normale + // donc en définitif on gardera globalement la direction précédente +// if ((normale * coor_inter) > 0.) + {normale += coor_inter;} +// else +// {normale -= coor_inter;}; + nb_normale++; + }; + }; + if (nb_normale != 0) + {normale /= nb_normale; + // enfin on normalise la normale + normale.Normer(); + }; + // ce qui fini la mise à jour de la normale au noeud + }; + #ifdef MISE_AU_POINT + // on vérifie que tous les noeuds des frontières possèdent une normales + {LaLIST ::iterator il,ilfin = listFrontiere.end(); + for (il = listFrontiere.begin(); il != ilfin; il++) + { Front& elem = (*il); // pour simplifier + ElFrontiere* elfro = elem.Eleme(); + Tableau & tabNFront = elfro->TabNoeud(); + int nbnoefront_et1 = 1+tabNFront.Taille(); + for (int inoe = 1; inoe mise à jour des normales à t @@ -1449,9 +1704,104 @@ void Maillage::MiseAjourNormaleAuxNoeuds_de_tdt_vers_T() }; // ce qui fini la mise à jour de la normale au noeud }; + + // on fait de même pour les éléments frontières minimals + // calcul éventuel du tableau indice_NFr + this->Indice_NFr(); + int dima = ParaGlob::Dimension(); + + for (int ine =1; ine < borne_max_nbNoeud;ine++ ) + {Noeud & noe = *tab_noeud(ine); // pour simplifier + // on récupère la normale au noeud + TypeQuelconque& tiq = noe.ModifGrandeur_quelconque(N_FRONT_t); + Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) (tiq.Grandeur_pointee())); + Coordonnee& normale = *gr.ConteneurCoordonnee(); + normale.Zero(); // init + // la norme est nulle, on continue + List_io & li_elem = indice_NFr(ine);// la liste des Front qui contiennent le noeud + List_io ::iterator il,ilfin = li_elem.end(); + // on balaie les éléments + int nb_normale=0; // le nombre de normales trouvées + for (il = li_elem.begin(); il != ilfin; il++) + {Front& elem = *(*il); + Enum_type_geom enutygeom = elem.Eleme_const()->Type_geom_front(); + // ici contrairement à la méthode: MiseAjourNormaleAuxNoeuds + // on demande à l'élément de calculer la normale avec la géométrie à tdt + int cas = elem.Eleme()->CalculNormale_noeud(TEMPS_tdt,*tab_noeud(ine),coor_inter); + if (cas == 0) + {cout << "\n *** erreur, le calcul de la normale n'est pas possible " + << " pour le noeud "<Num_noeud() + << " du maillage " << tab_noeud(ine)->Num_Mail() + << " par rapport a l'element de frontiere "; + elem.Affiche(1); + cout << "\n Maillage::InitNormaleAuxNoeuds() "; + Sortie(1); + } + else if (cas == 2) + {// le calcul n'est pas licite, mais ce n'est pas une erreur + // simplement, l'élément n'est pas rusé pour ce noeud, on ne fait rien + } + else // sinon c'est ok + {// on peut avoir des directions très proches mais de sens inverse ... ce qui va + // conduire à une somme nulle, pour éviter cela, on regarde le produit scalaire + // s'il est négatif on utilise l'inverse de la normale + // donc en définitif on gardera globalement la direction précédente +// if ((normale * coor_inter) > 0.) + {normale += coor_inter;} +// else +// {normale -= coor_inter;}; + nb_normale++; + }; + }; + if (nb_normale != 0) + {normale /= nb_normale; + // enfin on normalise la normale + normale.Normer(); + }; + // ce qui fini la mise à jour de la normale au noeud + }; + #ifdef MISE_AU_POINT + // on vérifie que tous les noeuds des frontières possèdent une normales + {LaLIST ::iterator il,ilfin = listFrontiere.end(); + for (il = listFrontiere.begin(); il != ilfin; il++) + { Front& elem = (*il); // pour simplifier + ElFrontiere* elfro = elem.Eleme(); + Tableau & tabNFront = elfro->TabNoeud(); + int nbnoefront_et1 = 1+tabNFront.Taille(); + for (int inoe = 1; inoe::iterator il,ilfin = listFrontiere.end(); + for (il = listFrontiere.begin(); il != ilfin; il++) + { // on vérifie que c'est un élément volumique + Enum_type_geom enutygeom = Type_geom_generique((*il).PtEI()->Id_geometrie()); + if (enutygeom == VOLUME) + {// on construit et on récupère les frontières segments, + // récup de l'élément géométrique + ElemGeomC0& el = (*il).PtEI()->ElementGeometrique(); + int tail_ar = el.NbSe(); // nombre potentiel d'arêtes + for (int ifront = 1; ifront <= tail_ar; ifront++) + {ElFrontiere* const elfr = (*il).PtEI()->Frontiere_lineique(ifront,true); + // ajout après création, de la frontière front + // dans front il y a une création d'un ElFrontiere qui est == à *elfr + // mais c'est un élément frontière autonome (indépendant de celui de l'élément) + listFrontiere_ligne_3D.push_back(Front(*elfr,(*il).PtEI(),ifront)); + }; + }; + }; + }; + }; // change le nom et le numéro du maillage void Maillage::ChangeNomNumeroMaillage(const string & nom,int num) @@ -1967,7 +2353,33 @@ void Maillage::Lecture_base_info(ifstream& entr,const int cas) Change_nb_element(nbElement); // Lecture des elements Element * pte; + #ifndef UTILISATION_MPI + // cas d'un calcul uni-CPU for (int i=1; i<= nbElement; i++) + #else + // cas d'un calcul // + // on récupère la distribution d'éléments concernant le cpu en cours + const list list_elem_cpu = ParaGlob::param->const_List_element_CPU_en_cours(idmail); + // le nombre d'élément spécifiquement pour le CPU + int nbElement_cpu = list_elem_cpu.size(); + int inter; // le nombre stocké sur le .BI + entr >> toto >> inter; + // on vérifie que c'est le bon + if (inter != nbElement_cpu) + { cout << "\nErreur : le nombre d'element a lire: " << nbElement_cpu + << " est different de celui stocke sur le .BI: " << inter + << "\n cas d'un calcul parallele avec lecture initiale du .BI, cpu nb:" + << ParaGlob::Monde()->rank() << " !! " + << "\n Maillage::Lecture_base_info(ofstream& sort,int cas)" + << endl; + Sortie (1); + }; + // lecture des éléments + // on balaie les éléments nécessaires + list ::const_iterator il,ilfin=list_elem_cpu.end(); + for (il = list_elem_cpu.begin();il != ilfin;il++) + {int i = (*il); + #endif { // lecture geometrie et interpolation Enum_geom id_geom; Enum_interpol id_interpol; EnumElemTypeProblem id_typeProb;string str_precision; @@ -2021,6 +2433,11 @@ void Maillage::Lecture_base_info(ifstream& entr,const int cas) }; }; } + #ifdef UTILISATION_MPI + // fin cas d'un calcul // + }; + #endif + // ------------ les elements frontières ----------- // il sont créé par ailleurs si il y en a besoin break; @@ -2054,10 +2471,41 @@ void Maillage::Lecture_base_info(ifstream& entr,const int cas) int nbElement = tab_element.Taille(); Tableau * pt = & tab_noeud; int nb;string toto; + #ifndef UTILISATION_MPI + // cas d'un calcul uni-CPU for (int j=1;j<=nbElement;j++) + #else + // cas d'un calcul // + // on récupère la distribution d'éléments concernant le cpu en cours + const list list_elem_cpu = ParaGlob::param->const_List_element_CPU_en_cours(idmail); + // le nombre d'élément spécifiquement pour le CPU + int nbElement_cpu = list_elem_cpu.size(); + int intera; // le nombre stocké sur le .BI + entr >> toto >> intera; + // on vérifie que c'est le bon + if (intera != nbElement_cpu) + { cout << "\nErreur : le nombre d'element a lire: " << nbElement_cpu + << " est different de celui stocke sur le .BI: " << inter + << "\n cas d'un calcul parallele avec lecture courante du .BI, cpu nb:" + << ParaGlob::Monde()->rank() << " !! " + << "\n Maillage::Lecture_base_info(ofstream& sort,int cas)" + << endl; + Sortie (1); + }; + // lecture des éléments + // on balaie les éléments nécessaires + list ::const_iterator il,ilfin=list_elem_cpu.end(); + for (il = list_elem_cpu.begin();il != ilfin;il++) + {int j = (*il); + #endif {entr >> toto >> nb; // le numéro de l'élément tab_element(j)->Lecture_base_info(entr,pt,cas); }; + #ifdef UTILISATION_MPI + // fin cas d'un calcul // + }; + #endif + // ------------ les elements frontières ----------- // il sont créé par ailleurs si il y en a besoin break; @@ -2114,21 +2562,40 @@ void Maillage::Ecriture_base_info(ofstream& sort,const int cas) tab_noeud(i)->Ecriture_base_info(sort,cas); // ------------ les elements finis ----------- sort << "\n --les_elements-- "; - // le nombre d'élément + // le nombre d'élément total int nbElement = tab_element.Taille(); - sort <<"\n nombre_d'element " << nbElement ; + sort <<"\n nombre_total_element " << nbElement ; // écriture des éléments + #ifndef UTILISATION_MPI + // cas d'un calcul uni-CPU for (int j=1;j<=nbElement;j++) - { // tout d'abord les données de différentiation - // numéro geometrie et interpolation - sort << "\n\n element: " << tab_element(j)->Num_elt() << " " - << tab_element(j)->Id_geometrie() << " " - << tab_element(j)->Interpolation() << " " - << tab_element(j)->TypeProblem() << " " - << tab_element(j)->Infos_annexe() << "\n"; - // puis les données de l'élément - tab_element(j)->Ecriture_base_info(sort,cas); - }; + #else + // cas d'un calcul // + // on récupère la distribution d'éléments concernant le cpu en cours + const list list_elem_cpu = ParaGlob::param->const_List_element_CPU_en_cours(idmail); + // le nombre d'élément spécifiquement pour le CPU + int nbElement_cpu = list_elem_cpu.size(); + sort <<"\n nombre_element_CPU " << nbElement_cpu ; + // écriture des éléments + // on balaie les éléments nécessaires + list ::const_iterator il,ilfin=list_elem_cpu.end(); + for (il = list_elem_cpu.begin();il != ilfin;il++) + {int j = (*il); + #endif + { // tout d'abord les données de différentiation + // numéro geometrie et interpolation + sort << "\n\n element: " << tab_element(j)->Num_elt() << " " + << tab_element(j)->Id_geometrie() << " " + << tab_element(j)->Interpolation() << " " + << tab_element(j)->TypeProblem() << " " + << tab_element(j)->Infos_annexe() << "\n"; + // puis les données de l'élément + tab_element(j)->Ecriture_base_info(sort,cas); + }; + #ifdef UTILISATION_MPI + // fin cas d'un calcul // + }; + #endif sort << "\n "; // ------------ les elements frontières ----------- // ne sont pas sauvegardé car reconstruit à la demande @@ -2144,10 +2611,30 @@ void Maillage::Ecriture_base_info(ofstream& sort,const int cas) tab_noeud(i)->Ecriture_base_info(sort,cas); // ------------ les elements finis ----------- int nbElement = tab_element.Taille(); + #ifndef UTILISATION_MPI + // cas d'un calcul uni-CPU for (int j=1;j<=nbElement;j++) + #else + // cas d'un calcul // + // on récupère la distribution d'éléments concernant le cpu en cours + const list list_elem_cpu = ParaGlob::param->const_List_element_CPU_en_cours(idmail); + // le nombre d'élément spécifiquement pour le CPU + int nbElement_cpu = list_elem_cpu.size(); + sort <<"\n nombre_element_CPU " << nbElement_cpu ; + // écriture des éléments + // on balaie les éléments nécessaires + list ::const_iterator il,ilfin=list_elem_cpu.end(); + for (il = list_elem_cpu.begin();il != ilfin;il++) + {int j = (*il); + #endif {sort << "\n\n element_nb: " << tab_element(j)->Num_elt() << " "; tab_element(j)->Ecriture_base_info(sort,cas); }; + #ifdef UTILISATION_MPI + // fin cas d'un calcul // + }; + #endif + // ------------ les elements frontières ----------- // ne sont pas sauvegardé car reconstruit à la demande @@ -2225,28 +2712,29 @@ Tableau Maillage::Taille_boiteMail() // à la fin du programme tous les frontières des éléments frontières sont supprimé void Maillage::MitoyenFront() { // le tableau indice_NFr (indice des noeuds frontières) va permettre une recherche plus rapide - // on le construit: - int tab_noeud_taille= tab_noeud.Taille(); - Tableau > indice_NFr(tab_noeud_taille); - // indice_NFr contiend les front succeptible d'avoir des frontières géométriques communes - LaLIST ::iterator iF; - LaLIST ::iterator iFfin = listFrontiere.end(); - for (iF = listFrontiere.begin();iF!=iFfin; iF++) - { Front* fro = &(*iF); - ElFrontiere * efem1 = fro->Eleme(); // recup de l'element géométrique qui a créé la frontière - // récup de son tableau de noeud - Tableau& tabn = efem1->TabNoeud(); - int tabntaille = tabn.Taille(); - for (int ij=1;ij<= tabntaille;ij++) - // on balaie ses noeuds - indice_NFr((tabn(ij)->Num_noeud())).push_back(fro); - }; - // on supprime les doublons - for (int i=1;i<=tab_noeud_taille;i++) - { List_io & intertab = indice_NFr(i); // pour allèger l'écriture - intertab.sort(); // on ordonne - intertab.unique(); // on supprime les doublons - }; + Calcul_indice_NFr(); +// // on le construit: +// int tab_noeud_taille= tab_noeud.Taille(); +// Tableau > indice_NFr(tab_noeud_taille); +// // indice_NFr contiend les front succeptible d'avoir des frontières géométriques communes +// LaLIST ::iterator iF; +// LaLIST ::iterator iFfin = listFrontiere.end(); +// for (iF = listFrontiere.begin();iF!=iFfin; iF++) +// { Front* fro = &(*iF); +// ElFrontiere * efem1 = fro->Eleme(); // recup de l'element géométrique qui a créé la frontière +// // récup de son tableau de noeud +// Tableau& tabn = efem1->TabNoeud(); +// int tabntaille = tabn.Taille(); +// for (int ij=1;ij<= tabntaille;ij++) +// // on balaie ses noeuds +// indice_NFr((tabn(ij)->Num_noeud())).push_back(fro); +// }; +// // on supprime les doublons +// for (int i=1;i<=tab_noeud_taille;i++) +// { List_io & intertab = indice_NFr(i); // pour allèger l'écriture +// intertab.sort(); // on ordonne +// intertab.unique(); // on supprime les doublons +// }; //-- debug // cout << "\n maillage " << idmail << "\n"; @@ -2325,9 +2813,9 @@ void Maillage::MitoyenFront() }; }; // fin de la recherche concernant elfr - // on supprime les doublons - inters.sort(); // on ordonne - inters.unique(); // on supprime les doublons + // on supprime les doublons + inters.sort(); // on ordonne + inters.unique(); // on supprime les doublons // creation d'un tableau a la place de la liste Tableau tabb((int) inters.size()); LaLIST ::iterator ip; int i2; @@ -2346,7 +2834,7 @@ void Maillage::MitoyenFront() // -- fin débug --- affichage // on vide la liste inters.erase(ipdebut,ipfin); - }; + }; // -- débug --- affichage // for ( iE = listFrontiere.begin(); iE !=iEfin; iE++) // (*iE).Affiche(); diff --git a/Maillage/Maillage.h b/Maillage/Maillage.h index 9bb4832..e975c55 100755 --- a/Maillage/Maillage.h +++ b/Maillage/Maillage.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -265,14 +265,35 @@ class Maillage // cf: l'algo non dyna par exempel void MiseAjourNormaleAuxNoeuds_de_tdt_vers_T(); - // creation des elements frontiere + // creation des elements frontiere minimal + // il s'agit ici des frontière minimales permettant de représenter toute la frontière + // Ainsi: + // en 1D on retrouve: + // - des points uniquement + // en 2D on retrouve : + // - des segments dans le cas d'une surface (les noeuds sont exclus car intégrés aux lignes) + // - points et segment pour les lignes + // en 2D axi, on retrouve : + // - des segments dans le cas d'une surface (les noeuds sont exclus car intégrés aux lignes) + // - points et segment pour les lignes + // en 3D, on retrouve + // - des faces pour les éléments volumique (noeuds et lignes sont exclus) + // - une face et des lignes pour les éléments 2D (pas de noeuds) void CreeElemFront(); - - // ramene un pointeur sur la liste des elements frontieres + // ramene un pointeur sur la liste des elements frontieres minimales inline LaLIST * ListFront() { return &listFrontiere;}; // ramene le tableau des noeuds de la frontière Tableau& Tab_noeud_front() {return tab_noeud_front; }; - + + // création forcée en 3D de toutes les frontières lignes (non traités par CreeElemFront()) + // qui appartiennent à la frontière globales, ceci uniquement pour les éléments volumiques + // - Ces frontières ne sont pas intégrées dans la liste de frontière minimale + // - une même ligne peut appartenir à plusieurs éléments finis, elle n'est donc pas ici + // définit de manière unique (contrairement aux frontières minimales) + void CreeListFrontiere_ligne_3D(); + // ramène le tableau de pointeurs de frontières ligne 3D créées par CreeListFrontiere_ligne_3D + inline LaLIST * ListFront_ligne_3D() { return &listFrontiere_ligne_3D;}; + // ramene le nom du maillage string NomDuMaillage() {return nomDuMaillage;}; @@ -418,11 +439,17 @@ class Maillage // ramène pour chaque noeud, la liste des éléments qui contiennent le noeud // si le tableau n'existe pas, il est construit, sinon uniquement un retour - // et la miss à jour est uniquement faite lors de la création des frontières + // et la mise à jour est uniquement faite lors de la création des frontières const Tableau >& Indice() {if (indice.Taille() == 0) Calcul_indice(); return indice; }; - + // ramène pour chaque noeud, la liste des éléments de frontière minimale qui contiennent le noeud + // si le tableau n'existe pas, il est construit, sinon uniquement un retour + // et la mise à jour est uniquement faite lors de la création des frontières + const Tableau >& Indice_NFr() + {if (indice_NFr.Taille() == 0) Calcul_indice_NFr(); + return indice_NFr; }; + //----- lecture écriture dans base info ----- // cas donne le niveau de la récupération // = 1 : on récupère tout @@ -523,16 +550,40 @@ class Maillage Tableau tab_noeud; // tableau des noeuds du maillage Tableau tab_element; // tableau des elements du maillage // list des elements frontieres du maillage, c-a-d des frontières uniques - LaLIST listFrontiere; + // il s'agit ici des frontières minimales: + // Ainsi: + // en 1D on retrouve: + // - des points uniquement + // en 2D on retrouve : + // - des segments dans le cas d'une surface (les noeuds sont exclus car intégrés aux lignes) + // - points et segment pour les lignes + // en 2D axi, on retrouve : + // - des segments dans le cas d'une surface (les noeuds sont exclus car intégrés aux lignes) + // - points et segment pour les lignes + // en 3D, on retrouve + // - des faces pour les éléments volumique (noeuds et lignes sont exclus) + // - une face et des lignes pour les éléments 2D (pas de noeuds) + LaLIST listFrontiere; // tableau des noeuds des éléments frontières Tableau tab_noeud_front; - // tableau utilitaire: + // tableaux utilitaires: // indice(i) contient la liste des éléments qui contiennent le noeud i Tableau > indice; + // indice_front(i) contient la liste des éléments frontères minimals qui contiennent le noeud i + Tableau > indice_NFr; + + // pour chaque élément "i" , mitoyen_de_chaque_element(i)(j) contient l'élément Front // qui décrit la frontière "j" de l'élément et dedans, les éléments mitoyens de cette frontière // appartenant à d'autres éléments (ce tableau est construit par la méthode : Mitoyen()) Tableau < Tableau > mitoyen_de_chaque_element; + + // en 3D liste de toutes les frontières lignes (non traités par CreeElemFront()) + // qui appartiennent à la frontière globales, ceci uniquement pour les éléments volumiques + // - Ces frontières ne sont pas intégrées dans la liste de frontière minimale + // - une même ligne peut appartenir à plusieurs éléments finis, elle n'est donc pas ici + // définit de manière unique (contrairement aux frontières minimales) + LaLIST listFrontiere_ligne_3D; // définie la liste des types de degrés de liberté inconnus, qui vont être calculés par la résolution des problèmes // physiques gérés par les éléments qui existent dans le maillages @@ -578,7 +629,9 @@ class Maillage void MitoyenFront(); // création pour chaque noeud de la liste des éléments qui contiennent le noeud void Calcul_indice(); - + // création pour chaque noeud de la liste des éléments frontières qui contiennent le noeud + void Calcul_indice_NFr(); + // definition d'un stockage contenant tous les Front associés à toutes les frontières de tous les éléments // puis définition des elements mitoyens à ces Front : deux éléments Front sont mitoyens // s'ils correspondent à des Element différents, et si les frontières associées possèdent les mêmes noeuds diff --git a/Maillage/Maillage2.cc b/Maillage/Maillage2.cc index 06a775f..74442e2 100644 --- a/Maillage/Maillage2.cc +++ b/Maillage/Maillage2.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -809,7 +809,7 @@ bool Maillage::PosiEtNoeud::operator < (const Maillage::PosiEtNoeud& po) const { if (co1(2) < co2(2)) return true; else if (co1(2) == co2(2)) { return (co1(3) < co2(3));} - else false; + else { return false;}; } return false; break; @@ -838,7 +838,7 @@ bool Maillage::PosiEtNoeud::operator <= (const Maillage::PosiEtNoeud& po) const { if (co1(2) < co2(2)) return true; else if (co1(2) == co2(2)) { return (co1(3) <= co2(3));} - else false; + else {return false;}; } return false; break; diff --git a/Maillage/Maillage3.cc b/Maillage/Maillage3.cc index 94298bc..05eb30d 100644 --- a/Maillage/Maillage3.cc +++ b/Maillage/Maillage3.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -72,7 +72,7 @@ void Maillage::CreationInteractiveListesRef(LesReferences* lesRef) // affichage du menu du type de référence voulu if (list_typeReference.size()!= 0) - { if (fr) {cout << "\n type actuellement enregistre ";} + { 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; @@ -143,8 +143,8 @@ void Maillage::CreationInteractiveListesRef(LesReferences* lesRef) { // 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 actuellement enregistre ";} - else {cout << "\n list of the already registered reference names ";} + { 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; }; @@ -612,7 +612,7 @@ void Maillage::CalculListRef_1D(list& list_nomReference,LesReferences* ,list_elemPtin_restant,premLpti,list_elemFace_restant,premLface ,list_elemArrete_restant,premLarrete); } - else if ( (methode == "cote_point")||(methode == "entre_points") + else if ( (methode == "cote_point")||(methode == "entre_points") || (methode == "entre_point_dist") ||(methode == "in_ref")||(methode == "out_ref") ) @@ -677,8 +677,8 @@ void Maillage::CalculListRef_1D(list& list_nomReference,LesReferences* }; } }; - // constitution des références - EnregRef(list_nomReference,list_noeud_restant,list_elemPtin_restant,list_element_restant + // constitution des références + EnregRef(list_nomReference,list_noeud_restant,list_elemPtin_restant,list_element_restant ,list_elemFace_restant,list_elemArrete_restant,lesRef); }; @@ -1498,7 +1498,7 @@ void Maillage::EnregRef(const list& list_nomReference,list & li // 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); +// 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 @@ -2641,12 +2641,28 @@ void Maillage::InitInRef() string nom_ref; const Reference * refIn = NULL; bool demande_fin = false; while (!demande_fin) - {if (fr) {cout << "\n -- condition : appartenance a une reference ---- "; + {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 -- condition : belonging to an already existing reference ---- "; - cout << "\n name of the reference ? (only a reference of a " + 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"); @@ -2681,11 +2697,27 @@ void Maillage::InitOutRef() string nom_ref; const Reference * refOut = NULL; bool demande_fin = false; while (!demande_fin) - {if (fr) {cout << "\n -- condition : hors d'une reference ---- "; + {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 -- condition : out of to an already existing reference ---- "; + 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; }; diff --git a/Maillage/Noeud.cc b/Maillage/Noeud.cc index 4a19e86..483e526 100644 --- a/Maillage/Noeud.cc +++ b/Maillage/Noeud.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -444,10 +444,10 @@ istream & operator >> (istream & ent, Noeud & noe) }; // le tableau des degrés de liberté - ent >> noe.tab_ddl; + ent >> nom >> noe.tab_ddl; // coordonnee initiale on les récupère par défaut // ensuite on fera la mise à jour - ent >> *(noe.coord0); + ent >> nom >> *(noe.coord0); ent >> nom >> noe.tab_0; // valeurs a l'instant 0 des ddl ent >> nom >> noe.tab_tdt; // valeurs a l'instant t+dt des ddl // les coordonnees a un instant t et tdt sont reconstruit avec @@ -515,19 +515,19 @@ ostream & operator << (ostream & sort , const Noeud & noe) sort << "\n tab_ddl_lier " << 0 << " "; // on signale l'absence du tableau ; // le tableau des degrés de liberté - sort << noe.tab_ddl; + sort << "\n ddl_primaires "<< noe.tab_ddl; // coordonnee initiale on les sauvegarde par défaut // ensuite on fera la mise à jour - sort << *(noe.coord0); - sort << " ddl_a_0 " << noe.tab_0; // valeurs a l'instant 0 des ddl - sort << " ddl_a_tdt " << noe.tab_tdt; // valeurs a l'instant t+dt des ddl + sort << "\n coordo_0 "<< *(noe.coord0); + sort << "\n ddl_a_0 " << noe.tab_0; // valeurs a l'instant 0 des ddl + sort << "\n ddl_a_tdt " << noe.tab_tdt; // valeurs a l'instant t+dt des ddl // les coordonnees a un instant t ne sont pas sauvegardées elles seront // reconstruites si besoin avec la mise à jour // coordonnee a un instant t+dt on signale son existence if (noe.coord2 != NULL) - sort << "coord2Existe \n"; + sort << "\ncoord2Existe \n"; else - sort << "pascoord2 \n"; + sort << "\npascoord2 \n"; // sort << "ddl_actif " << noe.tab_var_actives; // les numéros des ddl actifs // %% cas des types quelconques éventuelles %% noe.Ecriture_grandeurs_quelconque(sort); @@ -632,6 +632,12 @@ void Noeud::Info_commande_Noeud(UtilLecture * entreePrinc,Coordonnee& co,int num tab_ddl(i).Affiche(); if (tab_tdt.Taille() != 0) cout << tab_tdt(i) << " "; }; + + // les numéros de ddl actif + if (niveau > 3) + {cout << "\n les num des ddl actifs: " << tab_var_actives; + }; + // affichage éventuelle des grandeurs enum étendue stockées au noeud int tail_tab_ddletendu = tab_ddletendu.Taille(); if (tail_tab_ddletendu != 0) diff --git a/Maillage/Noeud.h b/Maillage/Noeud.h index 62a3f17..4253fbb 100644 --- a/Maillage/Noeud.h +++ b/Maillage/Noeud.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Maillage/Noeud2.cc b/Maillage/Noeud2.cc index c95421c..811139b 100644 --- a/Maillage/Noeud2.cc +++ b/Maillage/Noeud2.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -529,7 +529,20 @@ void Noeud::MiseAjourActif() for (int i = 1; i<=tab_ddlTaille; i++) if ((tab_ddl(i).Service())&&(tab_ddl(i).UneVariable())) nbddlactif++; // dimensionnement du tableau de pointeur - if (tab_var_actives.Taille() != nbddlactif) tab_var_actives.Change_taille(nbddlactif); + if (tab_var_actives.Taille() != nbddlactif) + { +////----- debug +//if (num_noeud == 120) +// {cout << "\n debug Noeud::MiseAjourActif()"; +// for (int j = 1; j <= tab_var_actives.Taille(); j++) +// cout << "\n tab_var_actives(" << j <<")= " +// << tab_var_actives(j) << " "; +// cout << endl; +// }; +////----- fin debug + + tab_var_actives.Change_taille(nbddlactif); + } // remplissage du tableau int indice = 1; for (short int i = 1; i<=tab_ddlTaille; i++) diff --git a/Maillage/VariablesExporter.cc b/Maillage/VariablesExporter.cc index 3feeb94..4506838 100755 --- a/Maillage/VariablesExporter.cc +++ b/Maillage/VariablesExporter.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -1032,7 +1032,7 @@ ostream & operator << ( ostream & sort,const VariablesExporter::TypeParticulier { // récup du pointeur de la classe mère const VariablesExporter::TypeQuelconque_a_un_element* aA = a.PointeurClass_Quelc_const(); // récup de l'énuméré du type quelconque - const TypeQuelconque_enum_etendu& quelc = a.Quelc_const(); +// const TypeQuelconque_enum_etendu& quelc = a.Quelc_const(); // sortie sort << "\n Particulier_a_un_element_ "; sort << *aA; // la classe mère @@ -1080,7 +1080,7 @@ ostream & operator << ( ostream & sort,const VariablesExporter::TypeEvoluee_a_u { // récup du pointeur de la classe mère const VariablesExporter::TypeQuelconque_a_un_element* aA = a.PointeurClass_Quelc_const(); // récup de l'énuméré du type quelconque - const TypeQuelconque_enum_etendu& quelc = a.Quelc_const(); +// const TypeQuelconque_enum_etendu& quelc = a.Quelc_const(); // sortie sort << "\n Evoluee_a_un_element_ "; sort << *aA; // la classe mère diff --git a/Maillage/VariablesExporter.h b/Maillage/VariablesExporter.h index 3dc9800..e447274 100755 --- a/Maillage/VariablesExporter.h +++ b/Maillage/VariablesExporter.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -423,7 +423,7 @@ class VariablesExporter // opérateurs TypeParticulier_a_un_element& operator= (const TypeParticulier_a_un_element& a) - {(*PointeurClass_Quelc())= (*a.PointeurClass_Quelc_const());}; + {(*PointeurClass_Quelc())= (*a.PointeurClass_Quelc_const()); return *this;}; bool operator== (const TypeParticulier_a_un_element& a) const {return ((*PointeurClass_Quelc_const()) == (*a.PointeurClass_Quelc_const()));}; bool operator!= (const TypeParticulier_a_un_element& a) const @@ -460,7 +460,7 @@ class VariablesExporter // opérateurs TypeEvoluee_a_un_element& operator= (const TypeEvoluee_a_un_element& a) - {(*PointeurClass_Quelc())= (*a.PointeurClass_Quelc_const());}; + {(*PointeurClass_Quelc())= (*a.PointeurClass_Quelc_const());return *this;}; bool operator== (const TypeEvoluee_a_un_element& a) const {return ((*PointeurClass_Quelc_const()) == (*a.PointeurClass_Quelc_const()));}; bool operator!= (const TypeEvoluee_a_un_element& a) const @@ -532,7 +532,7 @@ class VariablesExporter // opérateurs TypeQuelc_face_a_un_element& operator= (const TypeQuelc_face_a_un_element& a) - {(*PointClass_QuelcFA())= (*a.PointClass_QuelcFA_const());}; + {(*PointClass_QuelcFA())= (*a.PointClass_QuelcFA_const());return *this;}; bool operator== (const TypeQuelc_face_a_un_element& a) const {return ((*PointClass_QuelcFA_const()) == (*a.PointClass_QuelcFA_const()));}; bool operator!= (const TypeQuelc_face_a_un_element& a) const @@ -570,7 +570,7 @@ class VariablesExporter // opérateurs TypeQuelc_arete_a_un_element& operator= (const TypeQuelc_arete_a_un_element& a) - {(*PointClass_QuelcFA())= (*a.PointClass_QuelcFA_const());}; + {(*PointClass_QuelcFA())= (*a.PointClass_QuelcFA_const());return *this;}; bool operator== (const TypeQuelc_arete_a_un_element& a) const {return ((*PointClass_QuelcFA_const()) == (*a.PointClass_QuelcFA_const()));}; bool operator!= (const TypeQuelc_arete_a_un_element& a) const @@ -608,7 +608,7 @@ class VariablesExporter // opérateurs TypeQuelc_Une_composante_Grandeur_globale& operator= (const TypeQuelc_Une_composante_Grandeur_globale& a) - {var = a.var;}; + {var = a.var;return *this;}; bool operator== (const TypeQuelc_Une_composante_Grandeur_globale& a) const {return (var == a.var);}; bool operator!= (const TypeQuelc_Une_composante_Grandeur_globale& a) const diff --git a/Parametres/ConstMath.cc b/Parametres/ConstMath.cc index 515a850..c8a4713 100644 --- a/Parametres/ConstMath.cc +++ b/Parametres/ConstMath.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Parametres/ConstMath.h b/Parametres/ConstMath.h index 3c35227..5de997d 100644 --- a/Parametres/ConstMath.h +++ b/Parametres/ConstMath.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Parametres/ConstPhysico.cc b/Parametres/ConstPhysico.cc index 67c5a47..98fd7e6 100644 --- a/Parametres/ConstPhysico.cc +++ b/Parametres/ConstPhysico.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Parametres/ConstPhysico.h b/Parametres/ConstPhysico.h index e3d1cc3..619d4ce 100644 --- a/Parametres/ConstPhysico.h +++ b/Parametres/ConstPhysico.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Parametres/Constante.h b/Parametres/Constante.h index 03ccb9c..3bab8a4 100644 --- a/Parametres/Constante.h +++ b/Parametres/Constante.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Parametres/ConstantePrinc.h b/Parametres/ConstantePrinc.h index 3abbdea..c7365fe 100644 --- a/Parametres/ConstantePrinc.h +++ b/Parametres/ConstantePrinc.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Parametres/EnteteParaGlob.h b/Parametres/EnteteParaGlob.h index 2177857..5677d97 100644 --- a/Parametres/EnteteParaGlob.h +++ b/Parametres/EnteteParaGlob.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -41,7 +41,7 @@ EnumLangue ParaGlob::langueHZ = FRANCAIS; // langue utilisée pour les entrées sorties int ParaGlob::nbComposantesTenseur = 1; // nombre de composantes par defaut a 1 int ParaGlob::nivImpression = 2; // niveau d'impression - string ParaGlob::nbVersion = "6.991" ; // numéro de version du logiciel + string ParaGlob::nbVersion = "7.010" ; // numéro de version du logiciel string ParaGlob::NbVersionsurfichier = ""; // numéro de version lue en entrée fichier int ParaGlob::nb_diggit_double_calcul= 17; // nombre de chiffre significatifs utilisé pour // l'affichage des double précision pour l'archivage @@ -53,3 +53,10 @@ bool ParaGlob::geometrie_axisymetrique = false; // par défaut espace non axisymétrique // un tableau de grandeurs globales quelconques pour être accessibles de partout std::vector ParaGlob::grandeurs_globales(taille_Enum_GrandeurGlobale); + + #ifdef UTILISATION_MPI + // -- pour le calcul parallèle + boost::mpi::environment * ParaGlob::env=NULL; // environnement global + boost::mpi::communicator * ParaGlob::world=NULL; // le communicateur global + #endif + diff --git a/Parametres/ParaAlgoControle.cc b/Parametres/ParaAlgoControle.cc index 35f30cb..033373f 100755 --- a/Parametres/ParaAlgoControle.cc +++ b/Parametres/ParaAlgoControle.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -201,7 +201,11 @@ ParaAlgoControle::ParaAlgoControle() : nbDecolAutorise = 1; // nb de fois un noeud décolle pour n'être plus considéré en contact typeDeDecolement = 0; // type par défaut sur la réaction nb_glissant = 1; // par défaut il n'y a pas de moyenne glissante + + niveau_commentaire_lescontacts = 0; // par défaut c'est le général qui commande niveau_commentaire_contact = 0; // par défaut c'est le général qui commande + fct_niveau_commentaire_contact = "_";// pas de fonction par défaut + optimisation_numerotation = 0; // par défaut pas d'optimisation // 7) paramètres liés aux calculs des énergies @@ -312,7 +316,9 @@ ParaAlgoControle::ParaAlgoControle(const ParaAlgoControle& p) : fct_nD_force_tangentielle_noeud_maxi(p.fct_nD_force_tangentielle_noeud_maxi), nb_boucle_newton_position_frontiere(p.nb_boucle_newton_position_frontiere), nbDecolAutorise(p.nbDecolAutorise),typeDeDecolement(p.typeDeDecolement),nb_glissant(p.nb_glissant), + niveau_commentaire_lescontacts(p.niveau_commentaire_lescontacts), niveau_commentaire_contact(p.niveau_commentaire_contact), + fct_niveau_commentaire_contact(p.fct_niveau_commentaire_contact), optimisation_numerotation(p.optimisation_numerotation), point_interne_delta_thetai_maxi(p.point_interne_delta_thetai_maxi), point_interne_prec_thetai_interne(p.point_interne_prec_thetai_interne), @@ -422,7 +428,11 @@ ParaAlgoControle& ParaAlgoControle::operator= (const ParaAlgoControle& p) nb_boucle_newton_position_frontiere = p.nb_boucle_newton_position_frontiere; nbDecolAutorise = p.nbDecolAutorise; typeDeDecolement = p.typeDeDecolement; nb_glissant = p.nb_glissant; + + niveau_commentaire_lescontacts = p.niveau_commentaire_lescontacts; niveau_commentaire_contact = p.niveau_commentaire_contact; + fct_niveau_commentaire_contact = p.fct_niveau_commentaire_contact; + optimisation_numerotation = p.optimisation_numerotation; point_interne_delta_thetai_maxi = p.point_interne_delta_thetai_maxi; point_interne_prec_thetai_interne = p.point_interne_prec_thetai_interne; @@ -1097,8 +1107,19 @@ void ParaAlgoControle::Lecture_paraAlgoControle(UtilLecture & entreePrinc) {typeDeDecolement= (int) entreePrinc.lect_avec_const_double_utilisateur("TYPE_DE_DECOLLEMENT ");} else if (nom == "NB_MOY_GLISSANT") {nb_glissant= (int) entreePrinc.lect_avec_const_double_utilisateur("NB_MOY_GLISSANT ");} + else if (nom == "NIVEAU_COMMENTAIRE_LESCONTACTS") + {niveau_commentaire_lescontacts= (int) entreePrinc.lect_avec_const_double_utilisateur("NIVEAU_COMMENTAIRE_LESCONTACTS "); + } else if (nom == "NIVEAU_COMMENTAIRE_CONTACT") - {niveau_commentaire_contact= (int) entreePrinc.lect_avec_const_double_utilisateur("NIVEAU_COMMENTAIRE_CONTACT ");} + {if (strstr(entreePrinc.tablcar,"FCT_ND_NIVEAU_COMMENTAIRE_CONTACT")!=NULL) + {*(entreePrinc.entree) >> nom_inter >> fct_niveau_commentaire_contact; + niveau_commentaire_contact = -1; // valeur négative arbitraire + } + else + {niveau_commentaire_contact= (int) entreePrinc.lect_avec_const_double_utilisateur("NIVEAU_COMMENTAIRE_CONTACT "); + fct_niveau_commentaire_contact = "_"; + }; + } else if (nom == "OPTIMISATION_NUMEROTATION") {optimisation_numerotation= (int) entreePrinc.lect_avec_const_double_utilisateur("OPTIMISATION_NUMEROTATION ");} else @@ -1439,7 +1460,9 @@ void ParaAlgoControle::Ecriture_base_info_Para sort << "NB_DECOLLEMENT_MAXI " << nbDecolAutorise << "\n"; sort << "TYPE_DE_DECOLLEMENT " << typeDeDecolement << "\n"; sort << "NB_MOY_GLISSANT " << nb_glissant << "\n"; - sort << "NIVEAU_COMMENTAIRE_CONTACT "<< niveau_commentaire_contact << "\n"; + sort << "NIVEAU_COMMENTAIRE_LESCONTACTS "<< niveau_commentaire_lescontacts << "\n"; + sort << "NIVEAU_COMMENTAIRE_CONTACT "<< niveau_commentaire_contact + << "FCT_ND_NIVEAU_COMMENTAIRE_CONTACT"<< fct_niveau_commentaire_contact << "\n"; sort << "OPTIMISATION_NUMEROTATION "<< optimisation_numerotation << "\n"; // 7) paramètres liès aux énergies @@ -1648,6 +1671,9 @@ void ParaAlgoControle::Lecture_base_info_Para(ifstream& ent,const int cas) ent >> toto >> nbDecolAutorise ; ent >> toto >> typeDeDecolement ; ent >> toto >> nb_glissant ; + ent >> toto >> niveau_commentaire_lescontacts; + ent >> toto >> niveau_commentaire_contact >> toto >> fct_niveau_commentaire_contact; + ent >> toto >> optimisation_numerotation; // 7) paramètres liès aux énergies ent >> toto ; ent >> toto >> nb_incr_cal_ener ; @@ -1853,7 +1879,9 @@ void ParaAlgoControle::Affiche() const cout << "NB_DECOLLEMENT_MAXI " << nbDecolAutorise << "\n"; cout << "TYPE_DE_DECOLLEMENT " << typeDeDecolement << "\n"; cout << "NB_MOY_GLISSANT " << nb_glissant << "\n"; - cout << "NIVEAU_COMMENTAIRE_CONTACT " << niveau_commentaire_contact << "\n"; + cout << "NIVEAU_COMMENTAIRE_LESCONTACTS " << niveau_commentaire_lescontacts << "\n"; + cout << "NIVEAU_COMMENTAIRE_CONTACT " << niveau_commentaire_contact + << "FCT_ND_NIVEAU_COMMENTAIRE_CONTACT"<< fct_niveau_commentaire_contact << "\n"; cout << "OPTIMISATION_NUMEROTATION " << optimisation_numerotation << "\n"; // 7) paramètres liès aux énergies cout << "PARAMETRES_ENERGIES:\n"; @@ -2500,7 +2528,7 @@ void ParaAlgoControle::Info_commande_ParaAlgoControle(UtilLecture& entreePrinc) << "\n#--------------------------- " << "\n# PARAMETRE | VALEUR | " << "\n#--------------------------- "; - Tableau tab_modif(33,false); // indique qu'est-ce qui a été modifié + Tableau tab_modif(36,false); // indique qu'est-ce qui a été modifié //On va proposer un menu string repa=" "; cout << "\n --- controle generaux ------ "; @@ -2526,32 +2554,34 @@ void ParaAlgoControle::Info_commande_ParaAlgoControle(UtilLecture& entreePrinc) << "\n (15) NB_DECOLLEMENT_MAXI = 1 " << "\n (16) TYPE_DE_DECOLLEMENT = 0 " << "\n (17) NB_MOY_GLISSANT = 1 " - << "\n (18) NIVEAU_COMMENTAIRE_CONTACT = 0 " - << "\n (19) TYPE_PENALISATION_TANGENTIELLE = 2 " - << "\n (20) TANGENTIELLE_CONTACT_MAXI = 0.1 " - << "\n (21) TANGENTIELLE_BORNE_REGULARISATION = tres grand " - << "\n (22) FORCE_TANGENTIELLE_NOEUD_MAXI = tres grand " - << "\n (23) AJOUT_EXTRA_BOITE_PRELOCALISATION = 0. " - << "\n (24) OPTIMISATION_NUMEROTATION = 0 " - << "\n (25) FCT_ND_BASCUL_CONTACT_TYPE_4 = '_' " - << "\n (26) FCT_ND_PENALISATION_PENETRATION " - << "\n (27) FCT_ND_PENETRATION_CONTACT_MAXI " - << "\n (28) FCT_ND_PENETRATION_BORNE_REGULARISATION " - << "\n (29) FCT_ND_FORCE_CONTACT_NOEUD_MAXI " - << "\n (30) FCT_ND_PENALISATION_TANGENTIELLE " - << "\n (31) FCT_ND_TANGENTIELLE_CONTACT_MAXI " - << "\n (32) FCT_ND_TANGENTIELLE_BORNE_REGULARISATION " - << "\n (33) FCT_ND_FORCE_TANGENTIELLE_NOEUD_MAXI " - << "\n (34 ou h ou ? ) informations " + << "\n (18) NIVEAU_COMMENTAIRE_LESCONTACTS = 0 " + << "\n (19) NIVEAU_COMMENTAIRE_CONTACT = 0 " + << "\n (20) TYPE_PENALISATION_TANGENTIELLE = 2 " + << "\n (21) TANGENTIELLE_CONTACT_MAXI = 0.1 " + << "\n (22) TANGENTIELLE_BORNE_REGULARISATION = tres grand " + << "\n (23) FORCE_TANGENTIELLE_NOEUD_MAXI = tres grand " + << "\n (24) AJOUT_EXTRA_BOITE_PRELOCALISATION = 0. " + << "\n (25) OPTIMISATION_NUMEROTATION = 0 " + << "\n (26) FCT_ND_BASCUL_CONTACT_TYPE_4 = '_' " + << "\n (27) FCT_ND_PENALISATION_PENETRATION " + << "\n (28) FCT_ND_PENETRATION_CONTACT_MAXI " + << "\n (29) FCT_ND_PENETRATION_BORNE_REGULARISATION " + << "\n (30) FCT_ND_FORCE_CONTACT_NOEUD_MAXI " + << "\n (31) FCT_ND_PENALISATION_TANGENTIELLE " + << "\n (32) FCT_ND_TANGENTIELLE_CONTACT_MAXI " + << "\n (33) FCT_ND_TANGENTIELLE_BORNE_REGULARISATION " + << "\n (34) FCT_ND_FORCE_TANGENTIELLE_NOEUD_MAXI " + << "\n (35) FCT_ND_NIVEAU_COMMENTAIRE_CONTACT " + << "\n (36 ou h ou ? ) informations " << "\n "; repa = lect_return_defaut(false,"f"); if ((Minuscules(repa) == "f") || (Minuscules(repa) == "0"))// sortie directe break; int numa = ChangeEntier(repa); - if (repa == "?") numa = 34; + if (repa == "?") numa = 36; - if (!((numa >= 0)&&(numa<=34))) - { cout << "\n Erreur on attendait un entier entre 0 et 34 !!, " + if (!((numa >= 0)&&(numa<=36))) + { cout << "\n Erreur on attendait un entier entre 0 et 36 !!, " << "\n redonnez une bonne valeur" << "\n ou taper f ou 0 pour arreter le programme"; }; @@ -2563,7 +2593,7 @@ void ParaAlgoControle::Info_commande_ParaAlgoControle(UtilLecture& entreePrinc) switch (numa) { case 0: // sortie { break;} // normalement cela a déjà été filtré avant - case 6: case 8: case 14: case 15: case 16: case 17: case 18: case 19: case 24: + case 6: case 8: case 14: case 15: case 16: case 17: case 18: case 19: case 20: case 25: { cout << "\n nouvelle valeur (un entier ) ? "; string_inter= lect_chaine();cout << " valeur lue ="< #include // pour les interruptions systèmes +#include "Tableau_T.h" #include "UtilLecture.h" #include "EnumTypeCalcul.h" #include "VariablesTemps.h" @@ -72,6 +73,14 @@ using namespace std; #include "Enum_GrandeurGlobale.h" #include "EnumTypeGrandeur.h" +#ifdef UTILISATION_MPI + #include "mpi.h" + #include + #include + #include + #include + namespace mpi = boost::mpi; +#endif /** @defgroup Les_parametres_generaux * @@ -128,6 +137,28 @@ class ParaGlob // change l'ensemble des paramètres de contrôles qui sont actuellement "actifs" void ChangeParaAlgoControleActifs( ParaAlgoControle * para) {paraAlgoControle = para;}; + #ifdef UTILISATION_MPI + //-- pour le calcul parallèle + // récup de l'environnement et init + static boost::mpi::environment * Environnement() { return env;}; + static void Init_boost_environnement(boost::mpi::environment * pt_env) + {env = pt_env;}; + // récup du communicateur global et init + static boost::mpi::communicator * Monde() {return world;}; + static void Init_boost_communicator (boost::mpi::communicator * pt_world) + {world = pt_world;}; + // -- equilibrage d'éléments + void Init_tableau (const Tableau > >* tab_list_maillage_element) + {tab_list_mail_element = tab_list_maillage_element;}; + // retour des listes des éléments relatif au cpu en cours, c-a-d pour tous les maillages + // tab (j) donne la liste des éléments pour le maillage j + const Tableau < list > & const_List_element_CPU_en_cours() const + {return (*tab_list_mail_element)(world->rank());}; + // spécifiquement, la liste des éléments pour le maillage j + const list & const_List_element_CPU_en_cours(int j) const + {return (*tab_list_mail_element)(world->rank())(j);}; + #endif + // lecture du type de calcul et d'une liste de sous_type éventuel void LecTypeCalcul(UtilLecture& lec); @@ -350,8 +381,8 @@ class ParaGlob std::map < string, const void * , std::less > listegrandeurs_par_string; double * pt_temps_courant; // pointeur interne pour lier TEMPS_COURANT avec tempo - private : - static EnumLangue langueHZ; // langue utilisée pour les entrées sorties + private : + static EnumLangue langueHZ; // langue utilisée pour les entrées sorties static int dimensionPb; // dimension du probleme = 1 unidimensionnel par defaut int chdimensionPb ; // blocage de la dimension // nombre de composantes des tenseurs en absolu @@ -365,6 +396,16 @@ class ParaGlob static int nb_diggit_double_calcul; static int nb_diggit_double_graphique; static int nb_diggit_double_ecran; + #ifdef UTILISATION_MPI + // -- pour le calcul parallèle + static boost::mpi::environment * env; // environnement global + static boost::mpi::communicator * world; // le communicateur global + // -- equilibrage d'éléments + // tab_list_maillage_element(i)(j) contient la liste + // pour le maillage j des num <élément> associés au cpu i + // ici il s'agit d'une copie de tab_list_maillage_element qui doit être mise à jour par Distribution_CPU + const Tableau > >* tab_list_mail_element; + #endif //------------ info sur le temps --------------- // c'est paraAlgoControle qui gère le temps, cependant paraglob sert de relais pour // ramené les infos sur le temps diff --git a/References/Lect_reference.cc b/References/Lect_reference.cc index 67fb294..884463f 100644 --- a/References/Lect_reference.cc +++ b/References/Lect_reference.cc @@ -1 +1 @@ -// FICHIER : Lecture_reference.cp #include #include #include #include #include #include "Lect_reference.h" Tableau Lect_reference (char* nom_fichier) // LECTURE DES REFERENCES DU MAILLAGE ET STOCKAGE DE TOUTES LES // REFERENCES DANS UN TABLEAU { FILE* fichier; char ligne[80]; // *** Ouverture du fichier de donnees *** if ( (fichier=fopen(nom_fichier,"r"))==NULL ) { cout << "ERREUR D'OUVERTURE DU FICHIER :"; cout << nom_fichier << "\n"; exit(1); }; // *** Calcul du nombre de reference *** // ( et sauvegarde de l'indicateur de position des lignes // du fichier ou sont definies des references ) unsigned long int position=0; //indicateur de position dans le fichier lu Liste liste_posit; // liste contenant des positions correspondant // a la definition d'une reference // num_ligne est le numero de la derniere ligne lue (utile pour // les messages d'erreur) int num_ligne=0; // Parcours de l'ensemble du fichier et stockage dans liste_posit_ref // des indicateurs de position while ( feof(fichier)==0 ) { position=ftell(fichier);// sauvegarde dans position de la position // courante dans le fichier num_ligne=num_ligne+1; if ( (fgets(ligne,80,fichier)==NULL) && (feof(fichier)==0) ) { cout << "ERREUR DE LECTURE DU FICHIER :"; cout << nom_fichier << "\n"; cout << "Numero de la derniere ligne lue correctement :"; cout << (num_ligne-1) << "\n"; exit(1); }; if ( (strstr(ligne,"N_R")!=NULL) || (strstr(ligne,"E_R")!=NULL) || (strstr(ligne,"F_R")!=NULL) || (strstr(ligne,"A_R")!=NULL) ) // presence d'un nom de reference liste_posit.Ajout(position); ligne[0]='\0'; }; if ( liste_posit.Nombre()==0 ) { cout << "ERREUR DE LECTURE DU FICHIER : "; cout << nom_fichier << "\n"; cout << "Aucune reference n'a ete trouve !\n"; }; // *** Lecture des noms et des numeros des references *** // *** Stockage des informations dans tab_ref *** rewind(fichier); Tableau tab_ref(liste_posit.Nombre()); // Positionnement sur le premier element de liste_posit liste_posit.Debut(); // Placement de l'indicateur de position sur une ligne // definissant une reference et lecture des donnees de la // reference errno=0; for (int i=1;i<=liste_posit.Nombre();i++) { char nom_ref[10]; int numero=0; Liste liste_num; // liste des numeros d'une reference fseek(fichier,liste_posit.Element(),SEEK_SET); fscanf(fichier,"%10s",nom_ref); // lecture du nom de la reference if ( feof(fichier)!=0 ) { cout << "ERREUR DE LECTURE DU FICHIER :"; cout << nom_fichier << "\n"; cout << "Fin du fichier atteinte avant la lecture"; cout << " totale des donnees !\n"; exit(1); }; if ( errno!=0 ) { cout << "ERREUR DE LECTURE DU FICHIER : "; cout << nom_fichier << "\n"; if ( i>1 ) { cout << "Nom de la derniere reference lue correctement : "; cout << tab_ref(i-1).Nom() << "\n"; exit(1); } else { cout << "Probleme de lecture de la premiere reference\n"; exit(1); }; }; while ( fscanf(fichier,"%d", &numero)==1 ) // lecture des numeros d'une reference et stockage dans liste_num liste_num.Ajout(numero); if ( liste_num.Nombre()==0 ) { cout << "ERREUR DE LECTURE DU FICHIER : "; cout << nom_fichier << "\n"; cout << "La reference de nom " << nom_ref << " est vide \n"; }; Tableau tab_num(liste_num.Nombre()); liste_num.Debut(); for (int j=1;j<=liste_num.Nombre();j++) // stockage a partir de la liste des numeros liste_num de l'ensemble // des numeros d'une reference dans le tableau tab_num { tab_num(j)=liste_num.Element(); liste_num.Suivant(); }; Reference ref(tab_num,nom_ref); tab_ref(i)=ref; // sauvegarde de l'ensemble des donnees d'une reference dans tab_ref liste_posit.Suivant(); }; // *** Fermeture du fichier de donnees *** if ( fclose(fichier)==-1 ) { cout << " ERREUR DE FERMETURE DU FICHIER "; cout << nom_fichier << "\n"; exit(1); }; // *** Renvoie du tableau de reference *** return tab_ref; }; \ No newline at end of file +// FICHIER : Lecture_reference.cc // 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 #include #include #include #include #include "Lect_reference.h" Tableau Lect_reference (char* nom_fichier) // LECTURE DES REFERENCES DU MAILLAGE ET STOCKAGE DE TOUTES LES // REFERENCES DANS UN TABLEAU { FILE* fichier; char ligne[80]; // *** Ouverture du fichier de donnees *** if ( (fichier=fopen(nom_fichier,"r"))==NULL ) { cout << "ERREUR D'OUVERTURE DU FICHIER :"; cout << nom_fichier << "\n"; exit(1); }; // *** Calcul du nombre de reference *** // ( et sauvegarde de l'indicateur de position des lignes // du fichier ou sont definies des references ) unsigned long int position=0; //indicateur de position dans le fichier lu Liste liste_posit; // liste contenant des positions correspondant // a la definition d'une reference // num_ligne est le numero de la derniere ligne lue (utile pour // les messages d'erreur) int num_ligne=0; // Parcours de l'ensemble du fichier et stockage dans liste_posit_ref // des indicateurs de position while ( feof(fichier)==0 ) { position=ftell(fichier);// sauvegarde dans position de la position // courante dans le fichier num_ligne=num_ligne+1; if ( (fgets(ligne,80,fichier)==NULL) && (feof(fichier)==0) ) { cout << "ERREUR DE LECTURE DU FICHIER :"; cout << nom_fichier << "\n"; cout << "Numero de la derniere ligne lue correctement :"; cout << (num_ligne-1) << "\n"; exit(1); }; if ( (strstr(ligne,"N_R")!=NULL) || (strstr(ligne,"E_R")!=NULL) || (strstr(ligne,"F_R")!=NULL) || (strstr(ligne,"A_R")!=NULL) ) // presence d'un nom de reference liste_posit.Ajout(position); ligne[0]='\0'; }; if ( liste_posit.Nombre()==0 ) { cout << "ERREUR DE LECTURE DU FICHIER : "; cout << nom_fichier << "\n"; cout << "Aucune reference n'a ete trouve !\n"; }; // *** Lecture des noms et des numeros des references *** // *** Stockage des informations dans tab_ref *** rewind(fichier); Tableau tab_ref(liste_posit.Nombre()); // Positionnement sur le premier element de liste_posit liste_posit.Debut(); // Placement de l'indicateur de position sur une ligne // definissant une reference et lecture des donnees de la // reference errno=0; for (int i=1;i<=liste_posit.Nombre();i++) { char nom_ref[10]; int numero=0; Liste liste_num; // liste des numeros d'une reference fseek(fichier,liste_posit.Element(),SEEK_SET); fscanf(fichier,"%10s",nom_ref); // lecture du nom de la reference if ( feof(fichier)!=0 ) { cout << "ERREUR DE LECTURE DU FICHIER :"; cout << nom_fichier << "\n"; cout << "Fin du fichier atteinte avant la lecture"; cout << " totale des donnees !\n"; exit(1); }; if ( errno!=0 ) { cout << "ERREUR DE LECTURE DU FICHIER : "; cout << nom_fichier << "\n"; if ( i>1 ) { cout << "Nom de la derniere reference lue correctement : "; cout << tab_ref(i-1).Nom() << "\n"; exit(1); } else { cout << "Probleme de lecture de la premiere reference\n"; exit(1); }; }; while ( fscanf(fichier,"%d", &numero)==1 ) // lecture des numeros d'une reference et stockage dans liste_num liste_num.Ajout(numero); if ( liste_num.Nombre()==0 ) { cout << "ERREUR DE LECTURE DU FICHIER : "; cout << nom_fichier << "\n"; cout << "La reference de nom " << nom_ref << " est vide \n"; }; Tableau tab_num(liste_num.Nombre()); liste_num.Debut(); for (int j=1;j<=liste_num.Nombre();j++) // stockage a partir de la liste des numeros liste_num de l'ensemble // des numeros d'une reference dans le tableau tab_num { tab_num(j)=liste_num.Element(); liste_num.Suivant(); }; Reference ref(tab_num,nom_ref); tab_ref(i)=ref; // sauvegarde de l'ensemble des donnees d'une reference dans tab_ref liste_posit.Suivant(); }; // *** Fermeture du fichier de donnees *** if ( fclose(fichier)==-1 ) { cout << " ERREUR DE FERMETURE DU FICHIER "; cout << nom_fichier << "\n"; exit(1); }; // *** Renvoie du tableau de reference *** return tab_ref; }; \ No newline at end of file diff --git a/References/Lect_reference.h b/References/Lect_reference.h index 9adf0d3..41a8bc6 100644 --- a/References/Lect_reference.h +++ b/References/Lect_reference.h @@ -1,5 +1,37 @@ +/*! \file Lect_reference.h + \brief Lecture des references definies dans le fichier au format ".lis" de nom : nom_fichier +*/ // FICHIER : Lect_reference.h +// 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: . + + #ifndef LECT_REFERENCE_H #define LECT_REFERENCE_H @@ -10,8 +42,13 @@ #include "Tableau_T.h" -// Lecture des references definies dans le fichier au format ".lis" de nom : nom_fichier +/// @addtogroup Les_classes_Reference +/// @{ +/// + +/// Lecture des references definies dans le fichier au format ".lis" de nom : nom_fichier Tableau Lect_reference (char* nom_fichier); +/// @} // end of group -#endif \ No newline at end of file +#endif diff --git a/References/LesReferences.cc b/References/LesReferences.cc index 86a7892..7a3ef10 100644 --- a/References/LesReferences.cc +++ b/References/LesReferences.cc @@ -1,9 +1,39 @@ +// 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 "LesReferences.h" #include "PtTabRel.h" #include "ReferenceAF.h" #include "ReferenceNE.h" #include "ReferencePtiAF.h" +#include "ParaGlob.h" //-------- une méthode permettant d'utiliser des tableaux de map de références ----- // surcharge de l'operator d'ecriture diff --git a/References/LesReferences.h b/References/LesReferences.h index 71e1f7c..6be6a24 100644 --- a/References/LesReferences.h +++ b/References/LesReferences.h @@ -1,13 +1,36 @@ + +// 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: . + /************************************************************************ - * UNIVERSITE DE BRETAGNE SUD --- I.U.P/I.U.T. DE LORIENT * - ************************************************************************ - * LABORATOIRE DE GENIE MECANIQUE ET MATERIAUX * - * Tel 97.80.80.60 * - * Centre de Genie Industriel 56520 GUIDEL-PLAGES * - ************************************************************************ * DATE: 23/01/97 * * $ * - * AUTEUR: G RIO * + * AUTEUR: G RIO (mailto:gerardrio56@free.fr) * * $ * * PROJET: Herezh++ * * $ * @@ -36,11 +59,32 @@ #include "UtilLecture.h" #include "MotCle.h" +/// @addtogroup Les_classes_Reference +/// @{ +/// + +/// Gestion des listes de references. +/// +/// \author Gérard Rio +/// \version 1.0 +/// \date 23/01/97 + //-------- une méthode permettant d'utiliser des tableaux de map de références ----- // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort, const map < string, Reference*, std::less > & ); //----------- fin de la méthode permettant d'utiliser des tableaux de map de références ----- +/// @} // end of group + +/// @addtogroup Les_classes_Reference +/// @{ +/// + +/// Gestion des listes de references. +/// +/// \author Gérard Rio +/// \version 1.0 +/// \date 23/01/97 class LesReferences { @@ -200,5 +244,6 @@ class LesReferences }; - + /// @} // end of group + #endif diff --git a/References/Reference.cc b/References/Reference.cc index 8056cc5..e7537de 100644 --- a/References/Reference.cc +++ b/References/Reference.cc @@ -1,6 +1,35 @@ -// FICHIER : Reference.cp +// FICHIER : Reference.cc // CLASSE : Reference +// 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 "Reference.h" diff --git a/References/Reference.h b/References/Reference.h index ecc09a9..b113fe1 100644 --- a/References/Reference.h +++ b/References/Reference.h @@ -1,16 +1,38 @@ // FICHIER : Reference.h // CLASSE : Reference + +// 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: . + /************************************************************************ - * UNIVERSITE DE BRETAGNE SUD (UBS) --- I.U.P/I.U.T. DE LORIENT * - ************************************************************************ - * LABORATOIRE DE GENIE MECANIQUE ET MATERIAUX (LG2M) * - * Centre de Recherche Bvd Flandres Dunkerque - 56325 Lorient Cedex * - * tel. 02.97.87.45.70 fax. 02.97.87.45.72 http://www-lg2m.univ-ubs.fr * - ************************************************************************ * DATE: 06/02/00 * * $ * - * AUTEUR: G RIO (mailto:gerard.rio@univ-ubs.fr) * - * Tel 0297874571 fax : 02.97.87.45.72 * + * AUTEUR: G RIO (mailto:gerardrio56@free.fr) * * $ * * PROJET: Herezh++ * * $ * @@ -34,6 +56,18 @@ * $ * ************************************************************************/ +/** @defgroup Les_classes_Reference +* +* BUT: Definir les différentes références +* de noeuds, d'élément, d'aretes, de faces, de pti etc.. +* +* +* \author Gérard Rio +* \version 1.0 +* \date 06/02/00 +* \brief Definir les différentes références de noeuds, d'élément, d'aretes, de faces, de pti etc.. +* +*/ #ifndef REFERENCE_H #define REFERENCE_H @@ -47,7 +81,20 @@ #include #include "MotCle.h" -class Reference +/// @addtogroup Les_classes_Reference +/// @{ +/// + +/// class Reference: classe général virtuel des références. Les classes dérivées +/// permettent de définir précisemment les différentes références : +/// de noeuds, d'élément, d'aretes, de faces etc.. +/// Une instance de la classe s'identifie a partir d'un nom +/// +/// \author Gérard Rio +/// \version 1.0 +/// \date 06/02/00 + +class Reference { public : @@ -165,6 +212,7 @@ class Reference void Ecrit_int_base_info(ofstream& sort); }; +/// @} // end of group #ifndef MISE_AU_POINT #include "Reference.cc" diff --git a/References/ReferenceAF.cc b/References/ReferenceAF.cc index 99dc4c3..cbf3f18 100644 --- a/References/ReferenceAF.cc +++ b/References/ReferenceAF.cc @@ -1,9 +1,39 @@ -// FICHIER : ReferenceAF.cp +// FICHIER : ReferenceAF.cc // CLASSE : ReferenceAF +// 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 "ReferenceAF.h" #include "PtTabRel.h" +#include "ParaGlob.h" #ifndef REFERENCEAF_H_deja_inclus diff --git a/References/ReferenceAF.h b/References/ReferenceAF.h index 7d56118..b94724c 100644 --- a/References/ReferenceAF.h +++ b/References/ReferenceAF.h @@ -1,17 +1,39 @@ // FICHIER : ReferenceAF.h // CLASSE : ReferenceAF +// 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: . + + /************************************************************************ - * UNIVERSITE DE BRETAGNE SUD (UBS) --- I.U.P/I.U.T. DE LORIENT * - ************************************************************************ - * LABORATOIRE DE GENIE MECANIQUE ET MATERIAUX (LG2M) * - * Centre de Recherche Rue de Saint Maudé - 56325 Lorient cedex * - * tel. 02.97.87.45.70 fax. 02.97.87.45.72 http://www-lg2m.univ-ubs.fr * - ************************************************************************ * DATE: 23/01/97 * * $ * - * AUTEUR: G RIO (mailto:gerard.rio@univ-ubs.fr) * - * Tel 0297874571 fax : 02.97.87.45.72 * + * AUTEUR: G RIO (mailto:gerardrio56@free.fr) * * $ * * PROJET: Herezh++ * * $ * @@ -40,6 +62,16 @@ #include "Reference.h" +/// @addtogroup Les_classes_Reference +/// @{ +/// + +/// Def, stockage et manipulation des références pour les faces et les arêtes +/// +/// \author Gérard Rio +/// \version 1.0 +/// \date 23/01/97 + class ReferenceAF : public Reference { public : @@ -167,6 +199,7 @@ class ReferenceAF : public Reference // ou noeud d'element, ou de points d'intégrations d'élément }; +/// @} // end of group #ifndef MISE_AU_POINT #include "ReferenceAF.cc" diff --git a/References/ReferenceFA.h b/References/ReferenceFA.h old mode 100644 new mode 100755 diff --git a/References/ReferenceNE.cc b/References/ReferenceNE.cc index 49771c4..db08f1e 100644 --- a/References/ReferenceNE.cc +++ b/References/ReferenceNE.cc @@ -1,9 +1,39 @@ -// FICHIER : ReferenceNE.cp +// FICHIER : ReferenceNE.cc // CLASSE : ReferenceNE +// 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 "ReferenceNE.h" #include "PtTabRel.h" +#include "ParaGlob.h" #ifndef REFERENCENE_H_deja_inclus diff --git a/References/ReferenceNE.h b/References/ReferenceNE.h index 3283dce..5518f6c 100644 --- a/References/ReferenceNE.h +++ b/References/ReferenceNE.h @@ -1,17 +1,39 @@ // FICHIER : ReferenceNE.h // CLASSE : ReferenceNE +// 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: . + + /************************************************************************ - * UNIVERSITE DE BRETAGNE SUD (UBS) --- I.U.P/I.U.T. DE LORIENT * - ************************************************************************ - * LABORATOIRE DE GENIE MECANIQUE ET MATERIAUX (LG2M) * - * Centre de Recherche Rue de Saint Maudé - 56325 Lorient cedex * - * tel. 02.97.87.45.70 fax. 02.97.87.45.72 http://www-lg2m.univ-ubs.fr * - ************************************************************************ * DATE: 23/01/97 * * $ * - * AUTEUR: G RIO (mailto:gerard.rio@univ-ubs.fr) * - * Tel 0297874571 fax : 02.97.87.45.72 * + * AUTEUR: G RIO (mailto:gerardrio56@free.fr) * * $ * * PROJET: Herezh++ * * $ * @@ -40,6 +62,16 @@ #include "Reference.h" +/// @addtogroup Les_classes_Reference +/// @{ +/// + +/// Def, stockage et manipulation des références pour les noeuds et les éléments +/// +/// \author Gérard Rio +/// \version 1.0 +/// \date 06/02/00 + class ReferenceNE : public Reference { public : @@ -148,6 +180,7 @@ class ReferenceNE : public Reference Tableau tab_num; // tableau des numeros de noeuds ou d'élément de la reference }; +/// @} // end of group #ifndef MISE_AU_POINT #include "ReferenceNE.cc" diff --git a/References/ReferencePtiAF.cc b/References/ReferencePtiAF.cc index e15610c..56b6f88 100755 --- a/References/ReferencePtiAF.cc +++ b/References/ReferencePtiAF.cc @@ -1,9 +1,39 @@ // FICHIER : ReferencePtiAF.cc // CLASSE : ReferencePtiAF +// 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 "ReferencePtiAF.h" #include "PtTabRel.h" +#include "ParaGlob.h" #ifndef REFERENCEPTIAF_H_deja_inclus diff --git a/References/ReferencePtiAF.h b/References/ReferencePtiAF.h index 59367b6..10e1a64 100755 --- a/References/ReferencePtiAF.h +++ b/References/ReferencePtiAF.h @@ -1,17 +1,39 @@ // FICHIER : ReferencePtiAF.h // CLASSE : ReferencePtiAF +// 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: . + + /************************************************************************ - * UNIVERSITE DE BRETAGNE SUD (UBS) --- LORIENT * - ************************************************************************ - * IRDL - Equipe DE GENIE MECANIQUE ET MATERIAUX (EG2M) * - * Centre de Recherche Rue de Saint Maudé - 56325 Lorient cedex * - * tel. 02.97.32.82.47 http://IRDL.fr * - ************************************************************************ * DATE: 22/04/2020 * * $ * - * AUTEUR: G RIO (mailto:gerard.rio@univ-ubs.fr) * - * Tel 0297874571 fax : 02.97.87.45.72 * + * AUTEUR: G RIO (mailto:gerardrio56@free.fr) * * $ * * PROJET: Herezh++ * * $ * @@ -40,6 +62,16 @@ #include "Reference.h" +/// @addtogroup Les_classes_Reference +/// @{ +/// + +/// Def, stockage et manipulation des références pour les pti de faces et d'arêtes +/// +/// \author Gérard Rio +/// \version 1.0 +/// \date 22/04/2020 + class ReferencePtiAF : public Reference { public : @@ -179,6 +211,7 @@ class ReferencePtiAF : public Reference Tableau tab_pti; // tableau des points d'intégrations }; +/// @} // end of group #ifndef MISE_AU_POINT #include "ReferencePtiAF.cc" diff --git a/References/Reference_static.cc b/References/Reference_static.cc index 2235e93..39abd07 100644 --- a/References/Reference_static.cc +++ b/References/Reference_static.cc @@ -1,10 +1,48 @@ -// FICHIER : ReferenceNE.cp +/*! \file ReferenceNE.cc + \brief def d'une variable static motCle +*/ +// FICHIER : ReferenceNE.cc // CLASSE : ReferenceNE +// 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 "ReferenceNE.h" #include "PtTabRel.h" -// --------------- variables statiques --------- - MotCle Reference::motCle; // liste des mots clés +/// @addtogroup Les_classes_Reference +/// @{ +/// + +/// --------------- variables statiques --------- + MotCle Reference::motCle; /// liste des mots clés +/// @} // end of group diff --git a/Resolin/Matrices/ExceptionsMatrices.h b/Resolin/Matrices/ExceptionsMatrices.h index 9df5606..c277ee7 100755 --- a/Resolin/Matrices/ExceptionsMatrices.h +++ b/Resolin/Matrices/ExceptionsMatrices.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resolin/Matrices/MatBand.cc b/Resolin/Matrices/MatBand.cc index 574edd0..5c8ea68 100644 --- a/Resolin/Matrices/MatBand.cc +++ b/Resolin/Matrices/MatBand.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -32,6 +32,7 @@ #include #include "CharUtil.h" #include "MatDiag.h" +#include "ParaGlob.h" // par defaut diff --git a/Resolin/Matrices/MatBand.h b/Resolin/Matrices/MatBand.h index 2dac6c1..1cdcc26 100644 --- a/Resolin/Matrices/MatBand.h +++ b/Resolin/Matrices/MatBand.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resolin/Matrices/MatDiag.cc b/Resolin/Matrices/MatDiag.cc index 95b62b5..3c64b9e 100644 --- a/Resolin/Matrices/MatDiag.cc +++ b/Resolin/Matrices/MatDiag.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resolin/Matrices/MatDiag.h b/Resolin/Matrices/MatDiag.h index 1b08493..b3852d7 100644 --- a/Resolin/Matrices/MatDiag.h +++ b/Resolin/Matrices/MatDiag.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resolin/Matrices/Mat_abstraite.cc b/Resolin/Matrices/Mat_abstraite.cc index 6d0dc36..6738365 100644 --- a/Resolin/Matrices/Mat_abstraite.cc +++ b/Resolin/Matrices/Mat_abstraite.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -34,6 +34,7 @@ #include "MathUtil.h" #include #include "CharUtil.h" +#include "ParaGlob.h" // partie relative à la résolution #include "vecdefs_GR.h" // modif GR diff --git a/Resolin/Matrices/Mat_abstraite.h b/Resolin/Matrices/Mat_abstraite.h index e174bf7..66e34e5 100644 --- a/Resolin/Matrices/Mat_abstraite.h +++ b/Resolin/Matrices/Mat_abstraite.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -66,6 +66,11 @@ #ifndef MAT_ABSTRAITE_H #define MAT_ABSTRAITE_H +#ifdef UTILISATION_MPI + #include + #include +#endif + #include "mvvtp_GR.h" // classe template MV++ #include "Vecteur.h" #include "Tableau_T.h" @@ -394,7 +399,20 @@ class Mat_abstraite Enum_preconditionnement type_preconditionnement; // le type éventuelle de préconditionnement // pour la méthode "résidu minimal généralisé" - + + #ifdef UTILISATION_MPI + friend class boost::serialization::access; + // When the class Archive corresponds to an output archive, the + // & operator is defined similar to <<. Likewise, when the class Archive + // is a type of input archive the & operator is defined similar to >>. + template + void serialize(Archive & ar, const unsigned int version) + { + ar & type_matrice; + ar & type_resolution; + ar & type_preconditionnement; + } + #endif // Méthodes protégées : // Resolution du systeme Ax=b , méthodes générales pouvant être appelées par les classes dérivée // en entrée : b : comme second membre diff --git a/Resolin/Matrices/Mat_pleine.cc b/Resolin/Matrices/Mat_pleine.cc index 29dae0a..b734176 100644 --- a/Resolin/Matrices/Mat_pleine.cc +++ b/Resolin/Matrices/Mat_pleine.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -41,6 +41,7 @@ using namespace std; //introduces namespace std #include "MathUtil.h" #include "Mat_pleine.h" #include "MatDiag.h" +#include "ParaGlob.h" #ifndef Mat_pleine_H_deja_inclus @@ -49,7 +50,8 @@ using namespace std; //introduces namespace std inline #endif Mat_pleine::Mat_pleine (): - Mat_abstraite(RECTANGLE,CHOLESKY,RIEN_PRECONDITIONNEMENT),val() + Mat_abstraite(RECTANGLE,CHOLESKY,RIEN_PRECONDITIONNEMENT) + ,val_de_base(),val() { }; // Constructeur utile quand les dimensions de la matrice sont connues @@ -58,12 +60,16 @@ Mat_pleine::Mat_pleine (): #endif Mat_pleine::Mat_pleine (int nb_ligne,int nb_colonne,double val_init): Mat_abstraite(RECTANGLE,CHOLESKY,RIEN_PRECONDITIONNEMENT) + ,val_de_base(nb_ligne*nb_colonne) { if (nb_ligne == nb_colonne) {type_matrice = CARREE; if (nb_ligne < 4) // par défaut pour de petite matrice on utilise cramer type_resolution = CRAMER; }; - Initialise(nb_ligne,nb_colonne,val_init); + Creation_tab_val(nb_ligne,nb_colonne); + Initialise(val_init); + +// Initialise(nb_ligne,nb_colonne,val_init); }; // Constructeur de copie @@ -71,15 +77,38 @@ Mat_pleine::Mat_pleine (int nb_ligne,int nb_colonne,double val_init): inline #endif Mat_pleine::Mat_pleine (const Mat_pleine& mat_pl) : - Mat_abstraite(mat_pl) - { val=mat_pl.val; }; - + Mat_abstraite(mat_pl),val_de_base(mat_pl.val_de_base) + {Creation_tab_val(mat_pl.Nb_ligne(),mat_pl.Nb_colonne()); + }; + +/// --------- cas très particulier d'un vecteur val_de_base lié +/// --------- utilisé uniquement par des classes friend +// c-a-d qui ne gère pas sa mémoire -> memoire = false +/// il s'agit d'un tuillage, val_de_base est positionné a "vec" +/// aucun test n'est fait concernant la taille disponible à partir de "vec" +/// routine dangereuse !!!!! +/// avec_recopie == true : les infos de mat_pl sont recopiées, sinon non +#ifndef MISE_AU_POINT + inline +#endif +Mat_pleine::Mat_pleine(bool avec_recopie,double* vec, const Mat_pleine& mat_pl) : + Mat_abstraite(mat_pl),val_de_base(mat_pl.val_de_base.Taille(),vec,false) + {Creation_tab_val(mat_pl.Nb_ligne(),mat_pl.Nb_colonne()); + if (avec_recopie) + val_de_base = mat_pl.val_de_base; + }; + #ifndef MISE_AU_POINT inline #endif Mat_pleine::~Mat_pleine () // Destructeur -{ }; +{ // val_de_base est automatiquement détruit + int nb_ligne = val.Taille(); + for (int i =1;i<=nb_ligne;i++) + delete val(i); // en fait ne fait pas grand chose !! car il s'agit + // de vecteurs liés, on pourrait zapper ! +}; // fonction permettant de creer une nouvelle instance d'element @@ -108,30 +137,32 @@ Mat_abstraite & Mat_pleine::operator = ( const Mat_abstraite & b) << Nom_matrice(type_matrice) << " " << Nom_matrice(b.Type_matrice()) << '\n'; cout << "Mat_pleine::operator = ( const Mat_abstraite & b)" << endl; Sortie(1); - } + }; // #endif const Mat_pleine & mat_pl = *((Mat_pleine*) & b); - if ( val.Taille() != 0 ) - // cas ou la matrice se trouvant a gauche du signe = n'est pas vide - { - Libere(); // desallocation de ce vecteur - }; - // traitement---- - // cas ou la matrice se trouvant a droite du signe = est vide - // on a rien a faire car de toute manière la matrice this viens d'être - // supprimé dans le cas où elle était non nul - if ( mat_pl.Nb_ligne()!=0 ) - // autres cas - { - int taill_ligne = mat_pl.Nb_ligne(); - val.Change_taille(taill_ligne); - for (int i=1;i<=taill_ligne;i++) - // affectation de la ieme ligne de la matrice mat_pl a la ieme ligne - // de la matrice courante - val(i)=mat_pl(i); - }; - return (*this); - + // et on affecte entre matrices Mat_pleine + *this = mat_pl; + +// if ( val.Taille() != 0 ) +// // cas ou la matrice se trouvant a gauche du signe = n'est pas vide +// { +// Libere(); // desallocation de ce vecteur +// }; +// // traitement---- +// // cas ou la matrice se trouvant a droite du signe = est vide +// // on a rien a faire car de toute manière la matrice this viens d'être +// // supprimé dans le cas où elle était non nul +// if ( mat_pl.Nb_ligne()!=0 ) +// // autres cas +// { +// int taill_ligne = mat_pl.Nb_ligne(); +// val.Change_taille(taill_ligne); +// for (int i=1;i<=taill_ligne;i++) +// // affectation de la ieme ligne de la matrice mat_pl a la ieme ligne +// // de la matrice courante +// val(i)=mat_pl(i); +// }; + return (*this); }; // transfert des informations de *this dans la matrice passée en paramètre @@ -145,7 +176,7 @@ Mat_abstraite & Mat_pleine::operator = ( const Mat_abstraite & b) int nb_ligne = val.Taille(); int nb_col = Nb_colonne(); for (int i=1;i<=nb_ligne;i++) - { Vecteur& vee = val(i); + { Vecteur& vee = *(val(i)); for (int j=1;j<= nb_col; j++) b(i,j)=vee(j); }; @@ -157,27 +188,44 @@ Mat_abstraite & Mat_pleine::operator = ( const Mat_abstraite & b) Mat_pleine& Mat_pleine::operator= ( const Mat_pleine& mat_pl) // Surcharge de l'operateur = : affectation d'une matrice a une autre // il y a ajustement automatique de taille de la matrice en fonction de mat_pl -{ if ( val.Taille() != 0 ) - // cas ou la matrice se trouvant a gauche du signe = n'est pas vide - { - Libere(); // desallocation de ce vecteur - }; - // traitement---- - // cas ou la matrice se trouvant a droite du signe = est vide - // on a rien a faire car de toute manière la matrice this viens d'être - // supprimé dans le cas où elle était non nul - if ( mat_pl.Nb_ligne()!=0 ) - // autres cas - { - int taill_ligne = mat_pl.Nb_ligne(); - val.Change_taille(taill_ligne); - for (int i=1;i<=taill_ligne;i++) - // affectation de la ieme ligne de la matrice mat_pl a la ieme ligne - // de la matrice courante - val(i)=mat_pl(i); - }; - return (*this); - +{ if (val_de_base.Taille() == mat_pl.val_de_base.Taille()) + // l'ensemble à la même taille, on regarde le nombre de colonne + {if (mat_pl.Nb_ligne() != val.Taille()) + // on a la même taille globale mais pas le même nombre de ligne + // il faut changer le tableau des lignes + {Change_tailles_tab_val(mat_pl.Nb_ligne(),mat_pl.Nb_colonne()); + }; + // sinon on ne fait rien car tout est ok + } + else // cas ou val_de_base n'a pas la bonne taille + // on réaffecte + { val_de_base.Change_taille(mat_pl.val_de_base.Taille()); + // on change le tableau val des vecteurs liés + Change_tailles_tab_val(mat_pl.Nb_ligne(),mat_pl.Nb_colonne()); + }; + // toutes les tailles sont ok on peut affecter globalement + val_de_base = mat_pl.val_de_base; + +//if ( val.Taille() != 0 ) +// // cas ou la matrice se trouvant a gauche du signe = n'est pas vide +// { +// Libere(); // desallocation de ce vecteur +// }; +// // traitement---- +// // cas ou la matrice se trouvant a droite du signe = est vide +// // on a rien a faire car de toute manière la matrice this viens d'être +// // supprimé dans le cas où elle était non nul +// if ( mat_pl.Nb_ligne()!=0 ) +// // autres cas +// { +// int taill_ligne = mat_pl.Nb_ligne(); +// val.Change_taille(taill_ligne); +// for (int i=1;i<=taill_ligne;i++) +// // affectation de la ieme ligne de la matrice mat_pl a la ieme ligne +// // de la matrice courante +// val(i)=mat_pl(i); +// }; + return (*this); }; // Surcharge de l'operateur += : addition d'une matrice a la matrice courante @@ -331,18 +379,18 @@ void Mat_pleine::Affiche () const cout << endl; }; -#ifndef MISE_AU_POINT - inline -#endif -void Mat_pleine::Initialise (double val_init) -// Initialise les composantes de la matrice a val_init -{ int nb_ligne = val.Taille(); - int nb_col = Nb_colonne(); - for (int i=1;i<=nb_ligne;i++) - // initialisation des composantes de la matrice a val_init - for (int j=1;j<=nb_col;j++) - (*this)(i,j)=val_init; -}; +//#ifndef MISE_AU_POINT +// inline +//#endif +//void Mat_pleine::Initialise (double val_init) +//// Initialise les composantes de la matrice a val_init +//{ int nb_ligne = val.Taille(); +// int nb_col = Nb_colonne(); +// for (int i=1;i<=nb_ligne;i++) +// // initialisation des composantes de la matrice a val_init +// for (int j=1;j<=nb_col;j++) +// (*this)(i,j)=val_init; +//}; #ifndef MISE_AU_POINT inline @@ -358,13 +406,21 @@ void Mat_pleine::Initialise (int nb_ligne,int nb_colonne,double val_init) Sortie(1); }; #endif - val.Change_taille(nb_ligne); - for (int i=1;i<=nb_ligne;i++) - val(i).Change_taille(nb_colonne); - for (int i=1;i<=nb_ligne;i++) - // initialisation des composantes de la matrice a val_init - for (int j=1;j<=nb_colonne;j++) - (*this)(i,j)=val_init; + int taille_glob = nb_ligne * nb_colonne; + // changement de taille éventuelle + val_de_base.Change_taille(taille_glob); + Change_tailles_tab_val(nb_ligne,nb_colonne); + // initialisation globalle + val_de_base.Inita(val_init); +// +// +// val.Change_taille(nb_ligne); +// for (int i=1;i<=nb_ligne;i++) +// val(i).Change_taille(nb_colonne); +// for (int i=1;i<=nb_ligne;i++) +// // initialisation des composantes de la matrice a val_init +// for (int j=1;j<=nb_colonne;j++) +// (*this)(i,j)=val_init; }; #ifndef MISE_AU_POINT @@ -374,8 +430,8 @@ int Mat_pleine::Symetrie () const // Test sur la symetrie de la matrice // Retourne 1 si la matrice est symetrique // 0 sinon -{ if ( Nb_ligne()!=Nb_colonne() ) - return 0; +{if ( Nb_ligne()!=Nb_colonne() ) + return 0; int nb_lign = val.Taille(); for (int i=1;i<=nb_lign;i++) for (int j=1;j 2) { cout << "\n warning : attention ne fonction qu'avec une matrice symetrique !" << " ce qui n'est pas le cas ici !!" @@ -797,13 +853,15 @@ void Mat_pleine::Preparation_resol() AfficheNonSymetries(); }; }; + } // de plus si c'est cramer ou cholesky après symétrisation, on doit avoir une matrice carrée case CRAMER : case SYMETRISATION_PUIS_CHOLESKY : - if ( Nb_ligne()!=Nb_colonne() ) + {if ( Nb_ligne()!=Nb_colonne() ) { cout << "Erreur : la matrice doit etre carree !\n"; cout << "Mat_pleine::Preparation_resol() \n"; Sortie(1); }; + } default: break; // sinon ok ici }; #endif @@ -815,7 +873,8 @@ void Mat_pleine::Preparation_resol() {int N=Nb_ligne(); Triangulation (N,*this); } - }; + default: break; // sinon ok ici + }; }; // 2) *** résolution sans modification de la matrice DOIT ÊTRE PRÉCÉDÉ DE L'APPEL DE // Preparation_resol @@ -1035,15 +1094,16 @@ Vecteur& Mat_pleine::Prod_mat_vec (const Vecteur& vec,Vecteur& result) const Mat_pleine Mat_pleine::Transpose () const // Retourne la transposee de la matrice mat { - #ifdef MISE_AU_POINT - if ( ( Nb_ligne()==0 ) || ( Nb_colonne()==0 ) ) + int nb_col = Nb_colonne(); int nb_lign = val.Taille(); + #ifdef MISE_AU_POINT + if ( ( nb_lign ==0 ) || ( nb_col ==0 ) ) { cout << "Erreur : dimensions de la matrice non valables\n"; cout << "MAT_PLEINE::TRANSPOSE ( )\n"; Sortie(1); }; #endif - int nb_col = Nb_colonne(); int nb_lign = val.Taille(); + Mat_pleine result(nb_col,nb_lign); for (int i=1;i<=nb_col;i++) { @@ -1386,22 +1446,24 @@ double Mat_pleine::Determinant() const #endif Mat_pleine Mat_pleine::operator+ (const Mat_pleine& mat_pl) const // Surcharge de l'operateur + : addition de deux matrices -{ - int nb_lign = val.Taille(); - #ifdef MISE_AU_POINT - if ( ( nb_lign!=mat_pl.Nb_ligne() ) - || ( Nb_colonne()!=mat_pl.Nb_colonne() ) ) +{ int nb_lign = val.Taille(); + int nb_col = Nb_colonne(); + #ifdef MISE_AU_POINT + if ( ( nb_lign != mat_pl.Nb_ligne() ) + || ( nb_col != mat_pl.Nb_colonne() ) ) { cout << "Erreur : dimensions des matrices non egales\n"; cout << "MAT_PLEINE::OPERATOR+ (const Mat_pleine& )\n"; Sortie(1); }; #endif - Mat_pleine result; - result.val.Change_taille(nb_lign); - for (int i=1;i<=nb_lign;i++) - // addition des composantes a l'aide de la surcharge de l'operateur - // + pour les vecteurs - result.val(i)=val(i)+mat_pl(i); + Mat_pleine result(nb_lign,nb_col); + result.val_de_base = val_de_base + mat_pl.val_de_base; + +// result.val.Change_taille(nb_lign); +// for (int i=1;i<=nb_lign;i++) +// // addition des composantes a l'aide de la surcharge de l'operateur +// // + pour les vecteurs +// result.val(i)=val(i)+mat_pl(i); return result; }; @@ -1411,21 +1473,24 @@ Mat_pleine Mat_pleine::operator+ (const Mat_pleine& mat_pl) const Mat_pleine Mat_pleine::operator- (const Mat_pleine& mat_pl) const // Surcharge de l'operateur - : soustraction entre deux matrices { int nb_lign = val.Taille(); - #ifdef MISE_AU_POINT - if ( ( nb_lign !=mat_pl.Nb_ligne() ) - || ( Nb_colonne()!=mat_pl.Nb_colonne() ) ) + int nb_col = Nb_colonne(); + #ifdef MISE_AU_POINT + if ( ( nb_lign != mat_pl.Nb_ligne() ) + || ( nb_col != mat_pl.Nb_colonne() ) ) { cout << "Erreur : dimensions des matrices non egales\n"; cout << "MAT_PLEINE::OPERATOR- (const Mat_pleine& )\n"; Sortie(1); }; #endif - Mat_pleine result; - result.val.Change_taille(nb_lign); - for (int i=1;i<=nb_lign;i++) - // soustraction des composantes a l'aide de la surcharge de l'operateur - // - pour les vecteurs - result.val(i)=val(i)-mat_pl(i); + Mat_pleine result(nb_lign,nb_col); + result.val_de_base = val_de_base - mat_pl.val_de_base; +// +// result.val.Change_taille(nb_lign); +// for (int i=1;i<=nb_lign;i++) +// // soustraction des composantes a l'aide de la surcharge de l'operateur +// // - pour les vecteurs +// result.val(i)=val(i)-mat_pl(i); return result; }; @@ -1434,13 +1499,14 @@ Mat_pleine Mat_pleine::operator- (const Mat_pleine& mat_pl) const #endif Mat_pleine Mat_pleine::operator- () const // Surcharge de l'operateur - : oppose d'une matrice -{ Mat_pleine result; - int nb_lign = val.Taille(); - result.val.Change_taille(nb_lign); - for (int i=1;i<=nb_lign;i++) - // determination de l'oppose des composantes de la matrice courante a l'aide de la surcharge - // de l'operateur -= pour les vecteurs - result.val(i)=-val(i); +{ Mat_pleine result(this->Nb_ligne(),this->Nb_colonne()); + result.val_de_base = -val_de_base; +// int nb_lign = val.Taille(); +// result.val.Change_taille(nb_lign); +// for (int i=1;i<=nb_lign;i++) +// // determination de l'oppose des composantes de la matrice courante a l'aide de la surcharge +// // de l'operateur -= pour les vecteurs +// result.val(i)=-val(i); return result; }; @@ -1459,9 +1525,11 @@ void Mat_pleine::operator+= ( const Mat_pleine& mat_pl) Sortie(1); }; #endif - for (int i=1;i<=nb_lign;i++) - // l'operateur += est l'operateur += des vecteurs - val(i)+=mat_pl(i); + val_de_base += mat_pl.val_de_base; +// +// for (int i=1;i<=nb_lign;i++) +// // l'operateur += est l'operateur += des vecteurs +// val(i)+=mat_pl(i); }; #ifndef MISE_AU_POINT @@ -1479,9 +1547,11 @@ void Mat_pleine::operator-= ( const Mat_pleine& mat_pl) Sortie(1); }; #endif - for (int i=1;i<=nb_lign;i++) - // l'operateur -= est l'operateur -= des vecteurs - val(i)-=mat_pl(i); + val_de_base -= mat_pl.val_de_base; + +// for (int i=1;i<=nb_lign;i++) +// // l'operateur -= est l'operateur -= des vecteurs +// val(i)-=mat_pl(i); }; @@ -1499,8 +1569,8 @@ Mat_pleine Mat_pleine::operator* (const Mat_pleine& mat_pl) const Sortie(1); }; #endif - Mat_pleine result; - result.Initialise(nb_lign,mat_nb_col); + Mat_pleine result(nb_lign,mat_nb_col); +// result.Initialise(nb_lign,mat_nb_col); for (int i=1;i<=nb_lign;i++) { for (int j=1;j<=mat_nb_col;j++) @@ -1516,10 +1586,12 @@ Mat_pleine Mat_pleine::operator* (const Mat_pleine& mat_pl) const #endif void Mat_pleine::operator*= (double coeff) //multiplication de la matrice courante par un scalaire -{ int nb_lign = val.Taille(); - for (int i=1;i<=nb_lign;i++) - // l'operateur *= est l'operateur *= des vecteurs - val(i) *= coeff; +{ val_de_base *= coeff; +// +// int nb_lign = val.Taille(); +// for (int i=1;i<=nb_lign;i++) +// // l'operateur *= est l'operateur *= des vecteurs +// val(i) *= coeff; }; #ifndef MISE_AU_POINT @@ -1527,15 +1599,21 @@ void Mat_pleine::operator*= (double coeff) #endif Mat_pleine Mat_pleine::operator* (double coeff) const // Surcharge de l'operateur * : multiplication d'une matrice par un scalaire -{Mat_pleine result; - int nb_lign = val.Taille();int nb_col = Nb_colonne(); - result.Initialise(nb_lign,nb_col); - for (int i=1;i<=nb_lign;i++) - { - for (int j=1;j<=nb_col;j++) - result(i,j)=coeff*(*this)(i,j); - }; - return result; +{ Mat_pleine result(*this); + result *= coeff; + return result; +// +// +// +//Mat_pleine result; +// int nb_lign = val.Taille();int nb_col = Nb_colonne(); +// result.Initialise(nb_lign,nb_col); +// for (int i=1;i<=nb_lign;i++) +// { +// for (int j=1;j<=nb_col;j++) +// result(i,j)=coeff*(*this)(i,j); +// }; +// return result; }; #ifndef MISE_AU_POINT @@ -1549,12 +1627,18 @@ int Mat_pleine::operator== (const Mat_pleine& mat_pl) const int nb_lign = val.Taille();int nb_col = Nb_colonne(); if ( ( nb_lign != mat_pl.Nb_ligne() ) || ( nb_col != mat_pl.Nb_colonne() ) ) return 0; - for (int i=1;i <= nb_lign;i++) - {for (int j=1;j <= nb_col;j++) - {if ( (*this)(i,j) != mat_pl(i,j) ) - return 0; - }; - }; + int taille_glob = val_de_base.Taille(); + for (int i=1;i<=taille_glob;i++) + {if (val_de_base(i) != mat_pl.val_de_base(i)) + return 0; + } +// +// for (int i=1;i <= nb_lign;i++) +// {for (int j=1;j <= nb_col;j++) +// {if ( (*this)(i,j) != mat_pl(i,j) ) +// return 0; +// }; +// }; return 1; }; // remplace la ligne de la matrice par la ligne fournie @@ -1564,24 +1648,25 @@ int Mat_pleine::operator== (const Mat_pleine& mat_pl) const void Mat_pleine::RemplaceLigneSpe(int i,const Vecteur & v) { #ifdef MISE_AU_POINT - if (val(i).Taille() != v.Taille()) + if (val(i)->Taille() != v.Taille()) { cout << " \nla taille de la ligne i= " << i <<" a remplacer n est pas bonne " ; - cout << " taille = " << v.Taille() << " tailleLigneMatrice = " << val(i).Taille(); + cout << " taille = " << v.Taille() << " tailleLigneMatrice = " << val(i)->Taille(); cout << " void Mat_pleine::RemplaceLigne(int i,Vecteur & v)" << endl; Sortie (1); } #endif - val(i) = v; + *(val(i)) = v; }; //met une valeur identique sur toute la ligne #ifndef MISE_AU_POINT inline #endif void Mat_pleine::MetValLigne(int i,double x) - { Vecteur& v=val(i); - int vali_taille = val(i).Taille(); - for (int j=1;j <= vali_taille;j++) - v(j) = x; + { val(i)->Inita(x); +// Vecteur& v=*(val(i)); +// int vali_taille = val(i)->Taille(); +// for (int j=1;j <= vali_taille;j++) +// v(j) = x; }; // remplace la Colonne de la matrice par la colonne fournie @@ -1619,16 +1704,16 @@ void Mat_pleine::MetValColonne(int j,double y) double Mat_pleine::Prod_Ligne_vec ( int iligne, const Vecteur& vec) const { #ifdef MISE_AU_POINT - if (val(iligne).Taille() != vec.Taille()) + if (val(iligne)->Taille() != vec.Taille()) { cout << " \n erreur la taille de la ligne i= " << iligne <<" n est pas correcte "; - cout << " tailleligneMatrice = " <Taille(); for (int j=1;j <= val_iligne_taille;j++) res += (*this)(iligne,j) * vec(j); return res; @@ -1663,9 +1748,9 @@ double Mat_pleine::Prod_vec_col( int jcol, const Vecteur& vec) const double Mat_pleine::vectT_mat_vec(const Vecteur& vec1, const Vecteur& vec2) const { double resu=0.; // valeur de retour #ifdef MISE_AU_POINT - if (vec1.Taille() != val(1).Taille()) + if (vec1.Taille() != val(1)->Taille()) {cout << "erreur de taille, la dimension de (vec1)^T= " << vec1.Taille() << " n'a pas la même dimension"; - cout << " que le le nombre de ligne de la matrice= " << val(1).Taille() + cout << " que le le nombre de ligne de la matrice= " << val(1)->Taille() << "\n Mat_pleine::vectT_mat_vec(const Vecteur& vec1, const Vecteur& vec2)" << endl; Sortie(1); } @@ -1779,9 +1864,9 @@ double Mat_pleine::MaxiValAbs(int & imax, int & jmax) const int nb_col = Nb_colonne(); for (int i=1;i<= nb_lig;i++) for (int j=1;j<= nb_col;j++) - {double val = Dabs((*this)(i,j)); - if (val > lemaxi) - { lemaxi = val; imax = i; jmax = j; }; + {double valeur = Dabs((*this)(i,j)); + if (valeur > lemaxi) + { lemaxi = valeur; imax = i; jmax = j; }; }; return lemaxi; }; @@ -1799,7 +1884,7 @@ double Mat_pleine::Maxi_ligne_ValAbs(int & imax) const imax = 0; int nb_lig = val.Taille(); for (int i=1;i<= nb_lig;i++) - {double somme_ligne = val(i).SommeAbs(); + {double somme_ligne = val(i)->SommeAbs(); if (somme_ligne > lemaxi) { lemaxi = somme_ligne; imax = i;}; }; @@ -2065,6 +2150,86 @@ void Mat_pleine::Cramer( const Tableau & b,Tableau & res) cons }; }; + + +// méthode interne pour modifier éventuellement les tailles +// en liaison entre les deux stockages +#ifndef MISE_AU_POINT + inline +#endif +void Mat_pleine::Change_tailles_tab_val(int nb_lig,int nb_col) + { // on considère que val_de_base est déjà ok + #ifdef MISE_AU_POINT + if (nb_lig*nb_col != val_de_base.Taille()) + { cout << "\nErreur : la taille de val_de_base: " << val_de_base.Taille() + << " est differente de nb_lig*nb_col: " << nb_lig*nb_col; + cout << "void Change_tailles_tab_val(.. \n" << endl; + Sortie(1); + } + #endif + // l'objectif est la modification éventuelle de val + val.Change_taille(nb_lig); + double* pt = val_de_base.Pointeur_vect(); // init + for (int i=1;i<= nb_lig;i++) + {bool creation = false; + if (val(i) != NULL) + { double* pt_val = val(i)->Pointeur_vect(); + if ((pt_val != pt ) // il y a discordance + || (val(i)->Taille() != nb_col) + ) + {delete val(i); // on doit reconstruire le vecteur + creation = true; + }; + // sinon c'est ok, on ne fait rien + } + else + {creation = true;}; + if (creation) // on crée un vecteur lié + {// il n'y a pas d'initialisation de composantes des vecteur + // elles gardent les valeurs de val_de_base + bool memoire = false; + val(i)=new Vecteur(nb_col,pt,memoire); + }; + // on déplace le pointeur de base sur le vecteur suivant + for (int j = 1; j<= nb_col; j++) + pt++; + }; + }; + +// méthode interne pour créer val en fonction des dimensions +// ce qui crée une liaison entre les deux stockages +#ifndef MISE_AU_POINT + inline +#endif +void Mat_pleine::Creation_tab_val(int nb_lig,int nb_col) + { // on considère que val_de_base est déjà ok + #ifdef MISE_AU_POINT + if (nb_lig*nb_col != val_de_base.Taille()) + { cout << "\nErreur : la taille de val_de_base: " << val_de_base.Taille() + << " est differente de nb_lig*nb_col: " << nb_lig*nb_col; + cout << "void Mat_pleine::Creation_tab_val(.. \n" << endl; + Sortie(1); + } + #endif + // l'objectif est la construction de val + if (val.Taille() != 0) + // si val est déjà construit on voit s'il faut changer quelque chose + {Change_tailles_tab_val(nb_lig,nb_col);} + else + // sinon on construit + {bool memoire = false; + val.Change_taille(nb_lig); + double* pt = val_de_base.Pointeur_vect(); // init + for (int i=1;i<= nb_lig;i++) + {// il n'y a pas d'initialisation de composantes des vecteur + // elles gardent les valeurs de val_de_base + val(i)=new Vecteur(nb_col,pt,memoire); + for (int j = 1; j<= nb_col; j++) + pt++; + }; + }; + }; + // surcharge de l'operateur de lecture typée #ifndef MISE_AU_POINT inline @@ -2074,11 +2239,19 @@ istream & operator >> (istream & entree, Mat_pleine & mat) string type; entree >> type; if (type != "Mat_pleine") - {Sortie (1); + {cout << "\n*** erreur en lecture d'une matrice, on attendait Mat_pleine " + << " et on a lue: "<< type; + Sortie (1); return entree; }; - // puis le tableau - entree >> mat.val ; + // les tailles + int nb_ligne, nb_colonne; + string toto; + entree >> nb_ligne >> toto >> nb_colonne; + // redimentionnement éventuelle de la matrice + mat.Initialise (nb_ligne,nb_colonne,0.0); + // on lit les composantes + entree >> mat.val_de_base ; return entree; }; @@ -2088,7 +2261,8 @@ istream & operator >> (istream & entree, Mat_pleine & mat) #endif ostream & operator << ( ostream & sort,const Mat_pleine & mat) { // un indicateur donnant le type puis les datas - sort << "Mat_pleine " << mat.val ; + sort << "Mat_pleine " << mat.Nb_ligne() << " X "<< mat.Nb_colonne() << " " + << mat.val_de_base ; return sort; }; @@ -2100,4 +2274,3 @@ ostream & operator << ( ostream & sort,const Mat_pleine & mat) - diff --git a/Resolin/Matrices/Mat_pleine.h b/Resolin/Matrices/Mat_pleine.h index 2f13f32..514827f 100644 --- a/Resolin/Matrices/Mat_pleine.h +++ b/Resolin/Matrices/Mat_pleine.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -80,6 +80,15 @@ #include "Vecteur.h" #include "Coordonnee.h" #include "Coordonnee3.h" +#ifdef UTILISATION_MPI + #include "mpi.h" + #include + #include + #include + #include + namespace mpi = boost::mpi; +#endif +# include "ParaGlob.h" class Mat_abstraite; @@ -93,7 +102,8 @@ class Mat_pleine : public Mat_abstraite friend istream & operator >> (istream &, Mat_pleine &); // surcharge de l'operator d'ecriture typée friend ostream & operator << (ostream &, const Mat_pleine &); - + // ResRaid_MPI permet de faire un stockage globale de tranche de matrice + friend class ResRaid_MPI; public : // CONSTRUCTEURS : @@ -156,7 +166,8 @@ class Mat_pleine : public Mat_abstraite void Affiche () const ; // Initialisation des composantes de la matrice (par defaut a 0, sinon a val_init) - void Initialise (double val_init=0.0); + void Initialise (double val_init=0.0) + { val_de_base.Inita(val_init);}; // Initialisation d'une matrice a un nombre de lignes et de colonnes ainsi que // ces composantes a 0 par defaut ou a val_init sinon @@ -165,7 +176,7 @@ class Mat_pleine : public Mat_abstraite inline void Libere () // A la suite de l'appel de cette methode, la matrice est identique a ce qu'elle // serait a la suite d'un appel du constructeur par defaut - { val.Libere(); }; + { val_de_base.Libere(); }; // Retour du nombre de lignes de la matrice vue comme une matrice_rectangulaire inline int Nb_ligne () const @@ -176,21 +187,21 @@ class Mat_pleine : public Mat_abstraite // les vecteurs du tableau (aucun test n'est realise pour le verifier) inline int Nb_colonne () const { if ( Nb_ligne()!=0 ) - return val(1).Taille(); + return val(1)->Taille(); else return 0; }; // Retourne la ieme ligne de la matrice inline Vecteur Ligne (int i) const - { return val(i); }; + { return *(val(i)); }; // Retourne la ieme ligne de la matrice // sous le format de stokage propre a la matrice // donc a n'utiliser que comme sauvegarde en parralele // avec la fonction RemplaceLigne inline Vecteur LigneSpe (int i) const - { return val(i); }; + { return *(val(i)); }; // remplace la ligne de la matrice par la ligne fournie void RemplaceLigneSpe(int i,const Vecteur & v); //met une valeur identique sur toute la ligne @@ -343,7 +354,7 @@ class Mat_pleine : public Mat_abstraite inline Vecteur& Ligne_set(int i) // Retourne la ieme ligne de la matrice - { return val(i); }; + { return *(val(i)); }; inline Vecteur& operator() (int i) // Retourne également de la ieme ligne de la matrice @@ -351,16 +362,16 @@ class Mat_pleine : public Mat_abstraite // ( car naturellement on s'attend à avoir la ligne et cela engendre des erreurs) // ( très difficile à trouver, car tant que la copie persiste c'est ok, et quand le destructeur) // ( est appelé -> plus rien !! ) - { return val(i); }; + { return *(val(i)); }; inline Vecteur operator() (int i) const // Retourne une copie de la ieme ligne de la matrice // utile quand on travaille avec des const - { return val(i); }; + { return *(val(i)); }; inline double& operator () (int i,int j) // Retourne la ieme jieme composante de la matrice - { return val(i)(j); }; + { return (*(val(i)))(j); }; // ramène true si la place (i,j) existe, false sinon // ici on ne test pas le fait que i et j puissent être négatif ou pas @@ -370,7 +381,7 @@ class Mat_pleine : public Mat_abstraite // cas ou l'on ne veut pas modifier les valeurs // i : indice de ligne, j : indice de colonne inline double operator () ( int i, int j) const - { return val(i)(j); }; + { return (*(val(i)))(j); }; // Multiplication d'une ligne iligne de la matrice avec un vecteur de // dimension = le nombre de colonne de la matrice @@ -385,7 +396,7 @@ class Mat_pleine : public Mat_abstraite // mise a zero de tous les composantes de la matrice void Zero() - { int imax = val.Taille();for (int i=1; i<=imax;i++) val(i).Zero();}; + {val_de_base.Inita(0.);}; // retourne la place que prend la matrice en entier int Place() const { return (2*(Nb_ligne() * Nb_colonne()));}; @@ -412,13 +423,66 @@ class Mat_pleine : public Mat_abstraite // avec: |lambda_i| < Max_j somme_j |k_ij|) double Maxi_ligne_ValAbs(int & i) const; + +#ifdef UTILISATION_MPI // spécifique au calcul parallèle + // envoi et récup brut du tableau de composantes : nécessite pour la réception d'avoir + // un tableau de même dimension + void Envoi_MPI(int dest, int tag) const + {val_de_base.Envoi_MPI(dest,tag);}; + void Recup_MPI(int source, int tag) const + {val_de_base.Recup_MPI(source,tag);}; + mpi::request Ienvoi_MPI(int dest, int tag) const + {return val_de_base.Ienvoi_MPI(dest,tag);}; + mpi::request Irecup_MPI(int source, int tag) const + {return val_de_base.Irecup_MPI(source,tag);}; +#endif + protected : - - Tableau val; // Valeurs des composantes + Vecteur val_de_base; // le vecteur qui contient tous les vecteurs de val + Tableau val; // Valeurs des composantes: il s'agit de pointeurs + // sur des vecteurs liés: ils sont à la même place que val_de_base // val(i) = une ligne - + + // fonction protégé pour l'accès directe au stockage global, utilisé + // par ResRaid_MPI par exemple: pour un stockage par tranche de matrice + Vecteur & Val_de_base() {return val_de_base;} + + /// --------- cas très particulier d'un vecteur val_de_base lié + /// --------- utilisé uniquement par des classes friend + // c-a-d qui ne gère pas sa mémoire -> memoire = false + /// il s'agit d'un tuillage, val_de_base est positionné a "vec" + /// aucun test n'est fait concernant la taille disponible à partir de "vec" + /// routine dangereuse !!!!! + /// avec_recopie == true : les infos de mat_pl sont recopiées, sinon non + Mat_pleine(bool avec_recopie,double* vec, const Mat_pleine& mat_pl); + + // méthode interne pour créer val en fonction des dimensions + // ce qui crée une liaison entre les deux stockages + void Creation_tab_val(int nb_lig,int nb_col); + // idem pour modifier éventuellement les tailles de val uniquement + void Change_tailles_tab_val(int nb_lig,int nb_col); + +#ifdef UTILISATION_MPI + friend class boost::serialization::access; + // When the class Archive corresponds to an output archive, the + // & operator is defined similar to <<. Likewise, when the class Archive + // is a type of input archive the & operator is defined similar to >>. + template + void serialize(Archive & ar, const unsigned int version) + { int nb_ligne = val.Taille(); + int nb_colonne = Nb_colonne(); + ar & nb_ligne; + ar & nb_colonne; + val_de_base.Change_taille(nb_ligne*nb_colonne); + Change_tailles_tab_val(nb_ligne,nb_colonne); // en écriture, ne fait rien, + // en lecture permet d'avoir la bonne taille + // puis le vecteur global + ar & val_de_base; + } +#endif + // calcul de la matrice triangulée dans le cadre de la méthode de cholesky // utilisation particulière : la matrice résultat B est défini dans le programme // appelant. diff --git a/Resolin/Matrices/matrices_creuses/Mat_creuse_CompCol.cc b/Resolin/Matrices/matrices_creuses/Mat_creuse_CompCol.cc index d3c1f27..4ec3069 100755 --- a/Resolin/Matrices/matrices_creuses/Mat_creuse_CompCol.cc +++ b/Resolin/Matrices/matrices_creuses/Mat_creuse_CompCol.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resolin/Matrices/matrices_creuses/Mat_creuse_CompCol.h b/Resolin/Matrices/matrices_creuses/Mat_creuse_CompCol.h index e497085..04f4754 100644 --- a/Resolin/Matrices/matrices_creuses/Mat_creuse_CompCol.h +++ b/Resolin/Matrices/matrices_creuses/Mat_creuse_CompCol.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resolin/Matrices/matrices_lapack/Include_lapack/clapack.h b/Resolin/Matrices/matrices_lapack/Include_lapack/clapack.h old mode 100644 new mode 100755 diff --git a/Resolin/Matrices/matrices_lapack/MatLapack.cc b/Resolin/Matrices/matrices_lapack/MatLapack.cc index 9bf11bd..3ae1297 100644 --- a/Resolin/Matrices/matrices_lapack/MatLapack.cc +++ b/Resolin/Matrices/matrices_lapack/MatLapack.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -43,6 +43,7 @@ using namespace std; //introduces namespace std #include #include "CharUtil.h" #include "ExceptionsMatrices.h" +#include "ParaGlob.h" #ifdef ENLINUX_2009 #include "cblas.h" @@ -591,7 +592,7 @@ double& MatLapack::operator () (int i, int j) // !!! important, si l'élément n'existe pas du au type de stockage // utilisé, (mais que les indices sont possible) le retour est 0 double MatLapack::operator () ( int i, int j) const - { + {double toto; #ifdef MISE_AU_POINT if ((i < 1) || (i>nb_lign)) {cout << "erreur d acces aux composantes d une matrice "; @@ -649,6 +650,7 @@ double MatLapack::operator () ( int i, int j) const << "\n MatLapack::operator () (int i, int j)const "<& ,LesMaillage // ,bool animation) ,bool,const map < string, const double * , std::less >& ,const List_io < TypeQuelconque >& listeVecGlob ) -{ostream &sort = entreePrinc.Sort_princ_geomview(); +{//ostream &sort = entreePrinc.Sort_princ_geomview(); + cout << "\n *** la methode Animation_geomview::ExeOrdre( n'est pas implantee ! " + << " le resultat sera inconnue !! "; // définition de l'animation uniquement si animation est vraie /* en commentaire pour geomview pour l'instant if (actif && animation) if (list_nom_coordinate.size() == 0) diff --git a/Resultats/Geomview/Animation_geomview.h b/Resultats/Geomview/Animation_geomview.h index e9bf469..e8010a7 100644 --- a/Resultats/Geomview/Animation_geomview.h +++ b/Resultats/Geomview/Animation_geomview.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Geomview/Deformees_geomview.cc b/Resultats/Geomview/Deformees_geomview.cc index 603775c..d233ac9 100644 --- a/Resultats/Geomview/Deformees_geomview.cc +++ b/Resultats/Geomview/Deformees_geomview.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Geomview/Deformees_geomview.h b/Resultats/Geomview/Deformees_geomview.h index dd12e9d..3188b14 100644 --- a/Resultats/Geomview/Deformees_geomview.h +++ b/Resultats/Geomview/Deformees_geomview.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Geomview/Fin_geomview.cc b/Resultats/Geomview/Fin_geomview.cc index e0e29af..0d1a6e3 100644 --- a/Resultats/Geomview/Fin_geomview.cc +++ b/Resultats/Geomview/Fin_geomview.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Geomview/Fin_geomview.h b/Resultats/Geomview/Fin_geomview.h index b233c2e..790a888 100644 --- a/Resultats/Geomview/Fin_geomview.h +++ b/Resultats/Geomview/Fin_geomview.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Geomview/Frontiere_initiale_geomview.cc b/Resultats/Geomview/Frontiere_initiale_geomview.cc index a31a19f..533e130 100644 --- a/Resultats/Geomview/Frontiere_initiale_geomview.cc +++ b/Resultats/Geomview/Frontiere_initiale_geomview.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -172,7 +172,7 @@ void Frontiere_initiale_geomview::ExeOrdre(ParaGlob * paraGlob,const Tableau ::const_iterator il,ilfin=list_balaie->end(); + { //list ::const_iterator il,ilfin=list_balaie->end(); if (*(list_balaie->begin())==0) // cas du premier incrément = maillage initial if(list_balaie->size() > 2) animation = true; else animation = false; diff --git a/Resultats/Geomview/Visualisation_geomview.h b/Resultats/Geomview/Visualisation_geomview.h index ffd29a2..57b584e 100644 --- a/Resultats/Geomview/Visualisation_geomview.h +++ b/Resultats/Geomview/Visualisation_geomview.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gid/Deformees_Gid.cc b/Resultats/Gid/Deformees_Gid.cc index 3686338..6543de3 100644 --- a/Resultats/Gid/Deformees_Gid.cc +++ b/Resultats/Gid/Deformees_Gid.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gid/Deformees_Gid.h b/Resultats/Gid/Deformees_Gid.h index 0c3507d..c766cf8 100644 --- a/Resultats/Gid/Deformees_Gid.h +++ b/Resultats/Gid/Deformees_Gid.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gid/Fin_Gid.cc b/Resultats/Gid/Fin_Gid.cc index 649a0de..6d0ef79 100644 --- a/Resultats/Gid/Fin_Gid.cc +++ b/Resultats/Gid/Fin_Gid.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gid/Fin_Gid.h b/Resultats/Gid/Fin_Gid.h index 33fcd19..b52d362 100644 --- a/Resultats/Gid/Fin_Gid.h +++ b/Resultats/Gid/Fin_Gid.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gid/Isovaleurs_Gid.cc b/Resultats/Gid/Isovaleurs_Gid.cc index bced1ac..7ecb3cf 100644 --- a/Resultats/Gid/Isovaleurs_Gid.cc +++ b/Resultats/Gid/Isovaleurs_Gid.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gid/Isovaleurs_Gid.h b/Resultats/Gid/Isovaleurs_Gid.h index 138760e..09be96a 100644 --- a/Resultats/Gid/Isovaleurs_Gid.h +++ b/Resultats/Gid/Isovaleurs_Gid.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gid/Isovaleurs_Gid2.cc b/Resultats/Gid/Isovaleurs_Gid2.cc index e46668b..e9437cb 100644 --- a/Resultats/Gid/Isovaleurs_Gid2.cc +++ b/Resultats/Gid/Isovaleurs_Gid2.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gid/Mail_initiale_Gid.cc b/Resultats/Gid/Mail_initiale_Gid.cc index ad8544b..374277e 100644 --- a/Resultats/Gid/Mail_initiale_Gid.cc +++ b/Resultats/Gid/Mail_initiale_Gid.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gid/Mail_initiale_Gid.h b/Resultats/Gid/Mail_initiale_Gid.h index 812c5d2..fd9a824 100644 --- a/Resultats/Gid/Mail_initiale_Gid.h +++ b/Resultats/Gid/Mail_initiale_Gid.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gid/Visuali_Gid.cc b/Resultats/Gid/Visuali_Gid.cc index 5528fea..436dc5f 100644 --- a/Resultats/Gid/Visuali_Gid.cc +++ b/Resultats/Gid/Visuali_Gid.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gid/Visuali_Gid.h b/Resultats/Gid/Visuali_Gid.h index 39fcb3d..bb20f58 100644 --- a/Resultats/Gid/Visuali_Gid.h +++ b/Resultats/Gid/Visuali_Gid.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gid/Visualisation_Gid.cc b/Resultats/Gid/Visualisation_Gid.cc index cd41050..ffea48b 100755 --- a/Resultats/Gid/Visualisation_Gid.cc +++ b/Resultats/Gid/Visualisation_Gid.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gid/Visualisation_Gid.h b/Resultats/Gid/Visualisation_Gid.h index 0d72f91..4049539 100644 --- a/Resultats/Gid/Visualisation_Gid.h +++ b/Resultats/Gid/Visualisation_Gid.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gmsh/Deformees_Gmsh.cc b/Resultats/Gmsh/Deformees_Gmsh.cc index 7b98100..336141d 100644 --- a/Resultats/Gmsh/Deformees_Gmsh.cc +++ b/Resultats/Gmsh/Deformees_Gmsh.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gmsh/Deformees_Gmsh.h b/Resultats/Gmsh/Deformees_Gmsh.h index 78d68e3..f5fcd9f 100644 --- a/Resultats/Gmsh/Deformees_Gmsh.h +++ b/Resultats/Gmsh/Deformees_Gmsh.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gmsh/Fin_Gmsh.cc b/Resultats/Gmsh/Fin_Gmsh.cc index e339a99..829d6fb 100644 --- a/Resultats/Gmsh/Fin_Gmsh.cc +++ b/Resultats/Gmsh/Fin_Gmsh.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gmsh/Fin_Gmsh.h b/Resultats/Gmsh/Fin_Gmsh.h index f9cd8a5..86aa996 100644 --- a/Resultats/Gmsh/Fin_Gmsh.h +++ b/Resultats/Gmsh/Fin_Gmsh.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gmsh/Isovaleurs_Gmsh.cc b/Resultats/Gmsh/Isovaleurs_Gmsh.cc index b7d6399..0bc6ac5 100644 --- a/Resultats/Gmsh/Isovaleurs_Gmsh.cc +++ b/Resultats/Gmsh/Isovaleurs_Gmsh.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -277,8 +277,19 @@ void Isovaleurs_Gmsh::ExeOrdre(ParaGlob * ,const Tableau & tab_mail // ensuite les noeuds car pendant le calcul aux pt integ, on fait le transfert aux noeuds // qui ensuite sera traité pour la visualisation par les noeuds // ------------------------------------------------------------------------------------------------- - CalculAuxPtInteg(tab_mail,lesMail); - CalculAuxElemAuxNoeuds(tab_mail,lesMail); + try + { CalculAuxPtInteg(tab_mail,lesMail);} + catch ( ... ) + { cout << "\n erreur dans le calcul aux points d'integration, pour la sortie d'isovaleur " + << " les fichiers de sortie seront errones "<< endl; + }; + try + { CalculAuxElemAuxNoeuds(tab_mail,lesMail);} + catch ( ... ) + { cout << "\n erreur dans le calcul aux elements ou aux noeuds, pour la sortie d'isovaleur " + << " les fichiers de sortie seront errones "<< endl; + }; + // ------------------------------------------------------- // II - traitement des degrés de libertés aux noeuds // ------------------------------------------------------- diff --git a/Resultats/Gmsh/Isovaleurs_Gmsh.h b/Resultats/Gmsh/Isovaleurs_Gmsh.h index abbe274..c27f243 100644 --- a/Resultats/Gmsh/Isovaleurs_Gmsh.h +++ b/Resultats/Gmsh/Isovaleurs_Gmsh.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gmsh/Isovaleurs_Gmsh2.cc b/Resultats/Gmsh/Isovaleurs_Gmsh2.cc index bd8d497..1e76ac7 100644 --- a/Resultats/Gmsh/Isovaleurs_Gmsh2.cc +++ b/Resultats/Gmsh/Isovaleurs_Gmsh2.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gmsh/Mail_initiale_Gmsh.cc b/Resultats/Gmsh/Mail_initiale_Gmsh.cc index faf3825..e2e72ab 100644 --- a/Resultats/Gmsh/Mail_initiale_Gmsh.cc +++ b/Resultats/Gmsh/Mail_initiale_Gmsh.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gmsh/Mail_initiale_Gmsh.h b/Resultats/Gmsh/Mail_initiale_Gmsh.h index ec8dc78..1903e72 100644 --- a/Resultats/Gmsh/Mail_initiale_Gmsh.h +++ b/Resultats/Gmsh/Mail_initiale_Gmsh.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gmsh/Visuali_Gmsh.cc b/Resultats/Gmsh/Visuali_Gmsh.cc index 784d42b..3b6aac6 100644 --- a/Resultats/Gmsh/Visuali_Gmsh.cc +++ b/Resultats/Gmsh/Visuali_Gmsh.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gmsh/Visuali_Gmsh.h b/Resultats/Gmsh/Visuali_Gmsh.h index d5609a4..c39a583 100644 --- a/Resultats/Gmsh/Visuali_Gmsh.h +++ b/Resultats/Gmsh/Visuali_Gmsh.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gmsh/Visualisation_Gmsh.cc b/Resultats/Gmsh/Visualisation_Gmsh.cc index 2c092eb..e0d7074 100755 --- a/Resultats/Gmsh/Visualisation_Gmsh.cc +++ b/Resultats/Gmsh/Visualisation_Gmsh.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Gmsh/Visualisation_Gmsh.h b/Resultats/Gmsh/Visualisation_Gmsh.h index 18906a6..a242c44 100644 --- a/Resultats/Gmsh/Visualisation_Gmsh.h +++ b/Resultats/Gmsh/Visualisation_Gmsh.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/MAPLE/Animation_maple.cc b/Resultats/MAPLE/Animation_maple.cc index 6922c5d..2a92385 100644 --- a/Resultats/MAPLE/Animation_maple.cc +++ b/Resultats/MAPLE/Animation_maple.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/MAPLE/Animation_maple.h b/Resultats/MAPLE/Animation_maple.h index 2297ad4..2100ff0 100644 --- a/Resultats/MAPLE/Animation_maple.h +++ b/Resultats/MAPLE/Animation_maple.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/MAPLE/Choix_grandeurs_maple.cc b/Resultats/MAPLE/Choix_grandeurs_maple.cc index c25a0ab..e0bb1fa 100644 --- a/Resultats/MAPLE/Choix_grandeurs_maple.cc +++ b/Resultats/MAPLE/Choix_grandeurs_maple.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -267,7 +267,7 @@ void Choix_grandeurs_maple::ExeOrdre(ParaGlob * ,const Tableau & tab_mail sort.setf(ios::scientific); // on balaie la liste des grandeurs a visualiser, toutes les données sont sur une même ligne // sauf s'il y a un seul incrément - // tout d'abord les grandeurs globales + // --- tout d'abord les grandeurs globales if (list_grand_global_retenu.size() != 0) { List_io ::iterator jeint,jeintfin = list_grand_global_retenu.end(); sort << setprecision(nbdigit) << charge->Temps_courant() << " "; // le temps courant donc à tdt @@ -823,7 +823,7 @@ void Choix_grandeurs_maple::ExeOrdre(ParaGlob * ,const Tableau & tab_mail // supplémentaires si nécessaire. qui sont ensuite gérer par la classe elle même void Choix_grandeurs_maple::ChoixOrdre() { // demande de précision - int dim = ParaGlob::Dimension(); + //int dim = ParaGlob::Dimension(); bool choix_valide = false; while (!choix_valide) { // premier choix : grandeurs aux noeuds et/ou aux éléments diff --git a/Resultats/MAPLE/Choix_grandeurs_maple.h b/Resultats/MAPLE/Choix_grandeurs_maple.h index a2aa2e2..fc52cd7 100644 --- a/Resultats/MAPLE/Choix_grandeurs_maple.h +++ b/Resultats/MAPLE/Choix_grandeurs_maple.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/MAPLE/Choix_grandeurs_maple2.cc b/Resultats/MAPLE/Choix_grandeurs_maple2.cc index a00d767..2e3c0be 100644 --- a/Resultats/MAPLE/Choix_grandeurs_maple2.cc +++ b/Resultats/MAPLE/Choix_grandeurs_maple2.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -250,7 +250,7 @@ void Choix_grandeurs_maple::Entree_grandeur_principale_aux_noeuds(string& rep) // entrée du choix de ddl étendus secondaires aux noeuds void Choix_grandeurs_maple::Entree_grandeur_etendue_secondaire_aux_noeuds(string& rep) { // cas de grandeurs aux noeuds, on boucle sur les maillages - int dim = ParaGlob::Dimension(); + //int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); list::const_iterator ilm,ilmfin=list_mail.end(); @@ -338,11 +338,11 @@ void Choix_grandeurs_maple::Entree_grandeur_etendue_secondaire_aux_noeuds(string // entrée du choix de cas de grandeurs particulières aux noeuds void Choix_grandeurs_maple::Entree_grandeur_TypeQuelconque_secondaire_aux_noeuds(string& rep) { // cas de grandeurs particulières aux noeuds, on boucle sur les maillages - int dim = ParaGlob::Dimension(); + //int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); list::const_iterator ilm,ilmfin=list_mail.end(); - int taille_list_maille = list_mail.size(); + //int taille_list_maille = list_mail.size(); if (list_mail.size() == 0) { cout << "\n aucun maillage n'est definit ! , il faut commencer par definir les maillages pour" << " lesquels on veut une sortie "; @@ -489,11 +489,11 @@ void Choix_grandeurs_maple::Entree_grandeur_TypeQuelconque_secondaire_aux_noeuds // entrée du choix d'une grandeur aux éléments void Choix_grandeurs_maple::Entree_grandeur_aux_elements(string& rep) { // cas de grandeurs aux éléments, on boucle sur les maillages - int dim = ParaGlob::Dimension(); + //int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); list::const_iterator ilm,ilmfin=list_mail.end(); - int taille_list_maille = list_mail.size(); + //int taille_list_maille = list_mail.size(); if (list_mail.size() == 0) { cout << "\n aucun maillage n'est definit ! , il faut commencer par definir les maillages pour" << " lesquels on veut une sortie "; @@ -569,11 +569,11 @@ void Choix_grandeurs_maple::Entree_grandeur_aux_elements(string& rep) // entrée du choix d'une grandeur particulières (diff des ddl génériques) aux éléments void Choix_grandeurs_maple::Entree_grandeur_particuliere_aux_elements(string& rep) { // cas de grandeurs particulières aux éléments, on boucle sur les maillages - int dim = ParaGlob::Dimension(); + //int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); list::const_iterator ilm,ilmfin=list_mail.end(); - int taille_list_maille = list_mail.size(); + //int taille_list_maille = list_mail.size(); if (list_mail.size() == 0) { cout << "\n aucun maillage n'est definit ! , il faut commencer par definir les maillages pour" << " lesquels on veut une sortie "; @@ -674,11 +674,11 @@ void Choix_grandeurs_maple::Entree_grandeur_particuliere_aux_elements(string& re // entrée du choix d'une grandeur évoluées (tensorielles) aux éléments void Choix_grandeurs_maple::Entree_grandeur_tensorielle_aux_elements(string& rep) { // cas de grandeurs tensorielles aux éléments, on boucle sur les maillages - int dim = ParaGlob::Dimension(); + //int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); list::const_iterator ilm,ilmfin=list_mail.end(); - int taille_list_maille = list_mail.size(); + //int taille_list_maille = list_mail.size(); if (list_mail.size() == 0) { cout << "\n aucun maillage n'est definit ! , il faut commencer par definir les maillages pour" << " lesquels on veut une sortie "; @@ -779,11 +779,11 @@ void Choix_grandeurs_maple::Entree_grandeur_tensorielle_aux_elements(string& rep // entrée du choix d'une grandeur quelconque aux faces d'éléments void Choix_grandeurs_maple::Entree_grandeur_quelconque_aux_faces_element(string& rep) { // cas de grandeurs quelconques aux faces des éléments, on boucle sur les maillages - int dim = ParaGlob::Dimension(); + //int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); list::const_iterator ilm,ilmfin=list_mail.end(); - int taille_list_maille = list_mail.size(); + //int taille_list_maille = list_mail.size(); if (list_mail.size() == 0) { cout << "\n aucun maillage n'est definit ! , il faut commencer par definir les maillages pour" << " lesquels on veut une sortie "; @@ -885,11 +885,11 @@ void Choix_grandeurs_maple::Entree_grandeur_quelconque_aux_faces_element(string& // entrée du choix d'une grandeur quelconque aux arêtes d'éléments void Choix_grandeurs_maple::Entree_grandeur_quelconque_aux_aretes_element(string& rep) { // cas de grandeurs quelconques aux arêtes des éléments, on boucle sur les maillages - int dim = ParaGlob::Dimension(); + //int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); list::const_iterator ilm,ilmfin=list_mail.end(); - int taille_list_maille = list_mail.size(); + //int taille_list_maille = list_mail.size(); if (list_mail.size() == 0) { cout << "\n aucun maillage n'est definit ! , il faut commencer par definir les maillages pour" << " lesquels on veut une sortie "; @@ -994,7 +994,7 @@ void Choix_grandeurs_maple::Choix_element_a_retenir(int n_mail,List_io < Ddl_enu int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); - list::const_iterator ilm,ilmfin=list_mail.end(); + //list::const_iterator ilm,ilmfin=list_mail.end(); int taille_list_maille = list_mail.size(); // choix du ou des elements, on affiche la liste actuelle si elle est non nulle @@ -1161,7 +1161,7 @@ void Choix_grandeurs_maple::Choix_element_a_retenir(int n_mail,List_io < Ddl_enu if (nut.nbPtInteg != -1) // cas d'un seul pti {// on vérifie que ce point d'intégration est valide pour tous les éléments de la référence bool veriflocal = true; - List_io ::iterator idl,idlfin= nomDeRef_E(n_mail).end(); + //List_io ::iterator idl,idlfin= nomDeRef_E(n_mail).end(); List_io::iterator ite,itefin = li_ddl.end(); // boucle sur les ddl retenus for (ite = li_ddl.begin();ite != itefin; ite++) @@ -1217,7 +1217,7 @@ void Choix_grandeurs_maple::Choix_element_a_retenir(int n_mail,List_io < Ddl_enu }; // .. puis on balaie l'ensemble des éléments et l'ensemble des pti if (veriflocal) - {List_io ::iterator idl,idlfin= nomDeRef_E(n_mail).end(); + {//List_io ::iterator idl,idlfin= nomDeRef_E(n_mail).end(); List_io::iterator ite,itefin = li_ddl.end(); // boucle sur les ddl retenus for (ite = li_ddl.begin();ite != itefin; ite++) @@ -1263,7 +1263,7 @@ void Choix_grandeurs_maple::Choix_element_a_retenir(int n_mail,List_io < Ddl_enu else { // on vérifie que le choix est valide bool veriflocal = true; - List_io ::iterator idl,idlfin= nomDeRef_ptinteg(n_mail).end(); + //List_io ::iterator idl,idlfin= nomDeRef_ptinteg(n_mail).end(); List_io::iterator ite,itefin = li_ddl.end(); // boucle sur les ddl retenus for (ite = li_ddl.begin();ite != itefin; ite++) @@ -1424,10 +1424,10 @@ void Choix_grandeurs_maple::Choix_element_a_retenir(int n_mail,List_io < Ddl_enu void Choix_grandeurs_maple::Choix_faces_element_a_retenir(int n_mail,List_io < EnumTypeQuelconque >& li_enu_quelc) { // def de grandeur globale - int dim = ParaGlob::Dimension(); + //int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); - list::const_iterator ilm,ilmfin=list_mail.end(); + //list::const_iterator ilm,ilmfin=list_mail.end(); int taille_list_maille = list_mail.size(); // choix du ou des faces d'elements, on affiche la liste actuelle si elle est non nulle @@ -1537,7 +1537,7 @@ void Choix_grandeurs_maple::Choix_faces_element_a_retenir(int n_mail,List_io < E if (nut.nbPtInteg != -1) // cas d'un seul pti {// on vérifie que ce point d'intégration est valide pour toutes les faces de la référence bool veriflocal = true; - List_io ::iterator idl,idlfin= nomDeRef_F_E(n_mail).end(); + //List_io ::iterator idl,idlfin= nomDeRef_F_E(n_mail).end(); // recup de la reference correspondant au mot cle const Reference& refi = lesRef->Trouve(nom_ref,n_mail); @@ -1629,7 +1629,7 @@ void Choix_grandeurs_maple::Choix_faces_element_a_retenir(int n_mail,List_io < E }; // .. puis on balaie l'ensemble des éléments et l'ensemble des pti if (veriflocal) - {List_io ::iterator idl,idlfin= tab_nomDeRef_F_E_SM(n_mail).end(); + {//List_io ::iterator idl,idlfin= tab_nomDeRef_F_E_SM(n_mail).end(); // --- cas des types quelconques aux faces d'éléments {List_io::iterator ite,itefin = li_enu_quelc.end(); @@ -1826,10 +1826,10 @@ void Choix_grandeurs_maple::Choix_faces_element_a_retenir(int n_mail,List_io < E void Choix_grandeurs_maple::Choix_aretes_element_a_retenir(int n_mail,List_io < EnumTypeQuelconque >& li_enu_quelc) { // def de grandeur globale - int dim = ParaGlob::Dimension(); + //int dim = ParaGlob::Dimension(); // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); - list::const_iterator ilm,ilmfin=list_mail.end(); + //list::const_iterator ilm,ilmfin=list_mail.end(); int taille_list_maille = list_mail.size(); // choix du ou des arêtes d'elements, on affiche la liste actuelle si elle est non nulle @@ -1939,7 +1939,7 @@ void Choix_grandeurs_maple::Choix_aretes_element_a_retenir(int n_mail,List_io < if (nut.nbPtInteg != -1) // cas d'un seul pti {// on vérifie que ce point d'intégration est valide pour toutes les arêtes de la référence bool veriflocal = true; - List_io ::iterator idl,idlfin= nomDeRef_A_E(n_mail).end(); + //List_io ::iterator idl,idlfin= nomDeRef_A_E(n_mail).end(); // recup de la reference correspondant au mot cle const Reference& refi = lesRef->Trouve(nom_ref,n_mail); @@ -2031,7 +2031,7 @@ void Choix_grandeurs_maple::Choix_aretes_element_a_retenir(int n_mail,List_io < }; // .. puis on balaie l'ensemble des éléments et l'ensemble des pti if (veriflocal) - {List_io ::iterator idl,idlfin= tab_nomDeRef_A_E_SM(n_mail).end(); + {//List_io ::iterator idl,idlfin= tab_nomDeRef_A_E_SM(n_mail).end(); // --- cas des types quelconques aux arêtes d'éléments {List_io::iterator ite,itefin = li_enu_quelc.end(); @@ -2584,7 +2584,7 @@ void Choix_grandeurs_maple::Construction_liste_pour_animation List_io::iterator ilix1x2_fin = ilix1x2;ilix1x2_fin++; // maintenant on affiche les infos pour la liste totale d'éléments List_io ::iterator iptinteg = tab_total_ptint.begin(); - if ( ddl_etpas_TQ_1 & !ddl_etpas_TQ_2) + if ( ddl_etpas_TQ_1 && !ddl_etpas_TQ_2) { // cas où la première grandeur est ddl et la seconde particulière for (ielement = tab_total_elem.begin();ielement!=ielementfin;ielement++,iptinteg++) { // les grandeurs de type enum @@ -2597,7 +2597,7 @@ void Choix_grandeurs_maple::Construction_liste_pour_animation liste_sortie.push_back(DeuxDoubles(tab(1),val2)); } } - else if ( !ddl_etpas_TQ_1 & ddl_etpas_TQ_2) + else if ( !ddl_etpas_TQ_1 && ddl_etpas_TQ_2) { // cas où la première grandeur est particulière et la seconde ddl for (ielement = tab_total_elem.begin();ielement!=ielementfin;ielement++,iptinteg++) { // les grandeurs de type enum diff --git a/Resultats/MAPLE/Choix_grandeurs_maple3.cc b/Resultats/MAPLE/Choix_grandeurs_maple3.cc index 6f76e34..dd00796 100755 --- a/Resultats/MAPLE/Choix_grandeurs_maple3.cc +++ b/Resultats/MAPLE/Choix_grandeurs_maple3.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -39,7 +39,7 @@ // entrée du choix pour les moyennes sommes etc. sur ref E void Choix_grandeurs_maple::Entree_somme_moy_E(string& rep) { // cas de grandeurs aux éléments, on boucle sur les maillages - int dim = ParaGlob::Dimension(); + //int dim = ParaGlob::Dimension(); cout << "\n --- somme, moyenne, max, min etc. sur des references d'elements et de pti ---"; // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); @@ -321,7 +321,7 @@ void Choix_grandeurs_maple::Entree_somme_moy_E(string& rep) if (nut.nbPtInteg != -1) // cas d'un seul pti {// on vérifie que ce point d'intégration est valide pour tous les éléments de la référence bool veriflocal = true; - List_io ::iterator idl,idlfin= tab_nomDeRef_E_SM(n_mail).end(); + //List_io ::iterator idl,idlfin= tab_nomDeRef_E_SM(n_mail).end(); // --- cas des ddl principaux {List_io < Ddl_enum_etendu >& li_ddl = tabelement_type_ddl_retenu_pourSM(n_mail); @@ -434,7 +434,7 @@ void Choix_grandeurs_maple::Entree_somme_moy_E(string& rep) }; // .. puis on balaie l'ensemble des éléments et l'ensemble des pti if (veriflocal) - {List_io ::iterator idl,idlfin= tab_nomDeRef_E_SM(n_mail).end(); + {//List_io ::iterator idl,idlfin= tab_nomDeRef_E_SM(n_mail).end(); // --- cas des ddl principaux {List_io < Ddl_enum_etendu >& li_ddl = tabelement_type_ddl_retenu_pourSM(n_mail); @@ -959,7 +959,7 @@ void Choix_grandeurs_maple::Entree_somme_moy_E(string& rep) // entrée du choix pour les moyennes sommes etc. sur ref de face d'E void Choix_grandeurs_maple::Entree_somme_moy_F_E(string& rep) { // cas de grandeurs aux faces d'éléments, on boucle sur les maillages - int dim = ParaGlob::Dimension(); + //int dim = ParaGlob::Dimension(); cout << "\n --- somme, moyenne, max, min etc. sur des references de faces d'element et de pti ---"; // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); @@ -1111,7 +1111,7 @@ void Choix_grandeurs_maple::Entree_somme_moy_F_E(string& rep) if (nut.nbPtInteg != -1) // cas d'un seul pti {// on vérifie que ce point d'intégration est valide pour tous les éléments de la référence bool veriflocal = true; - List_io ::iterator idl,idlfin= tab_nomDeRef_F_E_SM(n_mail).end(); + //List_io ::iterator idl,idlfin= tab_nomDeRef_F_E_SM(n_mail).end(); // --- cas des types quelconques aux faces d'éléments {List_io::iterator ite,itefin = li_enu_quelconque.end(); @@ -1206,7 +1206,7 @@ void Choix_grandeurs_maple::Entree_somme_moy_F_E(string& rep) }; // .. puis on balaie l'ensemble des éléments et l'ensemble des pti if (veriflocal) - {List_io ::iterator idl,idlfin= tab_nomDeRef_F_E_SM(n_mail).end(); + {//List_io ::iterator idl,idlfin= tab_nomDeRef_F_E_SM(n_mail).end(); // --- cas des types quelconques aux faces d'éléments {List_io::iterator ite,itefin = li_enu_quelconque.end(); @@ -1586,7 +1586,7 @@ void Choix_grandeurs_maple::Entree_somme_moy_F_E(string& rep) // entrée du choix pour les moyennes sommes etc. sur ref d'arête d'E void Choix_grandeurs_maple::Entree_somme_moy_A_E(string& rep) { // cas de grandeurs aux arêtes d'éléments, on boucle sur les maillages - int dim = ParaGlob::Dimension(); + //int dim = ParaGlob::Dimension(); cout << "\n --- somme, moyenne, max, min etc. sur des references de aretes d'element et de pti ---"; // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); @@ -1739,7 +1739,7 @@ void Choix_grandeurs_maple::Entree_somme_moy_A_E(string& rep) if (nut.nbPtInteg != -1) // cas d'un seul pti {// on vérifie que ce point d'intégration est valide pour tous les arêtes de la référence bool veriflocal = true; - List_io ::iterator idl,idlfin= tab_nomDeRef_A_E_SM(n_mail).end(); + //List_io ::iterator idl,idlfin= tab_nomDeRef_A_E_SM(n_mail).end(); // --- cas des types quelconques aux arêtes d'éléments {List_io::iterator ite,itefin = li_enu_quelconque.end(); @@ -1829,7 +1829,7 @@ void Choix_grandeurs_maple::Entree_somme_moy_A_E(string& rep) }; // .. puis on balaie l'ensemble des arêtes et l'ensemble des pti if (veriflocal) - {List_io ::iterator idl,idlfin= tab_nomDeRef_A_E_SM(n_mail).end(); + {//List_io ::iterator idl,idlfin= tab_nomDeRef_A_E_SM(n_mail).end(); // --- cas des types quelconques aux arêtes d'éléments {List_io::iterator ite,itefin = li_enu_quelconque.end(); @@ -2207,7 +2207,7 @@ void Choix_grandeurs_maple::Entree_somme_moy_A_E(string& rep) // entrée du choix pour les moyennes sommes etc. sur ref N void Choix_grandeurs_maple::Entree_somme_moy_N(string& rep) { // cas de grandeurs aux noeuds, on boucle sur les maillages - int dim = ParaGlob::Dimension(); + //int dim = ParaGlob::Dimension(); cout << "\n --- somme, moyenne, max, min etc. sur des references de noeuds ---"; // on récupère la liste des maillages à visualiser const list & list_mail = choix_mail->List_choisit(); @@ -2992,7 +2992,7 @@ void Choix_grandeurs_maple::Sortie_somme_moy_E(ostream &sort,Charge* charge,bool // .... concernant les ddl principaux ..... if (!type_ddl_retenu_pourSM.empty()) {List_io::iterator ienu=type_ddl_retenu_pourSM.begin(); - List_io::iterator ienufin=type_ddl_retenu_pourSM.end(); + //List_io::iterator ienufin=type_ddl_retenu_pourSM.end(); // maintenant il y a deux cas, soit on travaille avec un seul pti soit // on considère tous les pti, on va faire une boucle par défaut int min_pti=nbPtInteg; int max_pti = nbPtInteg; @@ -3203,7 +3203,7 @@ void Choix_grandeurs_maple::Sortie_entete_somme_moy_N(ostream &sort,int & num_co num_total_grandeur += nb_ddl_etendu*10; // pour les grandeurs quelconques, on ne considère que la somme et la moyenne des grandeurs brutes List_io < TypeQuelconque > &TypeQuelconque_retenu_pourSM = tabnoeud_TypeQuelconque_retenu_pourSM(n_mail); - int nb_TypeQuelconque = TypeQuelconque_retenu_pourSM.size(); + //int nb_TypeQuelconque = TypeQuelconque_retenu_pourSM.size(); // on dimensionne en fonction de la taille de la grandeur quelconque {List_io::iterator ienu,ienufin=TypeQuelconque_retenu_pourSM.end(); int num_enu = 1; @@ -3331,7 +3331,7 @@ void Choix_grandeurs_maple::Sortie_entete_somme_moy_E(ostream &sort,int & num_co // pour les grandeurs quelconques, on ne considère que la somme et la moyenne des grandeurs brutes List_io < TypeQuelconque > &TypeQuelconque_retenu_pourSM = tabelement_typeParti_retenu_pourSM(n_mail); - int nb_TypeQuelconque = TypeQuelconque_retenu_pourSM.size(); + //int nb_TypeQuelconque = TypeQuelconque_retenu_pourSM.size(); // on dimensionne en fonction de la taille de la grandeur quelconque {List_io::iterator ienu,ienufin=TypeQuelconque_retenu_pourSM.end(); int num_enu = 1; @@ -3342,7 +3342,7 @@ void Choix_grandeurs_maple::Sortie_entete_somme_moy_E(ostream &sort,int & num_co }; // pour les grandeurs évoluées, on ne considère que la somme et la moyenne des grandeurs brutes List_io < TypeQuelconque > &Type_evoluee_retenu_pourSM = tabelement_evoluee_retenu_pourSM(n_mail); - int nb_Type_evoluee = Type_evoluee_retenu_pourSM.size(); + //int nb_Type_evoluee = Type_evoluee_retenu_pourSM.size(); // on dimensionne en fonction de la taille de la grandeur quelconque {List_io::iterator ienu,ienufin=Type_evoluee_retenu_pourSM.end(); int num_enu = 1; @@ -3797,7 +3797,7 @@ void Choix_grandeurs_maple::Sortie_entete_somme_moy_face_E(ostream &sort,int & n // pour les grandeurs quelconques, on ne considère que la somme et la moyenne des grandeurs brutes List_io < TypeQuelconque > &TypeQuelconque_retenu_pourSM = tab_F_element_TypeQuelconque_retenu_pourSM(n_mail); - int nb_TypeQuelconque = TypeQuelconque_retenu_pourSM.size(); + //int nb_TypeQuelconque = TypeQuelconque_retenu_pourSM.size(); // on dimensionne en fonction de la taille de la grandeur quelconque {List_io::iterator ienu,ienufin=TypeQuelconque_retenu_pourSM.end(); int num_enu = 1; @@ -3887,7 +3887,7 @@ void Choix_grandeurs_maple::Sortie_entete_somme_moy_arete_E(ostream &sort,int & // pour les grandeurs quelconques, on ne considère que la somme et la moyenne des grandeurs brutes List_io < TypeQuelconque > &TypeQuelconque_retenu_pourSM = tab_A_element_TypeQuelconque_retenu_pourSM(n_mail); - int nb_TypeQuelconque = TypeQuelconque_retenu_pourSM.size(); + //int nb_TypeQuelconque = TypeQuelconque_retenu_pourSM.size(); // on dimensionne en fonction de la taille de la grandeur quelconque {List_io::iterator ienu,ienufin=TypeQuelconque_retenu_pourSM.end(); int num_enu = 1; diff --git a/Resultats/MAPLE/Deformees_maple.cc b/Resultats/MAPLE/Deformees_maple.cc index e043369..e9a5a38 100644 --- a/Resultats/MAPLE/Deformees_maple.cc +++ b/Resultats/MAPLE/Deformees_maple.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/MAPLE/Deformees_maple.h b/Resultats/MAPLE/Deformees_maple.h index 156bf4f..e5971e8 100644 --- a/Resultats/MAPLE/Deformees_maple.h +++ b/Resultats/MAPLE/Deformees_maple.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/MAPLE/Fin_maple.cc b/Resultats/MAPLE/Fin_maple.cc index d4b84a7..0f693da 100644 --- a/Resultats/MAPLE/Fin_maple.cc +++ b/Resultats/MAPLE/Fin_maple.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/MAPLE/Fin_maple.h b/Resultats/MAPLE/Fin_maple.h index 854a1ed..481813a 100644 --- a/Resultats/MAPLE/Fin_maple.h +++ b/Resultats/MAPLE/Fin_maple.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/MAPLE/Visuali_maple.cc b/Resultats/MAPLE/Visuali_maple.cc index 9541792..be7cdd8 100644 --- a/Resultats/MAPLE/Visuali_maple.cc +++ b/Resultats/MAPLE/Visuali_maple.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/MAPLE/Visuali_maple.h b/Resultats/MAPLE/Visuali_maple.h index 8ef3087..b348298 100644 --- a/Resultats/MAPLE/Visuali_maple.h +++ b/Resultats/MAPLE/Visuali_maple.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/MAPLE/Visualisation_maple.cc b/Resultats/MAPLE/Visualisation_maple.cc index eb2d7b5..d3be649 100755 --- a/Resultats/MAPLE/Visualisation_maple.cc +++ b/Resultats/MAPLE/Visualisation_maple.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/MAPLE/Visualisation_maple.h b/Resultats/MAPLE/Visualisation_maple.h index c8008cc..a963abd 100755 --- a/Resultats/MAPLE/Visualisation_maple.h +++ b/Resultats/MAPLE/Visualisation_maple.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/OrdreVisu.cc b/Resultats/OrdreVisu.cc index 233a8bf..5cbeb6b 100755 --- a/Resultats/OrdreVisu.cc +++ b/Resultats/OrdreVisu.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/OrdreVisu.h b/Resultats/OrdreVisu.h index 3976341..cbe2758 100755 --- a/Resultats/OrdreVisu.h +++ b/Resultats/OrdreVisu.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/Resultats.cc b/Resultats/Resultats.cc index 36f34d7..114bd0d 100644 --- a/Resultats/Resultats.cc +++ b/Resultats/Resultats.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -143,7 +143,7 @@ void Resultats::Lecture(LesReferences* lesRef) else {cout << "\n ===============================================\n" ; // on signale l'erreur - cout << "\n **** bizarre, erreur inconnue en lecture des parametres de sortie de resultats "; + cout << "\n **** bizarre, erreur inconnue en lecture des parametres de sortie de 'resultats' ( fin du .info ) "; throw (erreur); }; } @@ -791,7 +791,7 @@ void Resultats::SortieNoeudContaintes << ", Resultats::SortieNoeudErreur(etc..." << endl; Sortie(1); } - int dim = paraGlob->Dimension (); + //int dim = paraGlob->Dimension (); // on balaie tous les noeuds du maillage int nbmaxinoeud = lesMail->Nombre_noeud(numMail); // écriture de l'entête @@ -856,7 +856,7 @@ void Resultats::SortieNoeudContaintes << ", Resultats::SortieElemErreur(etc..." << endl; Sortie(1); } - int dim = paraGlob->Dimension (); + //int dim = paraGlob->Dimension (); // on balaie tous les éléments du maillage int nbmaxiElement = lesMail->Nombre_element(numMail); // écriture de l'entête diff --git a/Resultats/Resultats.h b/Resultats/Resultats.h index 88f3c7b..7089fcd 100644 --- a/Resultats/Resultats.h +++ b/Resultats/Resultats.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Resultats/VRML/Animation_vrml.cc b/Resultats/VRML/Animation_vrml.cc index 60dd297..e4dba65 100644 --- a/Resultats/VRML/Animation_vrml.cc +++ b/Resultats/VRML/Animation_vrml.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -72,239 +72,240 @@ void Animation_vrml::ExeOrdre(ParaGlob * paraGlob,const Tableau & ,LesMaill {ostream &sort = entreePrinc.Sort_princ_vrml(); // définition de l'animation uniquement si animation est vraie if (actif && animation) - if (list_nom_coordinate.size() == 0) + {if (list_nom_coordinate.size() == 0) // cas ou on n'a pas définit les coordonnées c'est-a-dire que l'ordre déformée // n'a pas été exécutée, on ne peut rien faire sinon prévenir de définir la déformée { cout << "\n les parametres de deformee ne sont pas definit, l'animation ne " << " peut-être exécutee !! " << "\n recommencee en définissant la deformee "; - } + } else - { // on défini le trigger qui permet le démarrage de l'animation - // dans le cas d'un démarrage non automatique - if (!debut_auto) // cas d'un début non automatique - sort << "\n # Trigger things on touch: cas d'un demarrage non automatique" - << "\n DEF Touch TouchSensor { } "; - // on défini le timer - sort << "\n DEF Clock TimeSensor {" - << "\n cycleInterval " << cycleInterval - << "\n loop " ; - if (loop) sort << "TRUE"; else sort << "FALSE"; - sort << "\n startTime " << startTime - << "\n stopTime " << stopTime - << "\n } \n"; - - // ------ on défini l' interpolateur de points ---- - // récup du nombre de maillage qui sont visualisé - const list & lis_mail_choisit = choix_mail->List_choisit(); - int nb_maillage= lis_mail_choisit.size(); - // on fractionne régulièrement le temps - int nb_step = (int) (list_nom_coordinate.size()/nb_maillage); - // nb_step donne le nombre d'incrément - double step_time = 1./(nb_step-1); - // boucle sur les maillages - for (int imail=1;imail<=nb_maillage;imail++) - {// def de l'interpolateur de coordonnées - sort << "\n DEF InterpolDePoints" << imail << " CoordinateInterpolator { " - << "\n key [ "; - for (int i=1; i<= nb_step-1; i++) - sort << " " << step_time*(i-1); - sort << " " << 1 << "] "; - // on écrit les coordonnées - sort << "\n keyValue [ \n"; - list >::iterator il,ilfin = list_coordinate.end(); - list ::iterator ik,ikfin; - int compte; - // on décale le début de il en fonction du maillage traité - il=list_coordinate.begin();for (int ib=2;ib<=imail;ib++) - {il++;if(il==ilfin) {cout << "\n erreur de sortie d'animation vrml";Sortie(1);}}; - for (compte=1;il!=ilfin;) // l'incrémentation de il est multiple donc traitée dans la boucle - { ikfin = il->end(); - for (ik=il->begin();ik!=ikfin;ik++,compte++) - { sort << " " << setw (16); (*ik).Affiche(sort,16); - // si l'on n'est pas en dimension 3 on complete avec des zeros - if (paraGlob->Dimension () == 2) - { sort << setw (16) << 0 <<" ";} - else if (paraGlob->Dimension () == 1) - { sort << setw (16) << 0 <<" " << setw (16) << 0 <<" ";} - sort << " , "; - if (compte == 2) - { compte = 1; sort << "\n";} - } - // on s'occupe d'incrémenter il - for (int ib=1;ib<=nb_maillage;ib++) - {il++; if (il== ilfin) break;}; - } - sort << "\n ] } "; - } - // ------ on défini l' interpolateur de couleur éventuellement ---- - // pour l'instant ne sert pas car il faut un script !! -/* if (isovaleurs_vrml->Actif()) - { sort << "\n DEF InterpolDeCouleurs ColorInterpolator { " - << "\n key [ "; - // on fractionne régulièrement le temps - int nb_step = (int) list_nom_coordinate.size(); - double step_time = 1./(nb_step-1); - for (int i=1; i<= nb_step-1; i++) - sort << " " << step_time*(i-1); - sort << " " << 1 << "] "; - // def d'un conteneur intermédiaire pour simplifier - const list < Tableau < Rgb > > & list_couleur = isovaleurs_vrml->List_couleur(); - - // on écrit les couleurs - sort << "\n keyValue [ \n"; - list >::const_iterator il,ilfin = list_couleur.end(); - int compte; - for (il=list_couleur.begin(),compte=1;il!=ilfin;il++) - { int taill=(*il).Taille(); - for (int ik=1;ik<=taill;ik++,compte++) - { sort << " " << setw (16) << (*il)(ik); - sort << " , "; - if (compte == 2) - { compte = 1; sort << "\n"; - } + { // on défini le trigger qui permet le démarrage de l'animation + // dans le cas d'un démarrage non automatique + if (!debut_auto) // cas d'un début non automatique + sort << "\n # Trigger things on touch: cas d'un demarrage non automatique" + << "\n DEF Touch TouchSensor { } "; + // on défini le timer + sort << "\n DEF Clock TimeSensor {" + << "\n cycleInterval " << cycleInterval + << "\n loop " ; + if (loop) sort << "TRUE"; else sort << "FALSE"; + sort << "\n startTime " << startTime + << "\n stopTime " << stopTime + << "\n } \n"; + + // ------ on défini l' interpolateur de points ---- + // récup du nombre de maillage qui sont visualisé + const list & lis_mail_choisit = choix_mail->List_choisit(); + int nb_maillage= lis_mail_choisit.size(); + // on fractionne régulièrement le temps + int nb_step = (int) (list_nom_coordinate.size()/nb_maillage); + // nb_step donne le nombre d'incrément + double step_time = 1./(nb_step-1); + // boucle sur les maillages + for (int imail=1;imail<=nb_maillage;imail++) + {// def de l'interpolateur de coordonnées + sort << "\n DEF InterpolDePoints" << imail << " CoordinateInterpolator { " + << "\n key [ "; + for (int i=1; i<= nb_step-1; i++) + sort << " " << step_time*(i-1); + sort << " " << 1 << "] "; + // on écrit les coordonnées + sort << "\n keyValue [ \n"; + list >::iterator il,ilfin = list_coordinate.end(); + list ::iterator ik,ikfin; + int compte; + // on décale le début de il en fonction du maillage traité + il=list_coordinate.begin();for (int ib=2;ib<=imail;ib++) + {il++;if(il==ilfin) {cout << "\n erreur de sortie d'animation vrml";Sortie(1);}}; + for (compte=1;il!=ilfin;) // l'incrémentation de il est multiple donc traitée dans la boucle + { ikfin = il->end(); + for (ik=il->begin();ik!=ikfin;ik++,compte++) + { sort << " " << setw (16); (*ik).Affiche(sort,16); + // si l'on n'est pas en dimension 3 on complete avec des zeros + if (paraGlob->Dimension () == 2) + { sort << setw (16) << 0 <<" ";} + else if (paraGlob->Dimension () == 1) + { sort << setw (16) << 0 <<" " << setw (16) << 0 <<" ";} + sort << " , "; + if (compte == 2) + { compte = 1; sort << "\n";} + } + // on s'occupe d'incrémenter il + for (int ib=1;ib<=nb_maillage;ib++) + {il++; if (il== ilfin) break;}; } - } - sort << "\n ] } "; - } */ - // on définit les interpolateurs scalaires qui permettent de gérer la transparence de chaque - // incrément. L'idée est que la transparence d'un incrément est active uniquement sur un - // pas de temps, tout le reste du temps l'incrément est tout transparent - if (isovaleurs_vrml->Actif()) - { sort << "\n \n # ------ cas des isovaleurs, definition des interpolateurs scalaires pour la transparence " - << " des matieres ----- "; - // on a autant d'interpolateur que de step - double dex=step_time/10; - for (int ist=1;ist<= nb_step;ist++) - {sort << "\n DEF inter_intense"<Actif()) + { sort << "\n DEF InterpolDeCouleurs ColorInterpolator { " + << "\n key [ "; + // on fractionne régulièrement le temps + int nb_step = (int) list_nom_coordinate.size(); + double step_time = 1./(nb_step-1); + for (int i=1; i<= nb_step-1; i++) + sort << " " << step_time*(i-1); + sort << " " << 1 << "] "; + // def d'un conteneur intermédiaire pour simplifier + const list < Tableau < Rgb > > & list_couleur = isovaleurs_vrml->List_couleur(); + + // on écrit les couleurs + sort << "\n keyValue [ \n"; + list >::const_iterator il,ilfin = list_couleur.end(); + int compte; + for (il=list_couleur.begin(),compte=1;il!=ilfin;il++) + { int taill=(*il).Taille(); + for (int ik=1;ik<=taill;ik++,compte++) + { sort << " " << setw (16) << (*il)(ik); + sort << " , "; + if (compte == 2) + { compte = 1; sort << "\n"; + } } - sort << " 1.0, "; - } - sort << "] "; - sort << "\n } "; - } - } - - // on définit maintenant le routage pour le déplacement - sort << "\n \n # ------ definition de l'horloge ----- "; - if (!debut_auto) // cas d'un début non automatique - sort << "\n ROUTE Touch.touchTime TO Clock.set_startTime"; - else // cas d'un début automatique - { // on défini une deuxième horloge qui fléchée vers la première servira de démarrage auto - sort << "\n# cas ou on veut un demarrage automatique, on cree une deuxieme horloge" - << "\n# dont le cycle est flechee vers la premiere,"; - sort << "\n DEF Clock2 TimeSensor {" - << "\n cycleInterval " << (cycleInterval+inter_2pas) - << "\n loop TRUE " ; - sort << "\n startTime " << startTime - << "\n stopTime " << -1. - << "\n }"; - sort << "\n ROUTE Clock2.cycleTime TO Clock.set_startTime"; - }; - // def du routage pour la géométrie - sort << "\n \n # ------ definition du routage pour la deformee de base ----- "; - // boucle sur les maillages - for (int imail=1;imail<=nb_maillage;imail++) - {sort << "\n ROUTE Clock.fraction_changed TO InterpolDePoints"<::iterator ilc = list_nom_coordinate.begin(); - list ::iterator ilcfin = list_nom_coordinate.end(); - for (int ib=2;ib<=imail;ib++) - {ilc++;if(ilc==ilcfin) {cout << "\n erreur de sortie 2 d'animation vrml";Sortie(1);}}; - // fin de la sortie des infos - sort << *(ilc) << ".set_point"; - } - -//*** le cas des isovaleurs avec plusieurs maillage est à traiter !!!!!!!!!!!!!! - // si l'on a des isovaleurs on route également sur tous les incréments + } + sort << "\n ] } "; + } */ + // on définit les interpolateurs scalaires qui permettent de gérer la transparence de chaque + // incrément. L'idée est que la transparence d'un incrément est active uniquement sur un + // pas de temps, tout le reste du temps l'incrément est tout transparent if (isovaleurs_vrml->Actif()) - {sort << "\n \n # ------ cas des isovaleurs, definition des routages pour toutes les deformees ----- "; - list ::iterator ino=list_nom_coordinate.begin(); - ino++; // le premier est déjà fait - // on boucle sur le nombre d'incrément puis sur le nombre de maillage - for (int ic=2;ic<= nb_step;ic++) // on commence à deux cas 1 est déjà fait - for (int im=1;im<=nb_maillage;im++,ino++) - {sort << "\n ROUTE Clock.fraction_changed TO InterpolDePoints"<Actif()) - { sort << "\n \n # ------ cas des isovaleurs, definition des routages pour la transparence " - << " des matieres ----- "; - // récup de la liste des noms de matière - const list & noms_matiere = choix_deformee->Noms_matiere(); - list ::const_iterator inom=noms_matiere.begin(); - // on boucle sur le nombre d'incrément puis sur le nombre de maillage - for (int ic=1;ic<= nb_step;ic++) - for (int im=1;im<=nb_maillage;im++,inom++) - {sort << "\n ROUTE Clock.fraction_changed TO inter_intense"<::iterator ilc = list_nom_coordinate.begin(); + list ::iterator ilcfin = list_nom_coordinate.end(); + for (int ib=2;ib<=imail;ib++) + {ilc++;if(ilc==ilcfin) {cout << "\n erreur de sortie 2 d'animation vrml";Sortie(1);}}; + // fin de la sortie des infos + sort << *(ilc) << ".set_point"; + } - }; + //*** le cas des isovaleurs avec plusieurs maillage est à traiter !!!!!!!!!!!!!! + // si l'on a des isovaleurs on route également sur tous les incréments + if (isovaleurs_vrml->Actif()) + {sort << "\n \n # ------ cas des isovaleurs, definition des routages pour toutes les deformees ----- "; + list ::iterator ino=list_nom_coordinate.begin(); + ino++; // le premier est déjà fait + // on boucle sur le nombre d'incrément puis sur le nombre de maillage + for (int ic=2;ic<= nb_step;ic++) // on commence à deux cas 1 est déjà fait + for (int im=1;im<=nb_maillage;im++,ino++) + {sort << "\n ROUTE Clock.fraction_changed TO InterpolDePoints"<Actif()) + { sort << "\n \n # ------ cas des isovaleurs, definition des routages pour la transparence " + << " des matieres ----- "; + // récup de la liste des noms de matière + const list & noms_matiere = choix_deformee->Noms_matiere(); + list ::const_iterator inom=noms_matiere.begin(); + // on boucle sur le nombre d'incrément puis sur le nombre de maillage + for (int ic=1;ic<= nb_step;ic++) + for (int im=1;im<=nb_maillage;im++,inom++) + {sort << "\n ROUTE Clock.fraction_changed TO inter_intense"<::const_iterator il,ilfin=list_balaie->end(); + { //list ::const_iterator il,ilfin=list_balaie->end(); if (*(list_balaie->begin())==0) // cas du premier incrément = maillage initial if(list_balaie->size() > 2) animation = true; else animation = false; diff --git a/Resultats/Visualisation.h b/Resultats/Visualisation.h index fa1ee81..d2dc158 100644 --- a/Resultats/Visualisation.h +++ b/Resultats/Visualisation.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Tableaux/TabOper_T.h b/Tableaux/TabOper_T.h index 9859446..bff624d 100644 --- a/Tableaux/TabOper_T.h +++ b/Tableaux/TabOper_T.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Tableaux/Tableau2_T.h b/Tableaux/Tableau2_T.h index 311e00e..783cc26 100644 --- a/Tableaux/Tableau2_T.h +++ b/Tableaux/Tableau2_T.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -85,7 +85,7 @@ class Tableau2 : public Tableau // DESTRUCTEUR : - ~Tableau2 (); + virtual ~Tableau2 (); // METHODES : diff --git a/Tableaux/Tableau4_T.h b/Tableaux/Tableau4_T.h index d2a0352..354e8a3 100644 --- a/Tableaux/Tableau4_T.h +++ b/Tableaux/Tableau4_T.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Tableaux/Tableau_3D.cc b/Tableaux/Tableau_3D.cc index d53a650..0baa51d 100644 --- a/Tableaux/Tableau_3D.cc +++ b/Tableaux/Tableau_3D.cc @@ -1 +1 @@ -// FICHIER : Tableau_3D.cc // CLASSE : Tableau_3D // This file is part of the Herezh++ application. // // The finite element software Herezh++ is dedicated to the field // of mechanics for large transformations of solid structures. // It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600) // INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) . // // Herezh++ is distributed under GPL 3 license ou ultérieure. // // Copyright (C) 1997-2021 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // For more information, please consult: . #include using namespace std; #include #include "Sortie.h" #include "Tableau_3D.h" Tableau_3D::Tableau_3D () // Constructeur par defaut { dim1=0; dim2=0; dim3=0; t=NULL; }; Tableau_3D::Tableau_3D (int d1,int d2,int d3,double val) // Constructeur utile quand les trois dimensions ainsi qu'une // eventuelle valeur d'initialisation sont connues { if ( ( d1<0 ) || ( d2<0 ) || ( d3<0 ) ) { cout << "\nErreur : taille(s) invalide(s) !\n"; cout << "TABLEAU_3D::TABLEAU_3D(int ,int ,int ,double ) \n"; Sortie(1); }; if ( ( d1==0 ) || ( d2==0 ) || ( d3==0 ) ) // cas ou une des dimensions est nulle : initialisation identique // a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; t=NULL; } else // autres cas { dim1=d1; dim2=d2; dim3=d3; t=new double [d1*d2*d3]; // allocation dynamique de la memoire Initialise(val); // initialisation des composantes a val }; }; Tableau_3D::Tableau_3D (const Tableau_3D& tab) // Constructeur de copie { if ( tab.dim1==0 ) // cas ou le tableau copie est vide : initialisation // identique a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; t=NULL; } else { dim1=tab.dim1; dim2=tab.dim2; dim3=tab.dim3; t=new double [dim1*dim2*dim3]; // allocation dynamique de la memoire double* ptr1=t; double* ptr2=tab.t; for (int i=0;i0 ) delete [] t; // desallocation de la place memoire else { if ( t!=NULL ) { cout << "\nErreur de liberation de la place memoire\n"; cout << "TABLEAU_3D::LIBERE() \n"; Sortie(1); } }; t=NULL; dim1=0; dim2=0; dim3=0; }; Tableau_3D& Tableau_3D::operator= (const Tableau_3D& tab) // Surcharge de l'operateur = : egalite entre deux tableaux a trois dimensions { if ( t!=NULL ) Libere(); // cas ou le tableau se trouvant a gauche du signe = // n'est pas vide : desallocation de ce tableau if ( tab.dim1==0 ) // cas ou le tableau se trouvant a droite du signe = est vide : initialisation // identique a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; t=NULL; } else // autres cas { dim1=tab.dim1; dim2=tab.dim2; dim3=tab.dim3; t=new double [dim1*dim2*dim3]; // allocation de la place memoire double* ptr1=t; double* ptr2=tab.t; // copie des elements du tableau se trouvant a droite dans le tableau se trouvant // a gauche du signe d'affectation for (int i=0;i. // // 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 using namespace std; #include #include "Sortie.h" #include "Tableau_3D.h" Tableau_3D::Tableau_3D () // Constructeur par defaut { dim1=0; dim2=0; dim3=0; t=NULL; }; Tableau_3D::Tableau_3D (int d1,int d2,int d3,double val) // Constructeur utile quand les trois dimensions ainsi qu'une // eventuelle valeur d'initialisation sont connues { if ( ( d1<0 ) || ( d2<0 ) || ( d3<0 ) ) { cout << "\nErreur : taille(s) invalide(s) !\n"; cout << "TABLEAU_3D::TABLEAU_3D(int ,int ,int ,double ) \n"; Sortie(1); }; if ( ( d1==0 ) || ( d2==0 ) || ( d3==0 ) ) // cas ou une des dimensions est nulle : initialisation identique // a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; t=NULL; } else // autres cas { dim1=d1; dim2=d2; dim3=d3; t=new double [d1*d2*d3]; // allocation dynamique de la memoire Initialise(val); // initialisation des composantes a val }; }; Tableau_3D::Tableau_3D (const Tableau_3D& tab) // Constructeur de copie { if ( tab.dim1==0 ) // cas ou le tableau copie est vide : initialisation // identique a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; t=NULL; } else { dim1=tab.dim1; dim2=tab.dim2; dim3=tab.dim3; t=new double [dim1*dim2*dim3]; // allocation dynamique de la memoire double* ptr1=t; double* ptr2=tab.t; for (int i=0;i0 ) delete [] t; // desallocation de la place memoire else { if ( t!=NULL ) { cout << "\nErreur de liberation de la place memoire\n"; cout << "TABLEAU_3D::LIBERE() \n"; Sortie(1); } }; t=NULL; dim1=0; dim2=0; dim3=0; }; Tableau_3D& Tableau_3D::operator= (const Tableau_3D& tab) // Surcharge de l'operateur = : egalite entre deux tableaux a trois dimensions { if ( t!=NULL ) Libere(); // cas ou le tableau se trouvant a gauche du signe = // n'est pas vide : desallocation de ce tableau if ( tab.dim1==0 ) // cas ou le tableau se trouvant a droite du signe = est vide : initialisation // identique a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; t=NULL; } else // autres cas { dim1=tab.dim1; dim2=tab.dim2; dim3=tab.dim3; t=new double [dim1*dim2*dim3]; // allocation de la place memoire double* ptr1=t; double* ptr2=tab.t; // copie des elements du tableau se trouvant a droite dans le tableau se trouvant // a gauche du signe d'affectation for (int i=0;i. // // Herezh++ is distributed under GPL 3 license ou ultérieure. // // Copyright (C) 1997-2021 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // For more information, please consult: . #include using namespace std; #include #include "Tableau_4D.h" Tableau_4D::Tableau_4D () // Constructeur par defaut { dim1=0; dim2=0; dim3=0; dim4=0; t=NULL; }; Tableau_4D::Tableau_4D (int d1,int d2,int d3,int d4,double val) // Constructeur utile quand les quatre dimensions ainsi qu'une // eventuelle valeur d'initialisation sont connues { if ( ( d1<0 ) || ( d2<0 ) || ( d3<0 ) || ( d4<0 ) ) { cout << "\nErreur : taille(s) invalide(s) !\n"; cout << "TABLEAU_4D::TABLEAU_4D(int ,int ,int ,int ,double ) \n"; exit(1); }; if ( ( d1==0 ) || ( d2==0 ) || ( d3==0 ) || ( d4==0 ) ) // cas ou une des dimensions est nulle : initialisation identique // a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; dim4=0; t=NULL; } else // autres cas { dim1=d1; dim2=d2; dim3=d3; dim4=d4; t=new double [d1*d2*d3*d4]; // allocation dynamique de la memoire Initialise(val); // initialisation des composantes a val }; }; Tableau_4D::Tableau_4D (const Tableau_4D& tab) // Constructeur de copie { if ( tab.dim1==0 ) // cas ou le tableau copie est vide : initialisation // identique a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; dim4=0; t=NULL; } else { dim1=tab.dim1; dim2=tab.dim2; dim3=tab.dim3; dim4=tab.dim4; t=new double [dim1*dim2*dim3*dim4]; // allocation dynamique de la memoire double* ptr1=t; double* ptr2=tab.t; for (int i=0;i0 ) delete [] t; // desallocation de la place memoire else { if ( t!=NULL ) { cout << "\nErreur de liberation de la place memoire\n"; cout << "TABLEAU_4D::LIBERE() \n"; exit(1); } }; t=NULL; dim1=0; dim2=0; dim3=0; dim4=0; }; Tableau_4D& Tableau_4D::operator= (const Tableau_4D& tab) // Surcharge de l'operateur = : egalite entre deux tableaux a quatre dimensions { if ( t!=NULL ) Libere(); // cas ou le tableau se trouvant a gauche du signe = // n'est pas vide : desallocation de ce tableau if ( tab.dim1==0 ) // cas ou le tableau se trouvant a droite du signe = est vide : initialisation // identique a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; dim4=0; t=NULL; } else // autres cas { dim1=tab.dim1; dim2=tab.dim2; dim3=tab.dim3; dim4=tab.dim4; t=new double [dim1*dim2*dim3*dim4]; // allocation de la place memoire double* ptr1=t; double* ptr2=tab.t; // copie des elements du tableau se trouvant a droite dans le tableau se trouvant // a gauche du signe d'affectation for (int i=0;i. // // 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 using namespace std; #include #include "Tableau_4D.h" Tableau_4D::Tableau_4D () // Constructeur par defaut { dim1=0; dim2=0; dim3=0; dim4=0; t=NULL; }; Tableau_4D::Tableau_4D (int d1,int d2,int d3,int d4,double val) // Constructeur utile quand les quatre dimensions ainsi qu'une // eventuelle valeur d'initialisation sont connues { if ( ( d1<0 ) || ( d2<0 ) || ( d3<0 ) || ( d4<0 ) ) { cout << "\nErreur : taille(s) invalide(s) !\n"; cout << "TABLEAU_4D::TABLEAU_4D(int ,int ,int ,int ,double ) \n"; exit(1); }; if ( ( d1==0 ) || ( d2==0 ) || ( d3==0 ) || ( d4==0 ) ) // cas ou une des dimensions est nulle : initialisation identique // a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; dim4=0; t=NULL; } else // autres cas { dim1=d1; dim2=d2; dim3=d3; dim4=d4; t=new double [d1*d2*d3*d4]; // allocation dynamique de la memoire Initialise(val); // initialisation des composantes a val }; }; Tableau_4D::Tableau_4D (const Tableau_4D& tab) // Constructeur de copie { if ( tab.dim1==0 ) // cas ou le tableau copie est vide : initialisation // identique a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; dim4=0; t=NULL; } else { dim1=tab.dim1; dim2=tab.dim2; dim3=tab.dim3; dim4=tab.dim4; t=new double [dim1*dim2*dim3*dim4]; // allocation dynamique de la memoire double* ptr1=t; double* ptr2=tab.t; for (int i=0;i0 ) delete [] t; // desallocation de la place memoire else { if ( t!=NULL ) { cout << "\nErreur de liberation de la place memoire\n"; cout << "TABLEAU_4D::LIBERE() \n"; exit(1); } }; t=NULL; dim1=0; dim2=0; dim3=0; dim4=0; }; Tableau_4D& Tableau_4D::operator= (const Tableau_4D& tab) // Surcharge de l'operateur = : egalite entre deux tableaux a quatre dimensions { if ( t!=NULL ) Libere(); // cas ou le tableau se trouvant a gauche du signe = // n'est pas vide : desallocation de ce tableau if ( tab.dim1==0 ) // cas ou le tableau se trouvant a droite du signe = est vide : initialisation // identique a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; dim4=0; t=NULL; } else // autres cas { dim1=tab.dim1; dim2=tab.dim2; dim3=tab.dim3; dim4=tab.dim4; t=new double [dim1*dim2*dim3*dim4]; // allocation de la place memoire double* ptr1=t; double* ptr2=tab.t; // copie des elements du tableau se trouvant a droite dans le tableau se trouvant // a gauche du signe d'affectation for (int i=0;i. // // Herezh++ is distributed under GPL 3 license ou ultérieure. // // Copyright (C) 1997-2021 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // For more information, please consult: . // FICHIER : Tableau_5D.cp // CLASSE : Tableau_5D #include using namespace std; #include #include "Tableau_5D.h" Tableau_5D::Tableau_5D () // Constructeur par defaut { dim1=0; dim2=0; dim3=0; dim4=0; dim5=0; t=NULL; }; Tableau_5D::Tableau_5D (int d1,int d2,int d3,int d4,int d5,double val) // Constructeur utile quand les cinq dimensions ainsi qu'une // eventuelle valeur d'initialisation sont connues { if ( ( d1<0 ) || ( d2<0 ) || ( d3<0 ) || ( d4<0 ) || ( d5<0 ) ) { cout << "\nErreur : taille(s) invalide(s) !\n"; cout << "TABLEAU_5D::TABLEAU_5D(int ,int ,int ,int ,int ,double ) \n"; exit(1); }; if ( ( d1==0 ) || ( d2==0 ) || ( d3==0 ) || ( d4==0 ) || ( d5==0 ) ) // cas ou une des dimensions est nulle : initialisation identique // a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; dim4=0; dim5=0; t=NULL; } else // autres cas { dim1=d1; dim2=d2; dim3=d3; dim4=d4; dim5=d5; t=new double [d1*d2*d3*d4*d5]; // allocation dynamique de la memoire Initialise(val); // initialisation des composantes a val }; }; Tableau_5D::Tableau_5D (const Tableau_5D& tab) // Constructeur de copie { if ( tab.dim1==0 ) // cas ou le tableau copie est vide : initialisation // identique a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; dim4=0; dim5=0; t=NULL; } else { dim1=tab.dim1; dim2=tab.dim2; dim3=tab.dim3; dim4=tab.dim4; dim5=tab.dim5; t=new double [dim1*dim2*dim3*dim4*dim5]; // allocation dynamique de la memoire double* ptr1=t; double* ptr2=tab.t; for (int i=0;i0 ) delete [] t; // desallocation de la place memoire else { if ( t!=NULL ) { cout << "\nErreur de liberation de la place memoire\n"; cout << "TABLEAU_5D::LIBERE() \n"; exit(1); } }; t=NULL; dim1=0; dim2=0; dim3=0; dim4=0; dim5=0; }; Tableau_5D& Tableau_5D::operator= (const Tableau_5D& tab) // Surcharge de l'operateur = : egalite entre deux tableaux a cinq dimensions { if ( t!=NULL ) Libere(); // cas ou le tableau se trouvant a gauche du signe = // n'est pas vide : desallocation de ce tableau if ( tab.dim1==0 ) // cas ou le tableau se trouvant a droite du signe = est vide : initialisation // identique a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; dim4=0; dim5=0; t=NULL; } else // autres cas { dim1=tab.dim1; dim2=tab.dim2; dim3=tab.dim3; dim4=tab.dim4; dim5=tab.dim5; t=new double [dim1*dim2*dim3*dim4*dim5]; // allocation de la place memoire double* ptr1=t; double* ptr2=tab.t; // copie des elements du tableau se trouvant a droite dans le tableau se trouvant // a gauche du signe d'affectation for (int i=0;i. // // 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: . // FICHIER : Tableau_5D.cp // CLASSE : Tableau_5D #include using namespace std; #include #include "Tableau_5D.h" Tableau_5D::Tableau_5D () // Constructeur par defaut { dim1=0; dim2=0; dim3=0; dim4=0; dim5=0; t=NULL; }; Tableau_5D::Tableau_5D (int d1,int d2,int d3,int d4,int d5,double val) // Constructeur utile quand les cinq dimensions ainsi qu'une // eventuelle valeur d'initialisation sont connues { if ( ( d1<0 ) || ( d2<0 ) || ( d3<0 ) || ( d4<0 ) || ( d5<0 ) ) { cout << "\nErreur : taille(s) invalide(s) !\n"; cout << "TABLEAU_5D::TABLEAU_5D(int ,int ,int ,int ,int ,double ) \n"; exit(1); }; if ( ( d1==0 ) || ( d2==0 ) || ( d3==0 ) || ( d4==0 ) || ( d5==0 ) ) // cas ou une des dimensions est nulle : initialisation identique // a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; dim4=0; dim5=0; t=NULL; } else // autres cas { dim1=d1; dim2=d2; dim3=d3; dim4=d4; dim5=d5; t=new double [d1*d2*d3*d4*d5]; // allocation dynamique de la memoire Initialise(val); // initialisation des composantes a val }; }; Tableau_5D::Tableau_5D (const Tableau_5D& tab) // Constructeur de copie { if ( tab.dim1==0 ) // cas ou le tableau copie est vide : initialisation // identique a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; dim4=0; dim5=0; t=NULL; } else { dim1=tab.dim1; dim2=tab.dim2; dim3=tab.dim3; dim4=tab.dim4; dim5=tab.dim5; t=new double [dim1*dim2*dim3*dim4*dim5]; // allocation dynamique de la memoire double* ptr1=t; double* ptr2=tab.t; for (int i=0;i0 ) delete [] t; // desallocation de la place memoire else { if ( t!=NULL ) { cout << "\nErreur de liberation de la place memoire\n"; cout << "TABLEAU_5D::LIBERE() \n"; exit(1); } }; t=NULL; dim1=0; dim2=0; dim3=0; dim4=0; dim5=0; }; Tableau_5D& Tableau_5D::operator= (const Tableau_5D& tab) // Surcharge de l'operateur = : egalite entre deux tableaux a cinq dimensions { if ( t!=NULL ) Libere(); // cas ou le tableau se trouvant a gauche du signe = // n'est pas vide : desallocation de ce tableau if ( tab.dim1==0 ) // cas ou le tableau se trouvant a droite du signe = est vide : initialisation // identique a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; dim4=0; dim5=0; t=NULL; } else // autres cas { dim1=tab.dim1; dim2=tab.dim2; dim3=tab.dim3; dim4=tab.dim4; dim5=tab.dim5; t=new double [dim1*dim2*dim3*dim4*dim5]; // allocation de la place memoire double* ptr1=t; double* ptr2=tab.t; // copie des elements du tableau se trouvant a droite dans le tableau se trouvant // a gauche du signe d'affectation for (int i=0;i #include +#include using namespace std; //introduces namespace std #include "Sortie.h" #include #include -#include "ParaGlob.h" + /** @defgroup Les_Tableaux_generiques * @@ -101,7 +102,7 @@ class Tableau { // tout d'abord un indicateur donnant le type sort << "Tableau :taille= " << tab.taille << " "; for (int i=0;i & liste ); + void Init_from_list(const std::list & liste ); // opération inverse: remplissage d'une liste à partir du tableau // premier de la liste == premier du tableau - void Init_list(list & liste ); + void Init_list(std::list & liste ); // opération de lecture sur un flot d'entrée // les données sont le type puis la dimension puis les datas @@ -229,6 +230,8 @@ class Tableau int taille; // taille du tableau T* t; // pointeur sur les composantes du tableau + // on définit ici le nombre de diggit pour l'affichage de réel double + static int nb_diggit_double_calcul; //=17; }; @@ -241,6 +244,9 @@ class Tableau // du fait d'avoir des éléments constants ou non ce qui n'a pas l'air évident à traité sinon par // deux classes différentes +template +int Tableau::nb_diggit_double_calcul=17; + template // surcharge de l'operator de lecture d'élément non constant @@ -668,10 +674,10 @@ inline Tableau::Libere () } template void -inline Tableau::Init_from_list(const list & liste ) +inline Tableau::Init_from_list(const std::list & liste ) // initialisation d'un tableau à partir d'une liste { int tail_liste = liste.size(); // récup de la tail de la liste - typename list::const_iterator ili,ilifin=liste.end(); + typename std::list::const_iterator ili,ilifin=liste.end(); Change_taille(tail_liste); int i=0; for (ili=liste.begin();ili!=ilifin;ili++,i++) @@ -679,7 +685,7 @@ inline Tableau::Init_from_list(const list & liste ) } template void -inline Tableau::Init_list(list & liste ) +inline Tableau::Init_list(std::list & liste ) // initialisation d'une liste à partir du tableau // premier de la liste == premier du tableau { liste.clear(); // on initialise la liste diff --git a/Tableaux/Tableau_double.cc b/Tableaux/Tableau_double.cc index 1515276..2b1e5a7 100644 --- a/Tableaux/Tableau_double.cc +++ b/Tableaux/Tableau_double.cc @@ -1 +1 @@ - // This file is part of the Herezh++ application. // // The finite element software Herezh++ is dedicated to the field // of mechanics for large transformations of solid structures. // It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600) // INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) . // // Herezh++ is distributed under GPL 3 license ou ultérieure. // // Copyright (C) 1997-2021 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // For more information, please consult: . // définition d'un tableau de réel de dimension quelconque. Dans le cas ou la dimension est comprise // entre 1 et 20, on utilise des listes de réels pour allouer de la mémoire et pour la désallouer, ce qui // permet d'être beaucoup plus rapide que l'opérateur classique new. // la construstion de la classe s'appuit sur une spécialisation d'une classe template. #include "Tableau_double.h" // Constructeur fonction de la taille du tableau Tableau_double::Tableau_double (int nb) { #ifdef MISE_AU_POINT if ( nb<0 ) // cas ou la taille selectionnee est negative { cout << "\nErreur : taille invalide !\n"; cout << "Tableau_double::Tableau_double(int ) \n"; Sortie(1); }; #endif if ( nb!=0 ) { taille=nb; switch (nb) {/* case 1 : iapointe = new Reel1Pointe(); t = & (*(((Reel1Pointe*)iapointe)->ipointe)).donnees; t[0] = defaut; // initialisation break; case 2 : iapointe = new Reel2Pointe(); t = (*(((Reel2Pointe*)iapointe)->ipointe)).donnees; t[0] = defaut; t[2] = defaut; // initialisation break; case 3 : iapointe = new Reel3Pointe(); t = (*(((Reel3Pointe*)iapointe)->ipointe)).donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; // initialisation break;*/ case 4 : iapointe = new Reel4Pointe(); Reel4Pointe* toto = (Reel4Pointe*)iapointe; t = (*(((Reel4Pointe*)iapointe)->ipointe)).donnees; t[0] = 1; t[1] = 2; t[2] = 3; t[3] = 4;// initialisation break; /* case 5 : iapointe = new Reel5Pointe(); t = (*(((Reel5Pointe*)iapointe)->ipointe)).donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;// initialisation break; case 6 : iapointe = new Reel6Pointe(); t = (*(((Reel6Pointe*)iapointe)->ipointe)).donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;// initialisation break; case 7 : iapointe = new Reel7Pointe(); t = (*(((Reel7Pointe*)iapointe)->ipointe)).donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;// initialisation break; case 8 : iapointe = new Reel8Pointe(); t = (*(((Reel8Pointe*)iapointe)->ipointe)).donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut; // initialisation break; case 9 : iapointe = new Reel9Pointe(); t = (*(((Reel9Pointe*)iapointe)->ipointe)).donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; // initialisation break; /* case 10 : iapointe = new Reel10Pointe(); t = (*(((Reel10Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;// initialisation break; case 11 : iapointe = new Reel11Pointe(); t = (*(((Reel11Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;// initialisation break; case 12 : iapointe = new Reel12Pointe(); t = (*(((Reel12Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;t[11] = defaut;// initialisation break; case 13 : iapointe = new Reel13Pointe(); t = (*(((Reel13Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;t[11] = defaut;t[12] = defaut; // initialisation break; case 14 : iapointe = new Reel14Pointe(); t = (*(((Reel14Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;t[11] = defaut;t[12] = defaut;t[13] = defaut; // initialisation break; case 15 : iapointe = new Reel15Pointe(); t = (*(((Reel15Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;t[11] = defaut;t[12] = defaut;t[13] = defaut; t[14] = defaut;// initialisation break; case 16 : iapointe = new Reel16Pointe(); t = (*(((Reel16Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;t[11] = defaut;t[12] = defaut;t[13] = defaut; t[14] = defaut;t[15] = defaut;// initialisation break; case 17 : iapointe = new Reel17Pointe(); t = (*(((Reel17Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;t[11] = defaut;t[12] = defaut;t[13] = defaut; t[14] = defaut;t[15] = defaut;t[16] = defaut;// initialisation break; case 18 : iapointe = new Reel18Pointe(); t = (*(((Reel18Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;t[11] = defaut;t[12] = defaut;t[13] = defaut; t[14] = defaut;t[15] = defaut;t[16] = defaut;t[17] = defaut; // initialisation break; case 19 : iapointe = new Reel19Pointe(); t = (*(((Reel19Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;t[11] = defaut;t[12] = defaut;t[13] = defaut; t[14] = defaut;t[15] = defaut;t[16] = defaut;t[17] = defaut;t[18] = defaut; // initialisation break; case 20 : iapointe = new Reel20Pointe(); t = (*(((Reel20Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;t[11] = defaut;t[12] = defaut;t[13] = defaut; t[14] = defaut;t[15] = defaut;t[16] = defaut;t[17] = defaut;t[18] = defaut; t[19] = defaut; // initialisation break; */ default : // allocation classique t=new double [taille]; // allocation de la place memoire double* ptr=t; for (int i=0;iipointe)) ; // suppression de l'élément de la liste break; case 3 : delete ((Reel3Pointe*)iapointe); break; case 4 : Reel4Pointe* toto = (Reel4Pointe*)iapointe; delete toto; // delete ((Reel4Pointe*)iapointe); break; case 5 : delete ((Reel5Pointe*)iapointe); break; case 6 : delete ((Reel6Pointe*)iapointe); break; case 7 : delete ((Reel7Pointe*)iapointe); break; case 8 : delete ((Reel8Pointe*)iapointe); break; case 9 : delete ((Reel9Pointe*)iapointe); break; /* case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; /* default : // desallocation classique delete t=new double [taille]; // allocation de la place memoire double* ptr=t; for (int i=0;i. // // 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: . // définition d'un tableau de réel de dimension quelconque. Dans le cas ou la dimension est comprise // entre 1 et 20, on utilise des listes de réels pour allouer de la mémoire et pour la désallouer, ce qui // permet d'être beaucoup plus rapide que l'opérateur classique new. // la construstion de la classe s'appuit sur une spécialisation d'une classe template. #include "Tableau_double.h" // Constructeur fonction de la taille du tableau Tableau_double::Tableau_double (int nb) { #ifdef MISE_AU_POINT if ( nb<0 ) // cas ou la taille selectionnee est negative { cout << "\nErreur : taille invalide !\n"; cout << "Tableau_double::Tableau_double(int ) \n"; Sortie(1); }; #endif if ( nb!=0 ) { taille=nb; switch (nb) {/* case 1 : iapointe = new Reel1Pointe(); t = & (*(((Reel1Pointe*)iapointe)->ipointe)).donnees; t[0] = defaut; // initialisation break; case 2 : iapointe = new Reel2Pointe(); t = (*(((Reel2Pointe*)iapointe)->ipointe)).donnees; t[0] = defaut; t[2] = defaut; // initialisation break; case 3 : iapointe = new Reel3Pointe(); t = (*(((Reel3Pointe*)iapointe)->ipointe)).donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; // initialisation break;*/ case 4 : iapointe = new Reel4Pointe(); Reel4Pointe* toto = (Reel4Pointe*)iapointe; t = (*(((Reel4Pointe*)iapointe)->ipointe)).donnees; t[0] = 1; t[1] = 2; t[2] = 3; t[3] = 4;// initialisation break; /* case 5 : iapointe = new Reel5Pointe(); t = (*(((Reel5Pointe*)iapointe)->ipointe)).donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;// initialisation break; case 6 : iapointe = new Reel6Pointe(); t = (*(((Reel6Pointe*)iapointe)->ipointe)).donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;// initialisation break; case 7 : iapointe = new Reel7Pointe(); t = (*(((Reel7Pointe*)iapointe)->ipointe)).donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;// initialisation break; case 8 : iapointe = new Reel8Pointe(); t = (*(((Reel8Pointe*)iapointe)->ipointe)).donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut; // initialisation break; case 9 : iapointe = new Reel9Pointe(); t = (*(((Reel9Pointe*)iapointe)->ipointe)).donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; // initialisation break; /* case 10 : iapointe = new Reel10Pointe(); t = (*(((Reel10Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;// initialisation break; case 11 : iapointe = new Reel11Pointe(); t = (*(((Reel11Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;// initialisation break; case 12 : iapointe = new Reel12Pointe(); t = (*(((Reel12Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;t[11] = defaut;// initialisation break; case 13 : iapointe = new Reel13Pointe(); t = (*(((Reel13Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;t[11] = defaut;t[12] = defaut; // initialisation break; case 14 : iapointe = new Reel14Pointe(); t = (*(((Reel14Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;t[11] = defaut;t[12] = defaut;t[13] = defaut; // initialisation break; case 15 : iapointe = new Reel15Pointe(); t = (*(((Reel15Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;t[11] = defaut;t[12] = defaut;t[13] = defaut; t[14] = defaut;// initialisation break; case 16 : iapointe = new Reel16Pointe(); t = (*(((Reel16Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;t[11] = defaut;t[12] = defaut;t[13] = defaut; t[14] = defaut;t[15] = defaut;// initialisation break; case 17 : iapointe = new Reel17Pointe(); t = (*(((Reel17Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;t[11] = defaut;t[12] = defaut;t[13] = defaut; t[14] = defaut;t[15] = defaut;t[16] = defaut;// initialisation break; case 18 : iapointe = new Reel18Pointe(); t = (*(((Reel18Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;t[11] = defaut;t[12] = defaut;t[13] = defaut; t[14] = defaut;t[15] = defaut;t[16] = defaut;t[17] = defaut; // initialisation break; case 19 : iapointe = new Reel19Pointe(); t = (*(((Reel19Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;t[11] = defaut;t[12] = defaut;t[13] = defaut; t[14] = defaut;t[15] = defaut;t[16] = defaut;t[17] = defaut;t[18] = defaut; // initialisation break; case 20 : iapointe = new Reel20Pointe(); t = (*(((Reel20Pointe*)iapointe)->ipointe))->donnees; t[0] = defaut; t[1] = defaut; t[2] = defaut; t[3] = defaut; t[4] = defaut;t[5] = defaut;t[6] = defaut;t[7] = defaut;t[8] = defaut; t[9] = defaut;t[10] = defaut;t[11] = defaut;t[12] = defaut;t[13] = defaut; t[14] = defaut;t[15] = defaut;t[16] = defaut;t[17] = defaut;t[18] = defaut; t[19] = defaut; // initialisation break; */ default : // allocation classique t=new double [taille]; // allocation de la place memoire double* ptr=t; for (int i=0;iipointe)) ; // suppression de l'élément de la liste break; case 3 : delete ((Reel3Pointe*)iapointe); break; case 4 : Reel4Pointe* toto = (Reel4Pointe*)iapointe; delete toto; // delete ((Reel4Pointe*)iapointe); break; case 5 : delete ((Reel5Pointe*)iapointe); break; case 6 : delete ((Reel6Pointe*)iapointe); break; case 7 : delete ((Reel7Pointe*)iapointe); break; case 8 : delete ((Reel8Pointe*)iapointe); break; case 9 : delete ((Reel9Pointe*)iapointe); break; /* case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; case 3 : listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste break; /* default : // desallocation classique delete t=new double [taille]; // allocation de la place memoire double* ptr=t; for (int i=0;i. // // Herezh++ is distributed under GPL 3 license ou ultérieure. // // Copyright (C) 1997-2021 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // For more information, please consult: . /************************************************************************ * * * DATE: 23/01/97 * * $ * * AUTEUR: G RIO (mailto:gerardrio56@free.fr) * * $ * * PROJET: Herezh++ * * $ * ************************************************************************ * BUT: outils pour la visualisation avec le debugger * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * VERIFICATION: * * * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * ! ! ! ! * * * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * MODIFICATIONS: * * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * * * $ * * * ************************************************************************/ #ifndef TABLE_H #define TABLE_H class Table33 { public : double A[3][3]; }; #endif \ No newline at end of file + // 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: . /************************************************************************ * * * DATE: 23/01/97 * * $ * * AUTEUR: G RIO (mailto:gerardrio56@free.fr) * * $ * * PROJET: Herezh++ * * $ * ************************************************************************ * BUT: outils pour la visualisation avec le debugger * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * VERIFICATION: * * * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * ! ! ! ! * * * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * MODIFICATIONS: * * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * * * $ * * * ************************************************************************/ #ifndef TABLE_H #define TABLE_H class Table33 { public : double A[3][3]; }; #endif \ No newline at end of file diff --git a/TypeBase/Basiques.cc b/TypeBase/Basiques.cc index 2cc1d24..2afc47b 100644 --- a/TypeBase/Basiques.cc +++ b/TypeBase/Basiques.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -55,7 +55,8 @@ void DeuxEntiers::SchemaXML_DeuxEntiers(ofstream& sort,const Enum_IO_XML enu) co << "\n"; DeuxEntiers::impre_schem_XML=1; // une seule sortie }; - }; + default: sort << "\n SchemaXML: cas non pris en compte " ; + }; }; // surcharge de lecture en XML @@ -86,6 +87,8 @@ void DeuxDoubles::SchemaXML_DeuxDoubles(ofstream& sort,const Enum_IO_XML enu) co << "\n"; DeuxDoubles::impre_schem_XML=1; // une seule sortie }; + default: sort << "\n SchemaXML: cas non pris en compte " ; + }; }; @@ -119,6 +122,8 @@ void Entier_et_Double::SchemaXML_Entier_et_Double(ofstream& sort,const Enum_IO_X << "\n"; Entier_et_Double::impre_schem_XML=1; // une seule sortie }; + default: sort << "\n SchemaXML: cas non pris en compte " ; + }; }; @@ -151,6 +156,8 @@ void Deux_String::SchemaXML_Deux_String(ofstream& sort,const Enum_IO_XML enu) co << "\n"; Deux_String::impre_schem_XML=1; // une seule sortie }; + default: sort << "\n SchemaXML: cas non pris en compte " ; + }; }; @@ -183,6 +190,8 @@ void String_et_entier::SchemaXML_String_et_entier(ofstream& sort,const Enum_IO_X << "\n"; String_et_entier::impre_schem_XML=1; // une seule sortie }; + default: sort << "\n SchemaXML: cas non pris en compte " ; + }; }; @@ -216,6 +225,8 @@ void Trois_String::SchemaXML_Trois_String(ofstream& sort,const Enum_IO_XML enu) << "\n"; Trois_String::impre_schem_XML=1; // une seule sortie }; + default: sort << "\n SchemaXML: cas non pris en compte " ; + }; }; @@ -250,6 +261,7 @@ void quatre_string_un_entier::SchemaXML_quatre_string_un_entier(ofstream& sort,c << "\n"; Trois_String::impre_schem_XML=1; // une seule sortie }; + default: sort << "\n SchemaXML: cas non pris en compte " ; }; }; @@ -269,6 +281,8 @@ void TroisEntiers::SchemaXML_TroisEntiers(ofstream& sort,const Enum_IO_XML enu) << "\n"; TroisEntiers::impre_schem_XML=1; // une seule sortie }; + default: sort << "\n SchemaXML: cas non pris en compte " ; + }; }; diff --git a/TypeBase/Basiques.h b/TypeBase/Basiques.h index 4fd8140..408e201 100644 --- a/TypeBase/Basiques.h +++ b/TypeBase/Basiques.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -50,6 +50,12 @@ #include "Enum_IO_XML.h" using namespace std; +#ifdef UTILISATION_MPI + #include + #include + namespace mpi = boost::mpi; +#endif + /** @defgroup Les_conteneurs_ultra_basiques * * BUT: conteneurs ultra basiques, permettant entre autres * @@ -75,7 +81,20 @@ class DeuxEntiers int un,deux; // gestion schéma XML static short int impre_schem_XML; - + + #ifdef UTILISATION_MPI + private: + friend class boost::serialization::access; + // When the class Archive corresponds to an output archive, the + // & operator is defined similar to <<. Likewise, when the class Archive + // is a type of input archive the & operator is defined similar to >>. + template + void serialize(Archive & ar, const unsigned int version) + { ar & un; ar & deux; } + #endif + + public : + // CONSTRUCTEURS : DeuxEntiers() : un(0),deux(0) {}; DeuxEntiers(int u, int v) : un(u),deux(v) {}; @@ -125,7 +144,20 @@ class DeuxDoubles double un,deux; // gestion schéma XML static short int impre_schem_XML; - + + #ifdef UTILISATION_MPI + private: + friend class boost::serialization::access; + // When the class Archive corresponds to an output archive, the + // & operator is defined similar to <<. Likewise, when the class Archive + // is a type of input archive the & operator is defined similar to >>. + template + void serialize(Archive & ar, const unsigned int version) + { ar & un; ar & deux; } + #endif + + public : + // CONSTRUCTEURS : DeuxDoubles() : un(0.),deux(0.) {}; DeuxDoubles(double u, double v) : un(u),deux(v) {}; @@ -170,7 +202,20 @@ class Entier_et_Double int n; // gestion schéma XML static short int impre_schem_XML; - + + #ifdef UTILISATION_MPI + private: + friend class boost::serialization::access; + // When the class Archive corresponds to an output archive, the + // & operator is defined similar to <<. Likewise, when the class Archive + // is a type of input archive the & operator is defined similar to >>. + template + void serialize(Archive & ar, const unsigned int version) + { ar & x; ar & n; } + #endif + + public : + // CONSTRUCTEURS : Entier_et_Double() : x(0),n(0.) {}; Entier_et_Double(int u, double v) : n(u),x(v) {}; @@ -219,7 +264,20 @@ class Deux_String string nom1,nom2; // gestion schéma XML static short int impre_schem_XML; - + + #ifdef UTILISATION_MPI + private: + friend class boost::serialization::access; + // When the class Archive corresponds to an output archive, the + // & operator is defined similar to <<. Likewise, when the class Archive + // is a type of input archive the & operator is defined similar to >>. + template + void serialize(Archive & ar, const unsigned int version) + { ar & nom1; ar & nom2; } + #endif + + public : + // CONSTRUCTEURS : Deux_String() : nom1(),nom2() {}; Deux_String(const string& n1, const string& n2) : nom1(n1),nom2(n2) {}; @@ -269,7 +327,20 @@ class String_et_entier int n; // gestion schéma XML static short int impre_schem_XML; - + + #ifdef UTILISATION_MPI + private: + friend class boost::serialization::access; + // When the class Archive corresponds to an output archive, the + // & operator is defined similar to <<. Likewise, when the class Archive + // is a type of input archive the & operator is defined similar to >>. + template + void serialize(Archive & ar, const unsigned int version) + { ar & nom; ar & n; } + #endif + + public : + // CONSTRUCTEURS : String_et_entier() : nom(),n() {}; String_et_entier(const string& nomm, int nn) : nom(nomm),n(nn) {}; @@ -313,7 +384,20 @@ class Trois_String string nom1,nom2,nom3; // gestion schéma XML static short int impre_schem_XML; - + + #ifdef UTILISATION_MPI + private: + friend class boost::serialization::access; + // When the class Archive corresponds to an output archive, the + // & operator is defined similar to <<. Likewise, when the class Archive + // is a type of input archive the & operator is defined similar to >>. + template + void serialize(Archive & ar, const unsigned int version) + { ar & nom1; ar & nom2; ar & nom3;} + #endif + + public : + // CONSTRUCTEURS : Trois_String() : nom1(),nom2(),nom3() {}; Trois_String(const string& n1, const string& n2,const string& n3) : nom1(n1),nom2(n2),nom3(n3) {}; @@ -363,7 +447,20 @@ class quatre_string_un_entier int n; // gestion schéma XML static short int impre_schem_XML; - + + #ifdef UTILISATION_MPI + private: + friend class boost::serialization::access; + // When the class Archive corresponds to an output archive, the + // & operator is defined similar to <<. Likewise, when the class Archive + // is a type of input archive the & operator is defined similar to >>. + template + void serialize(Archive & ar, const unsigned int version) + { ar & nom1; ar & nom2; ar & nom3; ar & nom4; ar & n;} + #endif + + public : + // CONSTRUCTEURS : quatre_string_un_entier() : nom1(""),nom2(""),nom3(""),nom4(""),n(0) {}; quatre_string_un_entier(const string& n1, const string& n2,const string& n3,const string& n4,const int& nn) : nom1(n1),nom2(n2),nom3(n3),nom4(n4),n(nn) {}; @@ -559,7 +656,20 @@ class TroisEntiers int un,deux,trois; // gestion schéma XML static short int impre_schem_XML; - + + #ifdef UTILISATION_MPI + private: + friend class boost::serialization::access; + // When the class Archive corresponds to an output archive, the + // & operator is defined similar to <<. Likewise, when the class Archive + // is a type of input archive the & operator is defined similar to >>. + template + void serialize(Archive & ar, const unsigned int version) + { ar & un; ar & deux; ar & trois;} + #endif + + public : + // CONSTRUCTEURS : TroisEntiers() : un(0),deux(0),trois(0) {}; TroisEntiers(int u, int v,int w) : un(u),deux(v),trois(w) {}; @@ -686,6 +796,19 @@ class Deux_String_un_entier // gestion schéma XML static short int impre_schem_XML; + #ifdef UTILISATION_MPI + private: + friend class boost::serialization::access; + // When the class Archive corresponds to an output archive, the + // & operator is defined similar to <<. Likewise, when the class Archive + // is a type of input archive the & operator is defined similar to >>. + template + void serialize(Archive & ar, const unsigned int version) + { ar & nom1; ar & nom2; ar & n;} + #endif + + public : + // CONSTRUCTEURS : Deux_String_un_entier() : nom1(""),nom2(""),n(0) {}; Deux_String_un_entier(const string& n1, const string& n2,const int& nn) diff --git a/TypeBase/Chrono_GR.h b/TypeBase/Chrono_GR.h index c606ce3..ccc9814 100755 --- a/TypeBase/Chrono_GR.h +++ b/TypeBase/Chrono_GR.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/Ddl_enum_etendu.cc b/TypeBase/Ddl_enum_etendu.cc index 752d66c..0780fc2 100644 --- a/TypeBase/Ddl_enum_etendu.cc +++ b/TypeBase/Ddl_enum_etendu.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -420,7 +420,7 @@ Ddl_enum_etendu Ddl_enum_etendu::PremierDdlEnumEtenduFamille(const Ddl_enum_eten else if (posi < 19) return Ddl_enum_etendu(SIG11,"Cauchy_local11"); else if (posi < 25) - return Ddl_enum_etendu(SIG11,"Almansi_local11"); + return Ddl_enum_etendu(EPS11,"Almansi_local11"); else if (posi < 34) // scalaire idem return Ddl_enum_etendu(a); else if (posi < 40) diff --git a/TypeBase/Ddl_enum_etendu.h b/TypeBase/Ddl_enum_etendu.h index 3d79baa..c31306f 100644 --- a/TypeBase/Ddl_enum_etendu.h +++ b/TypeBase/Ddl_enum_etendu.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/Epai.h b/TypeBase/Epai.h index 92b127a..f271764 100644 --- a/TypeBase/Epai.h +++ b/TypeBase/Epai.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/LesTypePremierXML.h b/TypeBase/LesTypePremierXML.h index 6a72a40..a599056 100644 --- a/TypeBase/LesTypePremierXML.h +++ b/TypeBase/LesTypePremierXML.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/List_io.h b/TypeBase/List_io.h index d9f8938..287a031 100644 --- a/TypeBase/List_io.h +++ b/TypeBase/List_io.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/Map_io.h b/TypeBase/Map_io.h index fab60b4..10e2292 100644 --- a/TypeBase/Map_io.h +++ b/TypeBase/Map_io.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/Nb_assemb.h b/TypeBase/Nb_assemb.h index a973ded..29bd27c 100644 --- a/TypeBase/Nb_assemb.h +++ b/TypeBase/Nb_assemb.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/PlusieursCoordonnees.h b/TypeBase/PlusieursCoordonnees.h index c78f1c0..3249c57 100644 --- a/TypeBase/PlusieursCoordonnees.h +++ b/TypeBase/PlusieursCoordonnees.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/Ponderation.cc b/TypeBase/Ponderation.cc index 9f23b51..398060c 100755 --- a/TypeBase/Ponderation.cc +++ b/TypeBase/Ponderation.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/Ponderation.h b/TypeBase/Ponderation.h index a85e8c4..04d660d 100755 --- a/TypeBase/Ponderation.h +++ b/TypeBase/Ponderation.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/PtTabRel.cc b/TypeBase/PtTabRel.cc index f2114f4..def21ca 100644 --- a/TypeBase/PtTabRel.cc +++ b/TypeBase/PtTabRel.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/PtTabRel.h b/TypeBase/PtTabRel.h index e32bcf2..a2ca43d 100644 --- a/TypeBase/PtTabRel.h +++ b/TypeBase/PtTabRel.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/PtTabRel_Princ.h b/TypeBase/PtTabRel_Princ.h index 80edf8b..53901d4 100644 --- a/TypeBase/PtTabRel_Princ.h +++ b/TypeBase/PtTabRel_Princ.h @@ -17,7 +17,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/Section.h b/TypeBase/Section.h index d6f1ffd..3b3cb71 100755 --- a/TypeBase/Section.h +++ b/TypeBase/Section.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/Temps_CPU_HZpp.cc b/TypeBase/Temps_CPU_HZpp.cc index 1e9263b..ea1d288 100755 --- a/TypeBase/Temps_CPU_HZpp.cc +++ b/TypeBase/Temps_CPU_HZpp.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/Temps_CPU_HZpp.h b/TypeBase/Temps_CPU_HZpp.h index 8de2544..ae0bf51 100755 --- a/TypeBase/Temps_CPU_HZpp.h +++ b/TypeBase/Temps_CPU_HZpp.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/Temps_CPU_HZpp_3.cc b/TypeBase/Temps_CPU_HZpp_3.cc index c544e7d..babaca4 100755 --- a/TypeBase/Temps_CPU_HZpp_3.cc +++ b/TypeBase/Temps_CPU_HZpp_3.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -108,6 +108,9 @@ void Temps_CPU_HZpp_3::Affiche(ostream & sort,int niveau) // << " temps_reel:" << round(temps_reel) // << " temps_system:" << round(temps_system) // << endl; + #ifdef UTILISATION_MPI + sort << " cpu "<< ParaGlob::Monde()->rank(); + #endif sort << " tps(mls)_user:" << temps_user.count()/1000 << " system:" << temps_system.count()/1000 << " reel:" << temps_reel.count()/1000; @@ -148,6 +151,9 @@ void Temps_CPU_HZpp_3::Affiche_hh_mn_s_ml(ostream & sort) // autre solution utilisant le template de boost //display(cout, -boost::chrono::milliseconds(6)) << '\n'; sort << "\n temps_user:"; +#ifdef UTILISATION_MPI + sort << " cpu "<< ParaGlob::Monde()->rank() << " "; +#endif display(sort, temps_user) << " system:"; display(sort, temps_system) << " reel:"; display(sort, temps_reel) << '\n'; @@ -180,6 +186,9 @@ ostream & operator << (ostream & sort , const Temps_CPU_HZpp_3 & a) // << " temps_reel:" << a.temps_reel // << " temps_system:" << a.temps_system // << endl; + #ifdef UTILISATION_MPI + sort << " cpu "<< ParaGlob::Monde()->rank() << " "; + #endif sort << " U= " << a.temps_user.count() << " S= " << a.temps_system.count() << " R= " << a.temps_reel.count(); diff --git a/TypeBase/Temps_CPU_HZpp_3.h b/TypeBase/Temps_CPU_HZpp_3.h index 83e6c10..09a228a 100755 --- a/TypeBase/Temps_CPU_HZpp_3.h +++ b/TypeBase/Temps_CPU_HZpp_3.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/TypeQuelconque.cc b/TypeBase/TypeQuelconque.cc index b493317..2fef2a4 100644 --- a/TypeBase/TypeQuelconque.cc +++ b/TypeBase/TypeQuelconque.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/TypeQuelconque.h b/TypeBase/TypeQuelconque.h index 943d1d8..c6d8579 100644 --- a/TypeBase/TypeQuelconque.h +++ b/TypeBase/TypeQuelconque.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/TypeQuelconqueParticulier.cc b/TypeBase/TypeQuelconqueParticulier.cc index f5082d6..0cccb4e 100644 --- a/TypeBase/TypeQuelconqueParticulier.cc +++ b/TypeBase/TypeQuelconqueParticulier.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/TypeQuelconqueParticulier.h b/TypeBase/TypeQuelconqueParticulier.h index 3cbdec2..39aa431 100644 --- a/TypeBase/TypeQuelconqueParticulier.h +++ b/TypeBase/TypeQuelconqueParticulier.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -1262,7 +1262,7 @@ double GrandeurNumOrdre(int num) const; int NbMaxiNumeroOrdre() const {return ve.Taille();}; // récup du nb maxi de numéros d'ordres void Grandeur_brut(ostream & sort,int nbcar) const - {sort <<" "<< setprecision(nbcar) << ve; }; + {int tailp1 = ve.Taille()+1; for (int i=1;i erreur // ** les opérations entre deux types quelconques ne doivent concerner que des grandeurs de même type // affectation uniquement des données numériques (pas les pointeurs, pas les string) diff --git a/TypeBase/TypeQuelconqueParticulier_2.cc b/TypeBase/TypeQuelconqueParticulier_2.cc index 4786fbe..68d6420 100644 --- a/TypeBase/TypeQuelconqueParticulier_2.cc +++ b/TypeBase/TypeQuelconqueParticulier_2.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/TypeQuelconqueParticulier_3.cc b/TypeBase/TypeQuelconqueParticulier_3.cc index 82a95fb..65107bc 100755 --- a/TypeBase/TypeQuelconqueParticulier_3.cc +++ b/TypeBase/TypeQuelconqueParticulier_3.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/TypeQuelconque_enum_etendu.cc b/TypeBase/TypeQuelconque_enum_etendu.cc index dffa1b3..c2efe68 100755 --- a/TypeBase/TypeQuelconque_enum_etendu.cc +++ b/TypeBase/TypeQuelconque_enum_etendu.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -324,6 +324,7 @@ TypeQuelconque_enum_etendu TypeQuelconque_enum_etendu::Lecture_avec_creation_eve cout << " le type de grandeur "<< NomTypeGrandeur(a.type_grandeur) << " existant " << " est different de celui lu "<< NomTypeGrandeur(type_grandeur) << " "; Sortie(1); + return a; // pour taire le compilo }; } else // sinon on crée diff --git a/TypeBase/TypeQuelconque_enum_etendu.h b/TypeBase/TypeQuelconque_enum_etendu.h index c2957fa..5dc8b3d 100755 --- a/TypeBase/TypeQuelconque_enum_etendu.h +++ b/TypeBase/TypeQuelconque_enum_etendu.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/TypeBase/Vector_io.h b/TypeBase/Vector_io.h index 3ccf524..a60b444 100644 --- a/TypeBase/Vector_io.h +++ b/TypeBase/Vector_io.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Algo_Integ1D.cc b/Util/Algo_Integ1D.cc index 1c11e92..dc6f083 100644 --- a/Util/Algo_Integ1D.cc +++ b/Util/Algo_Integ1D.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Algo_Integ1D.h b/Util/Algo_Integ1D.h index 2449feb..5be81bd 100644 --- a/Util/Algo_Integ1D.h +++ b/Util/Algo_Integ1D.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Algo_Integ1D_2.cc b/Util/Algo_Integ1D_2.cc index c3ff7f9..3b3a250 100644 --- a/Util/Algo_Integ1D_2.cc +++ b/Util/Algo_Integ1D_2.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Algo_edp.cc b/Util/Algo_edp.cc index 5f4b349..24e7f95 100644 --- a/Util/Algo_edp.cc +++ b/Util/Algo_edp.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -286,7 +286,8 @@ void Algo_edp::Test_template() << "\n Algo_edp::Test_template() " << endl; Sortie(1); }; - int conver=this->Pilotage_kutta +// int conver=this->Pilotage_kutta + this->Pilotage_kutta (cas_kutta,*this,& Algo_edp::FoncDeriv,& Algo_edp::FoncVerif_fonc ,val_initiale,der_initiale ,tdeb,tfi,erreurAbsolue,erreurRelative diff --git a/Util/Algo_edp.h b/Util/Algo_edp.h index 8f2ad8a..e7fe15f 100644 --- a/Util/Algo_edp.h +++ b/Util/Algo_edp.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Algo_edp_2.cc b/Util/Algo_edp_2.cc index d0d7cc7..736016c 100644 --- a/Util/Algo_edp_2.cc +++ b/Util/Algo_edp_2.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -489,6 +489,7 @@ int Algo_edp::Pilotage_kutta(int cas_kutta, T& instance cout << "\n Erreur1 au niveau du pilotage de Runge Kutta, le nouvelle increment qu'il faudrait utiliser = " << deltat << " est plus petit que le minimum autorise: " << mini_delta_t << "\n Algo_edp::Pilotage_kutta(.."; + if (permet_affichage > 5 ) {cout << " estime_erreur= "; estime_erreur.Affiche();} dernierTemps = temps - 2. * deltat;val_finale = val_inter;der_finale = der_inter; return 6; // indication au programme appelant }; diff --git a/Util/Algo_zero.cc b/Util/Algo_zero.cc index 468b27a..ad7f820 100644 --- a/Util/Algo_zero.cc +++ b/Util/Algo_zero.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Algo_zero.h b/Util/Algo_zero.h index 6727095..80bd30c 100644 --- a/Util/Algo_zero.h +++ b/Util/Algo_zero.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Algo_zero_2.cc b/Util/Algo_zero_2.cc index af6c1a7..c5689e1 100644 --- a/Util/Algo_zero_2.cc +++ b/Util/Algo_zero_2.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -28,6 +28,7 @@ #ifndef Algo_zero_deja_inclus #include "Algo_zero.h" + #include "ParaGlob.h" #endif // contient que les méthodes nécessitant les templates, qui doivent donc être @@ -36,6 +37,7 @@ #ifndef Algo_zero_deja_inclus #include "MathUtil.h" #include "ConstMath.h" + #include "ParaGlob.h" //recherche du zéro d'une fonction en utilisant la méthode de Newton-Raphson incrémentale @@ -335,7 +337,7 @@ bool Algo_zero::Newton_raphson int glob_err_res = 0;// pour la gestion de test == -1 int glob_err_der = 0;// pour la gestion de test == -1 double residu_Max_val_abs=ConstMath::tresgrand; // init - double delta_x_sauve=ConstMath::tresgrand; // ne sert que pour la sortie des messages d'erreur +// double delta_x_sauve=ConstMath::tresgrand; // ne sert que pour la sortie des messages d'erreur // valeur énorme volontairement do // boucle globale diff --git a/Util/CharUtil.cc b/Util/CharUtil.cc index 6b31e94..07a67c2 100644 --- a/Util/CharUtil.cc +++ b/Util/CharUtil.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -145,36 +145,36 @@ double ChangeReel(char * st) // transformation d'un entier de 0 a 10 en 1 caractere correspondant // il existe une fonction _itoa qui fait le meme travail qui se trouve dans extras.h - char* ChangeEntierChar(int a) -{ char* result= " "; - switch (a) - { case 0 : - result="0";break; - case 1 : - result="1";break; - case 2 : - result="2";break; - case 3 : - result="3";break; - case 4 : - result="4";break; - case 5 : - result="5";break; - case 6 : - result="6";break; - case 7 : - result="7";break; - case 8 : - result="8";break; - case 9 : - result="9";break; - default : - cout << "\nErreur : l'entier n'est pas compris entre 0 et 9 !\n"; - cout << "ChangeEntierChar(int a) \n"; - Sortie(1); - }; - return result; - }; + char ChangeEntierChar(int a) +{ char result= ' '; + switch (a) + {case 0 : + result='0';break; + case 1 : + result='1';break; + case 2 : + result='2';break; + case 3 : + result='3';break; + case 4 : + result='4';break; + case 5 : + result='5';break; + case 6 : + result='6';break; + case 7 : + result='7';break; + case 8 : + result='8';break; + case 9 : + result='9';break; + default : + cout << "\nErreur : l'entier n'est pas compris entre 0 et 9 !\n"; + cout << "ChangeEntierChar(int a) \n"; + Sortie(1); + }; + return result; +}; // transformation d'un string en minuscules string Minuscules(const string& st) diff --git a/Util/CharUtil.h b/Util/CharUtil.h index 53e6107..8ebc057 100644 --- a/Util/CharUtil.h +++ b/Util/CharUtil.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -85,7 +85,7 @@ /// transformation d'un réel en chaine de caractère correspondant string ChangeReelSTring(double a ); /// transformation d'un entier de 0 a 10 en 1 caractere correspondant - char* ChangeEntierChar(int ); + char ChangeEntierChar(int ); /// transformation d'un string en minuscules string Minuscules(const string& st); diff --git a/Util/Courbes/Courbe1D.cc b/Util/Courbes/Courbe1D.cc index 8859611..16e64b9 100755 --- a/Util/Courbes/Courbe1D.cc +++ b/Util/Courbes/Courbe1D.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe1D.h b/Util/Courbes/Courbe1D.h index ada4750..3fd8947 100644 --- a/Util/Courbes/Courbe1D.h +++ b/Util/Courbes/Courbe1D.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -68,6 +68,7 @@ #include "UtilLecture.h" #include "EnumCourbe1D.h" #include "Enum_IO_XML.h" +#include "ParaGlob.h" /** @defgroup Les_courbes_1D Les_courbes_1D * diff --git a/Util/Courbes/CourbePolyHermite1D.cc b/Util/Courbes/CourbePolyHermite1D.cc index 294167d..55da313 100755 --- a/Util/Courbes/CourbePolyHermite1D.cc +++ b/Util/Courbes/CourbePolyHermite1D.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/CourbePolyHermite1D.h b/Util/Courbes/CourbePolyHermite1D.h index ca49aaf..338e7ce 100755 --- a/Util/Courbes/CourbePolyHermite1D.h +++ b/Util/Courbes/CourbePolyHermite1D.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/CourbePolyLineaire.cc b/Util/Courbes/CourbePolyLineaire.cc index bc16cc1..f0635cb 100755 --- a/Util/Courbes/CourbePolyLineaire.cc +++ b/Util/Courbes/CourbePolyLineaire.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/CourbePolyLineaire1D.h b/Util/Courbes/CourbePolyLineaire1D.h index 2f19fe0..d0a03ae 100644 --- a/Util/Courbes/CourbePolyLineaire1D.h +++ b/Util/Courbes/CourbePolyLineaire1D.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/CourbePolyLineaire1D_simpli.cc b/Util/Courbes/CourbePolyLineaire1D_simpli.cc index f9e94e6..94a746c 100755 --- a/Util/Courbes/CourbePolyLineaire1D_simpli.cc +++ b/Util/Courbes/CourbePolyLineaire1D_simpli.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/CourbePolyLineaire1D_simpli.h b/Util/Courbes/CourbePolyLineaire1D_simpli.h index 93ceabb..e910582 100644 --- a/Util/Courbes/CourbePolyLineaire1D_simpli.h +++ b/Util/Courbes/CourbePolyLineaire1D_simpli.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/CourbePolynomiale.cc b/Util/Courbes/CourbePolynomiale.cc index 100d3bb..a5149c5 100644 --- a/Util/Courbes/CourbePolynomiale.cc +++ b/Util/Courbes/CourbePolynomiale.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/CourbePolynomiale.h b/Util/Courbes/CourbePolynomiale.h index 3fa011c..65b7947 100644 --- a/Util/Courbes/CourbePolynomiale.h +++ b/Util/Courbes/CourbePolynomiale.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_cos.cc b/Util/Courbes/Courbe_cos.cc index 3aec5ed..a860358 100644 --- a/Util/Courbes/Courbe_cos.cc +++ b/Util/Courbes/Courbe_cos.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_cos.h b/Util/Courbes/Courbe_cos.h index 1739c61..8d7962c 100644 --- a/Util/Courbes/Courbe_cos.h +++ b/Util/Courbes/Courbe_cos.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_expo2_n.cc b/Util/Courbes/Courbe_expo2_n.cc index 3b48984..7904e2b 100644 --- a/Util/Courbes/Courbe_expo2_n.cc +++ b/Util/Courbes/Courbe_expo2_n.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_expo2_n.h b/Util/Courbes/Courbe_expo2_n.h index 08812b4..7509bb4 100644 --- a/Util/Courbes/Courbe_expo2_n.h +++ b/Util/Courbes/Courbe_expo2_n.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_expo_n.cc b/Util/Courbes/Courbe_expo_n.cc index c7ec8be..b3d0877 100644 --- a/Util/Courbes/Courbe_expo_n.cc +++ b/Util/Courbes/Courbe_expo_n.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_expo_n.h b/Util/Courbes/Courbe_expo_n.h index dcbc636..c8763f9 100644 --- a/Util/Courbes/Courbe_expo_n.h +++ b/Util/Courbes/Courbe_expo_n.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_expoaff.cc b/Util/Courbes/Courbe_expoaff.cc index d830761..e56c218 100755 --- a/Util/Courbes/Courbe_expoaff.cc +++ b/Util/Courbes/Courbe_expoaff.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_expoaff.h b/Util/Courbes/Courbe_expoaff.h index becdff2..d270e98 100644 --- a/Util/Courbes/Courbe_expoaff.h +++ b/Util/Courbes/Courbe_expoaff.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_expression_litterale_1D.cc b/Util/Courbes/Courbe_expression_litterale_1D.cc index 291b2d7..31ef04e 100755 --- a/Util/Courbes/Courbe_expression_litterale_1D.cc +++ b/Util/Courbes/Courbe_expression_litterale_1D.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_expression_litterale_1D.h b/Util/Courbes/Courbe_expression_litterale_1D.h index 827257d..330bd18 100755 --- a/Util/Courbes/Courbe_expression_litterale_1D.h +++ b/Util/Courbes/Courbe_expression_litterale_1D.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_expression_litterale_avec_derivees_1D.cc b/Util/Courbes/Courbe_expression_litterale_avec_derivees_1D.cc index eab3070..9f06a56 100755 --- a/Util/Courbes/Courbe_expression_litterale_avec_derivees_1D.cc +++ b/Util/Courbes/Courbe_expression_litterale_avec_derivees_1D.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_expression_litterale_avec_derivees_1D.h b/Util/Courbes/Courbe_expression_litterale_avec_derivees_1D.h index 1cc6730..07af711 100755 --- a/Util/Courbes/Courbe_expression_litterale_avec_derivees_1D.h +++ b/Util/Courbes/Courbe_expression_litterale_avec_derivees_1D.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_ln_cosh.cc b/Util/Courbes/Courbe_ln_cosh.cc index 5f01225..331b252 100755 --- a/Util/Courbes/Courbe_ln_cosh.cc +++ b/Util/Courbes/Courbe_ln_cosh.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_ln_cosh.h b/Util/Courbes/Courbe_ln_cosh.h index 6b0b75f..765bffb 100755 --- a/Util/Courbes/Courbe_ln_cosh.h +++ b/Util/Courbes/Courbe_ln_cosh.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_relax_expo.cc b/Util/Courbes/Courbe_relax_expo.cc index 4fefb85..8457f76 100644 --- a/Util/Courbes/Courbe_relax_expo.cc +++ b/Util/Courbes/Courbe_relax_expo.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_relax_expo.h b/Util/Courbes/Courbe_relax_expo.h index 7e3f5e3..27f15c6 100644 --- a/Util/Courbes/Courbe_relax_expo.h +++ b/Util/Courbes/Courbe_relax_expo.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_sin.cc b/Util/Courbes/Courbe_sin.cc index af73de9..f1eb3af 100644 --- a/Util/Courbes/Courbe_sin.cc +++ b/Util/Courbes/Courbe_sin.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_sin.h b/Util/Courbes/Courbe_sin.h index 10b4a34..05f716f 100644 --- a/Util/Courbes/Courbe_sin.h +++ b/Util/Courbes/Courbe_sin.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_un_moins_cos.cc b/Util/Courbes/Courbe_un_moins_cos.cc index f1b183c..b3d0a47 100755 --- a/Util/Courbes/Courbe_un_moins_cos.cc +++ b/Util/Courbes/Courbe_un_moins_cos.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Courbe_un_moins_cos.h b/Util/Courbes/Courbe_un_moins_cos.h index be53a85..9cf328d 100644 --- a/Util/Courbes/Courbe_un_moins_cos.h +++ b/Util/Courbes/Courbe_un_moins_cos.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/F1_plus_F2.cc b/Util/Courbes/F1_plus_F2.cc index 44cccea..81f2b8b 100644 --- a/Util/Courbes/F1_plus_F2.cc +++ b/Util/Courbes/F1_plus_F2.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/F1_plus_F2.h b/Util/Courbes/F1_plus_F2.h index d8d2259..92c4ba7 100644 --- a/Util/Courbes/F1_plus_F2.h +++ b/Util/Courbes/F1_plus_F2.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/F1_rond_F2.cc b/Util/Courbes/F1_rond_F2.cc index 842be9f..4740187 100644 --- a/Util/Courbes/F1_rond_F2.cc +++ b/Util/Courbes/F1_rond_F2.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/F1_rond_F2.h b/Util/Courbes/F1_rond_F2.h index 573e3b8..cbef30c 100644 --- a/Util/Courbes/F1_rond_F2.h +++ b/Util/Courbes/F1_rond_F2.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/F_cycle_add.cc b/Util/Courbes/F_cycle_add.cc index 0234faa..399efdf 100644 --- a/Util/Courbes/F_cycle_add.cc +++ b/Util/Courbes/F_cycle_add.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/F_cycle_add.h b/Util/Courbes/F_cycle_add.h index 7d93994..07fbe17 100644 --- a/Util/Courbes/F_cycle_add.h +++ b/Util/Courbes/F_cycle_add.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/F_cyclique.cc b/Util/Courbes/F_cyclique.cc index cfa4a59..c3bef9a 100644 --- a/Util/Courbes/F_cyclique.cc +++ b/Util/Courbes/F_cyclique.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/F_cyclique.h b/Util/Courbes/F_cyclique.h index 7918ca1..8ab4b23 100644 --- a/Util/Courbes/F_cyclique.h +++ b/Util/Courbes/F_cyclique.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/F_nD_courbe1D.cc b/Util/Courbes/F_nD_courbe1D.cc index 8bc63aa..e167e7c 100755 --- a/Util/Courbes/F_nD_courbe1D.cc +++ b/Util/Courbes/F_nD_courbe1D.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/F_nD_courbe1D.h b/Util/Courbes/F_nD_courbe1D.h index 2082067..1447b50 100755 --- a/Util/Courbes/F_nD_courbe1D.h +++ b/Util/Courbes/F_nD_courbe1D.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/F_union_1D.cc b/Util/Courbes/F_union_1D.cc index 7225a3f..46e8845 100644 --- a/Util/Courbes/F_union_1D.cc +++ b/Util/Courbes/F_union_1D.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -31,6 +31,7 @@ #include "ConstMath.h" #include "MathUtil.h" #include "CharUtil.h" +#include "ParaGlob.h" // CONSTRUCTEURS : diff --git a/Util/Courbes/F_union_1D.h b/Util/Courbes/F_union_1D.h index 8c13990..60f8cfb 100644 --- a/Util/Courbes/F_union_1D.h +++ b/Util/Courbes/F_union_1D.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Fonc_scal_combinees_nD.cc b/Util/Courbes/Fonc_scal_combinees_nD.cc index 3ed82a9..8ae338b 100755 --- a/Util/Courbes/Fonc_scal_combinees_nD.cc +++ b/Util/Courbes/Fonc_scal_combinees_nD.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -841,7 +841,7 @@ void Fonc_scal_combinees_nD::Info_commande_Fonctions_nD(UtilLecture & entreePrin << "\n# " << "\n# 3) --- on definit l'expression de la fonction globale " << "\n# l'expression s'ecrit une une ligne (qui peut-etre fractionnee " - << "\n# via le caractere \ cf. doc). Elle doit commencer par le mot " + << "\n# via le caractere \\ cf. doc). Elle doit commencer par le mot " << "\n# cle fct= suivi d'une expression analytique quelconque (cf. doc " << "\n# fonction analytique) " << "\n# l'expression peut contenir : " diff --git a/Util/Courbes/Fonc_scal_combinees_nD.h b/Util/Courbes/Fonc_scal_combinees_nD.h index 32fd0b2..9730d59 100755 --- a/Util/Courbes/Fonc_scal_combinees_nD.h +++ b/Util/Courbes/Fonc_scal_combinees_nD.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Fonction_expression_litterale_nD.cc b/Util/Courbes/Fonction_expression_litterale_nD.cc index 1e32887..32711a0 100755 --- a/Util/Courbes/Fonction_expression_litterale_nD.cc +++ b/Util/Courbes/Fonction_expression_litterale_nD.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -332,6 +332,9 @@ void Fonction_expression_litterale_nD::LectDonnParticulieres_Fonction_nD(const s }; */ + // affichage de l'expression si niveau suffisant + if (permet_affichage > 6) + cout << "\n expression de la fonction: " << expression_fonction; int taille = nom_variables.Taille(); // récup des tailles int nb_enu = enu_variables_globale.Taille(); @@ -406,7 +409,7 @@ void Fonction_expression_litterale_nD::Info_commande_Fonctions_nD(UtilLecture & << "\n# " << "\n# 2) --- on definit l'expression de la fonction globale " << "\n# l'expression s'ecrit sur une ligne (qui peut-etre fractionnee " - << "\n# via le caractere \ cf. doc). Elle doit commencer par le mot " + << "\n# via le caractere \\ cf. doc). Elle doit commencer par le mot " << "\n# cle fct= suivi d'une expression analytique quelconque (cf. doc " << "\n# fonction analytique) " << "\n# l'expression peut contenir : " diff --git a/Util/Courbes/Fonction_expression_litterale_nD.h b/Util/Courbes/Fonction_expression_litterale_nD.h index d291ff0..93cc568 100755 --- a/Util/Courbes/Fonction_expression_litterale_nD.h +++ b/Util/Courbes/Fonction_expression_litterale_nD.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Fonction_externe_nD.cc b/Util/Courbes/Fonction_externe_nD.cc index 1e6f898..4655ee9 100755 --- a/Util/Courbes/Fonction_externe_nD.cc +++ b/Util/Courbes/Fonction_externe_nD.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Fonction_externe_nD.h b/Util/Courbes/Fonction_externe_nD.h index c6c6040..af04742 100755 --- a/Util/Courbes/Fonction_externe_nD.h +++ b/Util/Courbes/Fonction_externe_nD.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Fonction_nD.cc b/Util/Courbes/Fonction_nD.cc index 3f2a2cc..38ced76 100755 --- a/Util/Courbes/Fonction_nD.cc +++ b/Util/Courbes/Fonction_nD.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -867,7 +867,8 @@ void Fonction_nD::Construction_index_conteneurs_evoluees() (Ddl_enum_etendu::PremierDdlEnumEtenduFamille(ddenumetendu)); posi_ddl_enum(i)=position; // maintenant il faut récupérer la position = l'indice, de l'enu dans le tenseur - Deuxentiers_enu deux = IJind(ddl_de_service.Enum(),dim); +// erreur : 18 mars 2023 Deuxentiers_enu deux = IJind(ddl_de_service.Enum(),dim); + Deuxentiers_enu deux = IJind(ddenumetendu.Enum(),dim); ind_tens(i) = deux; break; } @@ -1518,7 +1519,7 @@ void Fonction_nD::Lecture_variables(string& nom_lu,UtilLecture * entreePrinc) { // si on a un mot clé global dans la ligne courante c-a-d dans tablcar --> erreur if ( motCle.SimotCle(entreePrinc->tablcar)) - { cout << "\n erreur de lecture des parametre de definition d'une courbe avec expression litterale : on n'a pas trouve de mot cle relatif a une variable" + { cout << "\n erreur de lecture des parametre de definition d'une fonction nD : on n'a pas trouve de mot cle relatif a une variable" << " et par contre la ligne courante contient un mot cle global " << " *** a priori il y a une erreur de mise en donnees ! " ; entreePrinc->MessageBuffer("** erreur des parametres d'une fonction nD **"); @@ -1549,7 +1550,8 @@ void Fonction_nD::Lecture_variables(string& nom_lu,UtilLecture * entreePrinc) #else else if ((entreePrinc->entree)->eof()) // la lecture est bonne mais on a atteind la fin de la ligne - { if(nom_lu != "fin_parametres_fonction_expression_litterale_") + { if (nom_lu.find("fin_parametres_fonction_") == std::string::npos) + //if(nom_lu != "fin_parametres_fonction_expression_litterale_") // on lit sans tenir compte des < éventuelles {entreePrinc->NouvelleDonneeSansInf(); *(entreePrinc->entree) >> nom_lu; @@ -1558,7 +1560,7 @@ void Fonction_nD::Lecture_variables(string& nom_lu,UtilLecture * entreePrinc) #endif else // cas d'une erreur de lecture { cout << "\n erreur de lecture inconnue "; - entreePrinc->MessageBuffer("** erreur2 des parametres d'une courbe expression litterale**"); + entreePrinc->MessageBuffer("** erreur2 des parametres d'une fonction nD **"); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie(1); }; diff --git a/Util/Courbes/Fonction_nD.h b/Util/Courbes/Fonction_nD.h index feab2cf..711990a 100755 --- a/Util/Courbes/Fonction_nD.h +++ b/Util/Courbes/Fonction_nD.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/LesCourbes1D.cc b/Util/Courbes/LesCourbes1D.cc index 239947a..50c4d02 100755 --- a/Util/Courbes/LesCourbes1D.cc +++ b/Util/Courbes/LesCourbes1D.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/LesCourbes1D.h b/Util/Courbes/LesCourbes1D.h index 5d4d897..6354cee 100644 --- a/Util/Courbes/LesCourbes1D.h +++ b/Util/Courbes/LesCourbes1D.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/LesFonctions_nD.cc b/Util/Courbes/LesFonctions_nD.cc index 6b51449..428b898 100644 --- a/Util/Courbes/LesFonctions_nD.cc +++ b/Util/Courbes/LesFonctions_nD.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -432,7 +432,7 @@ Fonction_nD * LesFonctions_nD::Lecture_pour_base_info(ifstream& ent,const int ca // écriture pour base info // c'est le pendant de Lecture_pour_base_info, de manière à être cohérent void LesFonctions_nD::Ecriture_pour_base_info(ofstream& sort,const int cas,Fonction_nD * ptfonction) - { // la fonction d'écrouissage + { // la fonction sort << ptfonction->NomFonction() << " " << ptfonction->Type_Fonction() << " "; // écriture le la fonction elle-même que si le nom est "_" if (ptfonction->NomFonction() == "_") diff --git a/Util/Courbes/LesFonctions_nD.h b/Util/Courbes/LesFonctions_nD.h index 2dc9c43..b229ef9 100755 --- a/Util/Courbes/LesFonctions_nD.h +++ b/Util/Courbes/LesFonctions_nD.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/Poly_Lagrange.cc b/Util/Courbes/Poly_Lagrange.cc index fe431a6..e1c85ec 100644 --- a/Util/Courbes/Poly_Lagrange.cc +++ b/Util/Courbes/Poly_Lagrange.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -30,6 +30,7 @@ #include #include "ConstMath.h" +#include "ParaGlob.h" // CONSTRUCTEURS : diff --git a/Util/Courbes/Poly_Lagrange.h b/Util/Courbes/Poly_Lagrange.h index 6489090..1de7b6e 100644 --- a/Util/Courbes/Poly_Lagrange.h +++ b/Util/Courbes/Poly_Lagrange.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/SixpodeCos3phi.cc b/Util/Courbes/SixpodeCos3phi.cc index 54f471c..1d09d56 100644 --- a/Util/Courbes/SixpodeCos3phi.cc +++ b/Util/Courbes/SixpodeCos3phi.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -220,7 +220,7 @@ void SixpodeCos3phi::Ecriture_base_info(ofstream& sort,const int cas) }; // sortie du schemaXML: en fonction de enu -void SixpodeCos3phi::SchemaXML_Courbes1D(ofstream& ,const Enum_IO_XML enu) +void SixpodeCos3phi::SchemaXML_Courbes1D(ofstream& sort,const Enum_IO_XML enu) { switch (enu) { case XML_TYPE_GLOBAUX : @@ -239,6 +239,7 @@ void SixpodeCos3phi::SchemaXML_Courbes1D(ofstream& ,const Enum_IO_XML enu) { break; } + default: sort << "\n SchemaXML: cas non pris en compte " ; }; }; diff --git a/Util/Courbes/SixpodeCos3phi.h b/Util/Courbes/SixpodeCos3phi.h index 53b286d..2531104 100644 --- a/Util/Courbes/SixpodeCos3phi.h +++ b/Util/Courbes/SixpodeCos3phi.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Courbes/TangenteHyperbolique.cc b/Util/Courbes/TangenteHyperbolique.cc index ddda201..06dfbf2 100644 --- a/Util/Courbes/TangenteHyperbolique.cc +++ b/Util/Courbes/TangenteHyperbolique.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -262,6 +262,10 @@ void TangenteHyperbolique::SchemaXML_Courbes1D(ofstream& ,const Enum_IO_XML enu) { break; } - }; + default: cout << "\n *** attention cas non pris en compte pour le moment " + << " XML_TYPE_GLOBAUX= "< méthode de Jacobi -// la matrice A est ecrasee, a la sortie chaque colonne represente un vecteur propre -// le vecteur de retour contiend les valeurs propres -// s'il y a une erreur dans le calcul : cas = -1 -#ifndef MISE_AU_POINT - inline -#endif -Vecteur MathUtil2::VectValPropre(Mat_pleine& A,int& cas) - { // appel d'une routine jacobi - int nbcol = A.Nb_colonne(); - #ifndef MISE_AU_POINT - int nblign = A.Nb_ligne(); - if (nbcol != nblign) - { cout << "\n erreur dans VectValPropre(Mat_pleine& A), la matrice n'est pas carré" - << endl; - Sortie(1); - } - #endif - - // 1) def de la matrice et du vecteur contenant les vecteurs propre et les valeurs propres - Vecteur d(nbcol); - Mat_pleine V(nbcol,nbcol); - int nrot =0; // nombre de rotation dans jacobi - - // 3) appel du programme de la bibliothèque (fortement modifié) - Jacobi jaco; // une instance par défaut - - jaco.jacobi(A,d,V,nrot); - // traitement erreur - if (nrot == -1) {cas = -1;} else {cas = 1;}; - - // 4) mise en ordre des valeurs et vecteurs propres - jaco.eigsrt(d,V); - // 5) sauvegarde et retour - A = V; - return d; - }; - +//// vecteurs propre et valeurs propres d'une matrice nxn c-a-d : en particulier 3 3 ou 2 2 ou 1 1 +//// avec une limitation sur n (< 50) +//// *** dans le cas où les matrices sont symétriques !! *** +//// la méthode est itérative, --> méthode de Jacobi +//// la matrice A est ecrasee, a la sortie chaque colonne represente un vecteur propre +//// le vecteur de retour contiend les valeurs propres +//// s'il y a une erreur dans le calcul : cas = -1 +//#ifndef MISE_AU_POINT +// inline +//#endif +//Vecteur MathUtil2::VectValPropre(Mat_pleine& A,int& cas) +// { // appel d'une routine jacobi +// int nbcol = A.Nb_colonne(); +// #ifndef MISE_AU_POINT +// int nblign = A.Nb_ligne(); +// if (nbcol != nblign) +// { cout << "\n erreur dans VectValPropre(Mat_pleine& A), la matrice n'est pas carré" +// << endl; +// Sortie(1); +// } +// #endif +// +// // 1) def de la matrice et du vecteur contenant les vecteurs propre et les valeurs propres +// Vecteur d(nbcol); +// Mat_pleine V(nbcol,nbcol); +// int nrot =0; // nombre de rotation dans jacobi +// +// // 3) appel du programme de la bibliothèque (fortement modifié) +// Jacobi jaco; // une instance par défaut +// +// jaco.jacobi(A,d,V,nrot); +// // traitement erreur +// if (nrot == -1) {cas = -1;} else {cas = 1;}; +// +// // 4) mise en ordre des valeurs et vecteurs propres +// jaco.eigsrt(d,V); +// // 5) sauvegarde et retour +// A = V; +// return d; +// }; +// //calcul des vecteurs propres pour une matrice 3x3 réel uniquement, pas forcément symétrique diff --git a/Util/MathUtil2.h b/Util/MathUtil2.h index a9aba69..be5c240 100644 --- a/Util/MathUtil2.h +++ b/Util/MathUtil2.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -92,14 +92,14 @@ class ErrMathUtil2 class MathUtil2 { public : - /// vecteurs propre et valeurs propres d'une matrice nxn c-a-d : en particulier 3 3 ou 2 2 ou 1 1 - /// avec une limitation sur n (< 50) - /// *** dans le cas où les matrices sont symétriques !! *** - /// la méthode est itérative, --> méthode de Jacobi - /// la matrice A est ecrasee, a la sortie chaque colonne represente un vecteur propre - /// le vecteur de retour contiend les valeurs propres - /// s'il y a une erreur dans le calcul : cas = -1 - static Vecteur VectValPropre(Mat_pleine& A,int& cas); +// /// vecteurs propre et valeurs propres d'une matrice nxn c-a-d : en particulier 3 3 ou 2 2 ou 1 1 +// /// avec une limitation sur n (< 50) +// /// *** dans le cas où les matrices sont symétriques !! *** +// /// la méthode est itérative, --> méthode de Jacobi +// /// la matrice A est ecrasee, a la sortie chaque colonne represente un vecteur propre +// /// le vecteur de retour contiend les valeurs propres +// /// s'il y a une erreur dans le calcul : cas = -1 +// static Vecteur VectValPropre(Mat_pleine& A,int& cas); ///calcul des vecteurs propres pour une matrice 3x3 réel uniquement, pas forcément symétrique /// dans le cas où on connait déjà les valeurs propres diff --git a/Util/MvtSolide/MvtSolide.cc b/Util/MvtSolide/MvtSolide.cc index c2780bc..fc0267d 100644 --- a/Util/MvtSolide/MvtSolide.cc +++ b/Util/MvtSolide/MvtSolide.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/MvtSolide/MvtSolide.h b/Util/MvtSolide/MvtSolide.h index 847429c..5d7ff46 100644 --- a/Util/MvtSolide/MvtSolide.h +++ b/Util/MvtSolide/MvtSolide.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -49,13 +49,11 @@ #include "Tableau_T.h" #include "Basiques.h" -/** -* \author Gérard Rio -* \version 1.0 -* \date 19/01/2007 -* \brief gérer les mouvements solides avec homothétie qui est une extension à l'objectif initial -* -*/ +/// +/// \author Gérard Rio +/// \version 1.0 +/// \date 19/01/2007 + class MvtSolide { // surcharge de l'operator de lecture // les informations sont typées diff --git a/Util/Sortie.cc b/Util/Sortie.cc index 1545e3e..45a5d98 100644 --- a/Util/Sortie.cc +++ b/Util/Sortie.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Sortie.h b/Util/Sortie.h index 1fab8e3..f18f380 100644 --- a/Util/Sortie.h +++ b/Util/Sortie.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Util.cc b/Util/Util.cc index c49307c..6fcd2e8 100644 --- a/Util/Util.cc +++ b/Util/Util.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/Util.h b/Util/Util.h index a9dda17..184ce7f 100644 --- a/Util/Util.h +++ b/Util/Util.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/externe/Racine.cc b/Util/externe/Racine.cc index e9e4db6..6f90b11 100644 --- a/Util/externe/Racine.cc +++ b/Util/externe/Racine.cc @@ -52,13 +52,12 @@ Quartic::Quartic(): }; -/****************************************************/ -/* +/* ************************************************** */ // find the errors // // called by quartictest, docoeff, compare, // chris, descartes, ferrari, neumark, yacfraid. -/****************************************************/ +/* ************************************************** */ double Quartic::errors(double a,double b,double c,double d,double rts[4],double rterr[4],int nrts) { @@ -902,15 +901,15 @@ int Quartic::ferrari(double a,double b,double c,double d,double rts[4]) if ( ((b > doub0)&&(y > doub0)) || ((b < doub0)&&(y < doub0)) ) { - if ((a > doub0) && (e > doub0) - || (a < doub0) && (e < doub0) ) + if ( ((a > doub0) && (e > doub0)) + || ((a < doub0) && (e < doub0)) ) { g = (b + y)/gg; ++nfer[13]; } else - if ((a > doub0) && (e < doub0) - || (a < doub0) && (e > doub0) ) + if ( ((a > doub0) && (e < doub0)) + || ((a < doub0) && (e > doub0)) ) { gg = (b + y)/g; ++nfer[14]; @@ -1522,7 +1521,7 @@ int Quartic::chris(double a,double b,double c,double d,double rts[4]) else k1 = sqrt(Dabs(ysq + inv2*e2 + inv4*e1/y)); g1 = (doub4*ycu + doub2* y*e2 + e1)*k; - printf("chrisc %g %g %g %g %g\n",k,k1,y,g,g1,h); + printf("chrisc %g %g %g %g %g %g\n",k,k1,y,g,g1,h); } n0 = quadratic(g*kquinv,h*kquinv-doub2,v0); if (n0 < 1) diff --git a/Util/externe/Racine.h b/Util/externe/Racine.h old mode 100644 new mode 100755 diff --git a/Util/externe/quartic.c b/Util/externe/quartic.c old mode 100644 new mode 100755 diff --git a/Util/externe/quartic.cc b/Util/externe/quartic.cc old mode 100644 new mode 100755 diff --git a/Util/suites/LesSuitesReel.cc b/Util/suites/LesSuitesReel.cc index b2260e2..d4ebecb 100644 --- a/Util/suites/LesSuitesReel.cc +++ b/Util/suites/LesSuitesReel.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/suites/LesSuitesReel.h b/Util/suites/LesSuitesReel.h index 75c7d94..9dc0cf9 100644 --- a/Util/suites/LesSuitesReel.h +++ b/Util/suites/LesSuitesReel.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/suites/SuiteReel.cc b/Util/suites/SuiteReel.cc index a363916..803b834 100644 --- a/Util/suites/SuiteReel.cc +++ b/Util/suites/SuiteReel.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/suites/SuiteReel.h b/Util/suites/SuiteReel.h index 233a9bc..4d2f5fd 100644 --- a/Util/suites/SuiteReel.h +++ b/Util/suites/SuiteReel.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/suites/Suite_arithmetique.cc b/Util/suites/Suite_arithmetique.cc index 28839a9..0b6fc59 100644 --- a/Util/suites/Suite_arithmetique.cc +++ b/Util/suites/Suite_arithmetique.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/suites/Suite_arithmetique.h b/Util/suites/Suite_arithmetique.h index af1edb9..e495974 100644 --- a/Util/suites/Suite_arithmetique.h +++ b/Util/suites/Suite_arithmetique.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/suites/Suite_equidistante.cc b/Util/suites/Suite_equidistante.cc index 9e1ba3c..d9f9b5f 100644 --- a/Util/suites/Suite_equidistante.cc +++ b/Util/suites/Suite_equidistante.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/suites/Suite_equidistante.h b/Util/suites/Suite_equidistante.h index 87e087f..80c2db1 100644 --- a/Util/suites/Suite_equidistante.h +++ b/Util/suites/Suite_equidistante.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/suites/Suite_geometrique.cc b/Util/suites/Suite_geometrique.cc index 4402c61..f12511b 100644 --- a/Util/suites/Suite_geometrique.cc +++ b/Util/suites/Suite_geometrique.cc @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/Util/suites/Suite_geometrique.h b/Util/suites/Suite_geometrique.h index 742759f..2841455 100644 --- a/Util/suites/Suite_geometrique.h +++ b/Util/suites/Suite_geometrique.h @@ -7,7 +7,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/CompFrotAbstraite.cc b/comportement/CompFrotAbstraite.cc index 0d54b61..190fe92 100644 --- a/comportement/CompFrotAbstraite.cc +++ b/comportement/CompFrotAbstraite.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/CompFrotAbstraite.h b/comportement/CompFrotAbstraite.h index bb21d3b..33b28f5 100644 --- a/comportement/CompFrotAbstraite.h +++ b/comportement/CompFrotAbstraite.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/CompThermoPhysiqueAbstraite.cc b/comportement/CompThermoPhysiqueAbstraite.cc index 45972d5..9af5ff4 100644 --- a/comportement/CompThermoPhysiqueAbstraite.cc +++ b/comportement/CompThermoPhysiqueAbstraite.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -151,20 +151,21 @@ void CompThermoPhysiqueAbstraite::Cal_cinematique_thermique saveResul = saveTP ; // récup des flux et gradients - CoordonneeH & fluxH = (ptIntegThermi.FluxH()); // ici _tdt est la grandeur finale +/* CoordonneeH & fluxH = (ptIntegThermi.FluxH()); // ici _tdt est la grandeur finale CoordonneeH & fluxH_t = (ptIntegThermi.FluxH_t()); // ici _tdt est la grandeur finale CoordonneeB & gradTB_tdt = (ptIntegThermi.GradTB()); CoordonneeB & DgradTB_ = (ptIntegThermi.DgradTB()); CoordonneeB & delta_gradTB = (ptIntegThermi.DeltaGradTB()); // dilatation=dilat; // pour l'instant je ne sais pas si c'est utile +*/ // calcul de : epsBB_tdt, delta_epsBB,gijBB_tdt, gijHH_tdt, d_gijBB_tdt, // d_gijHH_tdt,jacobien,d_jacobien_tdt Temps_CPU_HZpp& temps_cpu_metrique = ptIntegThermi.TpsMetrique(); temps_cpu_metrique.Mise_en_route_du_comptage(); // cpu - bool calcul_varD_ddl = false;// a priori on ne veut pas de vitesse de def +// bool calcul_varD_ddl = false;// a priori on ne veut pas de vitesse de def // appel de la métrique pour un calcul autre que mécanique - bool avec_var_Xi = false; +// bool avec_var_Xi = false; const Met_abstraite::Impli& ex = def.Cal_implicit(premier_calcul,false); temps_cpu_metrique.Arret_du_comptage(); // cpu diff --git a/comportement/CompThermoPhysiqueAbstraite.h b/comportement/CompThermoPhysiqueAbstraite.h index de13dbf..83fac16 100644 --- a/comportement/CompThermoPhysiqueAbstraite.h +++ b/comportement/CompThermoPhysiqueAbstraite.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Energies_meca/EnergieMeca.h b/comportement/Energies_meca/EnergieMeca.h index 6420fca..de09291 100644 --- a/comportement/Energies_meca/EnergieMeca.h +++ b/comportement/Energies_meca/EnergieMeca.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Energies_meca/EnergiesMeca.cc b/comportement/Energies_meca/EnergiesMeca.cc index e94c206..0e52f3d 100644 --- a/comportement/Energies_meca/EnergiesMeca.cc +++ b/comportement/Energies_meca/EnergiesMeca.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Energies_thermique/EnergieThermi.h b/comportement/Energies_thermique/EnergieThermi.h index f711ca3..ea75048 100755 --- a/comportement/Energies_thermique/EnergieThermi.h +++ b/comportement/Energies_thermique/EnergieThermi.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Energies_thermique/EnergiesThermi.cc b/comportement/Energies_thermique/EnergiesThermi.cc index 7021c8d..ea7078c 100755 --- a/comportement/Energies_thermique/EnergiesThermi.cc +++ b/comportement/Energies_thermique/EnergiesThermi.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Frottement/CompFrotCoulomb.cc b/comportement/Frottement/CompFrotCoulomb.cc index dcf4f76..608b3aa 100644 --- a/comportement/Frottement/CompFrotCoulomb.cc +++ b/comportement/Frottement/CompFrotCoulomb.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -249,28 +249,29 @@ void CompFrotCoulomb::Info_commande_LoisDeComp(UtilLecture& entreePrinc) // test si la loi est complete int CompFrotCoulomb::TestComplet() - { int ret = LoiAbstraiteGeneral::TestComplet(); - if (mu_statique == -ConstMath::tresgrand) + { int ret = LoiAbstraiteGeneral::TestComplet(); + if (mu_statique == -ConstMath::tresgrand) { cout << "\n mu_statique n'est pas defini dans la loi de coulomb "; ret = 0; }; - if (regularisation != 0) - if (epsil == -ConstMath::tresgrand) - { cout << "\n le parametre de reglage de la regularisation n'est pas defini dans la loi de coulomb "; - ret = 0; - } - else if (Dabs(epsil) < ConstMath::pasmalpetit) - { cout << "\n le parametre de reglage de la regularisation = " << epsil << " dans la loi de coulomb " - << "est trop petit ! pour fonctionner correctement "; - ret = 0; - } - else if (epsil < 0.) - { cout << "\n le parametre de reglage de la regularisation = " << epsil << " dans la loi de coulomb " - << "est negatif, ce qui n'est pas possible "; - ret = 0; - }; - return ret; - }; + if (regularisation != 0) + {if (epsil == -ConstMath::tresgrand) + { cout << "\n le parametre de reglage de la regularisation n'est pas defini dans la loi de coulomb "; + ret = 0; + } + else if (Dabs(epsil) < ConstMath::pasmalpetit) + { cout << "\n le parametre de reglage de la regularisation = " << epsil << " dans la loi de coulomb " + << "est trop petit ! pour fonctionner correctement "; + ret = 0; + } + else if (epsil < 0.) + { cout << "\n le parametre de reglage de la regularisation = " << epsil << " dans la loi de coulomb " + << "est negatif, ce qui n'est pas possible "; + ret = 0; + }; + }; + return ret; + }; //----- lecture écriture de restart ----- // cas donne le niveau de la récupération diff --git a/comportement/Frottement/CompFrotCoulomb.h b/comportement/Frottement/CompFrotCoulomb.h index afa54af..20f608d 100644 --- a/comportement/Frottement/CompFrotCoulomb.h +++ b/comportement/Frottement/CompFrotCoulomb.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/Hart_Smith3D.cc b/comportement/Hyper_elastique/Hart_Smith3D.cc index 8fb6479..39013a7 100644 --- a/comportement/Hyper_elastique/Hart_Smith3D.cc +++ b/comportement/Hyper_elastique/Hart_Smith3D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -48,7 +48,9 @@ using namespace std; //introduces namespace std Hart_Smith3D::Hart_Smith3D () : // Constructeur par defaut Hyper_W_gene_3D(HART_SMITH3D,CAT_MECANIQUE,3) ,C1(-ConstMath::trespetit),C2(-ConstMath::trespetit),C3(-ConstMath::trespetit),K(-ConstMath::trespetit) + ,C1_use(0.),C2_use(0.),C3_use(0.),K_use(0.) // recalculés avant chaque usage ,C1_temperature(NULL),C2_temperature(NULL),C3_temperature(NULL),K_temperature(NULL),type_pot_vol(1) + ,K_nD(NULL),C1_nD(NULL),C2_nD(NULL),C3_nD(NULL) ,W_d(0.),W_v(0.) ,W_d_J1(0.),W_d_J2(0.),W_v_J3(0.),W_v_J3J3(0.) ,W_d_J1_2(0.),W_d_J1_J2(0.),W_d_J2_2(0.) @@ -57,6 +59,7 @@ Hart_Smith3D::Hart_Smith3D () : // Constructeur par defaut ,W_c(0.),W_c_J1(0.),W_c_J3(0.),W_c_J1_2(0.),W_c_J3_2(0.),W_c_J1_J3(0.) { // définition de la courbe représentant l'évolution de l'énergie en fonction de J1 Calcul_courbe_evolW_J1(); + nb_para_loi = 4; // nombre de paramètre de la loi }; @@ -64,8 +67,10 @@ Hart_Smith3D::Hart_Smith3D () : // Constructeur par defaut Hart_Smith3D::Hart_Smith3D (const Hart_Smith3D& loi) : Hyper_W_gene_3D(loi) ,C1(loi.C1),C2(loi.C2),C3(loi.C3),K(loi.K) + ,C1_use(0.),C2_use(0.),C3_use(0.),K_use(0.) // recalculés avant chaque usage ,C1_temperature(loi.C1_temperature),C2_temperature(loi.C2_temperature),C3_temperature(loi.C3_temperature) ,K_temperature(loi.K_temperature),type_pot_vol(loi.type_pot_vol) + ,K_nD(loi.K_nD),C1_nD(loi.C1_nD),C2_nD(loi.C2_nD),C3_nD(loi.C3_nD) ,W_d(loi.W_d),W_v(loi.W_v) ,W_d_J1(loi.W_d_J1),W_d_J2(loi.W_d_J2),W_v_J3(loi.W_v_J3),W_v_J3J3(loi.W_v_J3J3) ,W_d_J1_2(loi.W_d_J1_2),W_d_J1_J2(loi.W_d_J1_J2),W_d_J2_2(loi.W_d_J2_2) @@ -95,6 +100,34 @@ Hart_Smith3D::Hart_Smith3D (const Hart_Smith3D& loi) : if (r_temperature->NomCourbe() == "_") r_temperature = Courbe1D::New_Courbe1D(*(loi.r_temperature)); }; + + // idem pour les fonctions nD + if (K_nD != NULL) + if (K_nD->NomFonction() == "_") + {// comme il s'agit d'une fonction locale on la redéfinie (sinon pb lors du destructeur de loi) + string non_courbe("_"); + K_nD = Fonction_nD::New_Fonction_nD(*loi.K_nD); + }; + if (C1_nD != NULL) + if (C1_nD->NomFonction() == "_") + {// comme il s'agit d'une fonction locale on la redéfinie (sinon pb lors du destructeur de loi) + string non_courbe("_"); + C1_nD = Fonction_nD::New_Fonction_nD(*loi.C1_nD); + }; + if (C2_nD != NULL) + if (C2_nD->NomFonction() == "_") + {// comme il s'agit d'une fonction locale on la redéfinie (sinon pb lors du destructeur de loi) + string non_courbe("_"); + C2_nD = Fonction_nD::New_Fonction_nD(*loi.C2_nD); + }; + if (C3_nD != NULL) + if (C3_nD->NomFonction() == "_") + {// comme il s'agit d'une fonction locale on la redéfinie (sinon pb lors du destructeur de loi) + string non_courbe("_"); + C3_nD = Fonction_nD::New_Fonction_nD(*loi.C3_nD); + }; + nb_para_loi = 4; // nombre de paramètre de la loi + }; Hart_Smith3D::~Hart_Smith3D () @@ -111,13 +144,19 @@ Hart_Smith3D::~Hart_Smith3D () if (a_temperature->NomCourbe() == "_") delete a_temperature; if (r_temperature != NULL) if (r_temperature->NomCourbe() == "_") delete r_temperature; + // idem pour les fonctions nD + if (K_nD != NULL) if (K_nD->NomFonction() == "_") delete K_nD; + if (C1_nD != NULL) if (C1_nD->NomFonction() == "_") delete C1_nD; + if (C2_nD != NULL) if (C2_nD->NomFonction() == "_") delete C2_nD; + if (C3_nD != NULL) if (C3_nD->NomFonction() == "_") delete C3_nD; }; // Lecture des donnees de la classe sur fichier void Hart_Smith3D::LectureDonneesParticulieres (UtilLecture * entreePrinc,LesCourbes1D& lesCourbes1D,LesFonctions_nD& lesFonctionsnD) { string toto,nom; - // lecture du coefficient C1 + string nom_class_methode = "Hart_Smith3D::LectureDonneesParticulieres"; + // lecture du coefficient C1 *(entreePrinc->entree) >> nom; if(nom != "C1=") { cout << "\n erreur en lecture du parametre C1, on attendait la chaine C1= et on a lu: " << nom; @@ -281,7 +320,13 @@ void Hart_Smith3D::LectureDonneesParticulieres { // lecture de K *(entreePrinc->entree) >> K ; // s'il n'y a plus rien n'a lire, il faut passer un enregistrement - if(strstr(entreePrinc->tablcar,"type_potvol_")==0) entreePrinc->NouvelleDonnee(); + if((strstr(entreePrinc->tablcar,"type_potvol_")==0) + && (strstr(entreePrinc->tablcar,"avec_courbure_")==0) + && (strstr(entreePrinc->tablcar,"avec_nD_")==0) + && (strstr(entreePrinc->tablcar,"sortie_post_")==0) + ) + entreePrinc->NouvelleDonnee(); + }; // lecture éventuelle du type de potentiel if(strstr(entreePrinc->tablcar,"type_potvol_")!=0) @@ -402,16 +447,214 @@ void Hart_Smith3D::LectureDonneesParticulieres entreePrinc->NouvelleDonnee(); }; //-- fin de la lecture éventuelle d'un terme de courbure + + // -------- on regarde s'il y a une dépendance à une fonction nD + if (strstr(entreePrinc->tablcar,"avec_nD_")!=NULL) + { string nom1,nom2; + // lecture des fonctions nD + entreePrinc->NouvelleDonnee(); // passage d'une ligne + + // on lit tant que l'on ne rencontre pas la ligne contenant "fin_parametres_avec_nD_" + // ou un nouveau mot clé global auquel cas il y a pb !! + MotCle motCle; // ref aux mots cle + while (strstr(entreePrinc->tablcar,"fin_parametres_avec_nD_")==0) + { + // si on a un mot clé global dans la ligne courante c-a-d dans tablcar --> erreur + if ( motCle.SimotCle(entreePrinc->tablcar)) + { cout << "\n erreur de lecture des parametre de dependance a une fonction nD: on n'a pas trouve le mot cle " + << " fin_parametres_avec_nD_ et par contre la ligne courante contient un mot cle global "; + entreePrinc->MessageBuffer + ("** erreur51 des parametres de reglage de la loi de comportement Hart_Smith3D**"); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + + // lecture d'un mot clé + *(entreePrinc->entree) >> nom1; + + if ((entreePrinc->entree)->rdstate() == 0) + {} // lecture normale + #ifdef ENLINUX + else if ((entreePrinc->entree)->fail()) + // on a atteind la fin de la ligne et on appelle un nouvel enregistrement + { entreePrinc->NouvelleDonnee(); // lecture d'un nouvelle enregistrement + *(entreePrinc->entree) >>nom1; + } + #else + else if ((entreePrinc->entree)->eof()) + // la lecture est bonne mais on a atteind la fin de la ligne + { if(nom1 != "fin_parametres_avec_nD_") + {entreePrinc->NouvelleDonnee(); *(entreePrinc->entree) >> nom1;}; + } + #endif + else // cas d'une erreur de lecture + { cout << "\n erreur de lecture inconnue "; + entreePrinc->MessageBuffer + ("** erreur61 des parametres de reglage de la loi de comportement Hart_Smith3D**"); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + + if(nom1 == "K_nD=") + {string nom_fonct; + // lecture du nom de la fonction + *(entreePrinc->entree) >> nom_fonct; + + // maintenant on définit la fonction + if (lesFonctionsnD.Existe(nom_fonct)) + {K_nD = lesFonctionsnD.Trouve(nom_fonct); + } + else + {// sinon il faut la lire maintenant + string non("_"); + K_nD = Fonction_nD::New_Fonction_nD(non, Id_Nom_Fonction_nD(nom_fonct)); + // lecture de la fonction + K_nD->LectDonnParticulieres_Fonction_nD (non,entreePrinc); + // maintenant on vérifie que la fonction est utilisable + if (K_nD->NbComposante() != 1 ) + { cout << "\n erreur en lecture, la fonction " << nom_fonct + << " est une fonction vectorielle a " << K_nD->NbComposante() + << " composante alors qu'elle devrait etre scalaire ! " + << " elle n'est donc pas utilisable !! "; + string message("\n**erreur031** \n"+nom_class_methode+"(..."); + entreePrinc->MessageBuffer(message); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; + // on regarde si la fonction nD intègre la température + const Tableau & tab_enu = K_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + // prepa du flot de lecture + entreePrinc->NouvelleDonnee(); + } + else if(nom1 == "C1_nD=") + {string nom_fonct; + // lecture du nom de la fonction + *(entreePrinc->entree) >> nom_fonct; + + // maintenant on définit la fonction + if (lesFonctionsnD.Existe(nom_fonct)) + {C1_nD = lesFonctionsnD.Trouve(nom_fonct); + } + else + {// sinon il faut la lire maintenant + string non("_"); + C1_nD = Fonction_nD::New_Fonction_nD(non, Id_Nom_Fonction_nD(nom_fonct)); + // lecture de la fonction + C1_nD->LectDonnParticulieres_Fonction_nD (non,entreePrinc); + // maintenant on vérifie que la fonction est utilisable + if (C1_nD->NbComposante() != 1 ) + { cout << "\n erreur en lecture, la fonction " << nom_fonct + << " est une fonction vectorielle a " << C1_nD->NbComposante() + << " composante alors qu'elle devrait etre scalaire ! " + << " elle n'est donc pas utilisable !! "; + string message("\n**erreur031** \n"+nom_class_methode+"(..."); + entreePrinc->MessageBuffer(message); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; + // on regarde si la fonction nD intègre la température + const Tableau & tab_enu = C1_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + // prepa du flot de lecture + entreePrinc->NouvelleDonnee(); + } + else if(nom1 == "C2_nD=") + {string nom_fonct; + // lecture du nom de la fonction + *(entreePrinc->entree) >> nom_fonct; + + // maintenant on définit la fonction + if (lesFonctionsnD.Existe(nom_fonct)) + {C2_nD = lesFonctionsnD.Trouve(nom_fonct); + } + else + {// sinon il faut la lire maintenant + string non("_"); + C2_nD = Fonction_nD::New_Fonction_nD(non, Id_Nom_Fonction_nD(nom_fonct)); + // lecture de la fonction + C2_nD->LectDonnParticulieres_Fonction_nD (non,entreePrinc); + // maintenant on vérifie que la fonction est utilisable + if (C2_nD->NbComposante() != 1 ) + { cout << "\n erreur en lecture, la fonction " << nom_fonct + << " est une fonction vectorielle a " << C2_nD->NbComposante() + << " composante alors qu'elle devrait etre scalaire ! " + << " elle n'est donc pas utilisable !! "; + string message("\n**erreur031** \n"+nom_class_methode+"(..."); + entreePrinc->MessageBuffer(message); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; + // on regarde si la fonction nD intègre la température + const Tableau & tab_enu = C2_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + // prepa du flot de lecture + entreePrinc->NouvelleDonnee(); + } + else if(nom1 == "C3_nD=") + {string nom_fonct; + // lecture du nom de la fonction + *(entreePrinc->entree) >> nom_fonct; + + // maintenant on définit la fonction + if (lesFonctionsnD.Existe(nom_fonct)) + {C3_nD = lesFonctionsnD.Trouve(nom_fonct); + } + else + {// sinon il faut la lire maintenant + string non("_"); + C3_nD = Fonction_nD::New_Fonction_nD(non, Id_Nom_Fonction_nD(nom_fonct)); + // lecture de la fonction + C3_nD->LectDonnParticulieres_Fonction_nD (non,entreePrinc); + // maintenant on vérifie que la fonction est utilisable + if (C3_nD->NbComposante() != 1 ) + { cout << "\n erreur en lecture, la fonction " << nom_fonct + << " est une fonction vectorielle a " << C3_nD->NbComposante() + << " composante alors qu'elle devrait etre scalaire ! " + << " elle n'est donc pas utilisable !! "; + string message("\n**erreur031** \n"+nom_class_methode+"(..."); + entreePrinc->MessageBuffer(message); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; + // on regarde si la fonction nD intègre la température + const Tableau & tab_enu = C3_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + // prepa du flot de lecture + entreePrinc->NouvelleDonnee(); + } + else // cas d'une erreur + { cout << "\n erreur en lecture de la dependance a une fonction nD des coefficients, on aurait du lire " + << " le mot cle K_nD= ou C1_nD= ou C2_nD= ou C3_nD= et on a lu: " + << nom1; + entreePrinc->MessageBuffer("**erreur7 Hart_Smith3D::LectureDonneesParticulieres (...**"); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; //-- fin du while + entreePrinc->NouvelleDonnee(); // passage du mot clé "fin_parametres_avec_nD_" + }; + // lecture de l'indication éventuelle du post traitement - string nom_class_methode = "Hart_Smith3D";string le_mot_cle = "sortie_post_"; - entreePrinc->Lecture_un_parametre_int(0,nom_class_methode,0,1,le_mot_cle,sortie_post); - + string le_mot_cle = "sortie_post_"; + if (entreePrinc->Lecture_un_parametre_int(0,nom_class_methode,0,1,le_mot_cle,sortie_post)) + entreePrinc->NouvelleDonnee(); // passage éventuel du mot clé sortie_post_; + // --- appel au niveau de la classe mère // ici il n'y a pas de type de déformation associé // mais on prend la def standart d'almansi, pour les fonctions associées éventuelles + bool avec_passage_nouvelle_donnee=false; Loi_comp_abstraite::Lecture_type_deformation_et_niveau_commentaire - (*entreePrinc,lesFonctionsnD); + (*entreePrinc,lesFonctionsnD,avec_passage_nouvelle_donnee); }; // affichage de la loi void Hart_Smith3D::Affiche() const @@ -437,6 +680,36 @@ void Hart_Smith3D::Affiche() const << " courbe r=f(T): " << r_temperature->NomCourbe() <<" ";} else { cout << " r= " << r_courbure ;} }; + + // les dépendances à une fonction nD + if (K_nD != NULL) + {cout << " fonction nD K_nD: "; + if (K_nD->NomFonction() != "_") + cout << K_nD->NomFonction(); + else + K_nD->Affiche(); + }; + if (C1_nD!= NULL) + {cout << " fonction nD C1_nD: "; + if (C1_nD->NomFonction() != "_") + cout << C1_nD->NomFonction(); + else + C1_nD->Affiche(); + }; + if (C2_nD!= NULL) + {cout << " fonction nD C2_nD: "; + if (C2_nD->NomFonction() != "_") + cout << C2_nD->NomFonction(); + else + C2_nD->Affiche(); + }; + if (C3_nD!= NULL) + {cout << " fonction nD C3_nD: "; + if (C3_nD->NomFonction() != "_") + cout << C3_nD->NomFonction(); + else + C3_nD->Affiche(); + }; // appel de la classe mère Loi_comp_abstraite::Affiche_don_classe_abstraite(); }; @@ -472,16 +745,16 @@ void Hart_Smith3D::Info_commande_LoisDeComp(UtilLecture& entreePrinc) << "\n#------------------------------------------------------------------------------------" << "\n# C1= 1. C2= 0.145 C3= C3_thermo_dependant_ courbe4 " << "\n# K= K_thermo_dependant_ courbe4 " - << "\n#------------------------------------------------------------------------------------" - << "\n# un dernier parametre facultatif permet d'indiquer le type de variation volumique " + << "\n#---------------------------------- type_potvol_ ----------------------------------------" + << "\n# un parametre facultatif permet d'indiquer le type de variation volumique " << "\n# que l'on desire: par defaut il s'agit de : K(1-(1+log(V))/V) qui correspond au type 1" << "\n# mais on peut choisir: K/2(V-1) qui correspond au type 2 " << "\n# ou: K/2(log(V))^2 qui correspond au type 3 " << "\n# ou: K/2(V-1)^2 qui correspond au type 4 " << "\n# en indiquant (en fin de ligne) le mot cle: type_potvol_ suivi du type" << "\n# par defaut type_potvol_ a la valeur 1 " - << "\n#------------------------------------------------------------------------------------" - << "\n#------------------------------------------------------------------------------------" + << "\n# " + << "\n#---------------------------------- avec_courbure_ -------------------------------------" << "\n# apres le type de variation volumique on peut indiquer facultativement l'ajout au potentiel " << "\n# d'un terme permettant de raidir le comportement a partir d'un certain niveau de chargement " << "\n# pour cela on indique le mot cle: avec_courbure_ puis on change de ligne " @@ -496,7 +769,46 @@ void Hart_Smith3D::Info_commande_LoisDeComp(UtilLecture& entreePrinc) << "\n# C1= 1. C2= 0.145 C3= 1.e-4 K= 100 type_potvol_ 2 avec_courbure_ " << "\n# a_courbure= a_thermo_dependant_ " << "\n# r_courbure= r_thermo_dependant_ " - << "\n#------------------------------------------------------------------------------------"; + << "\n# " + << "\n#--------------------- dependance explicite a une fonction nD -----------------------------------" + << "\n# il est egalement possible de definir une dependance des parametres a une fonction nD " + << "\n# dans ce cas, a la suite de la dependance explicite a la temperature via une courbr 1D " + << "\n# ou a la suite du dernier parametre fixe, on met le mot cle: avec_nD_ " + << "\n# puis sur les lignes qui suivent on met des fonctions nD multiplicatives des parametres " + << "\n# initiaux, puis un mot cle signalant la fin des fonctions: fin_parametres_avec_nD_ " + << "\n# suit un exemple de declaration (il est possible d'ommettre certaine fonction ! " + << "\n# la presence de fct nD est facultative), de meme il est possible soit d'utiliser une fonction " + << "\n# deja defini soit de donner directement la fonction nD (comme pour les autres lois) " + << "\n# Enfin, apres chaque definition de fonction il faut passer a une nouvelle ligne " + << "\n# " + << "\n# exemple de definition de loi" + << "\n# C1= 1. C2= 0.145 C3= 1.e-4 K= 100 avec_nD_ " + << "\n# K_nD= fct_nD_1 " + << "\n# C1_nD= fct_nD_2 " + << "\n# C3_nD= fct_nD_3 " + << "\n# fin_parametres_avec_nD_ " + << "\n# " + << "\n# Remarques: " + << "\n# - les fonction nD sont des fonctions multiplicatives " + << "\n# des parametres initiaux (ou de ceux obtenus apres dependance explicite a la temperature " + << "\n# ( bien noter que la loi obtenue peut-etre quelconque, en particulier plus du tout " + << "\n# hyperelastique, tout depend des choix des fcts nD !) " + << "\n# " + << "\n#----------------------------------- sortie_post_ -------------------------------------" + << "\n# il est possible de recuperer differentes grandeurs de travail par exemple " + << "\n# l'intensite du potentiel, comme ces grandeurs sont calculees au moment de la resolution " + << "\n# et ne sont pas stockees. On peut egalement recuperer la valeur des coefficients de la loi " + << "\n# (utile s'ils varient) sous forme d'un tableau de quadruplets : K C1 C2 C3 " + << "\n# Il faut indiquer le mot cle sortie_post_ suivi de 1 (par defaut = 0) " + << "\n# ensuite au moment de la constitution du .CVisu on aura acces aux grandeurs de travail " + << "\n# ex: " + << "\n# sortie_post_ 1 " + << "\n# ce mot cle est le dernier des parametres specifiques de la loi il doit se situe " + << "\n# a la fin de la derniere ligne de donnees " + << "\n#" + << "\n#------------------------------------------------------------------------------------" + << "\n#------------------------------------------------------------------------------------" + << endl; }; sort << endl; // appel de la classe Hyper_W_gene_3D @@ -584,6 +896,13 @@ void Hart_Smith3D::Lecture_base_info_loi(ifstream& ent,const int cas,LesReferenc } else { ent >> nom; C1_temperature = lesCourbes1D.Lecture_pour_base_info(ent,cas,C1_temperature); }; + + // on regarde si il y a une fonction nD multiplicative + ent >> nom; + if (nom == "C1_nD:") + C1_nD = lesFonctionsnD.Lecture_pour_base_info(ent,cas,C1_nD); + + // C2 ent >> nom >> test; // vérification @@ -604,6 +923,11 @@ void Hart_Smith3D::Lecture_base_info_loi(ifstream& ent,const int cas,LesReferenc } else { ent >> nom; C2_temperature = lesCourbes1D.Lecture_pour_base_info(ent,cas,C2_temperature); }; + // on regarde si il y a une fonction nD multiplicative + ent >> nom; + if (nom == "C2_nD:") + C2_nD = lesFonctionsnD.Lecture_pour_base_info(ent,cas,C1_nD); + // C3 ent >> nom >> test; // vérification @@ -624,6 +948,11 @@ void Hart_Smith3D::Lecture_base_info_loi(ifstream& ent,const int cas,LesReferenc } else { ent >> nom; C3_temperature = lesCourbes1D.Lecture_pour_base_info(ent,cas,C3_temperature); }; + // on regarde si il y a une fonction nD multiplicative + ent >> nom; + if (nom == "C3_nD:") + C3_nD = lesFonctionsnD.Lecture_pour_base_info(ent,cas,C3_nD); + // K ent >> nom >> test; // vérification @@ -644,6 +973,11 @@ void Hart_Smith3D::Lecture_base_info_loi(ifstream& ent,const int cas,LesReferenc } else { ent >> nom; K_temperature = lesCourbes1D.Lecture_pour_base_info(ent,cas,K_temperature); }; + // on regarde si il y a une fonction nD multiplicative + ent >> nom; + if (nom == "K_nD:") + K_nD = lesFonctionsnD.Lecture_pour_base_info(ent,cas,K_nD); + // le type de potentiel ent >> nom >> type_pot_vol ; // --- potentiel de gestion de courbure, éventuellement @@ -710,27 +1044,46 @@ void Hart_Smith3D::Lecture_base_info_loi(ifstream& ent,const int cas,LesReferenc void Hart_Smith3D::Ecriture_base_info_loi(ofstream& sort,const int cas) { if (cas == 1) { // les coefficients - sort << "\n C1= "; + // C1 + sort << "\n C1= "; if (C1_temperature == NULL) { sort << false << " " << C1 << " ";} else { sort << true << " fonction_C1_temperature "; LesCourbes1D::Ecriture_pour_base_info(sort,cas,C1_temperature); }; - sort << " C2= "; + if (C1_nD != NULL) + {sort << " 2 C1_nD: " << " "; + LesFonctions_nD::Ecriture_pour_base_info(sort, cas,C1_nD); + } + else {sort << " non_C1_nD "; }; + // C2 + sort << " C2= "; if (C2_temperature == NULL) { sort << false << " " << C2 << " ";} else { sort << true << " fonction_C2_temperature "; LesCourbes1D::Ecriture_pour_base_info(sort,cas,C2_temperature); }; - sort << " C3= "; + if (C2_nD != NULL) + {sort << " 2 C2_nD: " << " "; + LesFonctions_nD::Ecriture_pour_base_info(sort, cas,C2_nD); + } + else {sort << " non_C2_nD "; }; + // C3 + sort << " C3= "; if (C3_temperature == NULL) { sort << false << " " << C3 << " ";} else { sort << true << " fonction_C3_temperature "; LesCourbes1D::Ecriture_pour_base_info(sort,cas,C3_temperature); }; + if (C3_nD != NULL) + {sort << " 2 C3_nD: " << " "; + LesFonctions_nD::Ecriture_pour_base_info(sort, cas,C3_nD); + } + else {sort << " non_C3_nD "; }; + // K sort << " K= "; if (K_temperature == NULL) { sort << false << " " << K << " ";} @@ -738,6 +1091,11 @@ void Hart_Smith3D::Ecriture_base_info_loi(ofstream& sort,const int cas) { sort << true << " fonction_K_temperature "; LesCourbes1D::Ecriture_pour_base_info(sort,cas,K_temperature); }; + if (K_nD != NULL) + {sort << " K_nD: " << " "; + LesFonctions_nD::Ecriture_pour_base_info(sort, cas,K_nD); + } + else {sort << " non_K_nD "; }; sort << " typ_pot= " << type_pot_vol << " "; // le type de potentiel // --- potentiel de gestion de courbure, éventuellement sort << " avec_courbure= " << avec_courbure; @@ -788,15 +1146,97 @@ void Hart_Smith3D::Calcul_SigmaHH (TenseurHH& ,TenseurBB& ,DdlElement & tab_ddl, #endif Tenseur3HH & sigHH = *((Tenseur3HH*) &sigHH_); // passage explicite en tenseur dim 3 + // init coefficient de la loi + C1_use = C1; C2_use = C2; C3_use = C3; K_use = K; + // cas de la thermo dépendance, on calcul les grandeurs - if (C1_temperature != NULL) C1 = C1_temperature->Valeur(*temperature); - if (C2_temperature != NULL) C2 = C2_temperature->Valeur(*temperature); - if (C3_temperature != NULL) C3 = C3_temperature->Valeur(*temperature); - if (K_temperature != NULL) K = K_temperature->Valeur(*temperature); + if (C1_temperature != NULL) C1_use = C1_temperature->Valeur(*temperature); + if (C2_temperature != NULL) C2_use = C2_temperature->Valeur(*temperature); + if (C3_temperature != NULL) C3_use = C3_temperature->Valeur(*temperature); + if (K_temperature != NULL) K_use = K_temperature->Valeur(*temperature); if (avec_courbure) { if (a_temperature != NULL) a_courbure = a_temperature->Valeur(*temperature); if (r_temperature != NULL) r_courbure = r_temperature->Valeur(*temperature); }; + + // récup du conteneur spécifique du point, pour sauvegarde éventuelle + SaveResulHyper_W_gene_3D & save_resulHyper_W = *((SaveResulHyper_W_gene_3D*) saveResul); + // dans le cas de l'utilisation de fct nD + if ( (K_nD != NULL) || (C1_nD != NULL) + || (C2_nD != NULL) || (C3_nD != NULL) + ) + { // opération de transmission de la métrique + const Met_abstraite::Impli* ex_impli = NULL; + const Met_abstraite::Expli_t_tdt* ex_expli_tdt = &ex; + const Met_abstraite::Umat_cont* ex_expli = NULL; + if (K_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + K_use *= tab_val(1); + }; + if (C1_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (C1_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + C1_use *= tab_val(1); + }; + if (C2_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (C2_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + C2_use *= tab_val(1); + }; + if (C3_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (C3_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + C3_use *= tab_val(1); + }; + }; + if (sortie_post) + {// sauvegarde des paramètres matériau + (*save_resulHyper_W.para_loi)(1) = K_use; + (*save_resulHyper_W.para_loi)(2) = C1_use; + (*save_resulHyper_W.para_loi)(3) = C2_use; + (*save_resulHyper_W.para_loi)(4) = C3_use; + }; // calcul des invariants et de leurs variations premières (méthode de Hyper_W_gene_3D) Invariants_et_var1(*(ex.gijBB_0),*(ex.gijHH_0),gijBB_,gijHH_,jacobien_0,jacobien); @@ -839,34 +1279,116 @@ void Hart_Smith3D::Calcul_DsigmaHH_tdt ,const Met_abstraite::Impli& ex ) { - #ifdef MISE_AU_POINT - if (epsBB_tdt.Dimension() != 3) - { cout << "\nErreur : la dimension devrait etre 3 !\n"; - cout << " Hart_Smith3D::Calcul_DsigmaHH_tdt\n"; - Sortie(1); - }; - if (tab_ddl.NbDdl() != d_gijBB_tdt.Taille()) - { cout << "\nErreur : le nb de ddl est != de la taille de d_gijBB_tdt !\n"; - cout << " Hart_Smith3D::Calcul_SDsigmaHH_tdt\n"; - Sortie(1); - }; + #ifdef MISE_AU_POINT + if (epsBB_tdt.Dimension() != 3) + { cout << "\nErreur : la dimension devrait etre 3 !\n"; + cout << " Hart_Smith3D::Calcul_DsigmaHH_tdt\n"; + Sortie(1); + }; + if (tab_ddl.NbDdl() != d_gijBB_tdt.Taille()) + { cout << "\nErreur : le nb de ddl est != de la taille de d_gijBB_tdt !\n"; + cout << " Hart_Smith3D::Calcul_SDsigmaHH_tdt\n"; + Sortie(1); + }; #endif Tenseur3HH & sigHH = *((Tenseur3HH*) &sigHH_tdt); // passage en dim 3 explicite Tenseur3HH & gijHH_tdt = *((Tenseur3HH*) &gijHH_tdt_); // passage en dim 3 explicite + // init coefficient de la loi + C1_use = C1; C2_use = C2; C3_use = C3; K_use = K; + // cas de la thermo dépendance, on calcul les grandeurs - if (C1_temperature != NULL) C1 = C1_temperature->Valeur(*temperature); - if (C2_temperature != NULL) C2 = C2_temperature->Valeur(*temperature); - if (C3_temperature != NULL) C3 = C3_temperature->Valeur(*temperature); - if (K_temperature != NULL) K = K_temperature->Valeur(*temperature); + if (C1_temperature != NULL) C1_use = C1_temperature->Valeur(*temperature); + if (C2_temperature != NULL) C2_use = C2_temperature->Valeur(*temperature); + if (C3_temperature != NULL) C3_use = C3_temperature->Valeur(*temperature); + if (K_temperature != NULL) K_use = K_temperature->Valeur(*temperature); if (avec_courbure) { if (a_temperature != NULL) a_courbure = a_temperature->Valeur(*temperature); if (r_temperature != NULL) r_courbure = r_temperature->Valeur(*temperature); }; //--- pour le debug -//cout << "\n C1=" << C1 << " C2=" << C2 << " C3=" << C3 << " K=" << K << " T=" << *temperature; +//cout << "\n C1_use=" << C1_use << " C2_use=" << C2_use << " C3_use=" << C3_use << " K_use=" << K_use << " T=" << *temperature; //--- fin debug - + + // récup du conteneur spécifique du point, pour sauvegarde éventuelle + SaveResulHyper_W_gene_3D & save_resulHyper_W = *((SaveResulHyper_W_gene_3D*) saveResul); + // dans le cas de l'utilisation de fct nD + if ( (K_nD != NULL) || (C1_nD != NULL) + || (C2_nD != NULL) || (C3_nD != NULL) + ) + { // opération de transmission de la métrique + const Met_abstraite::Impli* ex_impli = &ex; + const Met_abstraite::Expli_t_tdt* ex_expli_tdt = NULL; + const Met_abstraite::Umat_cont* ex_expli = NULL; + if (K_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + K_use *= tab_val(1); + }; + if (C1_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (C1_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + C1_use *= tab_val(1); + }; + if (C2_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (C2_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + C2_use *= tab_val(1); + }; + if (C3_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (C3_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + C3_use *= tab_val(1); + }; + }; + if (sortie_post) + {// sauvegarde des paramètres matériau + (*save_resulHyper_W.para_loi)(1) = K_use; + (*save_resulHyper_W.para_loi)(2) = C1_use; + (*save_resulHyper_W.para_loi)(3) = C2_use; + (*save_resulHyper_W.para_loi)(4) = C3_use; + }; + // calcul des invariants et de leurs variations premières et secondes Invariants_et_var2(*(ex.gijBB_0),*(ex.gijHH_0),gijBB_tdt,gijHH_tdt,jacobien_0,jacobien); // calcul du potentiel et de ses dérivées premières et secondes / aux invariants J_r @@ -965,15 +1487,97 @@ void Hart_Smith3D::Calcul_dsigma_deps (bool en_base_orthonormee, TenseurHH & ,Te Tenseur3HH & sigHH = *((Tenseur3HH*) &sigHH_tdt); // // passage en dim 3 explicite Tenseur3HH & gijHH_tdt = *((Tenseur3HH*) ex.gijHH_tdt); // passage en dim 3 explicite + // init coefficient de la loi + C1_use = C1; C2_use = C2; C3_use = C3; K_use = K; + // cas de la thermo dépendance, on calcul les grandeurs - if (C1_temperature != NULL) C1 = C1_temperature->Valeur(*temperature); - if (C2_temperature != NULL) C2 = C2_temperature->Valeur(*temperature); - if (C3_temperature != NULL) C3 = C3_temperature->Valeur(*temperature); - if (K_temperature != NULL) K = K_temperature->Valeur(*temperature); + if (C1_temperature != NULL) C1_use = C1_temperature->Valeur(*temperature); + if (C2_temperature != NULL) C2_use = C2_temperature->Valeur(*temperature); + if (C3_temperature != NULL) C3_use = C3_temperature->Valeur(*temperature); + if (K_temperature != NULL) K_use = K_temperature->Valeur(*temperature); if (avec_courbure) { if (a_temperature != NULL) a_courbure = a_temperature->Valeur(*temperature); if (r_temperature != NULL) r_courbure = r_temperature->Valeur(*temperature); }; + + // récup du conteneur spécifique du point, pour sauvegarde éventuelle + SaveResulHyper_W_gene_3D & save_resulHyper_W = *((SaveResulHyper_W_gene_3D*) saveResul); + // dans le cas de l'utilisation de fct nD + if ( (K_nD != NULL) || (C1_nD != NULL) + || (C2_nD != NULL) || (C3_nD != NULL) + ) + { // opération de transmission de la métrique + const Met_abstraite::Impli* ex_impli = NULL; + const Met_abstraite::Expli_t_tdt* ex_expli_tdt = NULL; + const Met_abstraite::Umat_cont* ex_expli = &ex; + if (K_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + K_use *= tab_val(1); + }; + if (C1_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (C1_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + C1_use *= tab_val(1); + }; + if (C2_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (C2_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + C2_use *= tab_val(1); + }; + if (C3_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (C3_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + C3_use *= tab_val(1); + }; + }; + if (sortie_post) + {// sauvegarde des paramètres matériau + (*save_resulHyper_W.para_loi)(1) = K_use; + (*save_resulHyper_W.para_loi)(2) = C1_use; + (*save_resulHyper_W.para_loi)(3) = C2_use; + (*save_resulHyper_W.para_loi)(4) = C3_use; + }; // calcul des invariants et de leurs variations premières et secondes Invariants_et_var2(*(ex.gijBB_0),*(ex.gijHH_0),*(ex.gijBB_tdt),gijHH_tdt,jacobien_0,jacobien); @@ -1067,35 +1671,58 @@ void Hart_Smith3D::Potentiel_et_var(double & module_compressibilite) // calcul du potentiel double logV = log(V); //---- ici la valeur du potentiel est à calculer par intégration - W_d = C1*int_J1.Valeur(J_r(1)) + C2 * log(J_r(2)/3.); // partie déviatorique - W_d_J1 = C1*exp(C3*Sqr(J_r(1)-3.)); // variation / J1 - W_d_J2 = C2/J_r(2); // variation / J2 - // puis partie volumique - switch (type_pot_vol) - {case 1: {W_v = K * (1- (1+logV)*unSurV); // potentiel 1 - W_v_J3 = 0.5 * K * logV * unSurV * unSurV2; // variation / V - module_compressibilite = K * unSurV2; - break; - } - case 2: {W_v = 0.5 * K * (V-1); // potentiel 2 - W_v_J3 = 0.25 * K * unSurV; // variation / V - module_compressibilite = 0.25 * K / (MaX(ConstMath::petit, logV)); - break; - } - case 3: {W_v = K * 0.5 * logV * logV; // potentiel 3 - W_v_J3 = K * 0.5 * unSurV2 * logV; // variation / V - module_compressibilite = MaX(ConstMath::petit, 0.25 * K * logV ); - break; - } - case 4: {W_v = 0.5 * K * (V-1.)*(V-1.); // potentiel - W_v_J3 = 0.5 * K * unSurV * (V-1); // variation / V - // ici on fait l'approximation que (V-1)/ln(V) vaut environ 1 - // dans ce cas -P = K * (V-1) = approximativement K ln(V) - module_compressibilite = K ; - break; - } - - }; + W_d = C1_use*int_J1.Valeur(J_r(1)) + C2_use * log(J_r(2)/3.); // partie déviatorique + W_d_J1 = C1_use*exp(C3_use*Sqr(J_r(1)-3.)); // variation / J1 + W_d_J2 = C2_use/J_r(2); // variation / J2 + + #ifdef MISE_AU_POINT + if (Permet_affichage() > 4) + { cout << "\n Hart_Smith3D::Potentiel_et_var(..." + << "\n W_d= " << W_d << ", W_d_J1= "<< W_d_J1 <<", W_d_J2= "<< W_d_J2 <<" "; + }; + #endif + + // puis partie volumique + double VmoinsUn = V-1.; + switch (type_pot_vol) + {case 1: {W_v = K_use * (1- (1+logV)*unSurV); // potentiel 1 + W_v_J3 = 0.5 * K_use * logV * unSurV * unSurV2; // variation / J3 + module_compressibilite = K_use * unSurV2; + break; + } + case 2: {W_v = 0.5 * K_use * VmoinsUn; // potentiel 2 + W_v_J3 = 0.25 * K_use * unSurV; // variation / J3 + if (Dabs(VmoinsUn) > ConstMath::petit ) + {module_compressibilite = 0.5 * K_use / logV;} + else // on fait un développement limité du log pour V proche de 1. + {module_compressibilite = 0.5 * K_use / (VmoinsUn-VmoinsUn*VmoinsUn/2.+VmoinsUn*VmoinsUn*VmoinsUn/3.);} + break; + } + case 3: {W_v = K_use * 0.5 * logV * logV; // potentiel 3 + W_v_J3 = K_use * 0.5 * unSurV2 * logV; // variation / J3 + module_compressibilite = K_use / V ; + break; + } + case 4: {W_v = 0.5 * K_use * VmoinsUn * VmoinsUn; // potentiel + W_v_J3 = 0.5 * K_use * unSurV * VmoinsUn; // variation / J3 + if (Dabs(VmoinsUn) > ConstMath::petit ) + {module_compressibilite = VmoinsUn * K_use /logV ;} + else // on fait un développement limité du log pour V proche de 1. + {module_compressibilite = VmoinsUn * K_use / (VmoinsUn-VmoinsUn*VmoinsUn/2.+VmoinsUn*VmoinsUn*VmoinsUn/3.);} + break; + } + }; + #ifdef MISE_AU_POINT + if (Permet_affichage() > 4) + {switch (type_pot_vol) + {case 1: case 2: case 3: case 4: + cout << "\n W_v= " << W_v << ", W_v_J3= "<< W_v_J3 << ", K_s= " << module_compressibilite << " "; + break; + }; + }; + #endif + + //--- partie courbure éventuelle if (avec_courbure) {double unSurV3=unSurV2*unSurV; @@ -1118,50 +1745,77 @@ void Hart_Smith3D::Potentiel_et_var2(double & module_compressibilite) double logV = log(V); //---- ici la valeur du potentiel est à calculer par intégration - W_d = C1*int_J1.Valeur(J_r(1)) + C2 * log(J_r(2)/3.); // partie déviatorique + W_d = C1_use*int_J1.Valeur(J_r(1)) + C2_use * log(J_r(2)/3.); // partie déviatorique // calcul des variations premières non nulles du potentiel // les variations secondes sont nulles - W_d_J1 = C1*exp(C3*Sqr(J_r(1)-3.)); // variation / J1 - W_d_J2 = C2/J_r(2); // variation / J2 - // dérivées secondes - W_d_J1_2 = 2.*C1*C3*(J_r(1)-3.)*exp(C3*Sqr(J_r(1)-3.)); - W_d_J1_J2 = 0.; - W_d_J2_2 = -C2/(Sqr(J_r(2))); + W_d_J1 = C1_use*exp(C3_use*Sqr(J_r(1)-3.)); // variation / J1 + W_d_J2 = C2_use/J_r(2); // variation / J2 + // dérivées secondes + W_d_J1_2 = 2.*C1_use*C3_use*(J_r(1)-3.)*exp(C3_use*Sqr(J_r(1)-3.)); + W_d_J1_J2 = 0.; + W_d_J2_2 = -C2_use/(Sqr(J_r(2))); - // puis partie volumique - double unSurV2=unSurV*unSurV; - switch (type_pot_vol) - {case 1: {W_v = K * (1- (1+logV)*unSurV); // potentiel 1 - W_v_J3 = 0.5 * K * logV * unSurV * unSurV2; // variation / V - // calcul des variations secondes non nulles - W_v_J3J3 = 0.25 * K * unSurV2 * unSurV2 * unSurV *(1.-3.*logV); // variation / V - module_compressibilite = K * unSurV2; - break; - } - case 2: {W_v = 0.5 * K * (V-1); // potentiel 2 - W_v_J3 = 0.25 * K * unSurV; // variation / V - // calcul des variations secondes non nulles - W_v_J3J3 = -K * 0.125 * unSurV2 * unSurV; - module_compressibilite = 0.25 * K / (MaX(ConstMath::petit, logV)); - break; - } - case 3: {W_v = K * 0.5 * logV * logV; // potentiel 3 - W_v_J3 = K * 0.5 * unSurV2 * logV; // variation / V - // calcul des variations secondes non nulles - W_v_J3J3 = K * 0.25 * unSurV2 * unSurV2 * (1.-2.*logV); - module_compressibilite = MiN(ConstMath::petit, 0.25 * K * logV ); - break; - } - case 4: {W_v = 0.5 * K * (V-1.)*(V-1.); // potentiel - W_v_J3 = 0.5 * K * unSurV * (V-1); // variation / V - // calcul des variations secondes non nulles - W_v_J3J3 = K * 0.25 * unSurV2 * unSurV; - // ici on fait l'approximation que (V-1)/ln(V) vaut environ 1 - // dans ce cas -P = K * (V-1) = approximativement K ln(V) - module_compressibilite = K ; - break; - } + #ifdef MISE_AU_POINT + if (Permet_affichage() > 4) + { cout << "\n Hart_Smith3D::Potentiel_et_var2(..." + << "\n W_d= " << W_d << ", W_d_J1= "<< W_d_J1 <<", W_d_J2= "<< W_d_J2 + << ", W_d_J1_2= "<< W_d_J1_2 <<", W_d_J1_J2= "<< W_d_J1_J2 + <<", W_d_J2_2= "<< W_d_J2_2<< " "; + }; + #endif + + // puis partie volumique + double unSurV2=unSurV*unSurV; + double VmoinsUn = V-1.; + switch (type_pot_vol) + {case 1: {W_v = K_use * (1- (1+logV)*unSurV); // potentiel 1 + W_v_J3 = 0.5 * K_use * logV * unSurV * unSurV2; // variation / J3 + // calcul des variations secondes / (J3)^2 + W_v_J3J3 = 0.25 * K_use * unSurV2 * unSurV2 * unSurV *(1.-3.*logV); + module_compressibilite = K_use * unSurV2; + break; + } + case 2: {W_v = 0.5 * K_use * VmoinsUn; // potentiel 2 + W_v_J3 = 0.25 * K_use * unSurV; // variation / J3 + // calcul des variations secondes / (J3)^2 + W_v_J3J3 = -K_use * 0.125 * unSurV2 * unSurV; + if (Dabs(VmoinsUn) > ConstMath::petit ) + {module_compressibilite = 0.5 * K_use / logV;} + else // on fait un développement limité du log pour V proche de 1. + {module_compressibilite = 0.5 * K_use / (VmoinsUn-VmoinsUn*VmoinsUn/2.+VmoinsUn*VmoinsUn*VmoinsUn/3.);} + break; + } + case 3: {W_v = K_use * 0.5 * logV * logV; // potentiel 3 + W_v_J3 = K_use * 0.5 * unSurV2 * logV; // variation / J3 + // calcul des variations secondes / (J3)^2 + W_v_J3J3 = K_use * 0.25 * unSurV2 * unSurV2 * (1.-2.*logV); + module_compressibilite = K_use / V ; + break; + } + case 4: {W_v = 0.5 * K_use * VmoinsUn * VmoinsUn; // potentiel + W_v_J3 = 0.5 * K_use * unSurV * VmoinsUn; // variation / J3 + // calcul des variations secondes / (J3)^2 + W_v_J3J3 = K_use * 0.25 * unSurV2 * unSurV; + if (Dabs(VmoinsUn) > ConstMath::petit ) + {module_compressibilite = VmoinsUn * K_use /logV ;} + else // on fait un développement limité du log pour V proche de 1. + {module_compressibilite = VmoinsUn * K_use / (VmoinsUn-VmoinsUn*VmoinsUn/2.+VmoinsUn*VmoinsUn*VmoinsUn/3.);} + break; + } }; + #ifdef MISE_AU_POINT + if (Permet_affichage() > 4) + {switch (type_pot_vol) + {case 1: case 2: case 3: case 4: + cout << "\n W_v= " << W_v << ", W_v_J3= "<< W_v_J3 << ", W_v_J3J3= "<< W_v_J3J3 + << ", K_s= " << module_compressibilite << " "; + break; + }; + }; + #endif + + + // -- partie courbure éventuelle --- if (avec_courbure) {double unSurV3=unSurV2*unSurV; @@ -1210,7 +1864,7 @@ void Hart_Smith3D::Calcul_courbe_evolW_J1() { for (int j=1;j<=nbtra;j++) { integral += 0.5 * foncti; x += delta_x; - foncti = exp(C3*Sqr(x-3.)); + foncti = exp(C3_use*Sqr(x-3.)); integral += 0.5 * foncti; }; points(i+1)(1)=x; points(i+1)(2)=integral; @@ -1221,7 +1875,7 @@ void Hart_Smith3D::Calcul_courbe_evolW_J1() { for (int j=1;j<=nbtra;j++) { integral += 0.5 * foncti; x += delta_x; - foncti = exp(C3*Sqr(x-3.)); + foncti = exp(C3_use*Sqr(x-3.)); integral += 0.5 * foncti; }; points(i+nb1+1)(1)=x; points(i+nb1+1)(2)=integral; @@ -1247,11 +1901,14 @@ void Hart_Smith3D::Cal_dsigma_deps_num (const TenseurBB & gijBB_0_,const Tenseur double delta = ConstMath::unpeupetit*10.; double unSurDelta = 1./delta; + // init coefficient de la loi + C1_use = C1; C2_use = C2; C3_use = C3; K_use = K; + // cas de la thermo dépendance, on calcul les grandeurs - if (C1_temperature != NULL) C1 = C1_temperature->Valeur(*temperature); - if (C2_temperature != NULL) C2 = C2_temperature->Valeur(*temperature); - if (C3_temperature != NULL) C3 = C3_temperature->Valeur(*temperature); - if (K_temperature != NULL) K = K_temperature->Valeur(*temperature); + if (C1_temperature != NULL) C1_use = C1_temperature->Valeur(*temperature); + if (C2_temperature != NULL) C2_use = C2_temperature->Valeur(*temperature); + if (C3_temperature != NULL) C3_use = C3_temperature->Valeur(*temperature); + if (K_temperature != NULL) K_use = K_temperature->Valeur(*temperature); if (avec_courbure) { if (a_temperature != NULL) a_courbure = a_temperature->Valeur(*temperature); if (r_temperature != NULL) r_courbure = r_temperature->Valeur(*temperature); diff --git a/comportement/Hyper_elastique/Hart_Smith3D.h b/comportement/Hyper_elastique/Hart_Smith3D.h index b63e34c..fec0680 100644 --- a/comportement/Hyper_elastique/Hart_Smith3D.h +++ b/comportement/Hyper_elastique/Hart_Smith3D.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -92,8 +92,27 @@ class Hart_Smith3D : public Hyper_W_gene_3D // DESTRUCTEUR : ~Hart_Smith3D (); + + // initialise les donnees particulieres a l'elements + // de matiere traite ( c-a-dire au pt calcule) + // Il y a creation d'une instance de SaveResul particuliere + // a la loi concernee + // la SaveResul classe est remplie par les instances heritantes + // le pointeur de SaveResul est sauvegarde au niveau de l'element + // c'a-d que les info particulieres au point considere sont stocke + // au niveau de l'element et non de la loi. + virtual SaveResul * New_et_Initialise() + { int avec_para = 0; // init par défaut + if (sortie_post) + avec_para = 4; + SaveResulHyper_W_gene_3D * pt = new SaveResulHyper_W_gene_3D(avec_para); + // insertion éventuelle de conteneurs de grandeurs quelconque + this->Insertion_conteneur_dans_save_result(pt); + return pt; + }; + - // Lecture des donnees de la classe sur fichier + // Lecture des donnees de la classe sur fichier void LectureDonneesParticulieres (UtilLecture * ,LesCourbes1D& lesCourbes1D,LesFonctions_nD& lesFonctionsnD); // affichage de la loi void Affiche() const ; @@ -133,7 +152,9 @@ class Hart_Smith3D : public Hyper_W_gene_3D protected : // donnée de la loi - double C1,C2,C3,K; // 4 coeffs + double C1,C2,C3,K; // 4 coeffs lus + double C1_use,C2_use,C3_use,K_use; // 4 coeffs résultants + Courbe1D* C1_temperature; // courbe éventuelle d'évolution de C10 en fonction de la température Courbe1D* C2_temperature; // courbe éventuelle d'évolution de C10 en fonction de la température Courbe1D* C3_temperature; // courbe éventuelle d'évolution de C01 en fonction de la température @@ -144,7 +165,13 @@ class Hart_Smith3D : public Hyper_W_gene_3D double r_courbure; // para r utilisé que dans le cas avec courbure Courbe1D* a_temperature; // courbe éventuelle d'évolution de a en fonction de la température Courbe1D* r_temperature; // courbe éventuelle d'évolution de r en fonction de la température - + + // cas d'une dépendance à une fonction nD, les fonctions sont multiplicatives par rapport aux valeurs + // définies par les données fixes où celles dépendantes directement de la température via une courbe 1D + // -- bien voir que dans ce cas on peut obtenir n'importe quoi, c'est de la responsabilité + // de l'utilisateur de savoir se qu'il fait + Fonction_nD * K_nD, * C1_nD, * C2_nD, * C3_nD; + // définition de la fonction énergie CourbePolyLineaire1D int_J1; // intégrale de la partie relative à J1 diff --git a/comportement/Hyper_elastique/Hyper10.cc b/comportement/Hyper_elastique/Hyper10.cc index ec02d36..8576cab 100644 --- a/comportement/Hyper_elastique/Hyper10.cc +++ b/comportement/Hyper_elastique/Hyper10.cc @@ -1 +1 @@ - // This file is part of the Herezh++ application. // // The finite element software Herezh++ is dedicated to the field // of mechanics for large transformations of solid structures. // It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600) // INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) . // // Herezh++ is distributed under GPL 3 license ou ultérieure. // // Copyright (C) 1997-2021 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // For more information, please consult: . #include "Hyper10.h" #include "Loi_comp_abstraite.hc" # include using namespace std; //introduces namespace std #include #include #include "Sortie.h" Hyper10::Hyper10 () : // Constructeur par defaut Hyper3D(ISOHYPER10,false),K(0.),Qor(0.),mur(0.),mu_inf(0.) {}; // Constructeur de copie Hyper10::Hyper10 (const Hyper10& loi) : Hyper3D (loi),K(loi.K),Qor(loi.Qor),mur(loi.mur),mu_inf(loi.mu_inf) {}; // Lecture des donnees de la classe sur fichier void Hyper10::LectureDonneesParticulieres (UtilLecture * entreePrinc) { // lecture des quatres coefficients de la loi *(entreePrinc->entree) >> K >> Qor >> mur >> mu_inf ; // appel au niveau de la classe mère Loi_comp_abstraite::Lecture_type_deformation_et_niveau_commentaire (*entreePrinc,lesFonctionsnD,false); }; // affichage de la loi void Hyper10::Affiche() { cout << " \n loi de comportement 3D hyperélastique isotrope nb 10 : " << Nom_comp(id_comp) << " paramètres : \n"; cout << " K= " << K << " ; Qor = " << Qor << " ; mur = " << mur << " ; mu_inf = " << mu_inf ; cout << endl; }; // test si la loi est complete int Hyper10::TestComplet() { int ret = LoiAbstraiteGeneral::TestComplet(); if ((K == 0.) && (Qor == 0.) && (mur == 0.) && (mu_inf == 0.)) { cout << " \n Les paramètres ne sont pas défini pour la loi " << Nom_comp(id_comp) << '\n'; ret = 0; } return ret; }; // =========== METHODES Protégées dérivant de virtuelles : ============== // calcul du potentiel et de ses dérivées non compris la phase void Hyper10::Potentiel(double & ,double & V,double& Qeps, double& E,double& EV,double& EQeps) { // le potentiel double co1 = Qor*Qor/2./mur; double A = cosh(2.*mur*Qeps/Qor); double co2 = co1 / A * 2.* mur/Qor ; double logV = log(V); double Ksur6 = K/6.;double Ksur12logVsurV = K/12.*log(V)/V; double deux_mu_inf_Qeps = mu_inf * 2. * Qeps; E = Ksur6 * (logV)*(logV) + co1*log(A) + mu_inf*Qeps*Qeps; EV = Ksur12logVsurV; EQeps = co1/A * sinh(2.*mur*Qeps/Qor) * 2.*mur/Qor ; }; // calcul du potentiel et de ses dérivées avec la phase void Hyper10::PotentielPhase(double & ,double & ,double& , double& ,double & , double& ,double& ,double& ,double& ) { // le potentiel ne dépend pas de la phase d'où un message d'erreur { cout << "\nErreur : Hyper10::PotentielPhase( ... !"; cout << "\n le potentiel Hyper10 ne dépend pas de la phase !\n"; Sortie(1); }; }; // calcul du potentiel sans phase et dérivées avec ses variations par rapport aux ddl void Hyper10::Potentiel_et_var(double & ,Tableau & , double & V,Tableau & dV,double& Qeps, Tableau & dQeps, double& E,Tableau & dE,double& EV,Tableau & dEV, double& EQeps,Tableau & dEQeps,double& EVV,Tableau & dEVV, double& EQQ,Tableau & dEQQ,double& EVQ,Tableau & dEVQ ) { // le potentiel double co1 = Qor*Qor/2./mur; double A = cosh(2.*mur*Qeps/Qor); double unsurA = 1./A; double co2 = co1 / A * 2.* mur/Qor ; double logV = log(V); double Ksur6 = K/6.;double Ksur12logVsurV = K/12.*log(V)/V; double deux_mu_inf_Qeps = mu_inf * 2. * Qeps; double unsurV = 1./V;double unsurV2 = unsurV * unsurV; E = Ksur6 * (logV)*(logV) + co1*log(A) + mu_inf*Qeps*Qeps; EV = Ksur12logVsurV; EQeps = co1/A * sinh(2.*mur*Qeps/Qor) * 2.*mur/Qor ; double Ksur12surV2 = Ksur6/2.* unsurV2; EVV = Ksur12surV2*(1. - logV); double Ap = sinh(2.*mur*Qeps/Qor)*2.*mur/Qor; EQQ = - co1 * unsurA * unsurA * Ap; EVQ = 0.; // calcul des variations double r1 = EQQ * Ap ; int nbddl = dV.Taille(); for (int i = 1; i<= nbddl; i++) { dE(i) = Ksur12logVsurV * dV(i) + co2 * dQeps(i) + deux_mu_inf_Qeps * dQeps(i); dEV(i) = Ksur12surV2 * dV(i); dEQeps(i) = (r1 + co1 * 2.*mur/Qor * 2.*mur/Qor) * dQeps(i); dEVV(i) = -(Ksur12surV2 * 2.*(1. - logV) + Ksur12surV2* unsurV)*dV(i); dEQQ(i) = (2.* co1 * unsurA * unsurA * unsurA * Ap * Ap - co1 * unsurA * unsurA) * A *2.*mur/Qor * dQeps(i); dEVQ(i) = 0.; }; }; // calcul du potentiel avec phase et dérivées avec ses variations par rapport aux ddl void Hyper10::PotentielPhase_et_var(double & ,Tableau & , double &,Tableau & ,double& , Tableau & ,double& ,Tableau & , double & ,Tableau & ,double& ,Tableau & ,double& ,Tableau & , double& ,Tableau & , double& ,Tableau & ,double& ,Tableau & , double& ,Tableau & ,double& ,Tableau & , double& ,Tableau & ,double& ,Tableau & , double& ,Tableau & ) { // le potentiel ne dépend pas de la phase d'où un message d'erreur cout << "\nErreur : Hyper10::PotentielPhase_et_var( ... !"; cout << "\n le potentiel Hyper10 ne dépend pas de la phase !\n"; Sortie(1); }; \ No newline at end of file + // 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 "Hyper10.h" #include "Loi_comp_abstraite.hc" # include using namespace std; //introduces namespace std #include #include #include "Sortie.h" Hyper10::Hyper10 () : // Constructeur par defaut Hyper3D(ISOHYPER10,false),K(0.),Qor(0.),mur(0.),mu_inf(0.) {}; // Constructeur de copie Hyper10::Hyper10 (const Hyper10& loi) : Hyper3D (loi),K(loi.K),Qor(loi.Qor),mur(loi.mur),mu_inf(loi.mu_inf) {}; // Lecture des donnees de la classe sur fichier void Hyper10::LectureDonneesParticulieres (UtilLecture * entreePrinc) { // lecture des quatres coefficients de la loi *(entreePrinc->entree) >> K >> Qor >> mur >> mu_inf ; // appel au niveau de la classe mère Loi_comp_abstraite::Lecture_type_deformation_et_niveau_commentaire (*entreePrinc,lesFonctionsnD,false); }; // affichage de la loi void Hyper10::Affiche() { cout << " \n loi de comportement 3D hyperélastique isotrope nb 10 : " << Nom_comp(id_comp) << " paramètres : \n"; cout << " K= " << K << " ; Qor = " << Qor << " ; mur = " << mur << " ; mu_inf = " << mu_inf ; cout << endl; }; // test si la loi est complete int Hyper10::TestComplet() { int ret = LoiAbstraiteGeneral::TestComplet(); if ((K == 0.) && (Qor == 0.) && (mur == 0.) && (mu_inf == 0.)) { cout << " \n Les paramètres ne sont pas défini pour la loi " << Nom_comp(id_comp) << '\n'; ret = 0; } return ret; }; // =========== METHODES Protégées dérivant de virtuelles : ============== // calcul du potentiel et de ses dérivées non compris la phase void Hyper10::Potentiel(double & ,double & V,double& Qeps, double& E,double& EV,double& EQeps) { // le potentiel double co1 = Qor*Qor/2./mur; double A = cosh(2.*mur*Qeps/Qor); double co2 = co1 / A * 2.* mur/Qor ; double logV = log(V); double Ksur6 = K/6.;double Ksur12logVsurV = K/12.*log(V)/V; double deux_mu_inf_Qeps = mu_inf * 2. * Qeps; E = Ksur6 * (logV)*(logV) + co1*log(A) + mu_inf*Qeps*Qeps; EV = Ksur12logVsurV; EQeps = co1/A * sinh(2.*mur*Qeps/Qor) * 2.*mur/Qor ; }; // calcul du potentiel et de ses dérivées avec la phase void Hyper10::PotentielPhase(double & ,double & ,double& , double& ,double & , double& ,double& ,double& ,double& ) { // le potentiel ne dépend pas de la phase d'où un message d'erreur { cout << "\nErreur : Hyper10::PotentielPhase( ... !"; cout << "\n le potentiel Hyper10 ne dépend pas de la phase !\n"; Sortie(1); }; }; // calcul du potentiel sans phase et dérivées avec ses variations par rapport aux ddl void Hyper10::Potentiel_et_var(double & ,Tableau & , double & V,Tableau & dV,double& Qeps, Tableau & dQeps, double& E,Tableau & dE,double& EV,Tableau & dEV, double& EQeps,Tableau & dEQeps,double& EVV,Tableau & dEVV, double& EQQ,Tableau & dEQQ,double& EVQ,Tableau & dEVQ ) { // le potentiel double co1 = Qor*Qor/2./mur; double A = cosh(2.*mur*Qeps/Qor); double unsurA = 1./A; double co2 = co1 / A * 2.* mur/Qor ; double logV = log(V); double Ksur6 = K/6.;double Ksur12logVsurV = K/12.*log(V)/V; double deux_mu_inf_Qeps = mu_inf * 2. * Qeps; double unsurV = 1./V;double unsurV2 = unsurV * unsurV; E = Ksur6 * (logV)*(logV) + co1*log(A) + mu_inf*Qeps*Qeps; EV = Ksur12logVsurV; EQeps = co1/A * sinh(2.*mur*Qeps/Qor) * 2.*mur/Qor ; double Ksur12surV2 = Ksur6/2.* unsurV2; EVV = Ksur12surV2*(1. - logV); double Ap = sinh(2.*mur*Qeps/Qor)*2.*mur/Qor; EQQ = - co1 * unsurA * unsurA * Ap; EVQ = 0.; // calcul des variations double r1 = EQQ * Ap ; int nbddl = dV.Taille(); for (int i = 1; i<= nbddl; i++) { dE(i) = Ksur12logVsurV * dV(i) + co2 * dQeps(i) + deux_mu_inf_Qeps * dQeps(i); dEV(i) = Ksur12surV2 * dV(i); dEQeps(i) = (r1 + co1 * 2.*mur/Qor * 2.*mur/Qor) * dQeps(i); dEVV(i) = -(Ksur12surV2 * 2.*(1. - logV) + Ksur12surV2* unsurV)*dV(i); dEQQ(i) = (2.* co1 * unsurA * unsurA * unsurA * Ap * Ap - co1 * unsurA * unsurA) * A *2.*mur/Qor * dQeps(i); dEVQ(i) = 0.; }; }; // calcul du potentiel avec phase et dérivées avec ses variations par rapport aux ddl void Hyper10::PotentielPhase_et_var(double & ,Tableau & , double &,Tableau & ,double& , Tableau & ,double& ,Tableau & , double & ,Tableau & ,double& ,Tableau & ,double& ,Tableau & , double& ,Tableau & , double& ,Tableau & ,double& ,Tableau & , double& ,Tableau & ,double& ,Tableau & , double& ,Tableau & ,double& ,Tableau & , double& ,Tableau & ) { // le potentiel ne dépend pas de la phase d'où un message d'erreur cout << "\nErreur : Hyper10::PotentielPhase_et_var( ... !"; cout << "\n le potentiel Hyper10 ne dépend pas de la phase !\n"; Sortie(1); }; \ No newline at end of file diff --git a/comportement/Hyper_elastique/Hyper10.h b/comportement/Hyper_elastique/Hyper10.h index 370457e..6026c47 100644 --- a/comportement/Hyper_elastique/Hyper10.h +++ b/comportement/Hyper_elastique/Hyper10.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/Hyper3D.cc b/comportement/Hyper_elastique/Hyper3D.cc index bc6311f..e024d88 100644 --- a/comportement/Hyper_elastique/Hyper3D.cc +++ b/comportement/Hyper_elastique/Hyper3D.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/Hyper3D.h b/comportement/Hyper_elastique/Hyper3D.h index 5c064cc..975a0f8 100644 --- a/comportement/Hyper_elastique/Hyper3D.h +++ b/comportement/Hyper_elastique/Hyper3D.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/Hyper3DN.cc b/comportement/Hyper_elastique/Hyper3DN.cc index 8e8a865..9ead385 100644 --- a/comportement/Hyper_elastique/Hyper3DN.cc +++ b/comportement/Hyper_elastique/Hyper3DN.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/Hyper3DN.h b/comportement/Hyper_elastique/Hyper3DN.h index 9d27769..b303c44 100644 --- a/comportement/Hyper_elastique/Hyper3DN.h +++ b/comportement/Hyper_elastique/Hyper3DN.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/HyperD.cc b/comportement/Hyper_elastique/HyperD.cc index bc9ffeb..9e8f790 100644 --- a/comportement/Hyper_elastique/HyperD.cc +++ b/comportement/Hyper_elastique/HyperD.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // - // Copyright (C) 1997-2021 Université Bretagne Sud (France) + // Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -465,9 +465,7 @@ void HyperD::ListeGrandeurs_particulieres(bool absolue,List_io& // activation du stockage de grandeurs quelconques qui pourront ensuite être récupéré // via le conteneur SaveResul, si la grandeur n'existe pas ici, aucune action void HyperD::Activation_stockage_grandeurs_quelconques(list & listEnuQuelc) - { // def du conteneur de grandeurs quelconques, initialisée à 0 - Grandeur_scalaire_double grand_courant(0.); - // récup de la liste de stockage + { // récup de la liste de stockage list & listlocale = ListQuelc_mis_en_acces_localement(); // on parcours la liste des grandeurs à activer @@ -509,7 +507,7 @@ void HyperD::Insertion_conteneur_dans_save_result(SaveResul * a) // { switch (enu) {EnumTypeQuelconque enu = *jk; switch (enu) - { case V_vol: case COS3PHI_EPS: case SPHERIQUE_EPS: case Q_EPS: // cas on des grandeurs sont demandées + { case POTENTIEL: case V_vol: case COS3PHI_EPS: case SPHERIQUE_EPS: case Q_EPS: // cas on des grandeurs sont demandées { if (sav.invP == NULL) // def si ils n'existent pas {sav.invP = new Invariantpost3D(); sav.invP_t = new Invariantpost3D(); @@ -856,7 +854,7 @@ void HyperD::Calcul_dsigma_deps (bool en_base_orthonormee, TenseurHH & ,TenseurB if ((norm_i_epsBH < ConstMath::petit)&&(!avec_regularisation)) // on est dans le cas on la déformation est très petite, on ne considère pas dans ce cas la phase { // calcul du potentiel - if ((ParaGlob::NiveauImpression() >= 5) || (Permet_affichage() > 2)) + if (Permet_affichage() > 3) cout << "\n norme def trop petite -> passage en calcul sans phase "; PotenSansPhaseAvecVar potenSansPhaseAvecVar = Potentiel_et_var(invariantVarEps,jacobien_0); // calcul des coefficients a_i diff --git a/comportement/Hyper_elastique/HyperD.h b/comportement/Hyper_elastique/HyperD.h index 787d5e7..cddd9ec 100644 --- a/comportement/Hyper_elastique/HyperD.h +++ b/comportement/Hyper_elastique/HyperD.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -135,7 +135,7 @@ class HyperD : public Loi_comp_abstraite // définition d'une nouvelle instance identique // appelle du constructeur via new - SaveResul * Nevez_SaveResul() const {return (new SaveResulHyperD(*this));}; + virtual SaveResul * Nevez_SaveResul() const {return (new SaveResulHyperD(*this));}; // affectation virtual SaveResul & operator = ( const SaveResul & a); //============= lecture écriture dans base info ========== @@ -149,11 +149,11 @@ class HyperD : public Loi_comp_abstraite virtual void Ecriture_base_info(ofstream& ,const int ) ; // mise à jour des informations transitoires - void TdtversT() ; - void TversTdt() ; + virtual void TdtversT() ; + virtual void TversTdt() ; // affichage à l'écran des infos - void Affiche() const ; + virtual void Affiche() const ; //changement de base de toutes les grandeurs internes tensorielles stockées // beta(i,j) represente les coordonnees de la nouvelle base naturelle gpB dans l'ancienne gB @@ -167,8 +167,8 @@ class HyperD : public Loi_comp_abstraite // au niveau du point d'intégration par exemple: exemple: un repère d'anisotropie // completer est appelé apres sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois - SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor - ,const Loi_comp_abstraite* loi) {}; + virtual SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor + ,const Loi_comp_abstraite* loi) {return NULL;}; // des grandeurs qui sont éventuellement crééent si on le demande HyperD::Invariantpost3D * invP, * invP_t; @@ -184,14 +184,14 @@ class HyperD : public Loi_comp_abstraite // récupération des type quelconque sous forme d'un arbre pour faciliter la recherche const map < EnumTypeQuelconque , TypeQuelconque, std::less < EnumTypeQuelconque> >* Map_type_quelconque() const {return &map_type_quelconque;}; - private: - void Mise_a_jour_map_type_quelconque(); + protected: + virtual void Mise_a_jour_map_type_quelconque(); // ---- fin gestion d'une liste de grandeurs quelconques éventuelles --- }; // création d'une nouvelle instance de SaveResul - SaveResul * New_et_Initialise(); + virtual SaveResul * New_et_Initialise(); // récupération des grandeurs particulière (hors ddl ) // correspondant à liTQ diff --git a/comportement/Hyper_elastique/HyperDN.cc b/comportement/Hyper_elastique/HyperDN.cc index e37a0db..a5e4f26 100644 --- a/comportement/Hyper_elastique/HyperDN.cc +++ b/comportement/Hyper_elastique/HyperDN.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/HyperDN.h b/comportement/Hyper_elastique/HyperDN.h index 35029e9..db57f3a 100644 --- a/comportement/Hyper_elastique/HyperDN.h +++ b/comportement/Hyper_elastique/HyperDN.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/Hyper_W_gene_3D.cc b/comportement/Hyper_elastique/Hyper_W_gene_3D.cc index 7a0fce0..9309a50 100644 --- a/comportement/Hyper_elastique/Hyper_W_gene_3D.cc +++ b/comportement/Hyper_elastique/Hyper_W_gene_3D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -51,21 +51,46 @@ using namespace std; //introduces namespace std // constructeur par défaut Hyper_W_gene_3D::SaveResulHyper_W_gene_3D::SaveResulHyper_W_gene_3D() : - invP(NULL),invP_t(NULL) -{ }; -// avec init ou pas -Hyper_W_gene_3D::SaveResulHyper_W_gene_3D::SaveResulHyper_W_gene_3D(int sortie_post) : - invP(new Invariantpost3D()),invP_t(new Invariantpost3D()) -{ }; + invP(NULL),invP_t(NULL),map_type_quelconque() + ,para_loi(NULL),para_loi_t(NULL) +{ // mise à jour de la liste des grandeurs quelconques internes + Mise_a_jour_map_type_quelconque(); +}; +// avec_para : le nombre indique si on sauvegarde des paramètres matériaux qui varient +// et également des invariants. +// si == 0 : pas de stockage (joue en fait le role de sortie_post) +Hyper_W_gene_3D::SaveResulHyper_W_gene_3D::SaveResulHyper_W_gene_3D(int avec_para) : + invP(NULL),invP_t(NULL) + ,para_loi(NULL),para_loi_t(NULL) + ,map_type_quelconque() +{ if (avec_para) + {invP = new Invariantpost3D(); + invP_t = new Invariantpost3D(); + }; + if (avec_para) + {para_loi = new Vecteur(avec_para,-ConstMath::trespetit); + para_loi_t = new Vecteur(avec_para,-ConstMath::trespetit); + }; + // mise à jour de la liste des grandeurs quelconques internes + Mise_a_jour_map_type_quelconque(); +}; // constructeur de copie Hyper_W_gene_3D::SaveResulHyper_W_gene_3D::SaveResulHyper_W_gene_3D(const SaveResulHyper_W_gene_3D& sav): - invP(NULL),invP_t(NULL) + invP(NULL),invP_t(NULL),para_loi(NULL),para_loi_t(NULL) + ,map_type_quelconque(sav.map_type_quelconque) { if (sav.invP != NULL) {invP = new Invariantpost3D(*(sav.invP)); invP_t = new Invariantpost3D(*(sav.invP_t)); }; - }; + if (sav.para_loi != NULL) + {para_loi = new Vecteur(*sav.para_loi); + para_loi_t = new Vecteur(*sav.para_loi_t); + }; + // mise à jour de la liste des grandeurs quelconques internes + Mise_a_jour_map_type_quelconque(); + + }; // destructeur Hyper_W_gene_3D::SaveResulHyper_W_gene_3D::~SaveResulHyper_W_gene_3D() @@ -73,6 +98,8 @@ Hyper_W_gene_3D::SaveResulHyper_W_gene_3D::~SaveResulHyper_W_gene_3D() { delete invP; delete invP_t; }; + if (para_loi != NULL) delete para_loi; + if (para_loi_t != NULL) delete para_loi_t; }; // affectation @@ -94,6 +121,16 @@ Loi_comp_abstraite::SaveResul & Hyper_W_gene_3D::SaveResulHyper_W_gene_3D::opera delete invP_t;invP_t=NULL; }; }; + map_type_quelconque = sav.map_type_quelconque; + if (sav.para_loi != NULL) + {if (para_loi == NULL) + {para_loi = new Vecteur(sav.para_loi->Taille(),-ConstMath::trespetit); + para_loi_t = new Vecteur(sav.para_loi->Taille(),-ConstMath::trespetit); + }; + *para_loi = *(sav.para_loi); + *para_loi_t = *(sav.para_loi_t); + }; + return *this; }; @@ -125,6 +162,27 @@ void Hyper_W_gene_3D::SaveResulHyper_W_gene_3D::Lecture_base_info (ifstream& ent delete invP_t;invP_t=NULL; }; }; + // cas des paramètres de lois éventuelles + ent >> toto; + if (toto == "sans_para") + {if (para_loi != NULL) + {delete para_loi;para_loi=NULL; + delete para_loi_t;para_loi_t=NULL; + }; + } + else if (toto == "avec_para_taille=") + {int taille; + ent >> taille; + if (para_loi == NULL) + {para_loi = new Vecteur(taille); + para_loi_t = new Vecteur(taille); + }; + ent >> *para_loi; + *para_loi_t=*para_loi; + }; + // mise à jour de la liste des grandeurs quelconques internes + Mise_a_jour_map_type_quelconque(); + }; // cas donne le niveau de sauvegarde @@ -134,28 +192,93 @@ void Hyper_W_gene_3D::SaveResulHyper_W_gene_3D::Lecture_base_info (ifstream& ent void Hyper_W_gene_3D::SaveResulHyper_W_gene_3D::Ecriture_base_info(ofstream& sort,const int ) { sort << "\n dat_sp_hyperelas: "; if (invP != NULL) - { sort << " 1 " << (*invP); }// V= " << invP->V << " Qeps= "<< invP->Qeps << " cos3phi= "<< invP->cos3phi << " "; }// V,Qeps,cos3phi; + { sort << " 1 " << (*invP); } else { sort << " 0 ";}; + // cas des paramètres de lois éventuelles + if (para_loi == NULL) + {sort << " sans_para ";} + else + {sort << " avec_para_taille= "<Taille() << " "; + sort << *para_loi; + }; + }; + + // mise à jour des informations transitoires +void Hyper_W_gene_3D::SaveResulHyper_W_gene_3D::TdtversT() + {if (invP != NULL) + (*invP_t) = (*invP); + if (para_loi != NULL) + {*para_loi_t = *para_loi;}; + // mise à jour de la liste des grandeurs quelconques internes + Mise_a_jour_map_type_quelconque(); + }; +void Hyper_W_gene_3D::SaveResulHyper_W_gene_3D::TversTdt() + {if (invP != NULL) + (*invP) = (*invP_t); + if (para_loi != NULL) + {*para_loi = *para_loi_t;}; + // mise à jour de la liste des grandeurs quelconques internes + Mise_a_jour_map_type_quelconque(); + }; + // affichage à l'écran des infos void Hyper_W_gene_3D::SaveResulHyper_W_gene_3D::Affiche() const { cout << "\n data specifiques hyperelastiques : " ; if (invP != NULL) - { cout << (*invP); } //" V= " << invP->V << " Qeps= "<< invP->Qeps << " cos3phi= "<< invP->cos3phi << " ";} + { cout << (*invP); }; + if (para_loi == NULL) + {cout << " sans_para ";} else - { cout << " aucun data sauvegarde "; }; - + {cout << " avec_para "; + cout << *para_loi; + }; }; -// ---------- classe HyperD --------- +// mise à jour de la liste des grandeurs quelconques internes +void Hyper_W_gene_3D::SaveResulHyper_W_gene_3D::Mise_a_jour_map_type_quelconque() + { // on parcours la map + map < EnumTypeQuelconque , TypeQuelconque, std::less < EnumTypeQuelconque> >::iterator + il,ilfin=map_type_quelconque.end(); + for (il=map_type_quelconque.begin();il != ilfin;il++) + + { switch ((*il).first) + { case POTENTIEL: + { Grandeur_scalaire_double& tyTQ= *((Grandeur_scalaire_double*) (*il).second.Grandeur_pointee()); // pour simplifier + (*tyTQ.ConteneurDouble()) = invP->potentiel; + break; + } + // -----cas des paramètres de la loi + case PARA_LOI_TYPE_MOONEY: + { Grandeur_Vecteur& gr= *((Grandeur_Vecteur*) map_type_quelconque[PARA_LOI_TYPE_MOONEY].Grandeur_pointee()); // pour simplifier + if (para_loi != NULL) + {*(gr.ConteneurVecteur()) = *(para_loi);} + else {gr.ConteneurVecteur()->Zero();}; + break; + } + + default: + cout << "\n *** erreur on demande l'acces a : " + << NomTypeQuelconque((*il).first) + << " or celui-ci n'est pas dispo pour la loi "; + this->Affiche(); + cout << " revoir la mise en donnees ! " << endl; + Sortie(1); + }; + + }; + +}; + +// ---------- classe Hyper_W_gene_3D --------- // Constructeur par defaut Hyper_W_gene_3D::Hyper_W_gene_3D (): Loi_comp_abstraite() ,I_B(0.),I_BB(0.),II_B(0.),III_B(0.) - ,sortie_post(0) + ,sortie_post(0),nb_para_loi(0) // I_B(0.),I_BB(0.),I_BBB(0.),II_B(0.),III_B(0.) ,J_r(3) ,d_I_B_epsBB_HH(),d_II_B_epsBB_HH(),d_III_B_epsBB_HH() @@ -176,7 +299,7 @@ Hyper_W_gene_3D::Hyper_W_gene_3D (Enum_comp id_compor,Enum_categorie_loi_comp ca ,int dimension,bool vit_def): Loi_comp_abstraite(id_compor,categorie_comp,dimension,vit_def) ,I_B(0.),I_BB(0.),II_B(0.),III_B(0.) - ,sortie_post(0) + ,sortie_post(0),nb_para_loi(0) // I_B(0.),I_BB(0.),I_BBB(0.),II_B(0.),III_B(0.) ,J_r(3) ,d_I_B_epsBB_HH(),d_II_B_epsBB_HH(),d_III_B_epsBB_HH() @@ -192,6 +315,7 @@ Hyper_W_gene_3D::Hyper_W_gene_3D (Enum_comp id_compor,Enum_categorie_loi_comp ca // Constructeur de copie Hyper_W_gene_3D::Hyper_W_gene_3D (const Hyper_W_gene_3D& loi): Loi_comp_abstraite(loi) + ,nb_para_loi(loi.nb_para_loi) ,I_B(loi.I_B),I_BB(loi.I_BB),II_B(II_B),III_B(III_B) // I_B(loi.I_B),I_BB(loi.I_BB),I_BBB(loi.I_BBB),II_B(II_B),III_B(III_B) ,J_r(loi.J_r) @@ -240,7 +364,15 @@ void Hyper_W_gene_3D::Grandeur_particuliere tyTQ(1+(*idecal)) = 0.; (*idecal)++; break; } - + case PARA_LOI_TYPE_MOONEY: + // ----- cas des coefficients de loi + { SaveResulHyper_W_gene_3D & save_resul = *((SaveResulHyper_W_gene_3D*) saveDon); + Tab_Grandeur_Vecteur& tyTQ= *((Tab_Grandeur_Vecteur*) (*itq).Grandeur_pointee()); // pour simplifier + if (save_resul.para_loi != NULL) {tyTQ(1+(*idecal))= *(save_resul.para_loi);} + else {tyTQ(1+(*idecal)).Zero();}; + (*idecal)++; break; + } + default: ;// on ne fait rien }; @@ -278,8 +410,114 @@ void Hyper_W_gene_3D::ListeGrandeurs_particulieres(bool absolue,List_io::iterator itq,itqfin=liTQ.end(); bool nexistePas = true; + for (itq=liTQ.begin();itq!=itqfin;itq++) + if ((*itq).EnuTypeQuelconque() == PARA_LOI_TYPE_MOONEY) + {Tab_Grandeur_Vecteur& tyTQ= *((Tab_Grandeur_Vecteur*) (*itq).Grandeur_pointee()); // pour simplifier + int taille = tyTQ.Taille()+1; + tyTQ.Change_taille(taille); nexistePas = false; + tyTQ(taille).Change_taille(nb_para_loi); + }; + if (nexistePas) + {Vecteur tens(nb_para_loi); // + Tab_Grandeur_Vecteur gr_vec_para(tens,1); + // def d'un type quelconque représentatif + TypeQuelconque typQ(PARA_LOI_TYPE_MOONEY,EPS11,gr_vec_para); + liTQ.push_back(typQ); + }; + }; }; + +// activation du stockage de grandeurs quelconques qui pourront ensuite être récupéré +// via le conteneur SaveResul, si la grandeur n'existe pas ici, aucune action +void Hyper_W_gene_3D::Activation_stockage_grandeurs_quelconques(list & listEnuQuelc) + { // récup de la liste de stockage + list & listlocale = ListQuelc_mis_en_acces_localement(); + + // on parcours la liste des grandeurs à activer + // et on remplit la liste locale + list ::iterator il, ilfin = listEnuQuelc.end(); + for (il = listEnuQuelc.begin();il != ilfin; il++) +// for (EnumTypeQuelconque enu : listEnuQuelc) + // on ne remplit que s'il s'agit d'une grandeur qui peut-être accessible + {switch (*il) + {case POTENTIEL: case PARA_LOI_TYPE_MOONEY: + listlocale.push_back(*(il)); + break; + default: ; // pour les autres cas on ne fait rien + }; + }; + + // on supprime les doublons localement + listlocale.sort(); // on ordonne la liste + listlocale.unique(); // suppression des doublons + + }; + +// insertion des conteneurs ad hoc concernant le stockage de grandeurs quelconques +// passée en paramètre, dans le save result: ces conteneurs doivent être valides +// c-a-d faire partie de listdeTouslesQuelc_dispo_localement +void Hyper_W_gene_3D::Insertion_conteneur_dans_save_result(SaveResul * a) + { + // -- autre stockage éventuel en fonction des grandeurs quelconques demandées par d'autres lois + // on va regarder s'il faut activer ou non invP et invP_t, pour le cas + // de la récupération de grandeur quelconque au moment de l'utilisation de la loi + // récup de la liste de stockage + list & listlocale = ListQuelc_mis_en_acces_localement(); + // def + Hyper_W_gene_3D::SaveResulHyper_W_gene_3D& sav = *((Hyper_W_gene_3D::SaveResulHyper_W_gene_3D*) a); + + List_io ::iterator jk,jkfin = listlocale.end(); + for (jk=listlocale.begin();jk != jkfin;jk++) +// for (EnumTypeQuelconque enu : listQuelc_dispo_localement) +// { switch (enu) + {EnumTypeQuelconque enu = *jk; + switch (enu) + { case POTENTIEL: // cas on des grandeurs sont demandées + { if (sav.invP == NULL) // def si ils n'existent pas + {sav.invP = new Invariantpost3D(); + sav.invP_t = new Invariantpost3D(); + if ((Permet_affichage() > 0 ) && (sortie_post == 0)) + {cout << "\n *** warning: on demande pour une loi hyper elastique, l'utilisation de la grandeur " + << NomTypeQuelconque(enu) << " or on n'a pas demande sortie_post_ different de 0 " + << " on met arbitrairement sortie_post_ = 1 "; + }; + if (sortie_post == 0) + sortie_post = 1; + }; + // on crée le conteneur ad hoc pour le passage d'info + // def d'un conteneur de grandeurs quelconques, initialisée à 0 + Grandeur_scalaire_double grand_courant(0.); + TypeQuelconque typQ1(enu,EPS11,grand_courant); + sav.map_type_quelconque[enu]=(typQ1); + break; + } + case PARA_LOI_TYPE_MOONEY: // cas on des grandeurs sont demandées + { if (sav.para_loi == NULL) // def si ils n'existent pas + {sav.para_loi = new Vecteur; // la dimension sera ensuite précisée + sav.para_loi_t = new Vecteur; // dans la loi dérivée + }; + // on crée le conteneur ad hoc pour le passage d'info + // def d'un conteneur de grandeurs quelconques, initialisée à 0 + Grandeur_Vecteur grand_courant(3);grand_courant.ConteneurVecteur()->Zero(); + TypeQuelconque typQ1(enu,EPS11,grand_courant); + sav.map_type_quelconque[enu]=(typQ1); + break; + } + + default: + cout << "\n *** erreur on demande l'acces a : " + << NomTypeQuelconque(enu) + << " or celui-ci n'est pas dispo pour la loi "; + this->Affiche(); + cout << " revoir la mise en donnees ! " << endl; + Sortie(1); + }; + }; + + }; // --------------- méthodes internes ------------- @@ -320,10 +558,10 @@ void Hyper_W_gene_3D::InvariantsEtVar1(const TenseurBB & gijBB_0_,const TenseurH III_B=V*V; // calcul plus rapide que le précédent // calcul des trois invariants en J if (III_B <= ConstMath::petit) - { if (ParaGlob::NiveauImpression() >= 1) + { if (Permet_affichage() >= 1) cout << "\n **** erreur, le volume final sur volume initial est quasi-nulle ! III_B=" << (III_B) << " on limite (V**(2)) a : " << ConstMath::petit; - if (ParaGlob::NiveauImpression() >= 5) + if (Permet_affichage() >= 5) cout << "\n Hyper_W_gene_3D::Invariants_et_var1( "; III_B = ConstMath::petit; }; diff --git a/comportement/Hyper_elastique/Hyper_W_gene_3D.h b/comportement/Hyper_elastique/Hyper_W_gene_3D.h index 840e2e9..6759f38 100644 --- a/comportement/Hyper_elastique/Hyper_W_gene_3D.h +++ b/comportement/Hyper_elastique/Hyper_W_gene_3D.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -123,11 +123,14 @@ class Hyper_W_gene_3D : public Loi_comp_abstraite double potentiel; }; - class SaveResulHyper_W_gene_3D: public Loi_comp_abstraite::SaveResul//HyperD + class SaveResulHyper_W_gene_3D: public Loi_comp_abstraite::SaveResul { public : // constructeur SaveResulHyper_W_gene_3D(); // par défaut - SaveResulHyper_W_gene_3D(int sortie_post); // avec init ou pas + // avec_para : le nombre indique si on sauvegarde des paramètres matériaux qui varient + // et également des invariants. + // si == 0 : pas de stockage (joue en fait le role de sortie_post) + SaveResulHyper_W_gene_3D(int avec_para); // avec init ou pas SaveResulHyper_W_gene_3D(const SaveResulHyper_W_gene_3D& sav); // de copie virtual ~SaveResulHyper_W_gene_3D(); // destructeur @@ -147,8 +150,8 @@ class Hyper_W_gene_3D : public Loi_comp_abstraite virtual void Ecriture_base_info(ofstream& ,const int ) ; // mise à jour des informations transitoires - void TdtversT() { if (invP != NULL) { (*invP_t) = (*invP);};}; - void TversTdt() { if (invP != NULL) { (*invP) = (*invP_t);};}; + void TdtversT() ; + void TversTdt() ; // affichage à l'écran des infos void Affiche() const ; @@ -166,14 +169,42 @@ class Hyper_W_gene_3D : public Loi_comp_abstraite // completer est appelé apres sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor - ,const Loi_comp_abstraite* loi){}; + ,const Loi_comp_abstraite* loi){return NULL;}; - // des grandeurs qui sont éventuellement crééent si on le demande + // --- gestion d'une map de grandeurs quelconques éventuelles --- + + // une map de grandeurs quelconques particulière qui peut servir aux classes appelantes + // il s'agit ici d'une map interne qui a priori ne doit servir qu'aux class loi de comportement + // un exemple d'utilisation est une loi combinée qui a besoin de grandeurs spéciales définies + // -> n'est pas sauvegardé, car a priori il s'agit de grandeurs redondantes + map < EnumTypeQuelconque , TypeQuelconque, std::less < EnumTypeQuelconque> > map_type_quelconque; + + // récupération des type quelconque sous forme d'un arbre pour faciliter la recherche + const map < EnumTypeQuelconque , TypeQuelconque, std::less < EnumTypeQuelconque> >* Map_type_quelconque() + const {return &map_type_quelconque;}; + + //------------------------------------------------------------------- + // données optionnelles : les paramètres matériaux réellement utilisés + //------------------------------------------------------------------- + // si on le demande: dans le cas où les paramètres matériaux sont des fonctions nD + // on stocke les paramètres matériaux + Vecteur *para_loi, *para_loi_t; + + // également des grandeurs qui sont éventuellement créées si on le demande Hyper_W_gene_3D::Invariantpost3D * invP, * invP_t; + + + protected: + virtual void Mise_a_jour_map_type_quelconque(); + + // ---- fin gestion d'une liste de grandeurs quelconques éventuelles --- + }; - SaveResul * New_et_Initialise() { return (new SaveResulHyper_W_gene_3D(this->sortie_post));}; + virtual SaveResul * New_et_Initialise() = 0; + + friend class SaveResulHyper_W_gene_3D; // récupération des grandeurs particulière (hors ddl ) // correspondant à liTQ @@ -222,14 +253,25 @@ class Hyper_W_gene_3D : public Loi_comp_abstraite const Tenseur3HHHH& D_J_1_eps2BB_HHHH () const {return d_J_1_eps2BB_HHHH;}; const Tenseur3HHHH& D_J_2_eps2BB_HHHH () const {return d_J_2_eps2BB_HHHH;}; const Tenseur3HHHH& D_J_3_eps2BB_HHHH () const {return d_J_3_eps2BB_HHHH;}; - - + + // activation du stockage de grandeurs quelconques qui pourront ensuite être récupéré + // via le conteneur SaveResul, si la grandeur n'existe pas ici, aucune action + virtual void Activation_stockage_grandeurs_quelconques(list & listEnuQuelc); + + // insertion des conteneurs ad hoc concernant le stockage de grandeurs quelconques + // passée en paramètre, dans le save result: ces conteneurs doivent être valides + // c-a-d faire partie de listdeTouslesQuelc_dispo_localement + virtual void Insertion_conteneur_dans_save_result(SaveResul * saveResul); + protected : // données int sortie_post; // permet de stocker et ensuite d'accéder en post-traitement à certaines données // = 0 par défaut, // = 1 : on stocke toutes les grandeurs et elles sont disponibles en sortie // lecture dans les classes dérivées !! + + int nb_para_loi; // nombre de paramètre de la loi: doit être défini par les classes dérivée + // est utilisé par ListeGrandeurs_particulieres double I_B,I_BB;//,I_BBB; // les 3 invariants primaires de B c'est-à-dire les trois traces // I_B, I_{B.B}, I_{B.B.B}, en fait on ne se sert pas de I_BBB diff --git a/comportement/Hyper_elastique/Hyper_externe_W.cc b/comportement/Hyper_elastique/Hyper_externe_W.cc index 6972c45..9a5aef8 100755 --- a/comportement/Hyper_elastique/Hyper_externe_W.cc +++ b/comportement/Hyper_elastique/Hyper_externe_W.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/Hyper_externe_W.h b/comportement/Hyper_elastique/Hyper_externe_W.h index af7bf63..535d01b 100755 --- a/comportement/Hyper_elastique/Hyper_externe_W.h +++ b/comportement/Hyper_elastique/Hyper_externe_W.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/Hyper_w1.h b/comportement/Hyper_elastique/Hyper_w1.h index 370457e..6026c47 100644 --- a/comportement/Hyper_elastique/Hyper_w1.h +++ b/comportement/Hyper_elastique/Hyper_w1.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/IsoHyper3DFavier3.cc b/comportement/Hyper_elastique/IsoHyper3DFavier3.cc index c0569d8..0c886c7 100644 --- a/comportement/Hyper_elastique/IsoHyper3DFavier3.cc +++ b/comportement/Hyper_elastique/IsoHyper3DFavier3.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -38,6 +38,8 @@ using namespace std; //introduces namespace std #include "Sortie.h" #include "ConstMath.h" #include "CharUtil.h" +#include "Enum_TypeQuelconque.h" +#include "TypeQuelconqueParticulier.h" //================== initialisation des variables static ====================== @@ -47,26 +49,349 @@ double IsoHyper3DFavier3::limite_co2=700.; // limite à partir de laquelle on co // ici cosh(700.) = 5.0712e+303 !! //================== fin d'initialisation des variables static ================ +//================== stockage particulier SaveResul ================ + +IsoHyper3DFavier3::SaveResulIsoHyper3DFavier3::SaveResulIsoHyper3DFavier3(bool avec_para): // constructeur par défaut : + SaveResulHyperD(),para_loi(NULL),para_loi_t(NULL) + {if (avec_para) + {para_loi = new Vecteur(4,-ConstMath::trespetit); + para_loi_t = new Vecteur(4,-ConstMath::trespetit); + }; + }; +IsoHyper3DFavier3::SaveResulIsoHyper3DFavier3::SaveResulIsoHyper3DFavier3(const SaveResulIsoHyper3DFavier3& sav): // de copie + SaveResulHyperD(sav),para_loi(NULL),para_loi_t(NULL) + {if (sav.para_loi != NULL) + {para_loi = new Vecteur(*sav.para_loi); + para_loi_t = new Vecteur(*sav.para_loi_t); + }; + }; + +IsoHyper3DFavier3::SaveResulIsoHyper3DFavier3::~SaveResulIsoHyper3DFavier3() // destructeur + { if (para_loi != NULL) delete para_loi; + if (para_loi_t != NULL) delete para_loi_t; + }; + // affectation +Loi_comp_abstraite::SaveResul & IsoHyper3DFavier3::SaveResulIsoHyper3DFavier3 + ::operator = ( const Loi_comp_abstraite::SaveResul & a) + { SaveResulHyperD::operator=(a); + SaveResulIsoHyper3DFavier3& sav = *((SaveResulIsoHyper3DFavier3*) &a); + if (sav.para_loi != NULL) + {if (para_loi == NULL) + {para_loi = new Vecteur(4,-ConstMath::trespetit); + para_loi_t = new Vecteur(4,-ConstMath::trespetit); + }; + *para_loi = *(sav.para_loi); + *para_loi_t = *(sav.para_loi_t); + }; + map_type_quelconque = sav.map_type_quelconque; + return *this; + }; + //============= lecture écriture dans base info ========== + // cas donne le niveau de la récupération + // = 1 : on récupère tout + // = 2 : on récupère uniquement les données variables (supposées comme telles) +void IsoHyper3DFavier3::SaveResulIsoHyper3DFavier3::Lecture_base_info (ifstream& ent,const int cas) + {SaveResulHyperD::Lecture_base_info (ent,cas); + string toto; + ent >> toto; + if (toto == "sans_para") + {if (para_loi != NULL) + {delete para_loi;para_loi=NULL; + delete para_loi_t;para_loi_t=NULL; + }; + } + else + {if (para_loi == NULL) + {para_loi = new Vecteur(4); + para_loi_t = new Vecteur(4); + }; + ent >> *para_loi; + *para_loi_t=*para_loi; + }; + }; + // cas donne le niveau de sauvegarde + // = 1 : on sauvegarde tout + // = 2 : on sauvegarde uniquement les données variables (supposées comme telles) +void IsoHyper3DFavier3::SaveResulIsoHyper3DFavier3::Ecriture_base_info(ofstream& sort,const int cas) + {SaveResulHyperD::Ecriture_base_info (sort,cas); + if (para_loi == NULL) + {sort << " sans_para ";} + else + {sort << " avec_para "; + sort << *para_loi; + }; + }; + + // mise à jour des informations transitoires +void IsoHyper3DFavier3::SaveResulIsoHyper3DFavier3::TdtversT() + {SaveResulHyperD::TdtversT(); + if (para_loi != NULL) + {*para_loi_t = *para_loi;}; + // mise à jour de la liste des grandeurs quelconques internes + Mise_a_jour_map_type_quelconque(); + }; +void IsoHyper3DFavier3::SaveResulIsoHyper3DFavier3::TversTdt() + {SaveResulHyperD::TversTdt(); + if (para_loi != NULL) + {*para_loi = *para_loi_t;}; + // mise à jour de la liste des grandeurs quelconques internes + Mise_a_jour_map_type_quelconque(); + }; + + // affichage à l'écran des infos +void IsoHyper3DFavier3::SaveResulIsoHyper3DFavier3::Affiche() const + {SaveResulHyperD::Affiche(); + if (para_loi == NULL) + {cout << " sans_para ";} + else + {cout << " avec_para "; + cout << *para_loi; + }; + }; + + +//================== fin stockage particulier SaveResul ================ IsoHyper3DFavier3::IsoHyper3DFavier3 () : // Constructeur par defaut Hyper3D(ISOHYPER3DFAVIER3,CAT_MECANIQUE,false),K(ConstMath::trespetit),Qor(ConstMath::trespetit) ,mur(ConstMath::trespetit),mu_inf(ConstMath::trespetit) ,nQor(ConstMath::trespetit),gammaQor(ConstMath::trespetit) ,n_mu_inf(ConstMath::trespetit),gamma_mu_inf(ConstMath::trespetit) + // dépendance nD éventuelle + ,K_nD(NULL),Qor_nD(NULL),mur_nD(NULL),mu_inf_nD(NULL) {}; // Constructeur de copie IsoHyper3DFavier3::IsoHyper3DFavier3 (const IsoHyper3DFavier3& loi) : Hyper3D (loi),K(loi.K),Qor(loi.Qor),mur(loi.mur),mu_inf(loi.mu_inf) ,nQor(loi.nQor),gammaQor(loi.gammaQor) ,n_mu_inf(loi.n_mu_inf),gamma_mu_inf(loi.gamma_mu_inf) - {}; + // dépendance nD éventuelle + ,K_nD(loi.K_nD),Qor_nD(loi.Qor_nD),mur_nD(loi.mur_nD),mu_inf_nD(loi.mu_inf_nD) + + {// on regarde s'il s'agit d'une fonction locale ou d'une fonction globale + if (K_nD != NULL) // 1) + if (K_nD->NomFonction() == "_") + {// comme il s'agit d'une fonction locale on la redéfinie (sinon pb lors du destructeur de loi) + string non_courbe("_"); + K_nD = Fonction_nD::New_Fonction_nD(*loi.K_nD); + }; + if (Qor_nD != NULL) // 2) + if (Qor_nD->NomFonction() == "_") + {// comme il s'agit d'une fonction locale on la redéfinie (sinon pb lors du destructeur de loi) + string non_courbe("_"); + Qor_nD = Fonction_nD::New_Fonction_nD(*loi.Qor_nD); + }; + if (mur_nD != NULL) // 3) + if (mur_nD->NomFonction() == "_") + {// comme il s'agit d'une fonction locale on la redéfinie (sinon pb lors du destructeur de loi) + string non_courbe("_"); + mur_nD = Fonction_nD::New_Fonction_nD(*loi.mur_nD); + }; + if (mu_inf_nD != NULL) // 4) + if (mu_inf_nD->NomFonction() == "_") + {// comme il s'agit d'une fonction locale on la redéfinie (sinon pb lors du destructeur de loi) + string non_courbe("_"); + mu_inf_nD = Fonction_nD::New_Fonction_nD(*loi.mu_inf_nD); + }; + + // --- on remplit avec les grandeurs succeptible d'être utilisées +// // acces à listdeTouslesQuelc_dispo_localement +// list & list_tousQuelc = ListdeTouslesQuelc_dispo_localement(); +// list_tousQuelc.push_back(E_YOUNG); +// list_tousQuelc.push_back(NU_YOUNG); +// // on supprime les doublons localement +// list_tousQuelc.sort(); // on ordonne la liste +// list_tousQuelc.unique(); // suppression des doublons + }; + // Lecture des donnees de la classe sur fichier void IsoHyper3DFavier3::LectureDonneesParticulieres (UtilLecture * entreePrinc,LesCourbes1D& ,LesFonctions_nD& lesFonctionsnD) - { // lecture des quatres coefficients de la loi - *(entreePrinc->entree) >> K >> Qor >> mur >> mu_inf ; + { // --- lecture des quatres coefficients de la loi + string nom_class_methode("IsoHyper3DFavier3::LectureDonneesParticulieres"); + // on regarde si K dépend d'une fonction nD + if(strstr(entreePrinc->tablcar,"K_fonction_nD:")!=0) + { string nom; + string mot_cle2="K_fonction_nD:"; + + // on lit le nom de la fonction + string nom_fonct; + bool lec = entreePrinc->Lecture_mot_cle_et_string(nom_class_methode,mot_cle2,nom_fonct); + if (!lec ) + { entreePrinc->MessageBuffer("**erreur01 en lecture** "+mot_cle2); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + // maintenant on définit la fonction + if (lesFonctionsnD.Existe(nom_fonct)) + {K_nD = lesFonctionsnD.Trouve(nom_fonct); + } + else + {// sinon il faut la lire maintenant + string non("_"); + K_nD = Fonction_nD::New_Fonction_nD(non, Id_Nom_Fonction_nD(nom_fonct)); + // lecture de la courbe + K_nD->LectDonnParticulieres_Fonction_nD (non,entreePrinc); + // maintenant on vérifie que la fonction est utilisable + if (K_nD->NbComposante() != 1 ) + { cout << "\n erreur en lecture, la fonction " << nom_fonct + << " est une fonction vectorielle a " << K_nD->NbComposante() + << " composante alors qu'elle devrait etre scalaire ! " + << " elle n'est donc pas utilisable !! "; + string message("\n**erreur02** \n"+nom_class_methode+"(..."); + entreePrinc->MessageBuffer(message); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; + // on regarde si la fonction nD intègre la température + const Tableau & tab_enu = K_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + } + // sinon si le module K n'a pas été lue, on le récupère en version scalaire + else + { // lecture du module + *(entreePrinc->entree) >> K ; + }; + // idem si Qor dépend d'une fonction nD + if(strstr(entreePrinc->tablcar,"Qor_fonction_nD:")!=0) + { string nom; + string mot_cle2="Qor_fonction_nD:"; + + // on lit le nom de la fonction + string nom_fonct; + bool lec = entreePrinc->Lecture_mot_cle_et_string(nom_class_methode,mot_cle2,nom_fonct); + if (!lec ) + { entreePrinc->MessageBuffer("**erreur03 en lecture** "+mot_cle2); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + // maintenant on définit la fonction + if (lesFonctionsnD.Existe(nom_fonct)) + {Qor_nD = lesFonctionsnD.Trouve(nom_fonct); + } + else + {// sinon il faut la lire maintenant + string non("_"); + Qor_nD = Fonction_nD::New_Fonction_nD(non, Id_Nom_Fonction_nD(nom_fonct)); + // lecture de la courbe + Qor_nD->LectDonnParticulieres_Fonction_nD (non,entreePrinc); + // maintenant on vérifie que la fonction est utilisable + if (Qor_nD->NbComposante() != 1 ) + { cout << "\n erreur en lecture, la fonction " << nom_fonct + << " est une fonction vectorielle a " << Qor_nD->NbComposante() + << " composante alors qu'elle devrait etre scalaire ! " + << " elle n'est donc pas utilisable !! "; + string message("\n**erreur04** \n"+nom_class_methode+"(..."); + entreePrinc->MessageBuffer(message); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; + // on regarde si la fonction nD intègre la température + const Tableau & tab_enu = Qor_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + } + // sinon si le module Qor n'a pas été lue, on le récupère en version scalaire + else + { // lecture du module + *(entreePrinc->entree) >> Qor ; + }; + // idem si mur dépend d'une fonction nD + if(strstr(entreePrinc->tablcar,"mur_fonction_nD:")!=0) + { string nom; + string mot_cle2="mur_fonction_nD:"; + + // on lit le nom de la fonction + string nom_fonct; + bool lec = entreePrinc->Lecture_mot_cle_et_string(nom_class_methode,mot_cle2,nom_fonct); + if (!lec ) + { entreePrinc->MessageBuffer("**erreur05 en lecture** "+mot_cle2); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + // maintenant on définit la fonction + if (lesFonctionsnD.Existe(nom_fonct)) + {mur_nD = lesFonctionsnD.Trouve(nom_fonct); + } + else + {// sinon il faut la lire maintenant + string non("_"); + mur_nD = Fonction_nD::New_Fonction_nD(non, Id_Nom_Fonction_nD(nom_fonct)); + // lecture de la courbe + mur_nD->LectDonnParticulieres_Fonction_nD (non,entreePrinc); + // maintenant on vérifie que la fonction est utilisable + if (mur_nD->NbComposante() != 1 ) + { cout << "\n erreur en lecture, la fonction " << nom_fonct + << " est une fonction vectorielle a " << mur_nD->NbComposante() + << " composante alors qu'elle devrait etre scalaire ! " + << " elle n'est donc pas utilisable !! "; + string message("\n**erreur06** \n"+nom_class_methode+"(..."); + entreePrinc->MessageBuffer(message); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; + // on regarde si la fonction nD intègre la température + const Tableau & tab_enu = mur_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + } + // sinon si le module mur n'a pas été lue, on le récupère en version scalaire + else + { // lecture du module + *(entreePrinc->entree) >> mur ; + }; + // idem si mu_inf dépend d'une fonction nD + if(strstr(entreePrinc->tablcar,"mu_inf_fonction_nD:")!=0) + { string nom; + string mot_cle2="mu_inf_fonction_nD:"; + + // on lit le nom de la fonction + string nom_fonct; + bool lec = entreePrinc->Lecture_mot_cle_et_string(nom_class_methode,mot_cle2,nom_fonct); + if (!lec ) + { entreePrinc->MessageBuffer("**erreur07 en lecture** "+mot_cle2); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + // maintenant on définit la fonction + if (lesFonctionsnD.Existe(nom_fonct)) + {mu_inf_nD = lesFonctionsnD.Trouve(nom_fonct); + } + else + {// sinon il faut la lire maintenant + string non("_"); + mu_inf_nD = Fonction_nD::New_Fonction_nD(non, Id_Nom_Fonction_nD(nom_fonct)); + // lecture de la courbe + mu_inf_nD->LectDonnParticulieres_Fonction_nD (non,entreePrinc); + // maintenant on vérifie que la fonction est utilisable + if (mu_inf_nD->NbComposante() != 1 ) + { cout << "\n erreur en lecture, la fonction " << nom_fonct + << " est une fonction vectorielle a " << mu_inf_nD->NbComposante() + << " composante alors qu'elle devrait etre scalaire ! " + << " elle n'est donc pas utilisable !! "; + string message("\n**erreur08** \n"+nom_class_methode+"(..."); + entreePrinc->MessageBuffer(message); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; + // on regarde si la fonction nD intègre la température + const Tableau & tab_enu = mu_inf_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + } + // sinon si le module mu_inf n'a pas été lue, on le récupère en version scalaire + else + { // lecture du module + *(entreePrinc->entree) >> mu_inf ; + }; +// *(entreePrinc->entree) >> K >> Qor >> mur >> mu_inf ; // on regarde ensuite s'il y a la phase if (strstr(entreePrinc->tablcar,"avec_phase")!=NULL) { // lecture des 4 paramètres de phase @@ -88,9 +413,9 @@ void IsoHyper3DFavier3::LectureDonneesParticulieres (UtilLecture * entreePrinc,L *(entreePrinc->entree) >> fact_regularisation; avec_regularisation=true; }; - // lecture de l'indication du post traitement - string nom_class_methode = "IsoHyper3DFavier3";string le_mot_cle = "sortie_post_"; - entreePrinc->Lecture_un_parametre_int(0,nom_class_methode,0,1,le_mot_cle,sortie_post); + // lecture de l'indication du post traitement + nom_class_methode = "IsoHyper3DFavier3";string le_mot_cle = "sortie_post_"; + entreePrinc->Lecture_un_parametre_int(0,nom_class_methode,0,1,le_mot_cle,sortie_post); // appel au niveau de la classe mère Loi_comp_abstraite::Lecture_type_deformation_et_niveau_commentaire (*entreePrinc,lesFonctionsnD); @@ -99,8 +424,48 @@ void IsoHyper3DFavier3::LectureDonneesParticulieres (UtilLecture * entreePrinc,L // affichage de la loi void IsoHyper3DFavier3::Affiche() const { cout << " \n loi de comportement 3D hyperelastique isotrope favier3 : " << Nom_comp(id_comp) - << " paramètres : \n"; - cout << " K= " << K << " ; Qor = " << Qor << " ; mur = " << mur << " ; mu_inf = " << mu_inf ; + << " paramètres : \n"; + if (K_nD != NULL) + {cout << "\n K fonction nD: "; + cout << "K_fonction_nD:" << " "; + if (K_nD->NomFonction() != "_") + cout << K_nD->NomFonction(); + else + K_nD->Affiche(); + } + else + { cout << " K= " << K ;}; + if (Qor_nD != NULL) + {cout << "\n Qor fonction nD: "; + cout << "Qor_fonction_nD:" << " "; + if (Qor_nD->NomFonction() != "_") + cout << Qor_nD->NomFonction(); + else + Qor_nD->Affiche(); + } + else + { cout << " Qor= " << Qor ;}; + if (mur_nD != NULL) + {cout << "\n mur fonction nD: "; + cout << "mur_fonction_nD:" << " "; + if (mur_nD->NomFonction() != "_") + cout << mur_nD->NomFonction(); + else + mur_nD->Affiche(); + } + else + { cout << " mur_nD= " << mur_nD ;}; + if (mu_inf_nD != NULL) + {cout << "\n mu_inf fonction nD: "; + cout << "mu_inf_fonction_nD:" << " "; + if (mu_inf_nD->NomFonction() != "_") + cout << mu_inf_nD->NomFonction(); + else + mu_inf_nD->Affiche(); + } + else + { cout << " mu_inf= " << mu_inf ;}; +// cout << " K= " << K << " ; Qor = " << Qor << " ; mur = " << mur << " ; mu_inf = " << mu_inf ; if (avec_phase) { cout << "\n cas de la loi avec phase, parametre de la phase: " << " nQor= " << nQor << " gammaQor= " << gammaQor << " n_mu_inf= " @@ -131,7 +496,22 @@ void IsoHyper3DFavier3::Info_commande_LoisDeComp(UtilLecture& entreePrinc) << "\n# n_Q | gamma_Q | n_mu | gamma_mu |" << "\n#-------------------------------------------------" << "\n 0.25 0.4 0.25 0.4 " - << "\n# **** exemple de cas SANS la phase :" + << "\n# **** exemple de cas AVEC utilisation de fonction nD :" + << "\n#------------------------------------------------------------------------------------" + << "\n# K | Qor | mur | mu_inf | avec_phase(falculatif) |" + << "\n#------------------------------------------------------------------------------------" + << "\n# 16000 Qor_fonction_nD: fct1 17000 mu_inf_fonction_nD: fct2" + << "\n#" + << "\n# une fonction nD est possible pour chacun des 4 coefficients, via les mots cle " + << "\n# K_fonction_nD: " + << "\n# Qor_fonction_nD: " + << "\n# mur_fonction_nD: " + << "\n# mu_inf_fonction_nD: " + << "\n# on peut utiliser 1 ou 2 ou 3 ou 4 fct nD, au choix " + << "\n# ( bien noter que la loi obtenue peut-etre quelconque, en particulier plus du tout " + << "\n# hyperelastique, tout depend des choix de fct nD !) " + << "\n#" + << "\n#------------------------------------------------------------------------------------" << "\n#------------------------------------------------------------------------------------" << "\n# il est possible d'indiquer un facteur de regularisation qui permet d'eviter " << "\n# de potentiels problemes de NaN, de type division par 0 par exemple " @@ -153,7 +533,8 @@ void IsoHyper3DFavier3::Info_commande_LoisDeComp(UtilLecture& entreePrinc) << "\n#" << "\n#------------------------------------------------------------------------------------"; }; - sort << "\n#------------------------------------------------------------------------------------" + sort << "\n# **** exemple de cas SANS la phase :" + << "\n#------------------------------------------------------------------------------------" << "\n# K | Qor | mur | mu_inf | avec_phase(falculatif) |" << "\n#------------------------------------------------------------------------------------" << "\n 160000 150 17000 220 " @@ -167,11 +548,28 @@ void IsoHyper3DFavier3::Info_commande_LoisDeComp(UtilLecture& entreePrinc) // test si la loi est complete int IsoHyper3DFavier3::TestComplet() { int ret = LoiAbstraiteGeneral::TestComplet(); - if ((K == ConstMath::trespetit) || (Qor == ConstMath::trespetit) - || (mur == ConstMath::trespetit) || (mu_inf == ConstMath::trespetit)) - { cout << " \n Les paramètres ne sont pas défini pour la loi " << Nom_comp(id_comp) + if ((K == ConstMath::trespetit) && (K_nD == NULL)) + { cout << " \n Le parametre K n'est pas defini pour la loi " << Nom_comp(id_comp) << '\n'; - Affiche(); + Affiche(); + ret = 0; + } + if ((Qor == ConstMath::trespetit) && (Qor_nD == NULL)) + { cout << " \n Le parametre Qor n'est pas defini pour la loi " << Nom_comp(id_comp) + << '\n'; + Affiche(); + ret = 0; + } + if ((mur == ConstMath::trespetit) && (mur_nD == NULL)) + { cout << " \n Le parametre mur n'est pas defini pour la loi " << Nom_comp(id_comp) + << '\n'; + Affiche(); + ret = 0; + } + if ((mu_inf == ConstMath::trespetit) && (mu_inf_nD == NULL)) + { cout << " \n Le parametre mu_inf n'est pas defini pour la loi " << Nom_comp(id_comp) + << '\n'; + Affiche(); ret = 0; } if (avec_phase) @@ -185,33 +583,252 @@ int IsoHyper3DFavier3::TestComplet() return ret; }; - + + // récupération des grandeurs particulière (hors ddl ) + // correspondant à liTQ + // absolue: indique si oui ou non on sort les tenseurs dans la base absolue ou une base particulière + void IsoHyper3DFavier3::Grandeur_particuliere + (bool absolue,List_io& liTQ,Loi_comp_abstraite::SaveResul * saveDon,list& decal) const + { // tout d'abord on appelle la class mère + HyperD::Grandeur_particuliere(absolue,liTQ,saveDon,decal); + // --- puis la loi elle-même + // on passe en revue la liste + List_io::iterator itq,itqfin=liTQ.end(); + list::iterator idecal=decal.begin(); + for (itq=liTQ.begin();itq!=itqfin;itq++,idecal++) + {TypeQuelconque& tipParticu = (*itq); // pour simplifier + if (tipParticu.EnuTypeQuelconque().Nom_vide()) // veut dire que c'est un enum pur + switch (tipParticu.EnuTypeQuelconque().EnumTQ()) + {case PARA_LOI_FAVIER: + // ----- cas des paramètres de la loi + { SaveResulIsoHyper3DFavier3 & save_resul = *((SaveResulIsoHyper3DFavier3*) saveDon); + Tab_Grandeur_Vecteur& tyTQ= *((Tab_Grandeur_Vecteur*) (*itq).Grandeur_pointee()); // pour simplifier + if (save_resul.para_loi != NULL) + {tyTQ(1+(*idecal))= *(save_resul.para_loi);} + else {tyTQ(1+(*idecal)).Zero();}; + (*idecal)++; break; + } + default: ;// on ne fait rien + }; + }; + }; + + // récupération et création de la liste de tous les grandeurs particulières + // ces grandeurs sont ajoutées à la liste passées en paramètres + // absolue: indique si oui ou non on sort les tenseurs dans la base absolue ou une base particulière + void IsoHyper3DFavier3::ListeGrandeurs_particulieres(bool absolue,List_io& liTQ) const + { // tout d'abord on appelle la class mère + HyperD::ListeGrandeurs_particulieres(absolue,liTQ); + // --- puis la loi elle-même + // $$$ cas des paramètres de la loi de comportement + {List_io::iterator itq,itqfin=liTQ.end(); bool nexistePas = true; + for (itq=liTQ.begin();itq!=itqfin;itq++) + if ((*itq).EnuTypeQuelconque() == PARA_LOI_FAVIER) + {Tab_Grandeur_Vecteur& tyTQ= *((Tab_Grandeur_Vecteur*) (*itq).Grandeur_pointee()); // pour simplifier + int taille = tyTQ.Taille()+1; + tyTQ.Change_taille(taille); nexistePas = false; + }; + if (nexistePas) + {Vecteur tens(4); // les 4 paramètres + Tab_Grandeur_Vecteur gr_vec_para(tens,1); + // def d'un type quelconque représentatif + TypeQuelconque typQ(PARA_LOI_FAVIER,SIG11,gr_vec_para); + liTQ.push_back(typQ); + }; + }; + + }; + //----- lecture écriture de restart ----- // cas donne le niveau de la récupération // = 1 : on récupère tout // = 2 : on récupère uniquement les données variables (supposées comme telles) void IsoHyper3DFavier3::Lecture_base_info_loi(ifstream& ent,const int cas,LesReferences& lesRef ,LesCourbes1D& lesCourbe1D,LesFonctions_nD& lesFonctionsnD) - { string toto; - if (cas == 1) - { ent >> toto >> K >> toto >> Qor >> toto >> mur >> toto >> mu_inf >> avec_phase; - if (avec_phase) - { ent >> toto >> nQor >> toto >> gammaQor >> toto - >> n_mu_inf >> toto >> gamma_mu_inf; + { string toto,nom; + if (cas == 1) + { ent >> toto >> thermo_dependant >> toto; + // tout d'abord la lecture de K + int type =0; + ent >> type; + switch (type) + { case 1 : + {ent >> nom; + if (nom != " K_fonction_nD: ") + { cout << "\n erreur en lecture de la fonction nD, on attendait " + << " K_fonction_nD: et on a lue " << nom + << "\n IsoHyper3DFavier3::Lecture_base_info_loi(..."; + Sortie(1); + }; + K_nD = lesFonctionsnD.Lecture_pour_base_info(ent,cas,K_nD); + // on regarde si la fonction nD intègre la température + // car l'utilisateur peut éventuellement lors d'un restart changer + // de paramètres pour la fonction nD + const Tableau & tab_enu = K_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + break; + }; + case 2 : + {ent >> K; + break; + }; + default: cout << "\n erreur type " << type << " non prevu, pour l'instant, les types " + << " reconnus sont uniquement: 1 c-a-d K fonction nD, " + << " 2 K une valeur fixe " + << "\n IsoHyper3DFavier3::Lecture_base_info_loi(..."; + Sortie(1); + break; + }; + // puis lecture de Qor + type =0; + ent >> toto >> type; + switch (type) + { case 1 : + {ent >> nom; + if (nom != " Qor_fonction_nD: ") + { cout << "\n erreur en lecture de la fonction nD, on attendait " + << " Qor_fonction_nD: et on a lue " << nom + << "\n IsoHyper3DFavier3::Lecture_base_info_loi(..."; + Sortie(1); + }; + Qor_nD = lesFonctionsnD.Lecture_pour_base_info(ent,cas,Qor_nD); + // on regarde si la fonction nD intègre la température + // car l'utilisateur peut éventuellement lors d'un restart changer + // de paramètres pour la fonction nD + const Tableau & tab_enu = Qor_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + break; + }; + case 2 : + {ent >> Qor; + break; + }; + default: cout << "\n erreur type " << type << " non prevu, pour l'instant, les types " + << " reconnus sont uniquement: 1 c-a-d Qor fonction nD, " + << " 2 Qor une valeur fixe " + << "\n IsoHyper3DFavier3::Lecture_base_info_loi(..."; + Sortie(1); + break; + }; + + // puis lecture de mur + type =0; + ent >> toto >> type; + switch (type) + { case 1 : + {ent >> nom; + if (nom != " mur_fonction_nD: ") + { cout << "\n erreur en lecture de la fonction nD, on attendait " + << " mur_fonction_nD: et on a lue " << nom + << "\n IsoHyper3DFavier3::Lecture_base_info_loi(..."; + Sortie(1); + }; + mur_nD = lesFonctionsnD.Lecture_pour_base_info(ent,cas,mur_nD); + // on regarde si la fonction nD intègre la température + // car l'utilisateur peut éventuellement lors d'un restart changer + // de paramètres pour la fonction nD + const Tableau & tab_enu = mur_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + break; + }; + case 2 : + {ent >> mur; + break; + }; + default: cout << "\n erreur type " << type << " non prevu, pour l'instant, les types " + << " reconnus sont uniquement: 1 c-a-d mur fonction nD, " + << " 2 mur une valeur fixe " + << "\n IsoHyper3DFavier3::Lecture_base_info_loi(..."; + Sortie(1); + break; + }; + + // puis lecture de mu_inf + type =0; + ent >> toto >> type; + switch (type) + { case 1 : + {ent >> nom; + if (nom != " mu_inf_fonction_nD: ") + { cout << "\n erreur en lecture de la fonction nD, on attendait " + << " mu_inf_fonction_nD: et on a lue " << nom + << "\n IsoHyper3DFavier3::Lecture_base_info_loi(..."; + Sortie(1); + }; + mu_inf_nD = lesFonctionsnD.Lecture_pour_base_info(ent,cas,mu_inf_nD); + // on regarde si la fonction nD intègre la température + // car l'utilisateur peut éventuellement lors d'un restart changer + // de paramètres pour la fonction nD + const Tableau & tab_enu = mu_inf_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + break; + }; + case 2 : + {ent >> mu_inf; + break; + }; + default: cout << "\n erreur type " << type << " non prevu, pour l'instant, les types " + << " reconnus sont uniquement: 1 c-a-d mu_inf fonction nD, " + << " 2 mu_inf une valeur fixe " + << "\n IsoHyper3DFavier3::Lecture_base_info_loi(..."; + Sortie(1); + break; + }; + + // ent >> toto >> K >> toto >> Qor >> toto >> mur >> toto >> mu_inf >> avec_phase; + // avec phase éventuelle + ent >> avec_phase; + if (avec_phase) + { ent >> toto >> nQor >> toto >> gammaQor >> toto + >> n_mu_inf >> toto >> gamma_mu_inf; + }; + // gestion du post-traitement + ent >> toto >> sortie_post ; }; - // gestion du post-traitement - ent >> toto >> sortie_post ; - }; - // appel class mère - Loi_comp_abstraite::Lecture_don_base_info(ent,cas,lesRef,lesCourbe1D,lesFonctionsnD); + // appel class mère + Loi_comp_abstraite::Lecture_don_base_info(ent,cas,lesRef,lesCourbe1D,lesFonctionsnD); }; // cas donne le niveau de sauvegarde // = 1 : on sauvegarde tout // = 2 : on sauvegarde uniquement les données variables (supposées comme telles) void IsoHyper3DFavier3::Ecriture_base_info_loi(ofstream& sort,const int cas) { if (cas == 1) - { sort << " module_dilatation " << K << " seuil " << Qor - << " pente_origine " << mur << " pente_infini " << mu_inf << " avec_phase " << avec_phase; + { sort << " ISOHYPER3DFAVIER3,thermodependance= " << thermo_dependant ; + sort << " module_K "; + if (K_nD != NULL) + {sort << " 1 K_fonction_nD: " << " "; + LesFonctions_nD::Ecriture_pour_base_info(sort, cas,K_nD); + } + else + { sort << " 2 " << K ; }; + sort << " seuil "; + if (Qor_nD != NULL) + {sort << " 1 Qor_fonction_nD: " << " "; + LesFonctions_nD::Ecriture_pour_base_info(sort, cas,Qor_nD); + } + else + { sort << " 2 " << Qor ; }; + sort << " pente_origine "; + if (mur_nD != NULL) + {sort << " 1 mur_fonction_nD: " << " "; + LesFonctions_nD::Ecriture_pour_base_info(sort, cas,mur_nD); + } + else + { sort << " 2 " << mur ; }; + sort << " pente_infini "; + if (mu_inf_nD != NULL) + {sort << " 1 mu_inf_fonction_nD: " << " "; + LesFonctions_nD::Ecriture_pour_base_info(sort, cas,mu_inf_nD); + } + else + { sort << " 2 " << mu_inf ; }; +// sort << " module_dilatation " << K << " seuil " << Qor +// << " pente_origine " << mur << " pente_infini " << mu_inf << " avec_phase " << avec_phase; + sort << " avec_phase " << avec_phase; if (avec_phase) { sort << "\n nQor= " << nQor << " gammaQor= " << gammaQor << " n_mu_inf= " << n_mu_inf << " gamma_mu_inf= " << gamma_mu_inf; @@ -221,7 +838,256 @@ void IsoHyper3DFavier3::Ecriture_base_info_loi(ofstream& sort,const int cas) }; // appel de la classe mère Loi_comp_abstraite::Ecriture_don_base_info(sort,cas); - }; + }; + + +// calcul d'un module d'young équivalent à la loi, ceci pour un +// chargement nul si rien n'est calculé, sinon c'est +// une valeur correspondante au dernier calcul +double IsoHyper3DFavier3::Module_young_equivalent(Enum_dure temps,const Deformation & def,SaveResul * saveDon) + { // compte tenu du fait que l'on ne connait pas la métrique etc... on ramène le module en cours + + // on récupère le conteneur + SaveResulIsoHyper3DFavier3 & save_resul = *((SaveResulIsoHyper3DFavier3*) saveResul); + + double K_sortie=K; // init + double mur_sortie=mur; // init + double mu_inf_sortie=mu_inf; // init + + // traitement du cas particulier de l'existence de fct nD + if (save_resul.para_loi != NULL) + {bool recup = false; + switch (temps) + { + case TEMPS_t : // on utilise les grandeurs stockées à t + if ((*save_resul.para_loi_t)(1) != (-ConstMath::trespetit)) + {K_sortie= (*save_resul.para_loi_t)(1);recup = true;} + break; + case TEMPS_tdt : // on utilise les grandeurs stockées à tdt + if ((*save_resul.para_loi)(1) != (-ConstMath::trespetit)) + {K_sortie= (*save_resul.para_loi)(1);recup = true;} + break; + case TEMPS_0 : // rien n'a été calculé + recup = false; + }; + // dans tous les autres cas on utilise soit les fonctions + // si elles existent sinon on concerve les valeurs par défaut + if (!recup) + {//on essaie un calcul + // cas des courbes d'évolution + if (K_nD != NULL) + // là il faut calcul la fonction nD + { + // ici on utilise les variables connues aux pti, ou calculées à partir de + // on commence par récupérer les conteneurs des grandeurs à fournir + List_io & li_enu_scal = K_nD->Li_enu_etendu_scalaire(); + List_io & li_quelc = K_nD->Li_equi_Quel_evolue(); + + // on initialise les grandeurs du tableau pour les valeurs numériques + Tableau val_ddl_enum(li_enu_scal.size(),0.); + // init par défaut des types quelconques + List_io ::iterator il,ilfin=li_quelc.end(); + for (il = li_quelc.begin();il != ilfin; il++) + (*il).Grandeur_pointee()->InitParDefaut(); + + // calcul de la valeur et retour dans tab_ret + Tableau & tab_val + = K_nD->Valeur_FnD_Evoluee(&val_ddl_enum,&li_enu_scal,&li_quelc,NULL,NULL); + #ifdef MISE_AU_POINT + if (tab_val.Taille() != 1) + { cout << "\nErreur : la fonction nD relative au module d'Young " + << " doit calculer un scalaire or le tableau de retour est de taille " + << tab_val.Taille() << " ce n'est pas normal !\n"; + cout << " IsoHyper3DFavier3::Module_compressibilite_equivalent(..\n"; + Sortie(1); + }; + #endif + // on récupère le premier élément du tableau uniquement + K_sortie = tab_val(1); + }; + }; + + // -- idem pour mur + recup = false; + switch (temps) + { + case TEMPS_t : // on utilise les grandeurs stockées à t + if ((*save_resul.para_loi_t)(3) != (-ConstMath::trespetit)) + {mur_sortie= (*save_resul.para_loi_t)(3);recup = true;} + break; + case TEMPS_tdt : // on utilise les grandeurs stockées à tdt + if ((*save_resul.para_loi)(3) != (-ConstMath::trespetit)) + {mur_sortie= (*save_resul.para_loi)(3);recup = true;} + break; + + case TEMPS_0 : // rien n'a été calculé + recup = false; + }; + // dans tous les autres cas on utilise soit les fonctions + // si elles existent sinon on concerve les valeurs par défaut + if (!recup) + {//on essaie un calcul + // cas des courbes d'évolution + if (mur_nD != NULL) + // là il faut calcul la fonction nD + { + // ici on utilise les variables connues aux pti, ou calculées à partir de + // on commence par récupérer les conteneurs des grandeurs à fournir + List_io & li_enu_scal = mur_nD->Li_enu_etendu_scalaire(); + List_io & li_quelc = mur_nD->Li_equi_Quel_evolue(); + + // on initialise les grandeurs du tableau pour les valeurs numériques + Tableau val_ddl_enum(li_enu_scal.size(),0.); + // init par défaut des types quelconques + List_io ::iterator il,ilfin=li_quelc.end(); + for (il = li_quelc.begin();il != ilfin; il++) + (*il).Grandeur_pointee()->InitParDefaut(); + + // calcul de la valeur et retour dans tab_ret + Tableau & tab_val + = mur_nD->Valeur_FnD_Evoluee(&val_ddl_enum,&li_enu_scal,&li_quelc,NULL,NULL); + #ifdef MISE_AU_POINT + if (tab_val.Taille() != 1) + { cout << "\nErreur : la fonction nD relative au module d'Young " + << " doit calculer un scalaire or le tableau de retour est de taille " + << tab_val.Taille() << " ce n'est pas normal !\n"; + cout << " IsoHyper3DFavier3::Module_compressibilite_equivalent(..\n"; + Sortie(1); + }; + #endif + // on récupère le premier élément du tableau uniquement + mur_sortie = tab_val(1); + }; + }; + + // -- idem pour mu_inf + recup = false; + switch (temps) + { + case TEMPS_t : // on utilise les grandeurs stockées à t + if ((*save_resul.para_loi_t)(4) != (-ConstMath::trespetit)) + {mu_inf_sortie= (*save_resul.para_loi_t)(4);recup = true;} + break; + case TEMPS_tdt : // on utilise les grandeurs stockées à tdt + if ((*save_resul.para_loi)(4) != (-ConstMath::trespetit)) + {mu_inf_sortie= (*save_resul.para_loi)(4);recup = true;} + break; + + case TEMPS_0 : // rien n'a été calculé + recup = false; + }; + // dans tous les autres cas on utilise soit les fonctions + // si elles existent sinon on concerve les valeurs par défaut + if (!recup) + {//on essaie un calcul + // cas des courbes d'évolution + if (mu_inf_nD != NULL) + // là il faut calcul la fonction nD + { + // ici on utilise les variables connues aux pti, ou calculées à partir de + // on commence par récupérer les conteneurs des grandeurs à fournir + List_io & li_enu_scal = mu_inf_nD->Li_enu_etendu_scalaire(); + List_io & li_quelc = mu_inf_nD->Li_equi_Quel_evolue(); + + // on initialise les grandeurs du tableau pour les valeurs numériques + Tableau val_ddl_enum(li_enu_scal.size(),0.); + // init par défaut des types quelconques + List_io ::iterator il,ilfin=li_quelc.end(); + for (il = li_quelc.begin();il != ilfin; il++) + (*il).Grandeur_pointee()->InitParDefaut(); + + // calcul de la valeur et retour dans tab_ret + Tableau & tab_val + = mu_inf_nD->Valeur_FnD_Evoluee(&val_ddl_enum,&li_enu_scal,&li_quelc,NULL,NULL); + #ifdef MISE_AU_POINT + if (tab_val.Taille() != 1) + { cout << "\nErreur : la fonction nD relative au module d'Young " + << " doit calculer un scalaire or le tableau de retour est de taille " + << tab_val.Taille() << " ce n'est pas normal !\n"; + cout << " IsoHyper3DFavier3::Module_compressibilite_equivalent(..\n"; + Sortie(1); + }; + #endif + // on récupère le premier élément du tableau uniquement + mu_inf_sortie = tab_val(1); + }; + }; + }; + + // retour du module + double module = (9.*K_sortie*(mur_sortie+mu_inf_sortie)/((mur_sortie+mu_inf_sortie)+3.*K_sortie)); + return module; + }; + +// récupération d'un module de compressibilité équivalent à la loi, ceci pour un chargement nul +// si rien n'est calculé, sinon c'est +// une valeur correspondante au dernier calcul +double IsoHyper3DFavier3::Module_compressibilite_equivalent(Enum_dure temps,const Deformation & def,SaveResul * saveDon) + { // compte tenu du fait que l'on ne connait pas la métrique etc... on ramène le module en cours + + // on récupère le conteneur + SaveResulIsoHyper3DFavier3 & save_resul = *((SaveResulIsoHyper3DFavier3*) saveResul); + + double K_sortie=K; // init + // traitement du cas particulier de l'existence de fct nD + if (save_resul.para_loi != NULL) + {bool recup = false; + switch (temps) + { + case TEMPS_t : // on utilise les grandeurs stockées à t + if ((*save_resul.para_loi_t)(1) != (-ConstMath::trespetit)) + {K_sortie= (*save_resul.para_loi_t)(1);recup = true;} + break; + case TEMPS_tdt : // on utilise les grandeurs stockées à tdt + if ((*save_resul.para_loi)(1) != (-ConstMath::trespetit)) + {K_sortie= (*save_resul.para_loi)(1);recup = true;} + break; + case TEMPS_0 : // rien n'a été calculé + recup = false; + }; + // dans tous les autres cas on utilise soit les fonctions + // si elles existent sinon on concerve les valeurs par défaut + if (!recup) + {//on essaie un calcul + // cas des courbes d'évolution + if (K_nD != NULL) + // là il faut calcul la fonction nD + { + // ici on utilise les variables connues aux pti, ou calculées à partir de + // on commence par récupérer les conteneurs des grandeurs à fournir + List_io & li_enu_scal = K_nD->Li_enu_etendu_scalaire(); + List_io & li_quelc = K_nD->Li_equi_Quel_evolue(); + + // on initialise les grandeurs du tableau pour les valeurs numériques + Tableau val_ddl_enum(li_enu_scal.size(),0.); + // init par défaut des types quelconques + List_io ::iterator il,ilfin=li_quelc.end(); + for (il = li_quelc.begin();il != ilfin; il++) + (*il).Grandeur_pointee()->InitParDefaut(); + + // calcul de la valeur et retour dans tab_ret + Tableau & tab_val + = K_nD->Valeur_FnD_Evoluee(&val_ddl_enum,&li_enu_scal,&li_quelc,NULL,NULL); + #ifdef MISE_AU_POINT + if (tab_val.Taille() != 1) + { cout << "\nErreur : la fonction nD relative au module d'Young " + << " doit calculer un scalaire or le tableau de retour est de taille " + << tab_val.Taille() << " ce n'est pas normal !\n"; + cout << " IsoHyper3DFavier3::Module_compressibilite_equivalent(..\n"; + Sortie(1); + }; + #endif + // on récupère le premier élément du tableau uniquement + K_sortie = tab_val(1); + }; + }; + }; + + // retour du module + double K= K_sortie/3.; + return K; + }; + // =========== METHODES Protégées dérivant de virtuelles : ============== @@ -232,7 +1098,32 @@ void IsoHyper3DFavier3::Ecriture_base_info_loi(ofstream& sort,const int cas) // ou très proche de 0 double IsoHyper3DFavier3::PoGrenoble (const double & Qeps,const Invariant & inv) - { // des variables intermédiaires + { // calcul éventuelle des paramètres de la loi + if (K_nD != NULL) + {K = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (Qor_nD != NULL) + {Qor = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (Qor_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mur_nD != NULL) + {mur = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mur_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mu_inf_nD != NULL) + {mu_inf = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mu_inf_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + // sauvegarde éventuelle des paramètres matériau + SaveResulIsoHyper3DFavier3 & save_resul = *((SaveResulIsoHyper3DFavier3*) saveResul); + if (save_resul.para_loi != NULL) + {(*save_resul.para_loi)(1) = K; + (*save_resul.para_loi)(2) = Qor; + (*save_resul.para_loi)(3) = mur; + (*save_resul.para_loi)(4) = mu_inf; + }; + // des variables intermédiaires double a = Qor/2./mur; double co1 = Qor*a; double co2 = Qeps/a ; @@ -260,7 +1151,33 @@ double IsoHyper3DFavier3::PoGrenoble // calcul du potentiel tout seul avec la phase donc dans le cas où Qeps est non nul double IsoHyper3DFavier3::PoGrenoble (const Invariant0QepsCosphi & inv_spec,const Invariant & inv) - { // dans le cas de l'existence de la phase, on modifie Qr et muinf + { // calcul éventuelle des paramètres de la loi + if (K_nD != NULL) + {K = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (Qor_nD != NULL) + {Qor = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (Qor_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mur_nD != NULL) + {mur = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mur_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mu_inf_nD != NULL) + {mu_inf = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mu_inf_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + // sauvegarde éventuelle des paramètres matériau + SaveResulIsoHyper3DFavier3 & save_resul = *((SaveResulIsoHyper3DFavier3*) saveResul); + if (save_resul.para_loi != NULL) + {(*save_resul.para_loi)(1) = K; + (*save_resul.para_loi)(2) = Qor; + (*save_resul.para_loi)(3) = mur; + (*save_resul.para_loi)(4) = mu_inf; + }; + + // dans le cas de l'existence de la phase, on modifie Qr et muinf double bmuinf,bQr,muinfF,Qr; if (avec_phase) {bmuinf = (1.+gamma_mu_inf*inv_spec.cos3phi); @@ -303,7 +1220,32 @@ double IsoHyper3DFavier3::PoGrenoble // ou très proche de 0, et de sa variation suivant V uniquement Hyper3D::PoGrenoble_V IsoHyper3DFavier3::PoGrenoble_et_V (const double & Qeps,const Invariant & inv) - { PoGrenoble_V ret; + { // calcul éventuelle des paramètres de la loi + if (K_nD != NULL) + {K = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (Qor_nD != NULL) + {Qor = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (Qor_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mur_nD != NULL) + {mur = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mur_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mu_inf_nD != NULL) + {mu_inf = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mu_inf_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + // sauvegarde éventuelle des paramètres matériau + SaveResulIsoHyper3DFavier3 & save_resul = *((SaveResulIsoHyper3DFavier3*) saveResul); + if (save_resul.para_loi != NULL) + {(*save_resul.para_loi)(1) = K; + (*save_resul.para_loi)(2) = Qor; + (*save_resul.para_loi)(3) = mur; + (*save_resul.para_loi)(4) = mu_inf; + }; + PoGrenoble_V ret; // des variables intermédiaires double a = Qor/2./mur; double co1 = Qor*a; @@ -334,7 +1276,32 @@ Hyper3D::PoGrenoble_V IsoHyper3DFavier3::PoGrenoble_et_V // calcul du potentiel et de sa variation suivant V uniquement Hyper3D::PoGrenoble_V IsoHyper3DFavier3::PoGrenoble_et_V (const Invariant0QepsCosphi & inv_spec,const Invariant & inv) - { Hyper3D::PoGrenoble_V ret; + { // calcul éventuelle des paramètres de la loi + if (K_nD != NULL) + {K = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (Qor_nD != NULL) + {Qor = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (Qor_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mur_nD != NULL) + {mur = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mur_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mu_inf_nD != NULL) + {mu_inf = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mu_inf_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + // sauvegarde éventuelle des paramètres matériau + SaveResulIsoHyper3DFavier3 & save_resul = *((SaveResulIsoHyper3DFavier3*) saveResul); + if (save_resul.para_loi != NULL) + {(*save_resul.para_loi)(1) = K; + (*save_resul.para_loi)(2) = Qor; + (*save_resul.para_loi)(3) = mur; + (*save_resul.para_loi)(4) = mu_inf; + }; + Hyper3D::PoGrenoble_V ret; // dans le cas de l'existence de la phase, on modifie Qr et muinf double bmuinf,bQr,muinfF,Qr; if (avec_phase) @@ -380,7 +1347,32 @@ Hyper3D::PoGrenoble_V IsoHyper3DFavier3::PoGrenoble_et_V // ou très proche de 0, et de ses variations première et seconde suivant V uniquement Hyper3D::PoGrenoble_VV IsoHyper3DFavier3::PoGrenoble_et_VV (const double & Qeps,const Invariant & inv) - { PoGrenoble_VV ret; + { // calcul éventuelle des paramètres de la loi + if (K_nD != NULL) + {K = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (Qor_nD != NULL) + {Qor = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (Qor_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mur_nD != NULL) + {mur = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mur_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mu_inf_nD != NULL) + {mu_inf = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mu_inf_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + // sauvegarde éventuelle des paramètres matériau + SaveResulIsoHyper3DFavier3 & save_resul = *((SaveResulIsoHyper3DFavier3*) saveResul); + if (save_resul.para_loi != NULL) + {(*save_resul.para_loi)(1) = K; + (*save_resul.para_loi)(2) = Qor; + (*save_resul.para_loi)(3) = mur; + (*save_resul.para_loi)(4) = mu_inf; + }; + PoGrenoble_VV ret; // des variables intermédiaires double a = Qor/2./mur; double co1 = Qor*a; @@ -413,7 +1405,32 @@ Hyper3D::PoGrenoble_VV IsoHyper3DFavier3::PoGrenoble_et_VV // calcul du potentiel et de sa variation première et seconde suivant V uniquement Hyper3D::PoGrenoble_VV IsoHyper3DFavier3::PoGrenoble_et_VV (const Invariant0QepsCosphi & inv_spec,const Invariant & inv) - { Hyper3D::PoGrenoble_VV ret; + { // calcul éventuelle des paramètres de la loi + if (K_nD != NULL) + {K = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (Qor_nD != NULL) + {Qor = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (Qor_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mur_nD != NULL) + {mur = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mur_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mu_inf_nD != NULL) + {mu_inf = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mu_inf_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + // sauvegarde éventuelle des paramètres matériau + SaveResulIsoHyper3DFavier3 & save_resul = *((SaveResulIsoHyper3DFavier3*) saveResul); + if (save_resul.para_loi != NULL) + {(*save_resul.para_loi)(1) = K; + (*save_resul.para_loi)(2) = Qor; + (*save_resul.para_loi)(3) = mur; + (*save_resul.para_loi)(4) = mu_inf; + }; + Hyper3D::PoGrenoble_VV ret; // dans le cas de l'existence de la phase, on modifie Qr et muinf double bmuinf,bQr,muinfF,Qr; if (avec_phase) @@ -460,7 +1477,32 @@ Hyper3D::PoGrenoble_VV IsoHyper3DFavier3::PoGrenoble_et_VV // calcul du potentiel et de ses dérivées non compris la phase Hyper3D::PoGrenobleSansPhaseSansVar IsoHyper3DFavier3::PoGrenoble (const InvariantQeps & inv_spec,const Invariant & inv) - { PoGrenobleSansPhaseSansVar ret; + { // calcul éventuelle des paramètres de la loi + if (K_nD != NULL) + {K = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (Qor_nD != NULL) + {Qor = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (Qor_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mur_nD != NULL) + {mur = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mur_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mu_inf_nD != NULL) + {mu_inf = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mu_inf_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + // sauvegarde éventuelle des paramètres matériau + SaveResulIsoHyper3DFavier3 & save_resul = *((SaveResulIsoHyper3DFavier3*) saveResul); + if (save_resul.para_loi != NULL) + {(*save_resul.para_loi)(1) = K; + (*save_resul.para_loi)(2) = Qor; + (*save_resul.para_loi)(3) = mur; + (*save_resul.para_loi)(4) = mu_inf; + }; + PoGrenobleSansPhaseSansVar ret; // des variables intermédiaires double a = Qor/2./mur; double co1 = Qor*a; @@ -503,7 +1545,32 @@ Hyper3D::PoGrenobleSansPhaseSansVar IsoHyper3DFavier3::PoGrenoble // calcul du potentiel et de ses dérivées avec la phase Hyper3D::PoGrenobleAvecPhaseSansVar IsoHyper3DFavier3::PoGrenoblePhase (const InvariantQepsCosphi& inv_spec,const Invariant & inv) - { PoGrenobleAvecPhaseSansVar ret; + { // calcul éventuelle des paramètres de la loi + if (K_nD != NULL) + {K = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (Qor_nD != NULL) + {Qor = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (Qor_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mur_nD != NULL) + {mur = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mur_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mu_inf_nD != NULL) + {mu_inf = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mu_inf_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + // sauvegarde éventuelle des paramètres matériau + SaveResulIsoHyper3DFavier3 & save_resul = *((SaveResulIsoHyper3DFavier3*) saveResul); + if (save_resul.para_loi != NULL) + {(*save_resul.para_loi)(1) = K; + (*save_resul.para_loi)(2) = Qor; + (*save_resul.para_loi)(3) = mur; + (*save_resul.para_loi)(4) = mu_inf; + }; + PoGrenobleAvecPhaseSansVar ret; // dans le cas de l'existence de la phase, on modifie Qr et muinf double bmuinf,bQr,muinfF,Qr; if (avec_phase) @@ -567,7 +1634,32 @@ Hyper3D::PoGrenobleAvecPhaseSansVar IsoHyper3DFavier3::PoGrenoblePhase // calcul du potentiel sans phase et dérivées avec ses variations par rapport aux invariants Hyper3D::PoGrenobleSansPhaseAvecVar IsoHyper3DFavier3::PoGrenoble_et_var (const Invariant2Qeps& inv_spec,const Invariant & inv) - { PoGrenobleSansPhaseAvecVar ret; + { // calcul éventuelle des paramètres de la loi + if (K_nD != NULL) + {K = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (Qor_nD != NULL) + {Qor = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (Qor_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mur_nD != NULL) + {mur = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mur_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mu_inf_nD != NULL) + {mu_inf = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mu_inf_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + // sauvegarde éventuelle des paramètres matériau + SaveResulIsoHyper3DFavier3 & save_resul = *((SaveResulIsoHyper3DFavier3*) saveResul); + if (save_resul.para_loi != NULL) + {(*save_resul.para_loi)(1) = K; + (*save_resul.para_loi)(2) = Qor; + (*save_resul.para_loi)(3) = mur; + (*save_resul.para_loi)(4) = mu_inf; + }; + PoGrenobleSansPhaseAvecVar ret; // des variables intermédiaires double a = Qor/2./mur; double co1 = Qor*a; @@ -636,7 +1728,32 @@ Hyper3D::PoGrenobleSansPhaseAvecVar IsoHyper3DFavier3::PoGrenoble_et_var // calcul du potentiel avec phase et dérivées avec ses variations par rapport aux invariants Hyper3D::PoGrenobleAvecPhaseAvecVar IsoHyper3DFavier3::PoGrenoblePhase_et_var (const Invariant2QepsCosphi& inv_spec,const Invariant & inv) - { Hyper3D::PoGrenobleAvecPhaseAvecVar ret; + { // calcul éventuelle des paramètres de la loi + if (K_nD != NULL) + {K = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (Qor_nD != NULL) + {Qor = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (Qor_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mur_nD != NULL) + {mur = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mur_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mu_inf_nD != NULL) + {mu_inf = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mu_inf_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + // sauvegarde éventuelle des paramètres matériau + SaveResulIsoHyper3DFavier3 & save_resul = *((SaveResulIsoHyper3DFavier3*) saveResul); + if (save_resul.para_loi != NULL) + {(*save_resul.para_loi)(1) = K; + (*save_resul.para_loi)(2) = Qor; + (*save_resul.para_loi)(3) = mur; + (*save_resul.para_loi)(4) = mu_inf; + }; + Hyper3D::PoGrenobleAvecPhaseAvecVar ret; // dans le cas de l'existence de la phase, on modifie Qr et muinf double bmuinf,bQr,muinfF,Qr; if (avec_phase) @@ -752,7 +1869,32 @@ Hyper3D::PoGrenobleAvecPhaseAvecVar IsoHyper3DFavier3::PoGrenoblePhase_et_var void IsoHyper3DFavier3::Verif_PoGrenoble_et_var (const double & Qeps,const Invariant & inv ,const PoGrenobleSansPhaseAvecVar& potret ) - { // dans le cas du premier passage on indique qu'il y a vérification + { // calcul éventuelle des paramètres de la loi + if (K_nD != NULL) + {K = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (Qor_nD != NULL) + {Qor = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (Qor_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mur_nD != NULL) + {mur = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mur_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mu_inf_nD != NULL) + {mu_inf = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mu_inf_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + // sauvegarde éventuelle des paramètres matériau + SaveResulIsoHyper3DFavier3 & save_resul = *((SaveResulIsoHyper3DFavier3*) saveResul); + if (save_resul.para_loi != NULL) + {(*save_resul.para_loi)(1) = K; + (*save_resul.para_loi)(2) = Qor; + (*save_resul.para_loi)(3) = mur; + (*save_resul.para_loi)(4) = mu_inf; + }; + // dans le cas du premier passage on indique qu'il y a vérification if (indic_Verif_PoGrenoble_et_var == 0) { cout << "\n ****vérification des dérivées du potentiels par rapport aux invariants****"; cout << "\n IsoHyper3DFavier3::Verif_PoGrenoble_et_var \n"; @@ -849,7 +1991,32 @@ void IsoHyper3DFavier3::Verif_PoGrenoble_et_var void IsoHyper3DFavier3::Verif_PoGrenoble_et_var (const double & Qeps,const Invariant & inv,const double& cos3phi ,const PoGrenobleAvecPhaseAvecVar& potret ) - { // dans le cas du premier passage on indique qu'il y a vérification + { // calcul éventuelle des paramètres de la loi + if (K_nD != NULL) + {K = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (Qor_nD != NULL) + {Qor = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (Qor_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mur_nD != NULL) + {mur = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mur_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + if (mu_inf_nD != NULL) + {mu_inf = (Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mu_inf_nD,1,ex_impli_hyper,ex_expli_tdt_hyper,ex_umat_hyper))(1); + }; + // sauvegarde éventuelle des paramètres matériau + SaveResulIsoHyper3DFavier3 & save_resul = *((SaveResulIsoHyper3DFavier3*) saveResul); + if (save_resul.para_loi != NULL) + {(*save_resul.para_loi)(1) = K; + (*save_resul.para_loi)(2) = Qor; + (*save_resul.para_loi)(3) = mur; + (*save_resul.para_loi)(4) = mu_inf; + }; + // dans le cas du premier passage on indique qu'il y a vérification if (indic_Verif_PoGrenoble_et_var == 0) { cout << "\n ****vérification des dérivées du potentiels par rapport aux invariants****"; cout << "\n IsoHyper3DFavier3::Verif_PoGrenoble_et_var \n"; diff --git a/comportement/Hyper_elastique/IsoHyper3DFavier3.h b/comportement/Hyper_elastique/IsoHyper3DFavier3.h index 864627a..53863b8 100644 --- a/comportement/Hyper_elastique/IsoHyper3DFavier3.h +++ b/comportement/Hyper_elastique/IsoHyper3DFavier3.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -64,8 +64,7 @@ /// -class IsoHyper3DFavier3 : - public Hyper3D +class IsoHyper3DFavier3 : public Hyper3D { public : // VARIABLES PUBLIQUES : @@ -78,9 +77,92 @@ class IsoHyper3DFavier3 : // DESTRUCTEUR : ~IsoHyper3DFavier3 () {}; - -// Lecture des donnees de la classe sur fichier -void LectureDonneesParticulieres (UtilLecture * ,LesCourbes1D& lesCourbes1D + + // initialise les donnees particulieres a l'elements + // de matiere traite ( c-a-dire au pt calcule) + // Il y a creation d'une instance de SaveResul particuliere + // a la loi concernee + // la SaveResul classe est remplie par les instances heritantes + // le pointeur de SaveResul est sauvegarde au niveau de l'element + // c'a-d que les info particulieres au point considere sont stocke + // au niveau de l'element et non de la loi. + class SaveResulIsoHyper3DFavier3: public SaveResulHyperD + { public : + SaveResulIsoHyper3DFavier3(bool avec_para = false); // constructeur par défaut : + SaveResulIsoHyper3DFavier3(const SaveResulIsoHyper3DFavier3& sav); // de copie + virtual ~SaveResulIsoHyper3DFavier3(); // destructeur + // définition d'une nouvelle instance identique + // appelle du constructeur via new + virtual SaveResul * Nevez_SaveResul() const{return (new SaveResulIsoHyper3DFavier3(*this));}; + // affectation + virtual SaveResul & operator = ( const SaveResul & a); + //============= lecture écriture dans base info ========== + // cas donne le niveau de la récupération + // = 1 : on récupère tout + // = 2 : on récupère uniquement les données variables (supposées comme telles) + virtual void Lecture_base_info (ifstream& ent,const int cas); + // cas donne le niveau de sauvegarde + // = 1 : on sauvegarde tout + // = 2 : on sauvegarde uniquement les données variables (supposées comme telles) + virtual void Ecriture_base_info(ofstream& sort,const int cas); + + // mise à jour des informations transitoires + virtual void TdtversT(); + virtual void TversTdt(); + + // affichage à l'écran des infos + virtual void Affiche() const; + + //changement de base de toutes les grandeurs internes tensorielles stockées + // beta(i,j) represente les coordonnees de la nouvelle base naturelle gpB dans l'ancienne gB + // gpB(i) = beta(i,j) * gB(j), i indice de ligne, j indice de colonne + // gpH(i) = gamma(i,j) * gH(j) + virtual void ChBase_des_grandeurs(const Mat_pleine& beta,const Mat_pleine& gamma) + {SaveResulHyperD::ChBase_des_grandeurs(beta,gamma);}; + + // procedure permettant de completer éventuellement les données particulières + // de la loi stockées + // au niveau du point d'intégration par exemple: exemple: un repère d'anisotropie + // completer est appelé apres sa creation avec les donnees du bloc transmis + // peut etre appeler plusieurs fois + virtual SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor + ,const Loi_comp_abstraite* loi) + {return SaveResulHyperD::Complete_SaveResul(bloc,tab_coor,loi);}; + + + //------------------------------------------------------------------- + // données: les paramètres matériaux réellement utilisés + //------------------------------------------------------------------- + // les 4 paramètres de la loi dans l'ordre suivant + // double K,Qor,mur,mu_inf; // paramètres de la loi + // ces paramètres ne sont définis "que si" on a une ou plusieurs fct nD + // de manière à optimiser la place mémoire + Vecteur *para_loi, *para_loi_t; +// double K,K_t; // module +// double Qor,Qor_t; // seuil +// double mur,mur_t; // pente à l'origine +// double mu_inf,mu_inf_t; // pente à l'infini + + + // ---- fin gestion d'une liste de grandeurs quelconques éventuelles --- + }; + + virtual SaveResul * New_et_Initialise() + { bool avec_para = false; + if ( (K_nD != NULL) || (Qor_nD != NULL) + || (mur_nD != NULL) || (mu_inf_nD != NULL) + ) + avec_para = true; + SaveResulIsoHyper3DFavier3 * pt = new SaveResulIsoHyper3DFavier3(avec_para); + // insertion éventuelle de conteneurs de grandeurs quelconque + Insertion_conteneur_dans_save_result(pt); + return pt; + }; + + friend class SaveResulIsoHyper3DFavier3; + + // Lecture des donnees de la classe sur fichier + void LectureDonneesParticulieres (UtilLecture * ,LesCourbes1D& lesCourbes1D ,LesFonctions_nD& lesFonctionsnD); // affichage de la loi @@ -100,16 +182,24 @@ void LectureDonneesParticulieres (UtilLecture * ,LesCourbes1D& lesCourbes1D // = 1 : on sauvegarde tout // = 2 : on sauvegarde uniquement les données variables (supposées comme telles) void Ecriture_base_info_loi(ofstream& sort,const int cas); - + + // récupération des grandeurs particulière (hors ddl ) + // correspondant à liTQ + // absolue: indique si oui ou non on sort les tenseurs dans la base absolue ou une base particulière + virtual void Grandeur_particuliere + (bool absolue,List_io& ,Loi_comp_abstraite::SaveResul * ,list& decal) const ; + // récupération de la liste de tous les grandeurs particulières + // ces grandeurs sont ajoutées à la liste passées en paramètres + // absolue: indique si oui ou non on sort les tenseurs dans la base absolue ou une base particulière + virtual void ListeGrandeurs_particulieres(bool absolue,List_io& ) const; + // calcul d'un module d'young équivalent à la loi, ceci pour un // chargement nul - double Module_young_equivalent(Enum_dure ,const Deformation & ,SaveResul * ) - { return (9.*K*(mur+mu_inf)/((mur+mu_inf)+3.*K)); - }; - // récupération d'un module de compressibilité équivalent à la loi, ceci pour un chargement nul + double Module_young_equivalent(Enum_dure temps,const Deformation & def,SaveResul * saveDon); + + // récupération d'un module de compressibilité équivalent à la loi, // il s'agit ici de la relation -pression = sigma_trace/3. = module de compressibilité * I_eps - double Module_compressibilite_equivalent(Enum_dure ,const Deformation & def) - { return K/3.;}; + double Module_compressibilite_equivalent(Enum_dure temps,const Deformation & def,SaveResul * saveDon); // récupération de la variation relative d'épaisseur calculée: h/h0 // cette variation n'est utile que pour des lois en contraintes planes @@ -173,19 +263,23 @@ protected : double mu_inf; // pente à l'infini double nQor,gammaQor; // paramètres de phase pour Qor double n_mu_inf,gamma_mu_inf; // paramètre de phase pour mu_inf - + // cas d'une dépendance à une fonction nD + // -- bien voir que dans ce cas on peut obtenir n'importe quoi, c'est de la responsabilité + // de l'utilisateur de savoir se qu'il fait + Fonction_nD * K_nD, * Qor_nD, * mur_nD, * mu_inf_nD; + static double limite_co2; // limite à partir de laquelle on considère que cosh(co2) = infini -///=============== fonctions pour la vérification et la mise au point =============== - - // vérif des dérivées du potentiels par rapport aux invariants, ceci par différences finies -void Verif_PoGrenoble_et_var(const double & Qeps,const Invariant & inv - ,const PoGrenobleSansPhaseAvecVar& potret ); - // idem mais avec la phase -void Verif_PoGrenoble_et_var(const double & Qeps,const Invariant & inv,const double& cos3phi - ,const PoGrenobleAvecPhaseAvecVar& potret ); + ///=============== fonctions pour la vérification et la mise au point =============== + + // vérif des dérivées du potentiels par rapport aux invariants, ceci par différences finies + void Verif_PoGrenoble_et_var(const double & Qeps,const Invariant & inv + ,const PoGrenobleSansPhaseAvecVar& potret ); + // idem mais avec la phase + void Verif_PoGrenoble_et_var(const double & Qeps,const Invariant & inv,const double& cos3phi + ,const PoGrenobleAvecPhaseAvecVar& potret ); -static int indic_Verif_PoGrenoble_et_var; // indicateur utilisé par Verif_Potentiel_et_var + static int indic_Verif_PoGrenoble_et_var; // indicateur utilisé par Verif_Potentiel_et_var }; /// @} // end of group diff --git a/comportement/Hyper_elastique/IsoHyper3DOrgeas1.cc b/comportement/Hyper_elastique/IsoHyper3DOrgeas1.cc index 73e9db8..35f6dc4 100644 --- a/comportement/Hyper_elastique/IsoHyper3DOrgeas1.cc +++ b/comportement/Hyper_elastique/IsoHyper3DOrgeas1.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/IsoHyper3DOrgeas1.h b/comportement/Hyper_elastique/IsoHyper3DOrgeas1.h index 5336636..6c911ac 100644 --- a/comportement/Hyper_elastique/IsoHyper3DOrgeas1.h +++ b/comportement/Hyper_elastique/IsoHyper3DOrgeas1.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/IsoHyper3DOrgeas2.cc b/comportement/Hyper_elastique/IsoHyper3DOrgeas2.cc index 39564c0..0378a40 100644 --- a/comportement/Hyper_elastique/IsoHyper3DOrgeas2.cc +++ b/comportement/Hyper_elastique/IsoHyper3DOrgeas2.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -1354,9 +1354,9 @@ double IsoHyper3DOrgeas2::PoGrenoble switch (cas_Q0s_thermo_dependant) {case 1:// cas d'une dépendance à la température selon fct laurent { if ((*temperature) >= Tc) - {Qs = Q0sT=0.5*Gr*( ((*temperature)-Tc+Ts)-sqrt(Sqr((*temperature)-Tc+Ts) + ar*ar)) + Qrmax;} + {Qs = Q0sT=0.5*Gr*( ((*temperature)-Tc+Ts)-sqrt(Sqr((*temperature)-Tc+Ts) + ar*ar)) + Qrmax;} else - {Qs = Q0sT=0.5*Gr*( ((*temperature)-Tc-Ts)+sqrt(Sqr((*temperature)-Tc-Ts) + ar*ar));}; + {Qs = Q0sT=0.5*Gr*( ((*temperature)-Tc-Ts)+sqrt(Sqr((*temperature)-Tc-Ts) + ar*ar));}; break; } case 2:// cas d'une dépendance à la température selon une fonction d'évolution diff --git a/comportement/Hyper_elastique/IsoHyper3DOrgeas2.h b/comportement/Hyper_elastique/IsoHyper3DOrgeas2.h index 28e7687..c4de93e 100644 --- a/comportement/Hyper_elastique/IsoHyper3DOrgeas2.h +++ b/comportement/Hyper_elastique/IsoHyper3DOrgeas2.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/IsoHyperBulk3.cc b/comportement/Hyper_elastique/IsoHyperBulk3.cc index 76af3eb..e11aae2 100644 --- a/comportement/Hyper_elastique/IsoHyperBulk3.cc +++ b/comportement/Hyper_elastique/IsoHyperBulk3.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/IsoHyperBulk3.h b/comportement/Hyper_elastique/IsoHyperBulk3.h index 4f490aa..38d4e57 100644 --- a/comportement/Hyper_elastique/IsoHyperBulk3.h +++ b/comportement/Hyper_elastique/IsoHyperBulk3.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/IsoHyperBulk_gene.cc b/comportement/Hyper_elastique/IsoHyperBulk_gene.cc index 3a27403..2ef56d8 100755 --- a/comportement/Hyper_elastique/IsoHyperBulk_gene.cc +++ b/comportement/Hyper_elastique/IsoHyperBulk_gene.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/IsoHyperBulk_gene.h b/comportement/Hyper_elastique/IsoHyperBulk_gene.h index 24f70b4..2d6205f 100755 --- a/comportement/Hyper_elastique/IsoHyperBulk_gene.h +++ b/comportement/Hyper_elastique/IsoHyperBulk_gene.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/Maheo_hyper.cc b/comportement/Hyper_elastique/Maheo_hyper.cc index 5dd1158..4b0473f 100755 --- a/comportement/Hyper_elastique/Maheo_hyper.cc +++ b/comportement/Hyper_elastique/Maheo_hyper.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -43,19 +43,24 @@ using namespace std; //introduces namespace std #include "Maheo_hyper.h" #include "MathUtil.h" +#include "Enum_TypeQuelconque.h" +#include "TypeQuelconqueParticulier.h" + + Maheo_hyper::Maheo_hyper () : // Constructeur par defaut Hyper_W_gene_3D(MAHEO_HYPER,CAT_MECANIQUE,3) ,Qsig_rev(-ConstMath::trespetit) , mu1_rev(-ConstMath::trespetit) ,mu2_rev(-ConstMath::trespetit) + ,Qsig_use(0.), mu1_use(0.),mu2_use(0.) // recalculés avant chaque utilisation + ,Qsig_nD(NULL),mu1_nD(NULL),mu2_nD(NULL) ,fact_regularisation(ConstMath::pasmalpetit) ,Qsig_rev_temperature(NULL),mu1_rev_temperature(NULL),mu2_rev_temperature(NULL) ,W_d(0.),W_v(0.) ,W_d_J1(0.),W_d_J2(0.),W_v_J3(0.),W_v_J3J3(0.) ,W_d_J1_2(0.),W_d_J1_J2(0.),W_d_J2_2(0.) - { }; - + {nb_para_loi = 3; }; // Constructeur de copie Maheo_hyper::Maheo_hyper (const Maheo_hyper& loi) : @@ -63,15 +68,17 @@ Maheo_hyper::Maheo_hyper (const Maheo_hyper& loi) : ,Qsig_rev(loi.Qsig_rev) , mu1_rev(loi.mu1_rev) ,mu2_rev(loi.mu2_rev) + ,Qsig_use(0.), mu1_use(0.),mu2_use(0.) // recalculés avant chaque utilisation ,Qsig_rev_temperature(loi.Qsig_rev_temperature) ,mu1_rev_temperature(loi.mu1_rev_temperature) ,mu2_rev_temperature(loi.mu2_rev_temperature) + ,Qsig_nD(loi.Qsig_nD),mu1_nD(loi.mu1_nD),mu2_nD(loi.mu2_nD) ,fact_regularisation(loi.fact_regularisation) ,W_d(loi.W_d),W_v(loi.W_v) ,W_d_J1(loi.W_d_J1),W_d_J2(loi.W_d_J2),W_v_J3(loi.W_v_J3),W_v_J3J3(loi.W_v_J3J3) ,W_d_J1_2(loi.W_d_J1_2),W_d_J1_J2(loi.W_d_J1_J2),W_d_J2_2(loi.W_d_J2_2) - {// on regarde s'il s'agit de courbes locales ou de courbes globales - + { nb_para_loi = 3; // nb paramètres de la loi + // on regarde s'il s'agit de courbes locales ou de courbes globales if (Qsig_rev_temperature != NULL) if (Qsig_rev_temperature->NomCourbe() == "_") Qsig_rev_temperature = Courbe1D::New_Courbe1D(*(loi.Qsig_rev_temperature)); @@ -81,6 +88,26 @@ Maheo_hyper::Maheo_hyper (const Maheo_hyper& loi) : if (mu2_rev_temperature != NULL) if (mu2_rev_temperature->NomCourbe() == "_") mu2_rev_temperature = Courbe1D::New_Courbe1D(*(loi.mu2_rev_temperature)); + + // idem pour les fonctions nD + if (Qsig_nD != NULL) + if (Qsig_nD->NomFonction() == "_") + {// comme il s'agit d'une fonction locale on la redéfinie (sinon pb lors du destructeur de loi) + string non_courbe("_"); + Qsig_nD = Fonction_nD::New_Fonction_nD(*loi.Qsig_nD); + }; + if (mu1_nD != NULL) + if (mu1_nD->NomFonction() == "_") + {// comme il s'agit d'une fonction locale on la redéfinie (sinon pb lors du destructeur de loi) + string non_courbe("_"); + mu1_nD = Fonction_nD::New_Fonction_nD(*loi.mu1_nD); + }; + if (mu2_nD != NULL) + if (mu2_nD->NomFonction() == "_") + {// comme il s'agit d'une fonction locale on la redéfinie (sinon pb lors du destructeur de loi) + string non_courbe("_"); + mu2_nD = Fonction_nD::New_Fonction_nD(*loi.mu2_nD); + }; }; Maheo_hyper::~Maheo_hyper () @@ -91,6 +118,10 @@ Maheo_hyper::~Maheo_hyper () if (mu1_rev_temperature->NomCourbe() == "_") delete mu1_rev_temperature; if (mu2_rev_temperature != NULL) if (mu2_rev_temperature->NomCourbe() == "_") delete mu2_rev_temperature; + // idem pour les fonctions nD + if (Qsig_nD != NULL) if (Qsig_nD->NomFonction() == "_") delete Qsig_nD; + if (mu1_nD != NULL) if (mu1_nD->NomFonction() == "_") delete mu1_nD; + if (mu2_nD != NULL) if (mu2_nD->NomFonction() == "_") delete mu2_nD; }; // Lecture des donnees de la classe sur fichier @@ -108,6 +139,7 @@ void Maheo_hyper::LectureDonneesParticulieres entreePrinc->Lecture_et_verif_mot_cle(nom_class_methode,mot_cle); // lecture de la loi d'évolution Qsig_rev_temperature = Lecture_courbe(entreePrinc,lesCourbes1D); + thermo_dependant=true; // on indique que la loi est thermo-dépendant } else *(entreePrinc->entree) >> Qsig_rev ; @@ -119,7 +151,8 @@ void Maheo_hyper::LectureDonneesParticulieres { mot_cle = "mu1_rev_temperature_"; entreePrinc->Lecture_et_verif_mot_cle(nom_class_methode,mot_cle); // lecture de la loi d'évolution - Qsig_rev_temperature = Lecture_courbe(entreePrinc,lesCourbes1D); + mu1_rev_temperature = Lecture_courbe(entreePrinc,lesCourbes1D); + thermo_dependant=true; // on indique que la loi est thermo-dépendant } else *(entreePrinc->entree) >> mu1_rev; @@ -131,10 +164,180 @@ void Maheo_hyper::LectureDonneesParticulieres { mot_cle = "mu2_rev_temperature_"; entreePrinc->Lecture_et_verif_mot_cle(nom_class_methode,mot_cle); // lecture de la loi d'évolution - Qsig_rev_temperature = Lecture_courbe(entreePrinc,lesCourbes1D); + mu2_rev_temperature = Lecture_courbe(entreePrinc,lesCourbes1D); + thermo_dependant=true; // on indique que la loi est thermo-dépendant } else - *(entreePrinc->entree) >> mu2_rev; + {*(entreePrinc->entree) >> mu2_rev; + // s'il n'y a plus rien n'a lire, il faut passer un enregistrement + if((strstr(entreePrinc->tablcar,"avec_regularisation_")==0) + && (strstr(entreePrinc->tablcar,"avec_nD_")==0) + ) + entreePrinc->NouvelleDonnee(); + }; + + // -------- on regarde s'il y a une dépendance à une fonction nD + if (strstr(entreePrinc->tablcar,"avec_nD_")!=NULL) + { string nom1,nom2; + // lecture des fonctions nD + entreePrinc->NouvelleDonnee(); // passage d'une ligne + + // on lit tant que l'on ne rencontre pas la ligne contenant "fin_parametres_avec_nD_" + // ou un nouveau mot clé global auquel cas il y a pb !! + MotCle motCle; // ref aux mots cle + while (strstr(entreePrinc->tablcar,"fin_parametres_avec_nD_")==0) + { + // si on a un mot clé global dans la ligne courante c-a-d dans tablcar --> erreur + if ( motCle.SimotCle(entreePrinc->tablcar)) + { cout << "\n erreur de lecture des parametre de dependance a une fonction nD: on n'a pas trouve le mot cle " + << " fin_parametres_avec_nD_ et par contre la ligne courante contient un mot cle global "; + entreePrinc->MessageBuffer + ("** erreur51 des parametres de reglage de la loi de comportement Maheo_hyper**"); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + + // lecture d'un mot clé + *(entreePrinc->entree) >> nom1; + + if ((entreePrinc->entree)->rdstate() == 0) + {} // lecture normale + #ifdef ENLINUX + else if ((entreePrinc->entree)->fail()) + // on a atteind la fin de la ligne et on appelle un nouvel enregistrement + { entreePrinc->NouvelleDonnee(); // lecture d'un nouvelle enregistrement + *(entreePrinc->entree) >>nom1; + } + #else + else if ((entreePrinc->entree)->eof()) + // la lecture est bonne mais on a atteind la fin de la ligne + { if(nom1 != "fin_parametres_avec_nD_") + {entreePrinc->NouvelleDonnee(); *(entreePrinc->entree) >> nom1;}; + } + #endif + else // cas d'une erreur de lecture + { cout << "\n erreur de lecture inconnue "; + entreePrinc->MessageBuffer + ("** erreur61 des parametres de reglage de la loi de comportement Maheo_hyper**"); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + + if(nom1 == "Qsig_nD=") + {string nom_fonct; + // lecture du nom de la fonction + *(entreePrinc->entree) >> nom_fonct; + + // maintenant on définit la fonction + if (lesFonctionsnD.Existe(nom_fonct)) + {Qsig_nD = lesFonctionsnD.Trouve(nom_fonct); + } + else + {// sinon il faut la lire maintenant + string non("_"); + Qsig_nD = Fonction_nD::New_Fonction_nD(non, Id_Nom_Fonction_nD(nom_fonct)); + // lecture de la fonction + Qsig_nD->LectDonnParticulieres_Fonction_nD (non,entreePrinc); + // maintenant on vérifie que la fonction est utilisable + if (Qsig_nD->NbComposante() != 1 ) + { cout << "\n erreur en lecture, la fonction " << nom_fonct + << " est une fonction vectorielle a " << Qsig_nD->NbComposante() + << " composante alors qu'elle devrait etre scalaire ! " + << " elle n'est donc pas utilisable !! "; + string message("\n**erreur031** \n"+nom_class_methode+"(..."); + entreePrinc->MessageBuffer(message); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; + // on regarde si la fonction nD intègre la température + const Tableau & tab_enu = Qsig_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + // prepa du flot de lecture + entreePrinc->NouvelleDonnee(); + } + else if(nom1 == "mu1_nD=") + {string nom_fonct; + // lecture du nom de la fonction + *(entreePrinc->entree) >> nom_fonct; + + // maintenant on définit la fonction + if (lesFonctionsnD.Existe(nom_fonct)) + {mu1_nD = lesFonctionsnD.Trouve(nom_fonct); + } + else + {// sinon il faut la lire maintenant + string non("_"); + mu1_nD = Fonction_nD::New_Fonction_nD(non, Id_Nom_Fonction_nD(nom_fonct)); + // lecture de la fonction + mu1_nD->LectDonnParticulieres_Fonction_nD (non,entreePrinc); + // maintenant on vérifie que la fonction est utilisable + if (mu1_nD->NbComposante() != 1 ) + { cout << "\n erreur en lecture, la fonction " << nom_fonct + << " est une fonction vectorielle a " << mu1_nD->NbComposante() + << " composante alors qu'elle devrait etre scalaire ! " + << " elle n'est donc pas utilisable !! "; + string message("\n**erreur031** \n"+nom_class_methode+"(..."); + entreePrinc->MessageBuffer(message); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; + // on regarde si la fonction nD intègre la température + const Tableau & tab_enu = mu1_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + // prepa du flot de lecture + entreePrinc->NouvelleDonnee(); + } + else if(nom1 == "mu2_nD=") + {string nom_fonct; + // lecture du nom de la fonction + *(entreePrinc->entree) >> nom_fonct; + + // maintenant on définit la fonction + if (lesFonctionsnD.Existe(nom_fonct)) + {mu2_nD = lesFonctionsnD.Trouve(nom_fonct); + } + else + {// sinon il faut la lire maintenant + string non("_"); + mu2_nD = Fonction_nD::New_Fonction_nD(non, Id_Nom_Fonction_nD(nom_fonct)); + // lecture de la fonction + mu2_nD->LectDonnParticulieres_Fonction_nD (non,entreePrinc); + // maintenant on vérifie que la fonction est utilisable + if (mu2_nD->NbComposante() != 1 ) + { cout << "\n erreur en lecture, la fonction " << nom_fonct + << " est une fonction vectorielle a " << mu2_nD->NbComposante() + << " composante alors qu'elle devrait etre scalaire ! " + << " elle n'est donc pas utilisable !! "; + string message("\n**erreur031** \n"+nom_class_methode+"(..."); + entreePrinc->MessageBuffer(message); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; + // on regarde si la fonction nD intègre la température + const Tableau & tab_enu = mu2_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + // prepa du flot de lecture + entreePrinc->NouvelleDonnee(); + } + else // cas d'une erreur + { cout << "\n erreur en lecture de la dependance a une fonction nD des coefficients, on aurait du lire " + << " le mot cle Qsig_nD= ou mu1_nD= ou mu2_nD= et on a lu: " + << nom1; + entreePrinc->MessageBuffer("**erreur7 Maheo_hyper::LectureDonneesParticulieres (...**"); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; //-- fin du while + entreePrinc->NouvelleDonnee(); // passage du mot clé "fin_parametres_avec_nD_" + + }; + // cas avec une régularisation éventuelle if (strstr(entreePrinc->tablcar,"avec_regularisation_")!=NULL) { mot_cle = "avec_regularisation_"; @@ -144,9 +347,9 @@ void Maheo_hyper::LectureDonneesParticulieres // lecture de l'indication éventuelle du post traitement string le_mot_cle = "sortie_post_"; - entreePrinc->Lecture_un_parametre_int(0,nom_class_methode,0,1,le_mot_cle,sortie_post); - - + if (entreePrinc->Lecture_un_parametre_int(0,nom_class_methode,0,1,le_mot_cle,sortie_post)) + entreePrinc->NouvelleDonnee(); // passage éventuel du mot clé sortie_post_; + // --- appel au niveau de la classe mère // ici il n'y a pas de type de déformation associé // mais on prend la def standart d'almansi, pour les fonctions associées éventuelles @@ -168,6 +371,28 @@ void Maheo_hyper::Affiche() const << " courbe mu2_rev=f(T): " << mu2_rev_temperature->NomCourbe() <<" ";} else { cout << " mu2_rev= " << mu2_rev << " ";}; + // les dépendances à une fonction nD + if (Qsig_nD) + {cout << " fonction nD Qsig_nD: "; + if (Qsig_nD->NomFonction() != "_") + cout << Qsig_nD->NomFonction(); + else + Qsig_nD->Affiche(); + }; + if (mu1_nD) + {cout << " fonction nD mu1_nD: "; + if (mu1_nD->NomFonction() != "_") + cout << mu1_nD->NomFonction(); + else + mu1_nD->Affiche(); + }; + if (mu2_nD) + {cout << " fonction nD mu2_nD: "; + if (mu2_nD->NomFonction() != "_") + cout << mu2_nD->NomFonction(); + else + mu2_nD->Affiche(); + }; // appel de la classe mère Loi_comp_abstraite::Affiche_don_classe_abstraite(); }; @@ -201,19 +426,47 @@ void Maheo_hyper::Info_commande_LoisDeComp(UtilLecture& entreePrinc) << "\n#------------------------------------------------------------------------------------" << "\n# noter qu'apres la definition de chaque courbe, on change de ligne, a l'inverse " << "\n# si la valeur du parametre est fixe, on poursuit sur la meme ligne. " - << "\n#------------------------------------------------------------------------------------" + << "\n#" + << "\n#--------------------- dependance explicite a une fonction nD -----------------------------------" + << "\n# il est egalement possible de definir une dependance des parametres a une fonction nD " + << "\n# dans ce cas, a la suite de la dependance explicite a la temperature via une courbr 1D " + << "\n# ou a la suite du dernier parametre fixe, on met le mot cle: avec_nD_ " + << "\n# puis sur les lignes qui suivent on met des fonctions nD multiplicatives des parametres " + << "\n# initiaux, puis un mot cle signalant la fin des fonctions: fin_parametres_avec_nD_ " + << "\n# suit un exemple de declaration (il est possible d'ommettre certaine fonction ! " + << "\n# la presence de fct nD est facultative), de meme il est possible soit d'utiliser une fonction " + << "\n# deja defini soit de donner directement la fonction nD (comme pour les autres lois) " + << "\n# Enfin, apres chaque definition de fonction il faut passer a une nouvelle ligne " + << "\n# " + << "\n# exemple de definition de loi" + << "\n# Qsig_rev= 1 mu1_rev= 1 mu2_rev= 1 avec_nD_ " + << "\n# Qsig_nD= fct_nD_1 " + << "\n# mu1_nD= fct_nD_2 " + << "\n# mu2_nD= fct_nD_3 " + << "\n# fin_parametres_avec_nD_ " + << "\n# " + << "\n# Remarques: " + << "\n# - les fonction nD sont des fonctions multiplicatives " + << "\n# des parametres initiaux (ou de ceux obtenus apres dependance explicite a la temperature " + << "\n# ( bien noter que la loi obtenue peut-etre quelconque, en particulier plus du tout " + << "\n# hyperelastique, tout depend des choix des fcts nD !) " + << "\n# " + << "\n#----------------------------------- avec_regularisation_ -------------------------------" << "\n# il est possible d'indiquer un facteur de regularisation qui permet d'eviter " - << "\n# de potentiels problemes de NaN, de type division par 0 par exemple " + << "\n# des problemes de NaN, de type division par 0 par exemple " << "\n# 1/a est remplace par 1/(a+fact_regularisation), par defaut fact_regularisation = 1.e-12 " << "\n# pour indiquer un facteur de regulation non nul on indique en dernier parametre " << "\n# le mot cle avec_regularisation_ suivi du facteur voulu " << "\n# ex: " << "\n# avec_regularisation_ 1.e-12 " - << "\n# ce mot cle doit se situer avant le mot cle sortie_post_ " - << "\n#------------------------------------------------------------------------------------" + << "\n# ce mot cle doit se situer avant eventuelement le mot cle sortie_post_ " + << "\n#" + << "\n#----------------------------------- sortie_post_ -------------------------------------" << "\n# il est possible de recuperer differentes grandeurs de travail par exemple " << "\n# l'intensite du potentiel, comme ces grandeurs sont calculees au moment de la resolution " - << "\n# et ne sont pas stockees, il faut indiquer le mot cle sortie_post_ suivi de 1 (par defaut = 0) " + << "\n# et ne sont pas stockees. On peut egalement recuperer la valeur des coefficients de la loi " + << "\n# (utile s'ils varient) sous forme d'un tableau de triplet : Qsig_rev C01 C10 mu1_rev mu2_use " + << "\n# Il faut indiquer le mot cle sortie_post_ suivi de 1 (par defaut = 0) " << "\n# ensuite au moment de la constitution du .CVisu on aura acces aux grandeurs de travail " << "\n# ex: " << "\n# sortie_post_ 1 " @@ -258,7 +511,7 @@ int Maheo_hyper::TestComplet() }; return ret; }; - + //----- lecture écriture de restart ----- // cas donne le niveau de la récupération @@ -268,7 +521,7 @@ void Maheo_hyper::Lecture_base_info_loi(ifstream& ent,const int cas,LesReference ,LesFonctions_nD& lesFonctionsnD) { string nom; bool test; if (cas == 1) - { // Qsig_rev + { // === Qsig_rev ent >> nom >> test; // vérification #ifdef MISE_AU_POINT @@ -288,8 +541,12 @@ void Maheo_hyper::Lecture_base_info_loi(ifstream& ent,const int cas,LesReference } else { ent >> nom; Qsig_rev_temperature = lesCourbes1D.Lecture_pour_base_info(ent,cas,Qsig_rev_temperature); }; + // on regarde si il y a une fonction nD multiplicative + ent >> nom; + if (nom == "Qsig_nD:") + Qsig_nD = lesFonctionsnD.Lecture_pour_base_info(ent,cas,Qsig_nD); - // mu1_rev + // === mu1_rev ent >> nom >> test; // vérification #ifdef MISE_AU_POINT @@ -309,8 +566,12 @@ void Maheo_hyper::Lecture_base_info_loi(ifstream& ent,const int cas,LesReference } else { ent >> nom; mu1_rev_temperature = lesCourbes1D.Lecture_pour_base_info(ent,cas,mu1_rev_temperature); }; + // on regarde si il y a une fonction nD multiplicative + ent >> nom; + if (nom == "mu1_nD:") + mu1_nD = lesFonctionsnD.Lecture_pour_base_info(ent,cas,mu1_nD); - // mu2_rev + // === mu2_rev ent >> nom >> test; // vérification #ifdef MISE_AU_POINT @@ -330,6 +591,10 @@ void Maheo_hyper::Lecture_base_info_loi(ifstream& ent,const int cas,LesReference } else { ent >> nom; mu2_rev_temperature = lesCourbes1D.Lecture_pour_base_info(ent,cas,mu2_rev_temperature); }; + // on regarde si il y a une fonction nD multiplicative + ent >> nom; + if (nom == "mu2_nD:") + mu2_nD = lesFonctionsnD.Lecture_pour_base_info(ent,cas,mu2_nD); }; // appel de la classe mère Loi_comp_abstraite::Lecture_don_base_info(ent,cas,lesRef,lesCourbes1D,lesFonctionsnD); @@ -348,6 +613,12 @@ void Maheo_hyper::Ecriture_base_info_loi(ofstream& sort,const int cas) { sort << true << " fonction_Qsig_rev_temperature "; LesCourbes1D::Ecriture_pour_base_info(sort,cas,Qsig_rev_temperature); }; + if (Qsig_nD != NULL) + {sort << " Qsig_nD: " << " "; + LesFonctions_nD::Ecriture_pour_base_info(sort, cas,Qsig_nD); + } + else {sort << " non_Qsig_nD "; }; + // mu1_rev sort << " mu1_rev= "; if (mu1_rev_temperature == NULL) @@ -356,6 +627,12 @@ void Maheo_hyper::Ecriture_base_info_loi(ofstream& sort,const int cas) { sort << true << " fonction_mu1_rev_temperature "; LesCourbes1D::Ecriture_pour_base_info(sort,cas,mu1_rev_temperature); }; + if (mu1_nD != NULL) + {sort << " 2 mu1_nD: " << " "; + LesFonctions_nD::Ecriture_pour_base_info(sort, cas,mu1_nD); + } + else {sort << " non_mu1_nD "; }; + // mu2_rev sort << " mu2_rev= "; if (mu2_rev_temperature == NULL) @@ -364,6 +641,11 @@ void Maheo_hyper::Ecriture_base_info_loi(ofstream& sort,const int cas) { sort << true << " fonction_mu2_rev_temperature "; LesCourbes1D::Ecriture_pour_base_info(sort,cas,mu2_rev_temperature); }; + if (mu2_nD != NULL) + {sort << " 2 mu1_nD: " << " "; + LesFonctions_nD::Ecriture_pour_base_info(sort, cas,mu1_nD); + } + else {sort << " non_mu2_nD "; }; }; // appel de la classe mère Loi_comp_abstraite::Ecriture_don_base_info(sort,cas); @@ -374,6 +656,12 @@ void Maheo_hyper::Ecriture_base_info_loi(ofstream& sort,const int cas) {// comme la loi n'a pas de partie volumique, le module d'Young équivalent est nul return 0.; }; + +// calcul d'un module compressibilité équivalent à la loi: +double Maheo_hyper::Module_compressibilite_equivalent(Enum_dure temps,const Deformation & ,SaveResul * ) + {// comme la loi n'a pas de partie volumique, le module de compressibilité est nul + return 0.; + }; // ========== codage des METHODES VIRTUELLES protegees:================ // calcul des contraintes a t+dt @@ -399,10 +687,78 @@ void Maheo_hyper::Calcul_SigmaHH (TenseurHH& ,TenseurBB& ,DdlElement & tab_ddl, #endif Tenseur3HH & sigHH = *((Tenseur3HH*) &sigHH_); // passage explicite en tenseur dim 3 + // init coef matériaux + Qsig_use = Qsig_rev; + mu1_use = mu1_rev; + mu2_use = mu2_rev; + // cas de la thermo dépendance, on calcul les grandeurs - if (Qsig_rev_temperature != NULL) Qsig_rev = Qsig_rev_temperature->Valeur(*temperature); - if (mu1_rev_temperature != NULL) mu1_rev = mu1_rev_temperature->Valeur(*temperature); - if (mu2_rev_temperature != NULL) mu2_rev = mu2_rev_temperature->Valeur(*temperature); + if (Qsig_rev_temperature != NULL) Qsig_use = Qsig_rev_temperature->Valeur(*temperature); + if (mu1_rev_temperature != NULL) mu1_use = mu1_rev_temperature->Valeur(*temperature); + if (mu2_rev_temperature != NULL) mu2_use = mu2_rev_temperature->Valeur(*temperature); + + // récup du conteneur spécifique du point, pour sauvegarde éventuelle + SaveResulHyper_W_gene_3D & save_resulHyper_W = *((SaveResulHyper_W_gene_3D*) saveResul); + // dans le cas de l'utilisation de fct nD + if ( (Qsig_nD != NULL) || (mu1_nD != NULL) + || (mu2_nD != NULL) + ) + { // opération de transmission de la métrique + const Met_abstraite::Impli* ex_impli = NULL; + const Met_abstraite::Expli_t_tdt* ex_expli_tdt = &ex; + const Met_abstraite::Umat_cont* ex_expli = NULL; + if (Qsig_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (Qsig_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + Qsig_use *= tab_val(1); + }; + if (mu1_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mu1_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + mu1_use *= tab_val(1); + }; + if (mu2_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mu2_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + mu2_use *= tab_val(1); + }; + }; + if (sortie_post) + {// sauvegarde des paramètres matériau + (*save_resulHyper_W.para_loi)(1) = Qsig_use; + (*save_resulHyper_W.para_loi)(2) = mu1_use; + (*save_resulHyper_W.para_loi)(3) = mu2_use; + }; // calcul des invariants et de leurs variations premières (méthode de Hyper_W_gene_3D) Invariants_et_var1(*(ex.gijBB_0),*(ex.gijHH_0),gijBB_,gijHH_,jacobien_0,jacobien); @@ -410,9 +766,7 @@ void Maheo_hyper::Calcul_SigmaHH (TenseurHH& ,TenseurBB& ,DdlElement & tab_ddl, Potentiel_et_var(); // stockage éventuel pour du post-traitement if (sortie_post) - { // récup du conteneur spécifique du point, pour sauvegarde éventuelle - SaveResulHyper_W_gene_3D & save_resulHyper_W = *((SaveResulHyper_W_gene_3D*) saveResul); - save_resulHyper_W.invP->potentiel= W_d + W_v; + { save_resulHyper_W.invP->potentiel= W_d + W_v; }; // calcul du tenseur des contraintes: on tiend compte du fait que le potentiel ne dépend que de J1 @@ -460,10 +814,79 @@ void Maheo_hyper::Calcul_DsigmaHH_tdt (TenseurHH& ,TenseurBB& ,DdlElement & tab_ Tenseur3HH & sigHH = *((Tenseur3HH*) &sigHH_tdt); // passage en dim 3 explicite Tenseur3HH & gijHH_tdt = *((Tenseur3HH*) &gijHH_tdt_); // passage en dim 3 explicite + // init coef matériaux + Qsig_use = Qsig_rev; + mu1_use = mu1_rev; + mu2_use = mu2_rev; + + // cas de la thermo dépendance, on calcul les grandeurs - if (Qsig_rev_temperature != NULL) Qsig_rev = Qsig_rev_temperature->Valeur(*temperature); - if (mu1_rev_temperature != NULL) mu1_rev = mu1_rev_temperature->Valeur(*temperature); - if (mu2_rev_temperature != NULL) mu2_rev = mu2_rev_temperature->Valeur(*temperature); + if (Qsig_rev_temperature != NULL) Qsig_use = Qsig_rev_temperature->Valeur(*temperature); + if (mu1_rev_temperature != NULL) mu1_use = mu1_rev_temperature->Valeur(*temperature); + if (mu2_rev_temperature != NULL) mu2_use = mu2_rev_temperature->Valeur(*temperature); + + // récup du conteneur spécifique du point, pour sauvegarde éventuelle + SaveResulHyper_W_gene_3D & save_resulHyper_W = *((SaveResulHyper_W_gene_3D*) saveResul); + // dans le cas de l'utilisation de fct nD + if ( (Qsig_nD != NULL) || (mu1_nD != NULL) + || (mu2_nD != NULL) + ) + { // opération de transmission de la métrique + const Met_abstraite::Impli* ex_impli = &ex; + const Met_abstraite::Expli_t_tdt* ex_expli_tdt = NULL; + const Met_abstraite::Umat_cont* ex_expli = NULL; + if (Qsig_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (Qsig_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + Qsig_use *= tab_val(1); + }; + if (mu1_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mu1_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + mu1_use *= tab_val(1); + }; + if (mu2_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mu2_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + mu2_use *= tab_val(1); + }; + }; + if (sortie_post) + {// sauvegarde des paramètres matériau + (*save_resulHyper_W.para_loi)(1) = Qsig_use; + (*save_resulHyper_W.para_loi)(2) = mu1_use; + (*save_resulHyper_W.para_loi)(3) = mu2_use; + }; // calcul des invariants et de leurs variations premières et secondes Invariants_et_var2(*(ex.gijBB_0),*(ex.gijHH_0),gijBB_tdt,gijHH_tdt,jacobien_0,jacobien); @@ -546,7 +969,6 @@ void Maheo_hyper::Calcul_DsigmaHH_tdt (TenseurHH& ,TenseurBB& ,DdlElement & tab_ }; - // calcul des contraintes et ses variations par rapport aux déformations a t+dt // en_base_orthonormee: le tenseur de contrainte en entrée est en orthonormee // le tenseur de déformation et son incrémentsont également en orthonormees @@ -568,10 +990,78 @@ void Maheo_hyper::Calcul_dsigma_deps (bool en_base_orthonormee, TenseurHH & ,Ten Tenseur3HH & sigHH = *((Tenseur3HH*) &sigHH_tdt); // // passage en dim 3 explicite Tenseur3HH & gijHH_tdt = *((Tenseur3HH*) ex.gijHH_tdt); // passage en dim 3 explicite + // init coef matériaux + Qsig_use = Qsig_rev; + mu1_use = mu1_rev; + mu2_use = mu2_rev; + // cas de la thermo dépendance, on calcul les grandeurs - if (Qsig_rev_temperature != NULL) Qsig_rev = Qsig_rev_temperature->Valeur(*temperature); - if (mu1_rev_temperature != NULL) mu1_rev = mu1_rev_temperature->Valeur(*temperature); - if (mu2_rev_temperature != NULL) mu2_rev = mu2_rev_temperature->Valeur(*temperature); + if (Qsig_rev_temperature != NULL) Qsig_use = Qsig_rev_temperature->Valeur(*temperature); + if (mu1_rev_temperature != NULL) mu1_use = mu1_rev_temperature->Valeur(*temperature); + if (mu2_rev_temperature != NULL) mu2_use = mu2_rev_temperature->Valeur(*temperature); + + // récup du conteneur spécifique du point, pour sauvegarde éventuelle + SaveResulHyper_W_gene_3D & save_resulHyper_W = *((SaveResulHyper_W_gene_3D*) saveResul); + // dans le cas de l'utilisation de fct nD + if ( (Qsig_nD != NULL) || (mu1_nD != NULL) + || (mu2_nD != NULL) + ) + { // opération de transmission de la métrique + const Met_abstraite::Impli* ex_impli = NULL; + const Met_abstraite::Expli_t_tdt* ex_expli_tdt = NULL; + const Met_abstraite::Umat_cont* ex_expli = &ex; + if (Qsig_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (Qsig_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + Qsig_use *= tab_val(1); + }; + if (mu1_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mu1_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + mu1_use *= tab_val(1); + }; + if (mu2_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (mu2_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + mu2_use *= tab_val(1); + }; + }; + if (sortie_post) + {// sauvegarde des paramètres matériau + (*save_resulHyper_W.para_loi)(1) = Qsig_use; + (*save_resulHyper_W.para_loi)(2) = mu1_use; + (*save_resulHyper_W.para_loi)(3) = mu2_use; + }; // calcul des invariants et de leurs variations premières et secondes Invariants_et_var2(*(ex.gijBB_0),*(ex.gijHH_0),*(ex.gijBB_tdt),gijHH_tdt,jacobien_0,jacobien); @@ -657,8 +1147,8 @@ void Maheo_hyper::Potentiel_et_var() cout << "\n Maheo_hyper::Calcul_dsigma_deps\n"; Sortie(1); }; - if ((mu1_rev/Qsig_rev) < 0.) - { cout << "\nErreur : mu1_rev/Qsig_rev= "<Valeur(*temperature); + if (mu1_rev_temperature != NULL) mu1_use = mu1_rev_temperature->Valeur(*temperature); + if (mu2_rev_temperature != NULL) mu2_use = mu2_rev_temperature->Valeur(*temperature); + // cas des contraintes et de ses variations analytiques // Tenseur3HHHH dSigdepsHHHH; // le tenseur contenant les dérivées analytiques Tenseur3HH SigmaHH_deb; @@ -815,6 +1315,8 @@ void Maheo_hyper::Cal_sigma_pour_num(const TenseurBB & gijBB_0,const TenseurHH & ,const double& jacobien_0,const double& jacobien,TenseurHH & sigHH_) { Tenseur3HH & sigHH = *((Tenseur3HH*) &sigHH_); // passage en dim 3 explicite + + // calcul des invariants et de leurs variations premières (méthode de Hyper_W_gene_3D) // Invariants_et_var1(gijBB_0,gijHH_0,gijBB_tdt,gijHH_tdt,jacobien_0,jacobien); // pour vérif on appelle var2, mais c'est à virer diff --git a/comportement/Hyper_elastique/Maheo_hyper.h b/comportement/Hyper_elastique/Maheo_hyper.h index 877cbc1..1881e62 100755 --- a/comportement/Hyper_elastique/Maheo_hyper.h +++ b/comportement/Hyper_elastique/Maheo_hyper.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -92,6 +92,24 @@ class Maheo_hyper : public Hyper_W_gene_3D // DESTRUCTEUR : ~Maheo_hyper (); + + // initialise les donnees particulieres a l'elements + // de matiere traite ( c-a-dire au pt calcule) + // Il y a creation d'une instance de SaveResul particuliere + // a la loi concernee + // la SaveResul classe est remplie par les instances heritantes + // le pointeur de SaveResul est sauvegarde au niveau de l'element + // c'a-d que les info particulieres au point considere sont stocke + // au niveau de l'element et non de la loi. + virtual SaveResul * New_et_Initialise() + { int avec_para = 0; // init par défaut + if (sortie_post) + avec_para = 3; + SaveResulHyper_W_gene_3D * pt = new SaveResulHyper_W_gene_3D(avec_para); + // insertion éventuelle de conteneurs de grandeurs quelconque + this->Insertion_conteneur_dans_save_result(pt); + return pt; + }; // Lecture des donnees de la classe sur fichier void LectureDonneesParticulieres (UtilLecture * ,LesCourbes1D& lesCourbes1D @@ -116,7 +134,12 @@ class Maheo_hyper : public Hyper_W_gene_3D // calcul d'un module d'young équivalent à la loi, // c'est sans doute complètement débile mais c'est pour pouvoir avancer !! double Module_young_equivalent(Enum_dure temps,const Deformation & ,SaveResul * saveResul); - + + // récupération d'un module de compressibilité équivalent à la loi, ceci pour un chargement nul + // il s'agit ici de la relation -pression = sigma_trace/3. = module de compressibilité * I_eps + // >>> en fait ici il s'agit du dernier module tangent calculé !! + double Module_compressibilite_equivalent(Enum_dure temps,const Deformation & def,SaveResul * saveResul); + // récupération de la variation relative d'épaisseur calculée: h/h0 // cette variation n'est utile que pour des lois en contraintes planes // - pour les lois 3D : retour d'un nombre très grand, indiquant que cette fonction est invalide @@ -130,16 +153,25 @@ class Maheo_hyper : public Hyper_W_gene_3D // affichage et definition interactive des commandes particulières à chaques lois void Info_commande_LoisDeComp(UtilLecture& lec); - + + protected : // données de la loi - double Qsig_rev, mu1_rev,mu2_rev; + double Qsig_rev, mu1_rev,mu2_rev; // coefficients lues + double Qsig_use, mu1_use,mu2_use; // coefficients utilisés + double fact_regularisation; // spécifie le facteur de régularisation + Courbe1D* Qsig_rev_temperature; // courbe éventuelle d'évolution de Qsig_rev en fonction de la température Courbe1D* mu1_rev_temperature; // courbe éventuelle d'évolution de mu1_rev en fonction de la température Courbe1D* mu2_rev_temperature; // courbe éventuelle d'évolution de mu2_rev en fonction de la température - double fact_regularisation; // spécifie le facteur de régularisation - + + // cas d'une dépendance à une fonction nD, les fonctions sont multiplicatives par rapport aux valeurs + // définies par les données fixes où celles dépendantes directement de la température via une courbe 1D + // -- bien voir que dans ce cas on peut obtenir n'importe quoi, c'est de la responsabilité + // de l'utilisateur de savoir se qu'il fait + Fonction_nD * Qsig_nD, * mu1_nD, * mu2_nD; + double W_d,W_v; // le potentiel: partie déviatorique, partie sphérique Vecteur W_r; // dérivées premières du potentiel par rapport aux J_r double W_d_J1,W_d_J2; // dérivées premières du potentiel déviatoire par rapport aux J_1 et J_2 diff --git a/comportement/Hyper_elastique/MooneyRivlin1D.cc b/comportement/Hyper_elastique/MooneyRivlin1D.cc index f999abf..1b70d9f 100644 --- a/comportement/Hyper_elastique/MooneyRivlin1D.cc +++ b/comportement/Hyper_elastique/MooneyRivlin1D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/MooneyRivlin1D.h b/comportement/Hyper_elastique/MooneyRivlin1D.h index dbd2676..68fecb1 100644 --- a/comportement/Hyper_elastique/MooneyRivlin1D.h +++ b/comportement/Hyper_elastique/MooneyRivlin1D.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/MooneyRivlin3D.cc b/comportement/Hyper_elastique/MooneyRivlin3D.cc index 4ecbb34..e7eb7d7 100644 --- a/comportement/Hyper_elastique/MooneyRivlin3D.cc +++ b/comportement/Hyper_elastique/MooneyRivlin3D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -41,26 +41,30 @@ using namespace std; //introduces namespace std #include "TypeConsTens.h" #include "CharUtil.h" - #include "MooneyRivlin3D.h" #include "MathUtil.h" MooneyRivlin3D::MooneyRivlin3D () : // Constructeur par defaut Hyper_W_gene_3D(MOONEY_RIVLIN_3D,CAT_MECANIQUE,3) ,C10(-ConstMath::trespetit),C01(-ConstMath::trespetit),K(-ConstMath::trespetit) + ,K_use(0.),C01_use(0.),C10_use(0.) // sont recalculés avant chaque utilisation ,C10_temperature(NULL),C01_temperature(NULL),K_temperature(NULL),type_pot_vol(1) + ,K_nD(NULL),C01_nD(NULL),C10_nD(NULL) ,W_d(0.),W_v(0.) ,W_d_J1(0.),W_d_J2(0.),W_v_J3(0.),W_v_J3J3(0.) ,avec_courbure(false) - { }; + { nb_para_loi = 3; // nombre de paramètre de la loi + }; // Constructeur de copie MooneyRivlin3D::MooneyRivlin3D (const MooneyRivlin3D& loi) : Hyper_W_gene_3D(loi) ,C10(loi.C10),C01(loi.C01),K(loi.K) + ,K_use(0.),C01_use(0.),C10_use(0.) // sont recalculés avant chaque utilisation ,C10_temperature(loi.C10_temperature),C01_temperature(loi.C01_temperature) ,K_temperature(loi.K_temperature),type_pot_vol(loi.type_pot_vol) + ,K_nD(loi.K_nD),C01_nD(loi.C01_nD),C10_nD(loi.C10_nD) ,W_d(loi.W_d),W_v(loi.W_v) ,W_d_J1(loi.W_d_J1),W_d_J2(loi.W_d_J2),W_v_J3(loi.W_v_J3),W_v_J3J3(loi.W_v_J3J3) ,avec_courbure(loi.avec_courbure) @@ -82,6 +86,27 @@ MooneyRivlin3D::MooneyRivlin3D (const MooneyRivlin3D& loi) : if (r_temperature->NomCourbe() == "_") r_temperature = Courbe1D::New_Courbe1D(*(loi.r_temperature)); }; + + // idem pour les fonctions nD + if (K_nD != NULL) + if (K_nD->NomFonction() == "_") + {// comme il s'agit d'une fonction locale on la redéfinie (sinon pb lors du destructeur de loi) + string non_courbe("_"); + K_nD = Fonction_nD::New_Fonction_nD(*loi.K_nD); + }; + if (C01_nD != NULL) + if (C01_nD->NomFonction() == "_") + {// comme il s'agit d'une fonction locale on la redéfinie (sinon pb lors du destructeur de loi) + string non_courbe("_"); + C01_nD = Fonction_nD::New_Fonction_nD(*loi.C01_nD); + }; + if (C10_nD != NULL) + if (C10_nD->NomFonction() == "_") + {// comme il s'agit d'une fonction locale on la redéfinie (sinon pb lors du destructeur de loi) + string non_courbe("_"); + C10_nD = Fonction_nD::New_Fonction_nD(*loi.C10_nD); + }; + nb_para_loi = 3; // nombre de paramètre de la loi }; MooneyRivlin3D::~MooneyRivlin3D () @@ -96,6 +121,10 @@ MooneyRivlin3D::~MooneyRivlin3D () if (a_temperature->NomCourbe() == "_") delete a_temperature; if (r_temperature != NULL) if (r_temperature->NomCourbe() == "_") delete r_temperature; + // idem pour les fonctions nD + if (K_nD != NULL) if (K_nD->NomFonction() == "_") delete K_nD; + if (C01_nD != NULL) if (C01_nD->NomFonction() == "_") delete C01_nD; + if (C10_nD != NULL) if (C10_nD->NomFonction() == "_") delete C10_nD; }; // Lecture des donnees de la classe sur fichier @@ -104,7 +133,9 @@ void MooneyRivlin3D::LectureDonneesParticulieres ,LesFonctions_nD& lesFonctionsnD) { string toto,nom; // lecture du coefficient C01 - *(entreePrinc->entree) >> nom; + string mot_cle = "C01="; + string nom_class_methode = "MooneyRivlin3D::LectureDonneesParticulieres"; + *(entreePrinc->entree) >> nom; if(nom != "C01=") { cout << "\n erreur en lecture du parametre C01, on attendait la chaine C01= et on a lu: " << nom; cout << "\n MooneyRivlin3D::LectureDonneesParticulieres " @@ -223,7 +254,12 @@ void MooneyRivlin3D::LectureDonneesParticulieres { // lecture de K *(entreePrinc->entree) >> K ; // s'il n'y a plus rien n'a lire, il faut passer un enregistrement - if(strstr(entreePrinc->tablcar,"type_potvol_")==0) entreePrinc->NouvelleDonnee(); + if((strstr(entreePrinc->tablcar,"type_potvol_")==0) + && (strstr(entreePrinc->tablcar,"avec_courbure_")==0) + && (strstr(entreePrinc->tablcar,"avec_nD_")==0) + && (strstr(entreePrinc->tablcar,"sortie_post_")==0) + ) + entreePrinc->NouvelleDonnee(); }; // lecture éventuelle du type de potentiel if(strstr(entreePrinc->tablcar,"type_potvol_")!=0) @@ -249,7 +285,11 @@ void MooneyRivlin3D::LectureDonneesParticulieres }; }; // s'il n'y a plus rien n'a lire, il faut passer un enregistrement - if(strstr(entreePrinc->tablcar,"avec_courbure_")==0) entreePrinc->NouvelleDonnee(); + if((strstr(entreePrinc->tablcar,"avec_courbure_")==0) + && (strstr(entreePrinc->tablcar,"avec_nD_")==0) + && (strstr(entreePrinc->tablcar,"sortie_post_")==0) + ) + entreePrinc->NouvelleDonnee(); }; // ---- lecture éventuelle d'un terme de courbure @@ -266,7 +306,7 @@ void MooneyRivlin3D::LectureDonneesParticulieres if (nom != "a_courbure=") { cout << "\n erreur en lecture du parametre a, on aurait du lire le mot cle a_courbure=" << " suivi d'un nombre reel et on a lue: " << nom ; - entreePrinc->MessageBuffer("**erreur10 Hart_Smith3D::LectureDonneesParticulieres (...**"); + entreePrinc->MessageBuffer("**erreur10 MooneyRivlin3D::LectureDonneesParticulieres (...**"); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie(1); }; @@ -278,7 +318,7 @@ void MooneyRivlin3D::LectureDonneesParticulieres if (nom != "a_thermo_dependant_") { cout << "\n erreur en lecture de la thermodependance de a, on aurait du lire le mot cle a_thermo_dependant_" << " suivi du nom d'une courbe de charge ou de la courbe elle meme, et on a lue: " << nom ; - entreePrinc->MessageBuffer("**erreur10 Hart_Smith3D::LectureDonneesParticulieres (...**"); + entreePrinc->MessageBuffer("**erreur10 MooneyRivlin3D::LectureDonneesParticulieres (...**"); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie(1); }; @@ -306,7 +346,7 @@ void MooneyRivlin3D::LectureDonneesParticulieres if (nom != "r_courbure=") { cout << "\n erreur en lecture du parametre r, on aurait du lire le mot cle r_courbure=" << " suivi d'un nombre reel et on a lue: " << nom ; - entreePrinc->MessageBuffer("**erreur11 Hart_Smith3D::LectureDonneesParticulieres (...**"); + entreePrinc->MessageBuffer("**erreur11 MooneyRivlin3D::LectureDonneesParticulieres (...**"); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie(1); }; @@ -317,7 +357,7 @@ void MooneyRivlin3D::LectureDonneesParticulieres if (nom != "r_thermo_dependant_") { cout << "\n erreur en lecture de la thermodependance de r, on aurait du lire le mot cle r_thermo_dependant_" << " suivi du nom d'une courbe de charge ou de la courbe elle meme, et on a lue: " << nom ; - entreePrinc->MessageBuffer("**erreur12 Hart_Smith3D::LectureDonneesParticulieres (...**"); + entreePrinc->MessageBuffer("**erreur12 MooneyRivlin3D::LectureDonneesParticulieres (...**"); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie(1); }; @@ -345,11 +385,173 @@ void MooneyRivlin3D::LectureDonneesParticulieres } //-- fin de la lecture éventuelle d'un terme de courbure else {avec_courbure=false;}; - - + + // -------- on regarde s'il y a une dépendance à une fonction nD + if (strstr(entreePrinc->tablcar,"avec_nD_")!=NULL) + { string nom1,nom2; + // lecture des fonctions nD + entreePrinc->NouvelleDonnee(); // passage d'une ligne + + // on lit tant que l'on ne rencontre pas la ligne contenant "fin_parametres_avec_nD_" + // ou un nouveau mot clé global auquel cas il y a pb !! + MotCle motCle; // ref aux mots cle + while (strstr(entreePrinc->tablcar,"fin_parametres_avec_nD_")==0) + { + // si on a un mot clé global dans la ligne courante c-a-d dans tablcar --> erreur + if ( motCle.SimotCle(entreePrinc->tablcar)) + { cout << "\n erreur de lecture des parametre de dependance a une fonction nD: on n'a pas trouve le mot cle " + << " fin_parametres_avec_nD_ et par contre la ligne courante contient un mot cle global "; + entreePrinc->MessageBuffer + ("** erreur51 des parametres de reglage de la loi de comportement MooneyRivlin3D**"); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + + // lecture d'un mot clé + *(entreePrinc->entree) >> nom1; + + if ((entreePrinc->entree)->rdstate() == 0) + {} // lecture normale + #ifdef ENLINUX + else if ((entreePrinc->entree)->fail()) + // on a atteind la fin de la ligne et on appelle un nouvel enregistrement + { entreePrinc->NouvelleDonnee(); // lecture d'un nouvelle enregistrement + *(entreePrinc->entree) >>nom1; + } + #else + else if ((entreePrinc->entree)->eof()) + // la lecture est bonne mais on a atteind la fin de la ligne + { if(nom1 != "fin_parametres_avec_nD_") + {entreePrinc->NouvelleDonnee(); *(entreePrinc->entree) >> nom1;}; + } + #endif + else // cas d'une erreur de lecture + { cout << "\n erreur de lecture inconnue "; + entreePrinc->MessageBuffer + ("** erreur61 des parametres de reglage de la loi de comportement MooneyRivlin3D**"); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + + if(nom1 == "K_nD=") + {string nom_fonct; + // lecture du nom de la fonction + *(entreePrinc->entree) >> nom_fonct; + + // maintenant on définit la fonction + if (lesFonctionsnD.Existe(nom_fonct)) + {K_nD = lesFonctionsnD.Trouve(nom_fonct); + } + else + {// sinon il faut la lire maintenant + string non("_"); + K_nD = Fonction_nD::New_Fonction_nD(non, Id_Nom_Fonction_nD(nom_fonct)); + // lecture de la fonction + K_nD->LectDonnParticulieres_Fonction_nD (non,entreePrinc); + // maintenant on vérifie que la fonction est utilisable + if (K_nD->NbComposante() != 1 ) + { cout << "\n erreur en lecture, la fonction " << nom_fonct + << " est une fonction vectorielle a " << K_nD->NbComposante() + << " composante alors qu'elle devrait etre scalaire ! " + << " elle n'est donc pas utilisable !! "; + string message("\n**erreur031** \n"+nom_class_methode+"(..."); + entreePrinc->MessageBuffer(message); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; + // on regarde si la fonction nD intègre la température + const Tableau & tab_enu = K_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + // prepa du flot de lecture + entreePrinc->NouvelleDonnee(); + } + else if(nom1 == "C01_nD=") + {string nom_fonct; + // lecture du nom de la fonction + *(entreePrinc->entree) >> nom_fonct; + + // maintenant on définit la fonction + if (lesFonctionsnD.Existe(nom_fonct)) + {C01_nD = lesFonctionsnD.Trouve(nom_fonct); + } + else + {// sinon il faut la lire maintenant + string non("_"); + C01_nD = Fonction_nD::New_Fonction_nD(non, Id_Nom_Fonction_nD(nom_fonct)); + // lecture de la fonction + C01_nD->LectDonnParticulieres_Fonction_nD (non,entreePrinc); + // maintenant on vérifie que la fonction est utilisable + if (C01_nD->NbComposante() != 1 ) + { cout << "\n erreur en lecture, la fonction " << nom_fonct + << " est une fonction vectorielle a " << C01_nD->NbComposante() + << " composante alors qu'elle devrait etre scalaire ! " + << " elle n'est donc pas utilisable !! "; + string message("\n**erreur031** \n"+nom_class_methode+"(..."); + entreePrinc->MessageBuffer(message); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; + // on regarde si la fonction nD intègre la température + const Tableau & tab_enu = C01_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + // prepa du flot de lecture + entreePrinc->NouvelleDonnee(); + } + else if(nom1 == "C10_nD=") + {string nom_fonct; + // lecture du nom de la fonction + *(entreePrinc->entree) >> nom_fonct; + + // maintenant on définit la fonction + if (lesFonctionsnD.Existe(nom_fonct)) + {C10_nD = lesFonctionsnD.Trouve(nom_fonct); + } + else + {// sinon il faut la lire maintenant + string non("_"); + C10_nD = Fonction_nD::New_Fonction_nD(non, Id_Nom_Fonction_nD(nom_fonct)); + // lecture de la fonction + C10_nD->LectDonnParticulieres_Fonction_nD (non,entreePrinc); + // maintenant on vérifie que la fonction est utilisable + if (C10_nD->NbComposante() != 1 ) + { cout << "\n erreur en lecture, la fonction " << nom_fonct + << " est une fonction vectorielle a " << C10_nD->NbComposante() + << " composante alors qu'elle devrait etre scalaire ! " + << " elle n'est donc pas utilisable !! "; + string message("\n**erreur031** \n"+nom_class_methode+"(..."); + entreePrinc->MessageBuffer(message); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; + // on regarde si la fonction nD intègre la température + const Tableau & tab_enu = C10_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + // prepa du flot de lecture + entreePrinc->NouvelleDonnee(); + } + else // cas d'une erreur + { cout << "\n erreur en lecture de la dependance a une fonction nD des coefficients, on aurait du lire " + << " le mot cle K_nD= ou C01_nD= ou C10_nD= et on a lu: " + << nom1; + entreePrinc->MessageBuffer("**erreur7 MooneyRivlin3D::LectureDonneesParticulieres (...**"); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; //-- fin du while + entreePrinc->NouvelleDonnee(); // passage du mot clé "fin_parametres_avec_nD_" + + }; + // lecture de l'indication éventuelle du post traitement - string nom_class_methode = "MooneyRivlin1D::LectureDonneesParticulieres";string le_mot_cle = "sortie_post_"; - entreePrinc->Lecture_un_parametre_int(0,nom_class_methode,0,1,le_mot_cle,sortie_post); + string le_mot_cle = "sortie_post_"; + if (entreePrinc->Lecture_un_parametre_int(0,nom_class_methode,0,1,le_mot_cle,sortie_post)) + entreePrinc->NouvelleDonnee(); // passage éventuel du mot clé sortie_post_; // --- appel au niveau de la classe mère // ici il n'y a pas de type de déformation associé // mais on prend la def standart d'almansi, pour les fonctions associées éventuelles @@ -377,6 +579,29 @@ void MooneyRivlin3D::Affiche() const << " courbe r=f(T): " << r_temperature->NomCourbe() <<" ";} else { cout << " r= " << r_courbure ;} }; + + // les dépendances à une fonction nD + if (K_nD != NULL) + {cout << " fonction nD K_nD: "; + if (K_nD->NomFonction() != "_") + cout << K_nD->NomFonction(); + else + K_nD->Affiche(); + }; + if (C01_nD!= NULL) + {cout << " fonction nD C01_nD: "; + if (C01_nD->NomFonction() != "_") + cout << C01_nD->NomFonction(); + else + C01_nD->Affiche(); + }; + if (C10_nD!= NULL) + {cout << " fonction nD C10_nD: "; + if (C10_nD->NomFonction() != "_") + cout << C10_nD->NomFonction(); + else + C10_nD->Affiche(); + }; // appel de la classe mère Loi_comp_abstraite::Affiche_don_classe_abstraite(); }; @@ -411,16 +636,17 @@ void MooneyRivlin3D::Info_commande_LoisDeComp(UtilLecture& entreePrinc) << "\n#------------------------------------------------------------------------------------" << "\n# C01= 2. C10= C10_thermo_dependant_ courbe4 " << "\n# K= K_thermo_dependant_ courbe4 " - << "\n#------------------------------------------------------------------------------------" - << "\n# un dernier parametre facultatif permet d'indiquer le type de variation volumique " + << "\n# " + << "\n#---------------------------------- type_potvol_ ----------------------------------------" + << "\n# un parametre facultatif permet d'indiquer le type de variation volumique " << "\n# que l'on desire: par defaut il s'agit de : K(1-(1+log(V))/V) qui correspond au type 1" << "\n# mais on peut choisir: K/2(V-1) qui correspond au type 2 " << "\n# ou: K/2(log(V))^2 qui correspond au type 3 " << "\n# ou: K/2(V-1)^2 qui correspond au type 4 " << "\n# en indiquant (en fin de ligne) le mot cle: type_potvol_ suivi du type" << "\n# par defaut type_potvol_ a la valeur 1 " - << "\n#------------------------------------------------------------------------------------" - << "\n#------------------------------------------------------------------------------------" + << "\n# " + << "\n#---------------------------------- avec_courbure_ -------------------------------------" << "\n# apres le type de variation volumique on peut indiquer facultativement l'ajout au potentiel " << "\n# d'un terme permettant de raidir le comportement a partir d'un certain niveau de chargement " << "\n# pour cela on indique le mot cle: avec_courbure_ puis on change de ligne " @@ -435,9 +661,52 @@ void MooneyRivlin3D::Info_commande_LoisDeComp(UtilLecture& entreePrinc) << "\n# ... type_potvol_ 2 avec_courbure_ " << "\n# a_courbure= a_thermo_dependant_ " << "\n# r_courbure= r_thermo_dependant_ " + << "\n# " + << "\n#--------------------- dependance explicite a une fonction nD -----------------------------------" + << "\n# il est egalement possible de definir une dependance des parametres a une fonction nD " + << "\n# dans ce cas, a la suite de la dependance explicite a la temperature via une courbr 1D " + << "\n# ou a la suite du dernier parametre fixe, on met le mot cle: avec_nD_ " + << "\n# puis sur les lignes qui suivent on met des fonctions nD multiplicatives des parametres " + << "\n# initiaux, puis un mot cle signalant la fin des fonctions: fin_parametres_avec_nD_ " + << "\n# suit un exemple de declaration (il est possible d'ommettre certaine fonction ! " + << "\n# la presence de fct nD est facultative), de meme il est possible soit d'utiliser une fonction " + << "\n# deja defini soit de donner directement la fonction nD (comme pour les autres lois) " + << "\n# Enfin, apres chaque definition de fonction il faut passer a une nouvelle ligne " + << "\n# " + << "\n# exemple de definition de loi" + << "\n# C01= 0.0167 C10= 0.145 K= 100 avec_nD_ " + << "\n# K_nD= fct_nD_1 " + << "\n# C01_nD= fct_nD_2 " + << "\n# C10_nD= fct_nD_3 " + << "\n# fin_parametres_avec_nD_ " + << "\n# " + << "\n# Remarques: " + << "\n# - les fonction nD sont des fonctions multiplicatives " + << "\n# des parametres initiaux (ou de ceux obtenus apres dependance explicite a la temperature " + << "\n# ( bien noter que la loi obtenue peut-etre quelconque, en particulier plus du tout " + << "\n# hyperelastique, tout depend des choix des fcts nD !) " + << "\n# " + << "\n#----------------------------------- sortie_post_ -------------------------------------" + << "\n# il est possible de recuperer differentes grandeurs de travail par exemple " + << "\n# l'intensite du potentiel, comme ces grandeurs sont calculees au moment de la resolution " + << "\n# et ne sont pas stockees. On peut egalement recuperer la valeur des coefficients de la loi " + << "\n# (utile s'ils varient) sous forme d'un tableau de triplet : K C01 C10 " + << "\n# Il faut indiquer le mot cle sortie_post_ suivi de 1 (par defaut = 0) " + << "\n# ensuite au moment de la constitution du .CVisu on aura acces aux grandeurs de travail " + << "\n# ex: " + << "\n# sortie_post_ 1 " + << "\n# ce mot cle est le dernier des parametres specifiques de la loi il doit se situe " + << "\n# a la fin de la derniere ligne de donnees " + << "\n#" + << "\n#------------------------------------------------------------------------------------" << "\n#------------------------------------------------------------------------------------" << endl; }; +// if((strstr(entreePrinc->tablcar,"type_potvol_")==0) +// && (strstr(entreePrinc->tablcar,"avec_courbure_")==0) +// && (strstr(entreePrinc->tablcar,"avec_nD_")==0) +// && (strstr(entreePrinc->tablcar,"sortie_post_")==0) +// ) // appel de la classe Hyper_W_gene_3D Hyper_W_gene_3D::Info_commande_LoisDeComp_hyper3D(entreePrinc); // appel de la classe mère @@ -517,6 +786,13 @@ void MooneyRivlin3D::Lecture_base_info_loi(ifstream& ent,const int cas,LesRefere } else { ent >> nom; C01_temperature = lesCourbes1D.Lecture_pour_base_info(ent,cas,C01_temperature); }; + + // on regarde si il y a une fonction nD multiplicative + ent >> nom; + if (nom == "C01_nD:") + C01_nD = lesFonctionsnD.Lecture_pour_base_info(ent,cas,C01_nD); + + // C10 ent >> nom >> test; // vérification @@ -537,6 +813,12 @@ void MooneyRivlin3D::Lecture_base_info_loi(ifstream& ent,const int cas,LesRefere } else { ent >> nom; C10_temperature = lesCourbes1D.Lecture_pour_base_info(ent,cas,C10_temperature); }; + + // on regarde si il y a une fonction nD multiplicative + ent >> nom; + if (nom == "C10_nD:") + C10_nD = lesFonctionsnD.Lecture_pour_base_info(ent,cas,C10_nD); + // K ent >> nom >> test; // vérification @@ -557,6 +839,10 @@ void MooneyRivlin3D::Lecture_base_info_loi(ifstream& ent,const int cas,LesRefere } else { ent >> nom; K_temperature = lesCourbes1D.Lecture_pour_base_info(ent,cas,K_temperature); }; + // on regarde si il y a une fonction nD multiplicative + ent >> nom; + if (nom == "K_nD:") + K_nD = lesFonctionsnD.Lecture_pour_base_info(ent,cas,K_nD); // le type de potentiel ent >> nom >> type_pot_vol ; // --- potentiel de gestion de courbure, éventuellement @@ -613,6 +899,9 @@ void MooneyRivlin3D::Lecture_base_info_loi(ifstream& ent,const int cas,LesRefere else { ent >> nom; r_temperature = lesCourbes1D.Lecture_pour_base_info(ent,cas,r_temperature); }; }; + + + }; // appel de la classe mère Loi_comp_abstraite::Lecture_don_base_info(ent,cas,lesRef,lesCourbes1D,lesFonctionsnD); @@ -622,28 +911,47 @@ void MooneyRivlin3D::Lecture_base_info_loi(ifstream& ent,const int cas,LesRefere // = 2 : on sauvegarde uniquement les données variables (supposées comme telles) void MooneyRivlin3D::Ecriture_base_info_loi(ofstream& sort,const int cas) { if (cas == 1) - { // les coefficients + { // --- les coefficients + // C01 sort << "\n C01= "; if (C01_temperature == NULL) { sort << false << " " << C01 << " ";} else { sort << true << " fonction_C01_temperature "; LesCourbes1D::Ecriture_pour_base_info(sort,cas,C01_temperature); - }; - sort << " C10= "; + }; + if (C01_nD != NULL) + {sort << " 2 C01_nD: " << " "; + LesFonctions_nD::Ecriture_pour_base_info(sort, cas,C01_nD); + } + else {sort << " non_C01_nD "; }; + // C10 + sort << " C10= "; if (C10_temperature == NULL) { sort << false << " " << C10 << " ";} else { sort << true << " fonction_C10_temperature "; LesCourbes1D::Ecriture_pour_base_info(sort,cas,C10_temperature); - }; + }; + if (C10_nD != NULL) + {sort << " 2 C01_nD: " << " "; + LesFonctions_nD::Ecriture_pour_base_info(sort, cas,C01_nD); + } + else {sort << " non_C10_nD "; }; + // K sort << " K= "; if (K_temperature == NULL) { sort << false << " " << K << " ";} else { sort << true << " fonction_K_temperature "; LesCourbes1D::Ecriture_pour_base_info(sort,cas,K_temperature); - }; + }; + if (K_nD != NULL) + {sort << " K_nD: " << " "; + LesFonctions_nD::Ecriture_pour_base_info(sort, cas,K_nD); + } + else {sort << " non_K_nD "; }; + // le type de potentiel sort << " typ_pot= " << type_pot_vol << " "; // le type de potentiel // --- potentiel de gestion de courbure, éventuellement sort << " avec_courbure= " << avec_courbure; @@ -663,6 +971,8 @@ void MooneyRivlin3D::Ecriture_base_info_loi(ofstream& sort,const int cas) LesCourbes1D::Ecriture_pour_base_info(sort,cas,r_temperature); }; }; + // --- + } // appel de la classe mère Loi_comp_abstraite::Ecriture_don_base_info(sort,cas); @@ -694,6 +1004,10 @@ void MooneyRivlin3D::Calcul_SigmaHH (TenseurHH& ,TenseurBB& ,DdlElement & tab_dd #endif Tenseur3HH & sigHH = *((Tenseur3HH*) &sigHH_); // passage explicite en tenseur dim 3 + K_use = K; // init + C01_use = C01; // " + C10_use = C10; // " + // informations éventuelles #ifdef MISE_AU_POINT if (Permet_affichage() > 4) @@ -702,24 +1016,24 @@ void MooneyRivlin3D::Calcul_SigmaHH (TenseurHH& ,TenseurBB& ,DdlElement & tab_dd #endif // cas de la thermo dépendance, on calcul les grandeurs if (C01_temperature != NULL) - {C01 = C01_temperature->Valeur(*temperature); + {C01_use = C01_temperature->Valeur(*temperature); #ifdef MISE_AU_POINT if (Permet_affichage() > 4) - cout << "\n C01(T)= "<Valeur(*temperature); + {C10_use = C10_temperature->Valeur(*temperature); #ifdef MISE_AU_POINT if (Permet_affichage() > 4) - cout << "\n C10(T)= "<Valeur(*temperature); + {K_use = K_temperature->Valeur(*temperature); #ifdef MISE_AU_POINT if (Permet_affichage() > 4) - cout << "\n K(T)= "< list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + K_use *= tab_val(1); + }; + if (C01_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (C01_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + C01_use *= tab_val(1); + }; + if (C10_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (C10_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + C10_use *= tab_val(1); + }; + }; + if (sortie_post) + {// sauvegarde des paramètres matériau + (*save_resulHyper_W.para_loi)(1) = K_use; + (*save_resulHyper_W.para_loi)(2) = C01_use; + (*save_resulHyper_W.para_loi)(3) = C10_use; + }; + // calcul des invariants et de leurs variations premières (méthode de Hyper_W_gene_3D) Invariants_et_var1(*(ex.gijBB_0),*(ex.gijHH_0),gijBB_,gijHH_,jacobien_0,jacobien); @@ -796,6 +1174,10 @@ void MooneyRivlin3D::Calcul_DsigmaHH_tdt (TenseurHH& ,TenseurBB& ,DdlElement & t Tenseur3HH & sigHH = *((Tenseur3HH*) &sigHH_tdt); // passage en dim 3 explicite Tenseur3HH & gijHH_tdt = *((Tenseur3HH*) &gijHH_tdt_); // passage en dim 3 explicite + K_use = K; // init + C01_use = C01; // " + C10_use = C10; // " + // informations éventuelles #ifdef MISE_AU_POINT if (Permet_affichage() > 4) @@ -804,24 +1186,24 @@ void MooneyRivlin3D::Calcul_DsigmaHH_tdt (TenseurHH& ,TenseurBB& ,DdlElement & t #endif // cas de la thermo dépendance, on calcul les grandeurs if (C01_temperature != NULL) - {C01 = C01_temperature->Valeur(*temperature); + {C01_use = C01_temperature->Valeur(*temperature); #ifdef MISE_AU_POINT if (Permet_affichage() > 4) - cout << "\n C01(T)= "<Valeur(*temperature); + {C10_use = C10_temperature->Valeur(*temperature); #ifdef MISE_AU_POINT if (Permet_affichage() > 4) - cout << "\n C10(T)= "<Valeur(*temperature); + {K_use = K_temperature->Valeur(*temperature); #ifdef MISE_AU_POINT if (Permet_affichage() > 4) - cout << "\n K(T)= "< list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + K_use *= tab_val(1); + }; + if (C01_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (C01_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + C01_use *= tab_val(1); + }; + if (C10_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (C10_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + C10_use *= tab_val(1); + }; + }; + if (sortie_post) + {// sauvegarde des paramètres matériau + (*save_resulHyper_W.para_loi)(1) = K_use; + (*save_resulHyper_W.para_loi)(2) = C01_use; + (*save_resulHyper_W.para_loi)(3) = C10_use; + }; + // calcul des invariants et de leurs variations premières et secondes Invariants_et_var2(*(ex.gijBB_0),*(ex.gijHH_0),gijBB_tdt,gijHH_tdt,jacobien_0,jacobien); ////----debug ----- @@ -972,26 +1417,30 @@ void MooneyRivlin3D::Calcul_dsigma_deps(bool en_base_orthonormee, TenseurHH & ,T { cout << "\nMooneyRivlin3D::Calcul_dsigma_deps(... "; }; #endif + K_use = K; // init + C01_use = C01; // " + C10_use = C10; // " + // cas de la thermo dépendance, on calcul les grandeurs if (C01_temperature != NULL) - {C01 = C01_temperature->Valeur(*temperature); + {C01_use = C01_temperature->Valeur(*temperature); #ifdef MISE_AU_POINT if (Permet_affichage() > 4) - cout << "\n C01(T)= "<Valeur(*temperature); + {C10_use = C10_temperature->Valeur(*temperature); #ifdef MISE_AU_POINT if (Permet_affichage() > 4) - cout << "\n C10(T)= "<Valeur(*temperature); + {K_use = K_temperature->Valeur(*temperature); #ifdef MISE_AU_POINT if (Permet_affichage() > 4) - cout << "\n K(T)= "< list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + K_use *= tab_val(1); + }; + if (C01_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (C01_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + C01_use *= tab_val(1); + }; + if (C10_nD != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (C10_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + C10_use *= tab_val(1); + }; + }; + if (sortie_post) + {// sauvegarde des paramètres matériau + (*save_resulHyper_W.para_loi)(1) = K_use; + (*save_resulHyper_W.para_loi)(2) = C01_use; + (*save_resulHyper_W.para_loi)(3) = C10_use; + }; // calcul des invariants et de leurs variations premières et secondes Invariants_et_var2(*(ex.gijBB_0),*(ex.gijHH_0),*(ex.gijBB_tdt),gijHH_tdt,jacobien_0,jacobien); @@ -1111,50 +1623,56 @@ void MooneyRivlin3D::Potentiel_et_var(double & module_compressibilite) // calcul du potentiel double logV = log(V); - W_d = C10 * (J_r(1)-3.) + C01 * (J_r(2)-3.); // partie déviatorique - W_d_J1 = C10; // variation / J1 - W_d_J2 = C01; // variation / J2 + W_d = C10_use * (J_r(1)-3.) + C01_use * (J_r(2)-3.); // partie déviatorique + W_d_J1 = C10_use; // variation / J1 + W_d_J2 = C01_use; // variation / J2 #ifdef MISE_AU_POINT if (Permet_affichage() > 4) { cout << "\n MooneyRivlin3D::Potentiel_et_var((..." - << "\n W_d= " << W_d << ", W_d_J1= "<< W_d_J1 <<", W_d_J2= "<< W_d_J2; + << "\n W_d= " << W_d << ", W_d_J1= "<< W_d_J1 <<", W_d_J2= "<< W_d_J2<< " "; }; #endif - // puis partie volumique - switch (type_pot_vol) - {case 1: {W_v = K * (1- (1+logV)*unSurV); // potentiel 1 - W_v_J3 = 0.5 * K * logV * unSurV * unSurV2; // variation / J3 - module_compressibilite = K * unSurV2; - break; - } - case 2: {W_v = 0.5 * K * (V-1); // potentiel 2 - W_v_J3 = 0.25 * K * unSurV; // variation / V - module_compressibilite = 0.25 * K / (MaX(ConstMath::petit, logV)); - break; - } - case 3: {W_v = K * 0.5 * logV * logV; // potentiel 3 - W_v_J3 = K * 0.5 * unSurV2 * logV; // variation / V - module_compressibilite = MiN(ConstMath::petit, 0.25 * K * logV ); - break; - } - case 4: {W_v = 0.5 * K * (V-1.)*(V-1.); // potentiel - W_v_J3 = 0.5 * K * unSurV * (V-1); // variation / V - // ici on fait l'approximation que (V-1)/ln(V) vaut environ 1 - // dans ce cas -P = K * (V-1) = approximativement K ln(V) - module_compressibilite = K ; - break; - } - - }; + + // puis partie volumique + double VmoinsUn = V-1.; + switch (type_pot_vol) + {case 1: {W_v = K_use * (1- (1+logV)*unSurV); // potentiel 1 + W_v_J3 = 0.5 * K_use * logV * unSurV * unSurV2; // variation / J3 + module_compressibilite = K_use * unSurV2; + break; + } + case 2: {W_v = 0.5 * K_use * VmoinsUn; // potentiel 2 + W_v_J3 = 0.25 * K_use * unSurV; // variation / J3 + if (Dabs(VmoinsUn) > ConstMath::petit ) + {module_compressibilite = 0.5 * K_use / logV;} + else // on fait un développement limité du log pour V proche de 1. + {module_compressibilite = 0.5 * K_use / (VmoinsUn-VmoinsUn*VmoinsUn/2.+VmoinsUn*VmoinsUn*VmoinsUn/3.);} + break; + } + case 3: {W_v = K_use * 0.5 * logV * logV; // potentiel 3 + W_v_J3 = K_use * 0.5 * unSurV2 * logV; // variation / J3 + module_compressibilite = K_use / V ; + break; + } + case 4: {W_v = 0.5 * K_use * VmoinsUn * VmoinsUn; // potentiel + W_v_J3 = 0.5 * K_use * unSurV * VmoinsUn; // variation / J3 + if (Dabs(VmoinsUn) > ConstMath::petit ) + {module_compressibilite = VmoinsUn * K_use /logV ;} + else // on fait un développement limité du log pour V proche de 1. + {module_compressibilite = VmoinsUn * K_use / (VmoinsUn-VmoinsUn*VmoinsUn/2.+VmoinsUn*VmoinsUn*VmoinsUn/3.);} + break; + } + }; #ifdef MISE_AU_POINT if (Permet_affichage() > 4) {switch (type_pot_vol) {case 1: case 2: case 3: case 4: - cout << "\n W_v= " << W_v << ", W_v_J3= "<< W_v_J3 ; + cout << "\n W_v= " << W_v << ", W_v_J3= "<< W_v_J3 << ", K_s= " << module_compressibilite << " "; break; }; }; #endif + //--- partie courbure éventuelle if (avec_courbure) {double unSurV3=unSurV2*unSurV; @@ -1181,49 +1699,54 @@ void MooneyRivlin3D::Potentiel_et_var2(double & module_compressibilite) // calcul du potentiel double logV = log(V); - W_d = C10 * (J_r(1)-3.) + C01 * (J_r(2)-3.); // partie déviatorique + W_d = C10_use * (J_r(1)-3.) + C01_use * (J_r(2)-3.); // partie déviatorique // calcul des variations premières non nulles du potentiel // les variations secondes sont nulles - W_d_J1 = C10; // variation / J1 - W_d_J2 = C01; // variation / J2 + W_d_J1 = C10_use; // variation / J1 + W_d_J2 = C01_use; // variation / J2 #ifdef MISE_AU_POINT if (Permet_affichage() > 4) { cout << "\n MooneyRivlin3D::Potentiel_et_var2(..." - << "\n W_d= " << W_d << ", W_d_J1= "<< W_d_J1 <<", W_d_J2= "<< W_d_J2; + << "\n W_d= " << W_d << ", W_d_J1= "<< W_d_J1 <<", W_d_J2= "<< W_d_J2<< " "; }; #endif - // puis partie volumique + // puis partie volumique double unSurV2=unSurV*unSurV; + double VmoinsUn = V-1.; switch (type_pot_vol) - {case 1: {W_v = K * (1- (1+logV)*unSurV); // potentiel 1 - W_v_J3 = 0.5 * K * logV * unSurV * unSurV2; // variation / V - // calcul des variations secondes non nulles - W_v_J3J3 = 0.25 * K * unSurV2 * unSurV2 * unSurV *(1.-3.*logV); // variation / V - module_compressibilite = K * unSurV2; + {case 1: {W_v = K_use * (1- (1+logV)*unSurV); // potentiel 1 + W_v_J3 = 0.5 * K_use * logV * unSurV * unSurV2; // variation / J3 + // calcul des variations secondes / (J3)^2 + W_v_J3J3 = 0.25 * K_use * unSurV2 * unSurV2 * unSurV *(1.-3.*logV); + module_compressibilite = K_use * unSurV2; break; } - case 2: {W_v = 0.5 * K * (V-1); // potentiel 2 - W_v_J3 = 0.25 * K * unSurV; // variation / V - // calcul des variations secondes non nulles - W_v_J3J3 = -K * 0.125 * unSurV2 * unSurV; - module_compressibilite = 0.25 * K / (MaX(ConstMath::petit, logV)); + case 2: {W_v = 0.5 * K_use * VmoinsUn; // potentiel 2 + W_v_J3 = 0.25 * K_use * unSurV; // variation / J3 + // calcul des variations secondes / (J3)^2 + W_v_J3J3 = -K_use * 0.125 * unSurV2 * unSurV; + if (Dabs(VmoinsUn) > ConstMath::petit ) + {module_compressibilite = 0.5 * K_use / logV;} + else // on fait un développement limité du log pour V proche de 1. + {module_compressibilite = 0.5 * K_use / (VmoinsUn-VmoinsUn*VmoinsUn/2.+VmoinsUn*VmoinsUn*VmoinsUn/3.);} break; } - case 3: {W_v = K * 0.5 * logV * logV; // potentiel 3 - W_v_J3 = K * 0.5 * unSurV2 * logV; // variation / V - // calcul des variations secondes non nulles - W_v_J3J3 = K * 0.25 * unSurV2 * unSurV2 * (1.-2.*logV); - module_compressibilite = MaX(ConstMath::petit, 0.25 * K * logV ); + case 3: {W_v = K_use * 0.5 * logV * logV; // potentiel 3 + W_v_J3 = K_use * 0.5 * unSurV2 * logV; // variation / J3 + // calcul des variations secondes / (J3)^2 + W_v_J3J3 = K_use * 0.25 * unSurV2 * unSurV2 * (1.-2.*logV); + module_compressibilite = K_use / V ; break; } - case 4: {W_v = 0.5 * K * (V-1.)*(V-1.); // potentiel - W_v_J3 = 0.5 * K * unSurV * (V-1); // variation / V - // calcul des variations secondes non nulles - W_v_J3J3 = K * 0.25 * unSurV2 * unSurV; - // ici on fait l'approximation que (V-1)/ln(V) vaut environ 1 - // dans ce cas -P = K * (V-1) = approximativement K ln(V) - module_compressibilite = K ; + case 4: {W_v = 0.5 * K_use * VmoinsUn * VmoinsUn; // potentiel + W_v_J3 = 0.5 * K_use * unSurV * VmoinsUn; // variation / J3 + // calcul des variations secondes / (J3)^2 + W_v_J3J3 = K_use * 0.25 * unSurV2 * unSurV; + if (Dabs(VmoinsUn) > ConstMath::petit ) + {module_compressibilite = VmoinsUn * K_use /logV ;} + else // on fait un développement limité du log pour V proche de 1. + {module_compressibilite = VmoinsUn * K_use / (VmoinsUn-VmoinsUn*VmoinsUn/2.+VmoinsUn*VmoinsUn*VmoinsUn/3.);} break; } }; @@ -1231,11 +1754,13 @@ void MooneyRivlin3D::Potentiel_et_var2(double & module_compressibilite) if (Permet_affichage() > 4) {switch (type_pot_vol) {case 1: case 2: case 3: case 4: - cout << "\n W_v= " << W_v << ", W_v_J3= "<< W_v_J3 << ", W_v_J3J3= "<< W_v_J3J3; + cout << "\n W_v= " << W_v << ", W_v_J3= "<< W_v_J3 << ", W_v_J3J3= "<< W_v_J3J3 + << ", K_s= " << module_compressibilite << " "; break; }; }; #endif + // -- partie courbure éventuelle --- if (avec_courbure) {double unSurV3=unSurV2*unSurV; @@ -1280,15 +1805,19 @@ void MooneyRivlin3D::Cal_dsigma_deps_num (const TenseurBB & gijBB_0_,const Tense Tenseur3HH gijHHtdt_N; // idem_0 double delta = ConstMath::unpeupetit*10.; double unSurDelta = 1./delta; + + K_use = K; // init + C01_use = C01; // " + C10_use = C10; // " - // cas de la thermo dépendance, on calcul les grandeurs - if (C01_temperature != NULL) C01 = C01_temperature->Valeur(*temperature); - if (C10_temperature != NULL) C10 = C10_temperature->Valeur(*temperature); - if (K_temperature != NULL) K = K_temperature->Valeur(*temperature); - if (avec_courbure) - { if (a_temperature != NULL) a_courbure = a_temperature->Valeur(*temperature); - if (r_temperature != NULL) r_courbure = r_temperature->Valeur(*temperature); - }; + // cas de la thermo dépendance, on calcul les grandeurs + if (C01_temperature != NULL) C01_use = C01_temperature->Valeur(*temperature); + if (C10_temperature != NULL) C10_use = C10_temperature->Valeur(*temperature); + if (K_temperature != NULL) K_use = K_temperature->Valeur(*temperature); + if (avec_courbure) + { if (a_temperature != NULL) a_courbure = a_temperature->Valeur(*temperature); + if (r_temperature != NULL) r_courbure = r_temperature->Valeur(*temperature); + }; // cas des contraintes et de ses variations analytiques // Tenseur3HHHH dSigdepsHHHH; // le tenseur contenant les dérivées analytiques diff --git a/comportement/Hyper_elastique/MooneyRivlin3D.h b/comportement/Hyper_elastique/MooneyRivlin3D.h index cd78b3c..058aa54 100644 --- a/comportement/Hyper_elastique/MooneyRivlin3D.h +++ b/comportement/Hyper_elastique/MooneyRivlin3D.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -95,7 +95,25 @@ class MooneyRivlin3D : public Hyper_W_gene_3D ~MooneyRivlin3D (); - // Lecture des donnees de la classe sur fichier + // initialise les donnees particulieres a l'elements + // de matiere traite ( c-a-dire au pt calcule) + // Il y a creation d'une instance de SaveResul particuliere + // a la loi concernee + // la SaveResul classe est remplie par les instances heritantes + // le pointeur de SaveResul est sauvegarde au niveau de l'element + // c'a-d que les info particulieres au point considere sont stocke + // au niveau de l'element et non de la loi. + virtual SaveResul * New_et_Initialise() + { int avec_para = 0; // init par défaut + if (sortie_post) + avec_para = 3; + SaveResulHyper_W_gene_3D * pt = new SaveResulHyper_W_gene_3D(avec_para); + // insertion éventuelle de conteneurs de grandeurs quelconque + this->Insertion_conteneur_dans_save_result(pt); + return pt; + }; + + // Lecture des donnees de la classe sur fichier void LectureDonneesParticulieres (UtilLecture * ,LesCourbes1D& lesCourbes1D ,LesFonctions_nD& lesFonctionsnD); // affichage de la loi @@ -135,7 +153,9 @@ class MooneyRivlin3D : public Hyper_W_gene_3D protected : // donnée de la loi - double C10,C01,K; // 3 coeffs + double C10,C01,K; // 3 coeffs lues + double K_use,C10_use,C01_use; // les 3 coeffs utilisés dans les calculs + Courbe1D* C10_temperature; // courbe éventuelle d'évolution de C10 en fonction de la température Courbe1D* C01_temperature; // courbe éventuelle d'évolution de C01 en fonction de la température Courbe1D* K_temperature; // courbe éventuelle d'évolution de K en fonction de la température @@ -145,6 +165,12 @@ class MooneyRivlin3D : public Hyper_W_gene_3D double r_courbure; // para r utilisé que dans le cas avec courbure Courbe1D* a_temperature; // courbe éventuelle d'évolution de a en fonction de la température Courbe1D* r_temperature; // courbe éventuelle d'évolution de r en fonction de la température + + // cas d'une dépendance à une fonction nD, les fonctions sont multiplicatives par rapport aux valeurs + // définies par les données fixes où celles dépendantes directement de la température via une courbe 1D + // -- bien voir que dans ce cas on peut obtenir n'importe quoi, c'est de la responsabilité + // de l'utilisateur de savoir se qu'il fait + Fonction_nD * K_nD, * C01_nD, * C10_nD; double W_d,W_v; // le potentiel: partie déviatorique, partie sphérique Vecteur W_r; // dérivées premières du potentiel par rapport aux J_r diff --git a/comportement/Hyper_elastique/Poly_hyper3D.cc b/comportement/Hyper_elastique/Poly_hyper3D.cc index 97eda5a..cc645f3 100644 --- a/comportement/Hyper_elastique/Poly_hyper3D.cc +++ b/comportement/Hyper_elastique/Poly_hyper3D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -46,25 +46,27 @@ using namespace std; //introduces namespace std Poly_hyper3D::Poly_hyper3D () : // Constructeur par defaut Hyper_W_gene_3D(POLY_HYPER3D,CAT_MECANIQUE,3) - ,Cij(),K(-ConstMath::trespetit) + ,Cij(),K(-ConstMath::trespetit),Cij_nD(),K_nD(NULL) + ,K_use(0.),Cij_use() ,Cij_temperature(NULL),K_temperature(NULL),type_pot_vol(1) ,avec_courbure(false),a_courbure(0.),r_courbure(0) ,W_d(0.),W_v(0.) ,W_d_J1(0.),W_d_J2(0.),W_v_J3(0.),W_v_J3J3(0.) ,W_d_J1_2(0.),W_d_J1_J2(0.),W_d_J2_2(0.) - { }; + { }; // Constructeur de copie Poly_hyper3D::Poly_hyper3D (const Poly_hyper3D& loi) : Hyper_W_gene_3D(loi) - ,Cij(loi.Cij),K(loi.K) + ,Cij(loi.Cij),K(loi.K),Cij_nD(loi.Cij_nD),K_nD(loi.K_nD) + ,K_use(loi.K),Cij_use(loi.Cij) ,Cij_temperature(loi.Cij_temperature) ,K_temperature(loi.K_temperature),type_pot_vol(loi.type_pot_vol) ,W_d(loi.W_d),W_v(loi.W_v) ,W_d_J1(loi.W_d_J1),W_d_J2(loi.W_d_J2),W_v_J3(loi.W_v_J3),W_v_J3J3(loi.W_v_J3J3) ,W_d_J1_2(loi.W_d_J1_2),W_d_J1_J2(loi.W_d_J1_J2),W_d_J2_2(loi.W_d_J2_2) ,avec_courbure(loi.avec_courbure),a_courbure(loi.a_courbure),r_courbure(loi.r_courbure) - {// on regarde s'il s'agit de courbes locales ou de courbes globales + { // on regarde s'il s'agit de courbes locales ou de courbes globales int tai = Cij.Taille(); for (int i=1;i<= tai; i++) { int taj = Cij(i).Taille(); @@ -76,14 +78,33 @@ Poly_hyper3D::Poly_hyper3D (const Poly_hyper3D& loi) : if (K_temperature != NULL) if (K_temperature->NomCourbe() == "_") K_temperature = Courbe1D::New_Courbe1D(*(loi.K_temperature));; - if(avec_courbure) - { if (a_temperature != NULL) - if (a_temperature->NomCourbe() == "_") - a_temperature = Courbe1D::New_Courbe1D(*(loi.a_temperature)); - if (r_temperature != NULL) - if (r_temperature->NomCourbe() == "_") - r_temperature = Courbe1D::New_Courbe1D(*(loi.r_temperature)); - }; + if(avec_courbure) + { if (a_temperature != NULL) + if (a_temperature->NomCourbe() == "_") + a_temperature = Courbe1D::New_Courbe1D(*(loi.a_temperature)); + if (r_temperature != NULL) + if (r_temperature->NomCourbe() == "_") + r_temperature = Courbe1D::New_Courbe1D(*(loi.r_temperature)); + }; + + // idem pour les fonctions nD + if (K_nD != NULL) + if (K_nD->NomFonction() == "_") + {// comme il s'agit d'une fonction locale on la redéfinie (sinon pb lors du destructeur de loi) + string non_courbe("_"); + K_nD = Fonction_nD::New_Fonction_nD(*loi.K_nD); + }; + int bai = Cij_nD.Taille(); + for (int i=1;i<= bai; i++) + { int baj = Cij_nD(i).Taille(); + for (int j=1;j<=baj;j++) + {if (Cij_nD(i)(j)->NomFonction() == "_") + {// comme il s'agit d'une fonction locale on la redéfinie (sinon pb lors du destructeur de loi) + string non_courbe("_"); + Cij_nD(i)(j) = Fonction_nD::New_Fonction_nD(*loi.Cij_nD(i)(j)); + }; + }; + }; }; Poly_hyper3D::~Poly_hyper3D () @@ -101,6 +122,40 @@ Poly_hyper3D::~Poly_hyper3D () if (a_temperature->NomCourbe() == "_") delete a_temperature; if (r_temperature != NULL) if (r_temperature->NomCourbe() == "_") delete r_temperature; + + // idem pour les fonctions nD + if (K_nD != NULL) if (K_nD->NomFonction() == "_") delete K_nD; + int bai = Cij_nD.Taille(); + for (int i=1;i<= bai; i++) + { int baj = Cij_nD(i).Taille(); + for (int j=1;j<=baj;j++) + if (Cij_nD(i)(j) != NULL) if (Cij_nD(i)(j)->NomFonction() == "_") delete Cij_nD(i)(j); + }; + }; + +// initialise les donnees particulieres a l'elements +// de matiere traite ( c-a-dire au pt calcule) +// Il y a creation d'une instance de SaveResul particuliere +// a la loi concernee +// la SaveResul classe est remplie par les instances heritantes +// le pointeur de SaveResul est sauvegarde au niveau de l'element +// c'a-d que les info particulieres au point considere sont stocke +// au niveau de l'element et non de la loi. +Loi_comp_abstraite::SaveResul * Poly_hyper3D::New_et_Initialise() + { // on sortie_post + int para=0; + if (sortie_post) + {para++; // premier element K + int tai = Cij.Taille(); + for (int i=1;i<= tai; i++) + para += Cij(i).Taille(); + }; + + // stockage en conséquence + SaveResulHyper_W_gene_3D * pt = new SaveResulHyper_W_gene_3D(para); + // insertion éventuelle de conteneurs de grandeurs quelconque + this->Insertion_conteneur_dans_save_result(pt); + return pt; }; // Lecture des donnees de la classe sur fichier @@ -127,10 +182,12 @@ void Poly_hyper3D::LectureDonneesParticulieres Sortie(1); }; Cij.Change_taille(tai); // on dimensionne correctement la première dimension de Cij + Cij_use.Change_taille(tai); Cij_temperature.Change_taille(tai); // idem pour la dépendance éventuelle à la température // puis on dimensionne la deuxième dimension for (int i=1;i<= tai; i++) {Cij(i).Change_taille(i+1,(-ConstMath::trespetit)); // init à (-ConstMath::trespetit) + Cij_use(i).Change_taille(i+1,(-ConstMath::trespetit)); Cij_temperature(i).Change_taille(i+1,NULL); // idem init à NULL }; @@ -223,7 +280,12 @@ void Poly_hyper3D::LectureDonneesParticulieres { // lecture de K *(entreePrinc->entree) >> K ; // s'il n'y a plus rien n'a lire, il faut passer un enregistrement - if(strstr(entreePrinc->tablcar,"type_potvol_")==0) entreePrinc->NouvelleDonnee(); + if((strstr(entreePrinc->tablcar,"type_potvol_")==0) + && (strstr(entreePrinc->tablcar,"avec_courbure_")==0) + && (strstr(entreePrinc->tablcar,"avec_nD_")==0) + && (strstr(entreePrinc->tablcar,"sortie_post_")==0) + ) + entreePrinc->NouvelleDonnee(); }; // lecture éventuelle du type de potentiel if(strstr(entreePrinc->tablcar,"type_potvol_")!=0) @@ -249,14 +311,268 @@ void Poly_hyper3D::LectureDonneesParticulieres }; }; // s'il n'y a plus rien n'a lire, il faut passer un enregistrement - if(strstr(entreePrinc->tablcar,"avec_courbure_")==0) entreePrinc->NouvelleDonnee(); + if((strstr(entreePrinc->tablcar,"avec_nD_")==0) + && (strstr(entreePrinc->tablcar,"avec_courbure_")==0) + && (strstr(entreePrinc->tablcar,"sortie_post_")==0) + ) + entreePrinc->NouvelleDonnee(); }; - - + + + // ---- lecture éventuelle d'un terme de courbure + if(strstr(entreePrinc->tablcar,"avec_courbure_")!=0) + { *(entreePrinc->entree) >> nom; + if (nom != "avec_courbure_") + { cout << "\n erreur en lecture du mot cle, on aurait du lire le mot cle avec_courbure_" + << " et on a lue: " << nom ; + entreePrinc->MessageBuffer("**erreur9 Poly_hyper3D::LectureDonneesParticulieres (...**"); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + *(entreePrinc->entree) >> nom; + if (nom != "a_courbure=") + { cout << "\n erreur en lecture du parametre a, on aurait du lire le mot cle a_courbure=" + << " suivi d'un nombre reel et on a lue: " << nom ; + entreePrinc->MessageBuffer("**erreur10 Poly_hyper3D::LectureDonneesParticulieres (...**"); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + avec_courbure=true; + // on regarde si le coefficient est thermo dépendante + if(strstr(entreePrinc->tablcar,"a_thermo_dependant_")!=0) + { thermo_dependant=true; + *(entreePrinc->entree) >> nom; + if (nom != "a_thermo_dependant_") + { cout << "\n erreur en lecture de la thermodependance de a, on aurait du lire le mot cle a_thermo_dependant_" + << " suivi du nom d'une courbe de charge ou de la courbe elle meme, et on a lue: " << nom ; + entreePrinc->MessageBuffer("**erreur10 Poly_hyper3D::LectureDonneesParticulieres (...**"); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + // lecture de la loi d'évolution en fonction de la température + *(entreePrinc->entree) >> nom; + // on regarde si la courbe existe, si oui on récupère la référence + if (lesCourbes1D.Existe(nom)) + { a_temperature = lesCourbes1D.Trouve(nom);} + else + { // sinon il faut la lire maintenant + string non_courbe("_"); + a_temperature = Courbe1D::New_Courbe1D(non_courbe,Id_Nom_Courbe1D (nom.c_str())); + // lecture de la courbe + a_temperature->LectDonnParticulieres_courbes (non_courbe,entreePrinc); + }; + // prepa du flot de lecture + entreePrinc->NouvelleDonnee(); + } + else + { // lecture de a + *(entreePrinc->entree) >> a_courbure ; + }; + //-- on lit maintenant le paramètre r + *(entreePrinc->entree) >> nom; + if (nom != "r_courbure=") + { cout << "\n erreur en lecture du parametre r, on aurait du lire le mot cle r_courbure=" + << " suivi d'un nombre reel et on a lue: " << nom ; + entreePrinc->MessageBuffer("**erreur11 Poly_hyper3D::LectureDonneesParticulieres (...**"); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + // on regarde si le coefficient est thermo dépendante + if(strstr(entreePrinc->tablcar,"r_thermo_dependant_")!=0) + { thermo_dependant=true; + *(entreePrinc->entree) >> nom; + if (nom != "r_thermo_dependant_") + { cout << "\n erreur en lecture de la thermodependance de r, on aurait du lire le mot cle r_thermo_dependant_" + << " suivi du nom d'une courbe de charge ou de la courbe elle meme, et on a lue: " << nom ; + entreePrinc->MessageBuffer("**erreur12 Poly_hyper3D::LectureDonneesParticulieres (...**"); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + // lecture de la loi d'évolution en fonction de la température + *(entreePrinc->entree) >> nom; + // on regarde si la courbe existe, si oui on récupère la référence + if (lesCourbes1D.Existe(nom)) + { r_temperature = lesCourbes1D.Trouve(nom);} + else + { // sinon il faut la lire maintenant + string non_courbe("_"); + r_temperature = Courbe1D::New_Courbe1D(non_courbe,Id_Nom_Courbe1D (nom.c_str())); + // lecture de la courbe + r_temperature->LectDonnParticulieres_courbes (non_courbe,entreePrinc); + } + // prepa du flot de lecture + entreePrinc->NouvelleDonnee(); + } + else + { // lecture de a + *(entreePrinc->entree) >> r_courbure ; + }; + // prepa du flot de lecture + entreePrinc->NouvelleDonnee(); + } //-- fin de la lecture éventuelle d'un terme de courbure + else + {avec_courbure=false;}; + + // -------- on regarde s'il y a une dépendance à une fonction nD + if (strstr(entreePrinc->tablcar,"avec_nD_")!=NULL) + { string nom1,nom2; + string nom_class_methode = "Poly_hyper3D::LectureDonneesParticulieres"; + // lecture des fonctions nD, + entreePrinc->NouvelleDonnee(); // passage d'une ligne + + // on commence par dimensionner le tableau des pointeurs de fonctions nD + int tai = Cij.Taille(); Cij_nD.Change_taille(tai); + for (int i=1;i<= tai; i++) + Cij_nD(i).Change_taille( Cij(i).Taille(),NULL); + + // on lit tant que l'on ne rencontre pas la ligne contenant "fin_parametres_avec_nD_" + // ou un nouveau mot clé global auquel cas il y a pb !! + MotCle motCle; // ref aux mots cle + while (strstr(entreePrinc->tablcar,"fin_parametres_avec_nD_")==0) + { + // si on a un mot clé global dans la ligne courante c-a-d dans tablcar --> erreur + if ( motCle.SimotCle(entreePrinc->tablcar)) + { cout << "\n erreur de lecture des parametre de dependance a une fonction nD: on n'a pas trouve le mot cle " + << " fin_parametres_avec_nD_ et par contre la ligne courante contient un mot cle global "; + entreePrinc->MessageBuffer + ("** erreur51 des parametres de reglage de la loi de comportement Poly_hyper3D**"); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + + // lecture d'un mot clé + *(entreePrinc->entree) >> nom1; + + if ((entreePrinc->entree)->rdstate() == 0) + {} // lecture normale + #ifdef ENLINUX + else if ((entreePrinc->entree)->fail()) + // on a atteind la fin de la ligne et on appelle un nouvel enregistrement + { entreePrinc->NouvelleDonnee(); // lecture d'un nouvelle enregistrement + *(entreePrinc->entree) >>nom1; + } + #else + else if ((entreePrinc->entree)->eof()) + // la lecture est bonne mais on a atteind la fin de la ligne + { if(nom1 != "fin_parametres_avec_nD_") + {entreePrinc->NouvelleDonnee(); *(entreePrinc->entree) >> nom1;}; + } + #endif + else // cas d'une erreur de lecture + { cout << "\n erreur de lecture inconnue "; + entreePrinc->MessageBuffer + ("** erreur61 des parametres de reglage de la loi de comportement Maheo_hyper**"); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + + // on récupère les indices, on doit avoir la forme suivante C_IJ_nD= + // ou alors il s'agit de K_nD + if ( (nom1 != "K_nD=") + && + ( (nom1[0] != 'C') || (nom1[1] != '_' ) || (nom1[4] != '_' ) + || (nom1[5] != 'n' ) || (nom1[6] != 'D' ) || (nom1[7] != '=' ) + || isNumeric(&nom1[2],10) || isNumeric(&nom1[3],10) + ) + ) + { cout << "\n erreur en lecture, l'indicateur lue de la fonction nD = " << nom1 + << " n'est pas correct, il devrait etre de la forme C_IJ_nD= avec I et J un entier " + << " entre 0 et 9 " + << " il n'est donc pas utilisable !! "; + string message("\n**erreur011** \n"+nom_class_methode+"(..."); + entreePrinc->MessageBuffer(message); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + + // deux cas suivant qu'il s'agit d'un coef ou de K + if(nom1 == "K_nD=") + {string nom_fonct; + // lecture du nom de la fonction + *(entreePrinc->entree) >> nom_fonct; + + // maintenant on définit la fonction + if (lesFonctionsnD.Existe(nom_fonct)) + {K_nD = lesFonctionsnD.Trouve(nom_fonct); + } + else + {// sinon il faut la lire maintenant + string non("_"); + K_nD = Fonction_nD::New_Fonction_nD(non, Id_Nom_Fonction_nD(nom_fonct)); + // lecture de la fonction + K_nD->LectDonnParticulieres_Fonction_nD (non,entreePrinc); + // maintenant on vérifie que la fonction est utilisable + if (K_nD->NbComposante() != 1 ) + { cout << "\n erreur en lecture, la fonction " << nom_fonct + << " est une fonction vectorielle a " << K_nD->NbComposante() + << " composante alors qu'elle devrait etre scalaire ! " + << " elle n'est donc pas utilisable !! "; + string message("\n**erreur031** \n"+nom_class_methode+"(..."); + entreePrinc->MessageBuffer(message); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; + // on regarde si la fonction nD intègre la température + const Tableau & tab_enu = K_nD->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + // prepa du flot de lecture + entreePrinc->NouvelleDonnee(); + } + else // sinon il s'agit d'un coef + {int i = ChangeEntier(&nom1[2]); + int j = ChangeEntier(&nom1[3]); + string nom_fonct; + // lecture du nom de la fonction + *(entreePrinc->entree) >> nom_fonct; + + // maintenant on définit la fonction + if (lesFonctionsnD.Existe(nom_fonct)) + {Cij_nD(i)(j) = lesFonctionsnD.Trouve(nom_fonct); + } + else + {// sinon il faut la lire maintenant + string non("_"); + Cij_nD(i)(j) = Fonction_nD::New_Fonction_nD(non, Id_Nom_Fonction_nD(nom_fonct)); + // lecture de la fonction + Cij_nD(i)(j)->LectDonnParticulieres_Fonction_nD (non,entreePrinc); + // maintenant on vérifie que la fonction est utilisable + if (Cij_nD(i)(j)->NbComposante() != 1 ) + { cout << "\n erreur en lecture, la fonction " << nom_fonct + << " est une fonction vectorielle a " << Cij_nD(i)(j)->NbComposante() + << " composante alors qu'elle devrait etre scalaire ! " + << " elle n'est donc pas utilisable !! "; + string message("\n**erreur031** \n"+nom_class_methode+"(..."); + entreePrinc->MessageBuffer(message); + throw (UtilLecture::ErrNouvelleDonnee(-1)); + Sortie(1); + }; + }; + // on regarde si la fonction nD intègre la température + const Tableau & tab_enu = Cij_nD(i)(j)->Tab_enu_etendu(); + if (tab_enu.Contient(TEMP)) + thermo_dependant=true; + // prepa du flot de lecture + entreePrinc->NouvelleDonnee(); + }; + }; //-- fin du while + }; + + // on définit le nombre de paramètre total de la loi + tai = Cij.Taille(); + nb_para_loi = 1; // le K + for (int i=1;i<= tai; i++) + { int baj = Cij(i).Taille(); + for (int j=1;j<=baj;j++) + nb_para_loi++; + }; + // lecture de l'indication éventuelle du post traitement string nom_class_methode = "Poly_hyper3D::LectureDonneesParticulieres";string le_mot_cle = "sortie_post_"; - entreePrinc->Lecture_un_parametre_int(0,nom_class_methode,0,1,le_mot_cle,sortie_post); - + if (entreePrinc->Lecture_un_parametre_int(0,nom_class_methode,0,1,le_mot_cle,sortie_post)) + entreePrinc->NouvelleDonnee(); // passage éventuel du mot clé sortie_post_; + // --- appel au niveau de la classe mère // ici il n'y a pas de type de déformation associé // mais on prend la def standart d'almansi, pour les fonctions associées éventuelles @@ -293,6 +609,27 @@ void Poly_hyper3D::Affiche() const << " courbe r=f(T): " << r_temperature->NomCourbe() <<" ";} else { cout << " r= " << r_courbure ;} }; + + // les dépendances à une fonction nD + if (K_nD != NULL) + {cout << " fonction nD K_nD: "; + if (K_nD->NomFonction() != "_") + cout << K_nD->NomFonction(); + else + K_nD->Affiche(); + }; + int bai = Cij_nD.Taille(); + for (int i=1;i<= bai; i++) + { int baj = Cij_nD(i).Taille(); + for (int j=1;j<=baj;j++) + if (Cij_nD(i)(j) != NULL) + {cout << " fonction nD C_"<NomFonction() != "_") + cout << Cij_nD(i)(j)->NomFonction(); + else + Cij_nD(i)(j)->Affiche(); + }; + }; // appel de la classe mère Loi_comp_abstraite::Affiche_don_classe_abstraite(); }; @@ -328,20 +665,20 @@ void Poly_hyper3D::Info_commande_LoisDeComp(UtilLecture& entreePrinc) << "\n#------------------------------------------------------------------------------------" << "\n# noter qu'apres la definition de chaque courbe, on change de ligne, a l'inverse " << "\n# si la valeur du parametre est fixe, on poursuit sur la meme ligne. " - << "\n#------------------------------------------------------------------------------------" - << "\n#------------------------------------------------------------------------------------" - << "\n# un dernier parametre facultatif permet d'indiquer le type de variation volumique " + << "\n# " + << "\n#---------------------------------- type_potvol_ ----------------------------------------" + << "\n# un parametre facultatif permet d'indiquer le type de variation volumique " << "\n# que l'on desire: par defaut il s'agit de : K(1-(1+log(V))/V) qui correspond au type 1" << "\n# mais on peut choisir: K/2(V-1) qui correspond au type 2 " << "\n# ou: K/2(log(V))^2 qui correspond au type 3 " << "\n# ou: K/2(V-1)^2 qui correspond au type 4 " << "\n# en indiquant (en fin de ligne) le mot cle: type_potvol_ suivi du type" << "\n# par defaut type_potvol_ a la valeur 1 " - << "\n#------------------------------------------------------------------------------------" - << "\n#------------------------------------------------------------------------------------" + << "\n# " + << "\n#---------------------------------- avec_courbure_ -------------------------------------" << "\n# apres le type de variation volumique on peut indiquer facultativement l'ajout au potentiel " << "\n# d'un terme permettant de raidir le comportement a partir d'un certain niveau de chargement " - << "\n# pour cela on indique le mot cle: avec_courbure_ puis on change de ligne " + << "\n# pour cela on indique le mot cle: avec_courbure_ puis on change de ligne " << "\n# le terme additionnelle depend de deux parametres: a et r, a positionne la valeur de J1 " << "\n# a partir de laquelle il y a durcissement, r controle la courbure du changement de regime " << "\n# exemple de declaration : " @@ -353,6 +690,46 @@ void Poly_hyper3D::Info_commande_LoisDeComp(UtilLecture& entreePrinc) << "\n# ... type_potvol_ 2 avec_courbure_ " << "\n# a_courbure= a_thermo_dependant_ " << "\n# r_courbure= r_thermo_dependant_ " + << "\n# " + << "\n#--------------------- dependance explicite a une fonction nD -----------------------------------" + << "\n# il est egalement possible de definir une dependance des parametres a une fonction nD " + << "\n# dans ce cas, a la suite de la dependance explicite a la temperature via une courbr 1D " + << "\n# ou a la suite du dernier parametre fixe, on met le mot cle: avec_nD_ " + << "\n# puis sur les lignes qui suivent on met des fonctions nD multiplicatives des parametres " + << "\n# initiaux, puis un mot cle signalant la fin des fonctions: fin_parametres_avec_nD_ " + << "\n# suit un exemple de declaration (il est possible d'ommettre certaine fonction ! " + << "\n# la presence de fct nD est facultative), de meme il est possible soit d'utiliser une fonction " + << "\n# deja defini soit de donner directement la fonction nD (comme pour les autres lois) " + << "\n# Enfin, apres chaque definition de fonction il faut passer a une nouvelle ligne " + << "\n# " + << "\n# exemple de definition de loi" + << "\n# degre_maxi= 2 C01= 0.0167 C10= 0.145 C02= 0.0167 C11= 0.145 C20= 0.0167 K= 100 avec_nD_ " + << "\n# K_nD= fct_nD_1 " + << "\n# C_01_nD= fct_nD_2 " + << "\n# C_11_nD= fct_nD_3 " + << "\n# fin_parametres_avec_nD_ " + << "\n# " + << "\n# Remarques: " + << "\n# - les fonction nD sont des fonctions multiplicatives " + << "\n# des parametres initiaux (ou de ceux obtenus apres dependance explicite a la temperature " + << "\n# ( bien noter que la loi obtenue peut-etre quelconque, en particulier plus du tout " + << "\n# hyperelastique, tout depend des choix des fcts nD !) " + << "\n# " + << "\n# " + << "\n#----------------------------------- sortie_post_ -------------------------------------" + << "\n# il est possible de recuperer differentes grandeurs de travail par exemple " + << "\n# l'intensite du potentiel, comme ces grandeurs sont calculees au moment de la resolution " + << "\n# et ne sont pas stockees. On peut egalement recuperer la valeur des coefficients de la loi " + << "\n# (utile s'ils varient) sous forme d'un tableau de n uplets dont le premier est K suivi des CIJ " + << "\n# dont l'ordre est celui d'entree des parametres CIJ a la lecture " + << "\n# Il faut indiquer le mot cle sortie_post_ suivi de 1 (par defaut = 0) " + << "\n# ensuite au moment de la constitution du .CVisu on aura acces aux grandeurs de travail " + << "\n# ex: " + << "\n# sortie_post_ 1 " + << "\n# ce mot cle est le dernier des parametres specifiques de la loi il doit se situe " + << "\n# a la fin de la derniere ligne de donnees " + << "\n#" + << "\n#------------------------------------------------------------------------------------" << "\n#------------------------------------------------------------------------------------" << endl; }; @@ -406,117 +783,165 @@ int Poly_hyper3D::TestComplet() void Poly_hyper3D::Lecture_base_info_loi(ifstream& ent,const int cas,LesReferences& lesRef,LesCourbes1D& lesCourbes1D ,LesFonctions_nD& lesFonctionsnD) { string nom; bool test; - if (cas == 1) - { // le degré maxi - int tai=0; - ent >> nom >> tai; + if (cas == 1) + { // le degré maxi + int tai=0; + ent >> nom >> tai; Cij.Change_taille(tai); // on dimensionne correctement la première dimension de Cij + Cij_use.Change_taille(tai); // pour les températures on commence par vider le tableau int tait = Cij_temperature.Taille(); for (int i=1;i<=tait;i++) - { int taj = Cij_temperature(i).Taille(); - for (int j=1;j<=taj;j++) + {int taj = Cij_temperature(i).Taille(); + for (int j=1;j<=taj;j++) if (Cij_temperature(i)(j) != NULL) if (Cij_temperature(i)(j)->NomCourbe() == "_") delete Cij_temperature(i)(j); - }; + }; // maintenant on peut adapter la dimension Cij_temperature.Change_taille(tai); // idem pour la dépendance éventuelle à la température // puis on dimensionne la deuxième dimension for (int i=1;i<= tai; i++) {Cij(i).Change_taille(i+1,(-ConstMath::trespetit)); // init à (-ConstMath::trespetit) + Cij_use(i).Change_taille(i+1,(-ConstMath::trespetit)); Cij_temperature(i).Change_taille(i+1,NULL); // idem init à NULL // on lit les informations for (int j=1;j<= i+1; j++) - { ent >> nom >> test; - if (!test) - { ent >> Cij(i)(j);} - else - { ent >> nom; - Cij_temperature(i)(j) = lesCourbes1D.Lecture_pour_base_info(ent,cas,Cij_temperature(i)(j)); - }; - }; + {ent >> nom >> test; + if (!test) + { ent >> Cij(i)(j);} + else + { ent >> nom; + Cij_temperature(i)(j) = lesCourbes1D.Lecture_pour_base_info(ent,cas,Cij_temperature(i)(j)); + }; + }; }; //-- fin de la boucle i - - // K - ent >> nom >> test; + + // K + ent >> nom >> test; // vérification #ifdef MISE_AU_POINT - if (nom != "K") - { cout << "\n erreur en lecture du parametres K de la loi de mooney rivlin 3D" - << " on devait lire K= avant le second parametre " - << " et on a lue: " << nom << " " - << "\n Poly_hyper3D::Lecture_base_info_loi(..." - << endl; - Sortie(1); - } + if (nom != "K") + { cout << "\n erreur en lecture du parametres K de la loi de mooney rivlin 3D" + << " on devait lire K= avant le second parametre " + << " et on a lue: " << nom << " " + << "\n Poly_hyper3D::Lecture_base_info_loi(..." + << endl; + Sortie(1); + }; #endif - if (!test) - { ent >> K; - if (K_temperature != NULL) {if (K_temperature->NomCourbe() == "_") - delete K_temperature; K_temperature = NULL;}; - } - else - { ent >> nom; K_temperature = lesCourbes1D.Lecture_pour_base_info(ent,cas,K_temperature); }; - // le type de potentiel - ent >> nom >> type_pot_vol ; - // --- potentiel de gestion de courbure, éventuellement - ent >> nom ; - #ifdef MISE_AU_POINT - if (nom != "avec_courbure=") - { cout << "\n erreur en lecture de l'indicateur de courbure de la loi de Hart Smith 3D" - << " on devait lire avec_courbure= et on a lue: " << nom << " " - << "\n Hart_Smith3D::Lecture_base_info_loi(..." - << endl; - Sortie(1); + if (!test) + { ent >> K; + if (K_temperature != NULL) {if (K_temperature->NomCourbe() == "_") + delete K_temperature; K_temperature = NULL;}; } - #endif - ent >> avec_courbure; - if (avec_courbure) - {// a_courbure - ent >> nom >> test; - // vérification - #ifdef MISE_AU_POINT - if (nom != "a=") - { cout << "\n erreur en lecture du parametres a de la gestion eventuelle de courbure de la loi de Hart Smith 3D" - << " on devait lire a= avant le premier parametre " - << " et on a lue: " << nom << " " - << "\n Hart_Smith3D::Lecture_base_info_loi(..." - << endl; - Sortie(1); - }; - #endif - if (!test) - { ent >> a_courbure; - if (a_temperature != NULL) {if (a_temperature->NomCourbe() == "_") - delete a_temperature; a_temperature = NULL;}; - } - else - { ent >> nom; a_temperature = lesCourbes1D.Lecture_pour_base_info(ent,cas,a_temperature); }; - // r_courbure - ent >> nom >> test; - // vérification - #ifdef MISE_AU_POINT - if (nom != "r=") - { cout << "\n erreur en lecture du parametres r de la gestion eventuelle de courbure de la loi de Hart Smith 3D" - << " on devait lire r= avant le premier parametre " - << " et on a lue: " << nom << " " - << "\n Hart_Smith3D::Lecture_base_info_loi(..." - << endl; - Sortie(1); - }; - #endif - if (!test) - { ent >> r_courbure; - if (r_temperature != NULL) {if (r_temperature->NomCourbe() == "_") - delete r_temperature; r_temperature = NULL;}; - } - else - { ent >> nom; r_temperature = lesCourbes1D.Lecture_pour_base_info(ent,cas,r_temperature); }; - }; - } - // appel de la classe mère - Loi_comp_abstraite::Lecture_don_base_info(ent,cas,lesRef,lesCourbes1D,lesFonctionsnD); - }; + else + { ent >> nom; K_temperature = lesCourbes1D.Lecture_pour_base_info(ent,cas,K_temperature); }; + // le type de potentiel + ent >> nom >> type_pot_vol ; + // --- potentiel de gestion de courbure, éventuellement + ent >> nom ; + #ifdef MISE_AU_POINT + if (nom != "avec_courbure=") + { cout << "\n erreur en lecture de l'indicateur de courbure de la loi de Poly_hyper3D " + << " on devait lire avec_courbure= et on a lue: " << nom << " " + << "\n Poly_hyper3D::Lecture_base_info_loi(..." + << endl; + Sortie(1); + }; + #endif + ent >> avec_courbure; + if (avec_courbure) + {// a_courbure + ent >> nom >> test; + // vérification + #ifdef MISE_AU_POINT + if (nom != "a=") + { cout << "\n erreur en lecture du parametres a de la gestion eventuelle de courbure de la loi de Poly_hyper3D 3D" + << " on devait lire a= avant le premier parametre " + << " et on a lue: " << nom << " " + << "\n Poly_hyper3D::Lecture_base_info_loi(..." + << endl; + Sortie(1); + }; + #endif + if (!test) + { ent >> a_courbure; + if (a_temperature != NULL) {if (a_temperature->NomCourbe() == "_") + delete a_temperature; a_temperature = NULL;}; + } + else + { ent >> nom; a_temperature = lesCourbes1D.Lecture_pour_base_info(ent,cas,a_temperature); }; + // r_courbure + ent >> nom >> test; + // vérification + #ifdef MISE_AU_POINT + if (nom != "r=") + { cout << "\n erreur en lecture du parametres r de la gestion eventuelle de courbure de la loi de Poly_hyper3D " + << " on devait lire r= avant le premier parametre " + << " et on a lue: " << nom << " " + << "\n Poly_hyper3D::Lecture_base_info_loi(..." + << endl; + Sortie(1); + }; + #endif + if (!test) + {ent >> r_courbure; + if (r_temperature != NULL) {if (r_temperature->NomCourbe() == "_") + delete r_temperature; r_temperature = NULL;}; + } + else + { ent >> nom; r_temperature = lesCourbes1D.Lecture_pour_base_info(ent,cas,r_temperature); }; + }; + // --- fonctions nD éventuelles + ent >> nom; + if (nom == "avec_fct_nD") + { ent >> nom; + // d'abord K + if (nom == "K_nD:") + K_nD = lesFonctionsnD.Lecture_pour_base_info(ent,cas,K_nD); + // puis les coefficients + int bai = Cij_nD.Taille(); + // comme il s'agit du cas==1, on considère que ce ne sera pas exécuté souvent + // on ne cherche pas a optimiser, du coup on commence par supprimer les fct éventuellement existantes + // ceci pour faciliter la lecture + for (int i=1;i<= bai; i++) + { int baj = Cij_nD(i).Taille(); + for (int j=1;j<=baj;j++) + if (Cij_nD(i)(j) != NULL) if (Cij_nD(i)(j)->NomFonction() == "_") + {delete Cij_nD(i)(j);Cij_nD(i)(j)=NULL;}; + }; + // on dimensionne si nécessaire + if (!bai) + // cas où le tableau est vide + {int tai = Cij.Taille(); Cij_nD.Change_taille(tai); + for (int i=1;i<= tai; i++) + Cij_nD(i).Change_taille( Cij(i).Taille(),NULL); + }; + // on lit et on rempli + for (int i=1;i<= bai; i++) + { int baj = Cij_nD(i).Taille(); + for (int j=1;j<=baj;j++) + { int a,b; + ent >> nom >> a >> b >> nom; + Cij_nD(i)(j) = lesFonctionsnD.Lecture_pour_base_info(ent,cas,Cij_nD(i)(j)); + }; + + }; + }; + + // on définit le nombre de paramètre total de la loi + tai = Cij.Taille(); + nb_para_loi = 1; // le K + for (int i=1;i<= tai; i++) + { int baj = Cij(i).Taille(); + for (int j=1;j<=baj;j++) + nb_para_loi++; + }; + + } + // appel de la classe mère + Loi_comp_abstraite::Lecture_don_base_info(ent,cas,lesRef,lesCourbes1D,lesFonctionsnD); + }; // cas donne le niveau de sauvegarde // = 1 : on sauvegarde tout // = 2 : on sauvegarde uniquement les données variables (supposées comme telles) @@ -529,49 +954,73 @@ void Poly_hyper3D::Ecriture_base_info_loi(ofstream& sort,const int cas) // on balaie les coefficients sort << "\n "; for (int i=1;i<= tai; i++) - for (int j=0;j<= i; j++) + for (int j=0;j<= i; j++) { // constitution de l'indicateur string indicateur("C"); indicateur += ChangeEntierSTring(j);indicateur +=ChangeEntierSTring(i-j); - indicateur +="="; + indicateur +="="; sort << indicateur << " "; - if ( Cij_temperature(i)(j+1) != NULL) - { sort << true << " courbe_f(T): "; - LesCourbes1D::Ecriture_pour_base_info(sort,cas,Cij_temperature(i)(j+1)); - } - else { sort << false << Cij(i)(j+1) ;}; + if ( Cij_temperature(i)(j+1) != NULL) + { sort << true << " courbe_f(T): "; + LesCourbes1D::Ecriture_pour_base_info(sort,cas,Cij_temperature(i)(j+1)); + } + else { sort << false << Cij(i)(j+1) ;}; }; // la partie volumique - sort << " K= "; + sort << " K= "; if (K_temperature == NULL) { sort << false << " " << K << " ";} else { sort << true << " fonction_K_temperature "; LesCourbes1D::Ecriture_pour_base_info(sort,cas,K_temperature); - }; + }; // le potentiel sort << " typ_pot= " << type_pot_vol << " "; // le type de potentiel // --- potentiel de gestion de courbure, éventuellement sort << " avec_courbure= " << avec_courbure; if (avec_courbure) { sort << " a= "; - if (a_temperature == NULL) - { sort << false << " " << a_courbure << " ";} - else - { sort << true << " fonction_a_temperature "; - LesCourbes1D::Ecriture_pour_base_info(sort,cas,a_temperature); - }; + if (a_temperature == NULL) + { sort << false << " " << a_courbure << " ";} + else + { sort << true << " fonction_a_temperature "; + LesCourbes1D::Ecriture_pour_base_info(sort,cas,a_temperature); + }; sort << "\n r= "; - if (r_temperature == NULL) - { sort << false << " " << r_courbure << " ";} - else - { sort << true << " fonction_r_temperature "; - LesCourbes1D::Ecriture_pour_base_info(sort,cas,r_temperature); - }; + if (r_temperature == NULL) + { sort << false << " " << r_courbure << " ";} + else + { sort << true << " fonction_r_temperature "; + LesCourbes1D::Ecriture_pour_base_info(sort,cas,r_temperature); + }; + }; + // --- cas de fonction nD éventuelles + int bai = Cij_nD.Taille(); + if (!bai) + { sort << " sans_fctnD ";} + else + { sort << " avec_fct_nD "; + // d'abord K + if (K_nD != NULL) + {sort << " K_nD: " << " "; + LesFonctions_nD::Ecriture_pour_base_info(sort, cas,K_nD); + } + else {sort << " non_K_nD "; }; + // puis les coefficients + for (int i=1;i<= bai; i++) + { int baj = Cij_nD(i).Taille(); + for (int j=1;j<=baj;j++) + if (Cij_nD(i)(j) != NULL) + { sort << " coeff " << i <<" "< 4) @@ -612,17 +1064,17 @@ void Poly_hyper3D::Calcul_SigmaHH(TenseurHH& ,TenseurBB& ,DdlElement & tab_ddl, for (int i=1;i<= tai; i++) for (int j=1;j<= i+1; j++) if (Cij_temperature(i)(j) != NULL) - {Cij(i)(j) = Cij_temperature(i)(j)->Valeur(*temperature); + {Cij_use(i)(j) = Cij_temperature(i)(j)->Valeur(*temperature); #ifdef MISE_AU_POINT if (Permet_affichage() > 4) - cout << "\n C_"<Valeur(*temperature); + {K_use = K_temperature->Valeur(*temperature); #ifdef MISE_AU_POINT if (Permet_affichage() > 4) - cout << "\n K_(T)="< list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + K_use *= tab_val(1); + }; + + // puis les coef: on boucle sur le tableau + for (int i=1;i<= bai; i++) + { int baj = Cij_nD(i).Taille(); + for (int j=1;j<=baj;j++) + if (Cij_nD(i)(j) != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (Cij_nD(i)(j),1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + Cij_use(i)(j) *= tab_val(1); + }; + }; + }; + if (sortie_post) + {// sauvegarde des paramètres matériau + int ia = 1; // init + // d'abord K + (*save_resulHyper_W.para_loi)(ia) = K_use; + // puis les coef + int tai = Cij.Taille(); + for (int i=1;i<= tai; i++) + { int taj = Cij(i).Taille(); + for (int j=1;j<=taj;j++,ia++) + (*save_resulHyper_W.para_loi)(ia) = Cij_use(i)(j); + }; + }; // calcul des invariants et de leurs variations premières (méthode de Hyper_W_gene_3D) Invariants_et_var1(*(ex.gijBB_0),*(ex.gijHH_0),gijBB_,gijHH_,jacobien_0,jacobien); @@ -699,6 +1213,10 @@ void Poly_hyper3D::Calcul_DsigmaHH_tdt (TenseurHH& ,TenseurBB& ,DdlElement & tab Tenseur3HH & sigHH = *((Tenseur3HH*) &sigHH_tdt); // passage en dim 3 explicite Tenseur3HH & gijHH_tdt = *((Tenseur3HH*) &gijHH_tdt_); // passage en dim 3 explicite + // init des coefficients utilisés + Cij_use = Cij; + K_use = K; + // informations éventuelles #ifdef MISE_AU_POINT if (Permet_affichage() > 4) @@ -712,17 +1230,17 @@ void Poly_hyper3D::Calcul_DsigmaHH_tdt (TenseurHH& ,TenseurBB& ,DdlElement & tab for (int i=1;i<= tai; i++) for (int j=1;j<= i+1; j++) if (Cij_temperature(i)(j) != NULL) - {Cij(i)(j) = Cij_temperature(i)(j)->Valeur(*temperature); + {Cij_use(i)(j) = Cij_temperature(i)(j)->Valeur(*temperature); #ifdef MISE_AU_POINT if (Permet_affichage() > 4) - cout << "\n C_"<Valeur(*temperature); + {K_use = K_temperature->Valeur(*temperature); #ifdef MISE_AU_POINT if (Permet_affichage() > 4) - cout << "\n K_(T)="< list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + K_use *= tab_val(1); + }; + + // puis les coef: on boucle sur le tableau + for (int i=1;i<= bai; i++) + { int baj = Cij_nD(i).Taille(); + for (int j=1;j<=baj;j++) + if (Cij_nD(i)(j) != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (Cij_nD(i)(j),1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + Cij_use(i)(j) *= tab_val(1); + }; + }; + + }; + if (sortie_post) + {// sauvegarde des paramètres matériau + int ia = 1; // init + // d'abord K + (*save_resulHyper_W.para_loi)(ia) = K_use; + // puis les coef + int tai = Cij.Taille(); + for (int i=1;i<= tai; i++) + { int taj = Cij(i).Taille(); + for (int j=1;j<=taj;j++,ia++) + (*save_resulHyper_W.para_loi)(ia) = Cij_use(i)(j); + }; + }; + // calcul des invariants et de leurs variations premières et secondes Invariants_et_var2(*(ex.gijBB_0),*(ex.gijHH_0),gijBB_tdt,gijHH_tdt,jacobien_0,jacobien); // calcul du potentiel et de ses dérivées premières et secondes / aux invariants J_r @@ -834,6 +1413,10 @@ void Poly_hyper3D::Calcul_dsigma_deps (bool en_base_orthonormee, TenseurHH & ,Te Tenseur3HH & sigHH = *((Tenseur3HH*) &sigHH_tdt); // // passage en dim 3 explicite Tenseur3HH & gijHH_tdt = *((Tenseur3HH*) ex.gijHH_tdt); // passage en dim 3 explicite + // init des coefficients utilisés + Cij_use = Cij; + K_use = K; + // informations éventuelles #ifdef MISE_AU_POINT if (Permet_affichage() > 4) @@ -847,17 +1430,17 @@ void Poly_hyper3D::Calcul_dsigma_deps (bool en_base_orthonormee, TenseurHH & ,Te for (int i=1;i<= tai; i++) for (int j=1;j<= i+1; j++) if (Cij_temperature(i)(j) != NULL) - {Cij(i)(j) = Cij_temperature(i)(j)->Valeur(*temperature); + {Cij_use(i)(j) = Cij_temperature(i)(j)->Valeur(*temperature); #ifdef MISE_AU_POINT if (Permet_affichage() > 4) - cout << "\n C_"<Valeur(*temperature); + {K_use = K_temperature->Valeur(*temperature); #ifdef MISE_AU_POINT if (Permet_affichage() > 4) - cout << "\n K_(T)="< list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (K_nD,1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + K_use *= tab_val(1); + }; + + // puis les coef: on boucle sur le tableau + for (int i=1;i<= bai; i++) + { int baj = Cij_nD(i).Taille(); + for (int j=1;j<=baj;j++) + if (Cij_nD(i)(j) != NULL) + // là il faut calculer la fonction nD + { // on utilise la méthode générique de loi abstraite + list list_save; // inter pour l'appel de la fonction + list_save.push_back(saveResul); + Tableau & tab_val = Loi_comp_abstraite::Loi_comp_Valeur_FnD_Evoluee + (Cij_nD(i)(j),1 // une seule valeur attendue en retour + ,ex_impli,ex_expli_tdt,ex_expli + ,NULL + ,NULL + ,&list_save + ); + // on récupère le premier élément du tableau uniquement + Cij_use(i)(j) *= tab_val(1); + }; + }; + }; + if (sortie_post) + {// sauvegarde des paramètres matériau + int ia = 1; // init + // d'abord K + (*save_resulHyper_W.para_loi)(ia) = K_use; + // puis les coef + int tai = Cij.Taille(); + for (int i=1;i<= tai; i++) + { int taj = Cij(i).Taille(); + for (int j=1;j<=taj;j++,ia++) + (*save_resulHyper_W.para_loi)(ia) = Cij_use(i)(j); + }; + }; + // calcul des invariants et de leurs variations premières et secondes Invariants_et_var2(*(ex.gijBB_0),*(ex.gijHH_0),*(ex.gijBB_tdt),gijHH_tdt,jacobien_0,jacobien); @@ -988,54 +1632,60 @@ void Poly_hyper3D::Potentiel_et_var(double & module_compressibilite) W_d=0.; // init W_d W_d_J1 = 0.; // init variation / J1 W_d_J2 = 0.; // init variation / J2 - int tai=Cij.Taille(); + int tai=Cij_use.Taille(); for (int n=1;n<= tai; n++) // n c'est le degré for (int k=1;k<=n+1;k++) - { W_d += Cij(n)(k) * PuissPoten((J_r(1)-3.),k-1) * PuissPoten((J_r(2)-3.),n-k+1); - W_d_J1 += Cij(n)(k) * (k-1) * PuissPoten((J_r(1)-3.),k-2) * PuissPoten((J_r(2)-3.),n-k+1); - W_d_J2 += Cij(n)(k) * PuissPoten((J_r(1)-3.),k-1) * (n-k+1) * PuissPoten((J_r(2)-3.),n-k); + { W_d += Cij_use(n)(k) * PuissPoten((J_r(1)-3.),k-1) * PuissPoten((J_r(2)-3.),n-k+1); + W_d_J1 += Cij_use(n)(k) * (k-1) * PuissPoten((J_r(1)-3.),k-2) * PuissPoten((J_r(2)-3.),n-k+1); + W_d_J2 += Cij_use(n)(k) * PuissPoten((J_r(1)-3.),k-1) * (n-k+1) * PuissPoten((J_r(2)-3.),n-k); }; #ifdef MISE_AU_POINT if (Permet_affichage() > 4) { cout << "\n Poly_hyper3D::Potentiel_et_var((..." - << "\n W_d= " << W_d << ", W_d_J1= "<< W_d_J1 <<", W_d_J2= "<< W_d_J2; + << "\n W_d= " << W_d << ", W_d_J1= "<< W_d_J1 <<", W_d_J2= "<< W_d_J2 << " "; }; #endif + // puis partie volumique - switch (type_pot_vol) - {case 1: {W_v = K * (1- (1+logV)*unSurV); // potentiel 1 - W_v_J3 = 0.5 * K * logV * unSurV * unSurV2; // variation / V - module_compressibilite = K * unSurV2; - break; - } - case 2: {W_v = 0.5 * K * (V-1); // potentiel 2 - W_v_J3 = 0.25 * K * unSurV; // variation / V - module_compressibilite = 0.25 * K / (MaX(ConstMath::petit, logV)); - break; - } - case 3: {W_v = K * 0.5 * logV * logV; // potentiel 3 - W_v_J3 = K * 0.5 * unSurV2 * logV; // variation / V - module_compressibilite = MiN(ConstMath::petit, 0.25 * K * logV ); - break; - } - case 4: {W_v = 0.5 * K * (V-1.)*(V-1.); // potentiel - W_v_J3 = 0.5 * K * unSurV * (V-1); // variation / V - // ici on fait l'approximation que (V-1)/ln(V) vaut environ 1 - // dans ce cas -P = K * (V-1) = approximativement K ln(V) - module_compressibilite = K ; - break; - } - - }; + double VmoinsUn = V-1.; + switch (type_pot_vol) + {case 1: {W_v = K_use * (1- (1+logV)*unSurV); // potentiel 1 + W_v_J3 = 0.5 * K_use * logV * unSurV * unSurV2; // variation / J3 + module_compressibilite = K_use * unSurV2; + break; + } + case 2: {W_v = 0.5 * K_use * VmoinsUn; // potentiel 2 + W_v_J3 = 0.25 * K_use * unSurV; // variation / J3 + if (Dabs(VmoinsUn) > ConstMath::petit ) + {module_compressibilite = 0.5 * K_use / logV;} + else // on fait un développement limité du log pour V proche de 1. + {module_compressibilite = 0.5 * K_use / (VmoinsUn-VmoinsUn*VmoinsUn/2.+VmoinsUn*VmoinsUn*VmoinsUn/3.);} + break; + } + case 3: {W_v = K_use * 0.5 * logV * logV; // potentiel 3 + W_v_J3 = K_use * 0.5 * unSurV2 * logV; // variation / J3 + module_compressibilite = K_use / V ; + break; + } + case 4: {W_v = 0.5 * K_use * VmoinsUn * VmoinsUn; // potentiel + W_v_J3 = 0.5 * K_use * unSurV * VmoinsUn; // variation / J3 + if (Dabs(VmoinsUn) > ConstMath::petit ) + {module_compressibilite = VmoinsUn * K_use /logV ;} + else // on fait un développement limité du log pour V proche de 1. + {module_compressibilite = VmoinsUn * K_use / (VmoinsUn-VmoinsUn*VmoinsUn/2.+VmoinsUn*VmoinsUn*VmoinsUn/3.);} + break; + } + }; #ifdef MISE_AU_POINT if (Permet_affichage() > 4) {switch (type_pot_vol) {case 1: case 2: case 3: case 4: - cout << "\n W_v= " << W_v << ", W_v_J3= "<< W_v_J3 ; + cout << "\n W_v= " << W_v << ", W_v_J3= "<< W_v_J3 << ", K_s= " << module_compressibilite << " "; break; }; }; #endif + //--- partie courbure éventuelle if (avec_courbure) {double unSurV3=unSurV2*unSurV; @@ -1066,69 +1716,76 @@ void Poly_hyper3D::Potentiel_et_var2(double & module_compressibilite) W_d_J1 = 0.; // init variation / J1 W_d_J2 = 0.; // init variation / J2 W_d_J1_2 = W_d_J1_J2 = W_d_J2_2 = 0.; // init des dérivées secondes - int tai=Cij.Taille(); + int tai=Cij_use.Taille(); for (int n=1;n<= tai; n++) // n c'est le degré for (int k=1;k<=n+1;k++) - { W_d += Cij(n)(k) * PuissPoten((J_r(1)-3.),k-1) * PuissPoten((J_r(2)-3.),n-k+1); - W_d_J1 += Cij(n)(k) * (k-1) * PuissPoten((J_r(1)-3.),k-2) * PuissPoten((J_r(2)-3.),n-k+1); - W_d_J2 += Cij(n)(k) * PuissPoten((J_r(1)-3.),k-1) * (n-k+1) * PuissPoten((J_r(2)-3.),n-k); + { W_d += Cij_use(n)(k) * PuissPoten((J_r(1)-3.),k-1) * PuissPoten((J_r(2)-3.),n-k+1); + W_d_J1 += Cij_use(n)(k) * (k-1) * PuissPoten((J_r(1)-3.),k-2) * PuissPoten((J_r(2)-3.),n-k+1); + W_d_J2 += Cij_use(n)(k) * PuissPoten((J_r(1)-3.),k-1) * (n-k+1) * PuissPoten((J_r(2)-3.),n-k); // dérivées secondes - W_d_J1_2 += Cij(n)(k) * (k-1)*(k-2) * PuissPoten((J_r(1)-3.),k-3) * PuissPoten((J_r(2)-3.),n-k+1); - W_d_J1_J2 += Cij(n)(k) * (k-1) * PuissPoten((J_r(1)-3.),k-2) * (n-k+1) * PuissPoten((J_r(2)-3.),n-k); - W_d_J2_2 += Cij(n)(k) * PuissPoten((J_r(1)-3.),k-1) * (n-k+1)*(n-k) * PuissPoten((J_r(2)-3.),n-k-1); + W_d_J1_2 += Cij_use(n)(k) * (k-1)*(k-2) * PuissPoten((J_r(1)-3.),k-3) * PuissPoten((J_r(2)-3.),n-k+1); + W_d_J1_J2 += Cij_use(n)(k) * (k-1) * PuissPoten((J_r(1)-3.),k-2) * (n-k+1) * PuissPoten((J_r(2)-3.),n-k); + W_d_J2_2 += Cij_use(n)(k) * PuissPoten((J_r(1)-3.),k-1) * (n-k+1)*(n-k) * PuissPoten((J_r(2)-3.),n-k-1); }; #ifdef MISE_AU_POINT if (Permet_affichage() > 4) - { cout << "\nPoly_hyper3D::Potentiel_et_var2(..." + { cout << "\n Poly_hyper3D::Potentiel_et_var2(..." << "\n W_d= " << W_d << ", W_d_J1= "<< W_d_J1 <<", W_d_J2= "<< W_d_J2 << ", W_d_J1_2= "<< W_d_J1_2 <<", W_d_J1_J2= "<< W_d_J1_J2 - <<", W_d_J2_2= "<< W_d_J2_2; + <<", W_d_J2_2= "<< W_d_J2_2 << " "; }; #endif - + // puis partie volumique - double unSurV2=unSurV*unSurV; - switch (type_pot_vol) - {case 1: {W_v = K * (1- (1+logV)*unSurV); // potentiel 1 - W_v_J3 = 0.5 * K * logV * unSurV * unSurV2; // variation / V - // calcul des variations secondes non nulles - W_v_J3J3 = 0.25 * K * unSurV2 * unSurV2 * unSurV *(1.-3.*logV); // variation / V - module_compressibilite = K * unSurV2; - break; - } - case 2: {W_v = 0.5 * K * (V-1); // potentiel 2 - W_v_J3 = 0.25 * K * unSurV; // variation / V - // calcul des variations secondes non nulles - W_v_J3J3 = -K * 0.125 * unSurV2 * unSurV; - module_compressibilite = 0.25 * K / (MaX(ConstMath::petit, logV)); - break; - } - case 3: {W_v = K * 0.5 * logV * logV; // potentiel 3 - W_v_J3 = K * 0.5 * unSurV2 * logV; // variation / V - // calcul des variations secondes non nulles - W_v_J3J3 = K * 0.25 * unSurV2 * unSurV2 * (1.-2.*logV); - module_compressibilite = MaX(ConstMath::petit, 0.25 * K * logV ); - break; - } - case 4: {W_v = 0.5 * K * (V-1.)*(V-1.); // potentiel - W_v_J3 = 0.5 * K * unSurV * (V-1); // variation / V - // calcul des variations secondes non nulles - W_v_J3J3 = K * 0.25 * unSurV2 * unSurV; - // ici on fait l'approximation que (V-1)/ln(V) vaut environ 1 - // dans ce cas -P = K * (V-1) = approximativement K ln(V) - module_compressibilite = K ; - break; - } + double unSurV2=unSurV*unSurV; + double VmoinsUn = V-1.; + switch (type_pot_vol) + {case 1: {W_v = K_use * (1- (1+logV)*unSurV); // potentiel 1 + W_v_J3 = 0.5 * K_use * logV * unSurV * unSurV2; // variation / J3 + // calcul des variations secondes / (J3)^2 + W_v_J3J3 = 0.25 * K_use * unSurV2 * unSurV2 * unSurV *(1.-3.*logV); + module_compressibilite = K_use * unSurV2; + break; + } + case 2: {W_v = 0.5 * K_use * VmoinsUn; // potentiel 2 + W_v_J3 = 0.25 * K_use * unSurV; // variation / J3 + // calcul des variations secondes / (J3)^2 + W_v_J3J3 = -K_use * 0.125 * unSurV2 * unSurV; + if (Dabs(VmoinsUn) > ConstMath::petit ) + {module_compressibilite = 0.5 * K_use / logV;} + else // on fait un développement limité du log pour V proche de 1. + {module_compressibilite = 0.5 * K_use / (VmoinsUn-VmoinsUn*VmoinsUn/2.+VmoinsUn*VmoinsUn*VmoinsUn/3.);} + break; + } + case 3: {W_v = K_use * 0.5 * logV * logV; // potentiel 3 + W_v_J3 = K_use * 0.5 * unSurV2 * logV; // variation / J3 + // calcul des variations secondes / (J3)^2 + W_v_J3J3 = K_use * 0.25 * unSurV2 * unSurV2 * (1.-2.*logV); + module_compressibilite = K_use / V ; + break; + } + case 4: {W_v = 0.5 * K_use * VmoinsUn * VmoinsUn; // potentiel + W_v_J3 = 0.5 * K_use * unSurV * VmoinsUn; // variation / J3 + // calcul des variations secondes / (J3)^2 + W_v_J3J3 = K_use * 0.25 * unSurV2 * unSurV; + if (Dabs(VmoinsUn) > ConstMath::petit ) + {module_compressibilite = VmoinsUn * K_use /logV ;} + else // on fait un développement limité du log pour V proche de 1. + {module_compressibilite = VmoinsUn * K_use / (VmoinsUn-VmoinsUn*VmoinsUn/2.+VmoinsUn*VmoinsUn*VmoinsUn/3.);} + break; + } }; #ifdef MISE_AU_POINT if (Permet_affichage() > 4) {switch (type_pot_vol) {case 1: case 2: case 3: case 4: - cout << "\n W_v= " << W_v << ", W_v_J3= "<< W_v_J3 << ", W_v_J3J3= "<< W_v_J3J3; + cout << "\n W_v= " << W_v << ", W_v_J3= "<< W_v_J3 << ", W_v_J3J3= "<< W_v_J3J3 + << ", K_s= " << module_compressibilite << " "; break; }; }; #endif + // -- partie courbure éventuelle --- if (avec_courbure) {double unSurV3=unSurV2*unSurV; @@ -1173,15 +1830,19 @@ void Poly_hyper3D::Cal_dsigma_deps_num (const TenseurBB & gijBB_0_,const Tenseur Tenseur3HH gijHHtdt_N; // idem_0 double delta = ConstMath::unpeupetit*10.; double unSurDelta = 1./delta; - + + // init des coefficients utilisés + Cij_use = Cij; + K_use = K; + // cas de la thermo dépendance, on calcul les grandeurs int tai = Cij.Taille(); // on balaie les coefficients for (int i=1;i<= tai; i++) for (int j=1;j<= i+1; j++) if (Cij_temperature(i)(j) != NULL) - Cij(i)(j) = Cij_temperature(i)(j)->Valeur(*temperature); - if (K_temperature != NULL) K = K_temperature->Valeur(*temperature); + Cij_use(i)(j) = Cij_temperature(i)(j)->Valeur(*temperature); + if (K_temperature != NULL) K_use = K_temperature->Valeur(*temperature); if (avec_courbure) { if (a_temperature != NULL) a_courbure = a_temperature->Valeur(*temperature); if (r_temperature != NULL) r_courbure = r_temperature->Valeur(*temperature); diff --git a/comportement/Hyper_elastique/Poly_hyper3D.h b/comportement/Hyper_elastique/Poly_hyper3D.h index 1cf5725..92d61ab 100644 --- a/comportement/Hyper_elastique/Poly_hyper3D.h +++ b/comportement/Hyper_elastique/Poly_hyper3D.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -91,7 +91,17 @@ class Poly_hyper3D : public Hyper_W_gene_3D // DESTRUCTEUR : ~Poly_hyper3D (); - + + // initialise les donnees particulieres a l'elements + // de matiere traite ( c-a-dire au pt calcule) + // Il y a creation d'une instance de SaveResul particuliere + // a la loi concernee + // la SaveResul classe est remplie par les instances heritantes + // le pointeur de SaveResul est sauvegarde au niveau de l'element + // c'a-d que les info particulieres au point considere sont stocke + // au niveau de l'element et non de la loi. + virtual SaveResul * New_et_Initialise(); + // Lecture des donnees de la classe sur fichier void LectureDonneesParticulieres (UtilLecture * ,LesCourbes1D& lesCourbes1D ,LesFonctions_nD& lesFonctionsnD); @@ -133,10 +143,12 @@ class Poly_hyper3D : public Hyper_W_gene_3D protected : // donnée de la loi double K; // le module de compressibilité + double K_use; // le k réellement utilisé: calculé avant utilisation // on utilise des tableaux de tableaux car les dimensions des sous tableaux sont toutes différentes Tableau > Cij; // Cij(i)(j) : contiend les coefficients du polynome tel que: // Ckl : est stocké dans Cij(l+k)(k+1) // et Cij(i)(j) : contient C_(j-1)_(i-j+1) + Tableau > Cij_use; // coefficients réellement utilisés: donc calculés à l'utilisation Tableau > Cij_temperature; // les courbe éventuelle d'évolution // des coefficients en fonction de la température Courbe1D* K_temperature; // courbe éventuelle d'évolution de K en fonction de la température @@ -147,6 +159,14 @@ class Poly_hyper3D : public Hyper_W_gene_3D Courbe1D* a_temperature; // courbe éventuelle d'évolution de a en fonction de la température Courbe1D* r_temperature; // courbe éventuelle d'évolution de r en fonction de la température + // cas d'une dépendance à une fonction nD, les fonctions sont multiplicatives par rapport aux valeurs + // définies par les données fixes où celles dépendantes directement de la température via une courbe 1D + // -- bien voir que dans ce cas on peut obtenir n'importe quoi, c'est de la responsabilité + // de l'utilisateur de savoir se qu'il fait + Tableau > Cij_nD; + Fonction_nD * K_nD; + + double W_d,W_v; // le potentiel: partie déviatorique, partie sphérique Vecteur W_r; // dérivées premières du potentiel par rapport aux J_r double W_d_J1,W_d_J2; // dérivées premières du potentiel déviatoire par rapport aux J_1 et J_2 diff --git a/comportement/Hyper_elastique/TreloarN.cc b/comportement/Hyper_elastique/TreloarN.cc index d6ce073..7ebb3eb 100644 --- a/comportement/Hyper_elastique/TreloarN.cc +++ b/comportement/Hyper_elastique/TreloarN.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hyper_elastique/TreloarN.h b/comportement/Hyper_elastique/TreloarN.h index a959238..596bc63 100644 --- a/comportement/Hyper_elastique/TreloarN.h +++ b/comportement/Hyper_elastique/TreloarN.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hypo_elastique/Hypo_hooke2D_C.cc b/comportement/Hypo_elastique/Hypo_hooke2D_C.cc index f2c3136..8b8c8ea 100644 --- a/comportement/Hypo_elastique/Hypo_hooke2D_C.cc +++ b/comportement/Hypo_elastique/Hypo_hooke2D_C.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Hypo_elastique/Hypo_hooke2D_C.h b/comportement/Hypo_elastique/Hypo_hooke2D_C.h index 46daaec..f4b79d0 100644 --- a/comportement/Hypo_elastique/Hypo_hooke2D_C.h +++ b/comportement/Hypo_elastique/Hypo_hooke2D_C.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -148,7 +148,7 @@ class Hypo_hooke2D_C : public Loi_comp_abstraite // completer est appelé apres sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor - ,const Loi_comp_abstraite* loi) {}; + ,const Loi_comp_abstraite* loi) {return NULL;}; // ---- récupération d'information: spécifique à certaine classe dérivée double Deformation_plastique(); diff --git a/comportement/Hypo_elastique/Hypo_hooke3D.cc b/comportement/Hypo_elastique/Hypo_hooke3D.cc index 7ea91aa..ecab855 100644 --- a/comportement/Hypo_elastique/Hypo_hooke3D.cc +++ b/comportement/Hypo_elastique/Hypo_hooke3D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -464,7 +464,9 @@ void Hypo_hooke3D::LectureDonneesParticulieres (UtilLecture * entreePrinc,LesCou if(strstr(entreePrinc->tablcar,"fin_loi_HYPO_ELAS3D")==0) entreePrinc->NouvelleDonnee(); // appel au niveau de la classe mère Loi_comp_abstraite::Lecture_type_deformation_et_niveau_commentaire - (*entreePrinc,lesFonctionsnD); + (*entreePrinc,lesFonctionsnD,false); + // prepa du flot de lecture + if(strstr(entreePrinc->tablcar,"fin_loi_HYPO_ELAS3D")!=0) entreePrinc->NouvelleDonnee(); }; @@ -1062,6 +1064,28 @@ void Hypo_hooke3D::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& DepsBB_,DdlElem save_resul.eps_cumulBB = delta_epsBB + epsBB_n; break;} }; + + bool affichage = (Permet_affichage() > 5); + #ifdef MISE_AU_POINT + if (affichage) + {cout << "\n === donnees d'entree "; + cout << "\n epsBB_tdt(local)= "; epsBB.Ecriture(cout); + cout << "\n DepsBB(local)= "; DepsBB.Ecriture(cout); + cout << "\n delta_epsBB(local)= "; delta_epsBB.Ecriture(cout); + cout << "\n sigHH_t(local)= "; sigHH_t.Ecriture(cout); + // en absolue + Tenseur3BB tiutiu; + epsBB.BaseAbsolue(tiutiu,*(ex.giH_tdt)); + cout << "\n eps en absolu :";tiutiu.Ecriture(cout); + DepsBB.BaseAbsolue(tiutiu,*(ex.giH_tdt)); + cout << "\n Deps en absolu :";tiutiu.Ecriture(cout); + delta_epsBB.BaseAbsolue(tiutiu,*(ex.giH_tdt)); + cout << "\n delta_eps en absolu :";tiutiu.Ecriture(cout); + Tenseur3HH titi; + sigHH_t.BaseAbsolue(titi,*(ex.giB_tdt)); + cout << "\n sig_t en absolu :";titi.Ecriture(cout); + }; + #endif // opération de transmission de la métrique const Met_abstraite::Impli* ex_impli = NULL; @@ -1179,6 +1203,13 @@ void Hypo_hooke3D::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& DepsBB_,DdlElem save_resul.Kc = Kc_use; save_resul.mu = mu_use; + #ifdef MISE_AU_POINT + if (affichage) + {cout << "\n giB_tdt" << (*ex.giB_tdt); + cout << "\n giH_tdt" << (*ex.giH_tdt); + cout << "\n mu= "<< mu_use << ", K= "<< Kc_use; + }; + #endif // recup de l'incrément de temps double deltat=ParaGlob::Variables_de_temps().IncreTempsCourant(); @@ -1231,13 +1262,30 @@ void Hypo_hooke3D::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& DepsBB_,DdlElem Sortie(1); } }; + #ifdef MISE_AU_POINT + if (affichage) + {cout << "\n pas de temps normal "; + cout << "\n IDeps= "<< IDeps; + cout << "\n Deps_barre_BH(local)= "; Deps_barre_BH.Ecriture(cout); + Tenseur3BH tiutiu; + Deps_barre_BH.BaseAbsolue(tiutiu,*(ex.giB_tdt),*(ex.giH_tdt)); + cout << "\n Deps_barre_BH en absolu :";tiutiu.Ecriture(cout); + Tenseur3HH titi; + sigHH.BaseAbsolue(titi,*(ex.giB_tdt)); + cout << "\n sig_tdt en absolu :";titi.Ecriture(cout); + } + #endif // traitement des énergies // on incrémente l'énergie élastique energ.ChangeEnergieElastique(energ_t.EnergieElastique() + 0.5 * deltat * ((sigHH + sigHH_nn) && DepsBB)); } else {// --cas d'un deltat très petit, on utilise delta eps à la place de deltat * D - + #ifdef MISE_AU_POINT + if (affichage) + cout << "\n pas de temps tres petit, on utilise delta eps a la place de deltat * D "; + #endif + // cas de la partie sphérique Tenseur3BH delta_epsBH = delta_epsBB * gijHH; double Idelta_eps = delta_epsBH.Trace(); @@ -1276,6 +1324,20 @@ void Hypo_hooke3D::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& DepsBB_,DdlElem // on incrémente l'énergie élastique energ.ChangeEnergieElastique(energ_t.EnergieElastique() + 0.5 * ((sigHH + sigHH_nn) && delta_epsBB)); + #ifdef MISE_AU_POINT + if (affichage) + {cout << "\n pas de temps tres petit, on utilise delta eps a la place de deltat * D "; + cout << "\n Idelta_eps= "<< Idelta_eps; + cout << "\n delta_eps_barre_BH(local)= "; delta_eps_barre_BH.Ecriture(cout); + Tenseur3BH tiutiu; + delta_eps_barre_BH.BaseAbsolue(tiutiu,*(ex.giB_tdt),*(ex.giH_tdt)); + cout << "\n delta_eps_barre_BH en absolu :";tiutiu.Ecriture(cout); + Tenseur3HH titi; + sigHH.BaseAbsolue(titi,*(ex.giB_tdt)); + cout << "\n sig_tdt en absolu :";titi.Ecriture(cout); + } + #endif + } @@ -1308,17 +1370,21 @@ void Hypo_hooke3D::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& DepsBB_,Dd ,EnergieMeca & energ,const EnergieMeca & energ_t,double& module_compressibilite,double& module_cisaillement ,const Met_abstraite::Impli& ex) { - #ifdef MISE_AU_POINT - if (DepsBB_.Dimension() != 3) - { cout << "\nErreur : la dimension devrait etre 3 !\n"; - cout << " Hypo_hooke3D::Calcul_DsigmaHH_tdt\n"; - Sortie(1); - }; - if (tab_ddl.NbDdl() != d_gijBB_tdt.Taille()) - { cout << "\nErreur : le nb de ddl est != de la taille de d_gijBB_tdt !\n"; - cout << " Hypo_hooke3D::Calcul_SDsigmaHH_tdt\n"; - Sortie(1); - }; + #ifdef MISE_AU_POINT + if (Permet_affichage() > 3) + {cout << "\n --- loi de comportement Hypo_hooke3D Calcul_DsigmaHH_tdt --- "; + Signature_pti_encours(cout); + }; + if (DepsBB_.Dimension() != 3) + { cout << "\nErreur : la dimension devrait etre 3 !\n"; + cout << " Hypo_hooke3D::Calcul_DsigmaHH_tdt\n"; + Sortie(1); + }; + if (tab_ddl.NbDdl() != d_gijBB_tdt.Taille()) + { cout << "\nErreur : le nb de ddl est != de la taille de d_gijBB_tdt !\n"; + cout << " Hypo_hooke3D::Calcul_SDsigmaHH_tdt\n"; + Sortie(1); + }; #endif const Tenseur3BB & epsBB = *((Tenseur3BB*) &epsBB_tdt); // passage en dim 3 const Tenseur3BB & DepsBB = *((Tenseur3BB*) &DepsBB_); // passage en dim 3 @@ -1370,6 +1436,29 @@ void Hypo_hooke3D::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& DepsBB_,Dd } }; + bool affichage = (Permet_affichage() > 5); + #ifdef MISE_AU_POINT + if (affichage) + {cout << "\n === donnees d'entree "; + cout << "\n epsBB_tdt(local)= "; epsBB.Ecriture(cout); + cout << "\n DepsBB(local)= "; DepsBB.Ecriture(cout); + cout << "\n delta_epsBB(local)= "; delta_epsBB.Ecriture(cout); + cout << "\n sigHH_t(local)= "; sigHH_t.Ecriture(cout); + // en absolue + Tenseur3BB tiutiu; + epsBB.BaseAbsolue(tiutiu,*(ex.giH_tdt)); + cout << "\n eps en absolu :";tiutiu.Ecriture(cout); + DepsBB.BaseAbsolue(tiutiu,*(ex.giH_tdt)); + cout << "\n Deps en absolu :";tiutiu.Ecriture(cout); + delta_epsBB.BaseAbsolue(tiutiu,*(ex.giH_tdt)); + cout << "\n delta_eps en absolu :";tiutiu.Ecriture(cout); + Tenseur3HH titi; + sigHH_t.BaseAbsolue(titi,*(ex.giB_tdt)); + cout << "\n sig_t en absolu :";titi.Ecriture(cout); + }; + #endif + + // opération de transmission de la métrique const Met_abstraite::Impli* ex_impli = &ex; const Met_abstraite::Expli_t_tdt* ex_expli_tdt = NULL; @@ -1486,6 +1575,14 @@ void Hypo_hooke3D::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& DepsBB_,Dd // sauvegarde des paramètres matériau save_resul.Kc = Kc_use; save_resul.mu = mu_use; + + #ifdef MISE_AU_POINT + if (affichage) + {cout << "\n giB_tdt" << (*ex.giB_tdt); + cout << "\n giH_tdt" << (*ex.giH_tdt); + cout << "\n mu= "<< mu_use << ", K= "<< Kc_use; + }; + #endif Tenseur3BH DepsBH = DepsBB * gijHH; // recup de l'incrément de temps @@ -1516,25 +1613,38 @@ void Hypo_hooke3D::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& DepsBB_,Dd switch (cas_calcul) { case 0: // calcul normal (tous les termes) - { // la partie sphérique est déjà calculé, cas de la partie déviatorique + { // la partie sphérique est déjà calculé, cas de la partie déviatorique Tenseur3HH SHH = gijHH * (SBH_n + deltat * mu_use * Deps_barre_BH); sigHH = SHH + (untier * Isigma) * gijHH ; - break; - } + break; + } case 1: // calcul de la partie déviatorique seule - { sigHH = gijHH * (SBH_n + deltat * mu_use * Deps_barre_BH); - break; - } + { sigHH = gijHH * (SBH_n + deltat * mu_use * Deps_barre_BH); + break; + } case 2: // calcul de la partie sphérique seule - { sigHH = (untier * Isigma) * gijHH ; // *IdBH3; - break; - } + { sigHH = (untier * Isigma) * gijHH ; // *IdBH3; + break; + } default: { cout << "\n erreur l'indicateur cas_calcul= " << cas_calcul << " n'a pas une valeur correcte !! " << "\n Hypo_hooke3D::Calcul_DsigmaHH_tdt (.... "; Sortie(1); } - }; + }; + #ifdef MISE_AU_POINT + if (affichage) + {//cout << "\n pas de temps normal "; + cout << "\n IDeps= "<< IDeps; + cout << "\n Deps_barre_BH(local)= "; Deps_barre_BH.Ecriture(cout); + Tenseur3BH tiutiu; + Deps_barre_BH.BaseAbsolue(tiutiu,*(ex.giB_tdt),*(ex.giH_tdt)); + cout << "\n Deps_barre_BH en absolu :";tiutiu.Ecriture(cout); + Tenseur3HH titi; + sigHH.BaseAbsolue(titi,*(ex.giB_tdt)); + cout << "\n sig_tdt en absolu :";titi.Ecriture(cout); + } + #endif ////--- debug //cout << "\n Hypo_hooke3D::Calcul_DsigmaHH_tdt"; //cout << "\n IDeps= "< 3) + {cout << "\n --- loi de comportement Hypo_hooke3D Calcul_dsigma_deps --- "; + Signature_pti_encours(cout); + }; + if (DepsBB_.Dimension() != 3) + { cout << "\nErreur : la dimension devrait etre 3 !\n"; + cout << " Hypo_hooke3D::Calcul_DsigmaHH_tdt\n"; + Sortie(1); + }; #endif const Tenseur3BB & epsBB = *((Tenseur3BB*) &epsBB_tdt); // passage en dim 3 @@ -1733,6 +1847,38 @@ void Hypo_hooke3D::Calcul_dsigma_deps (bool en_base_orthonormee, TenseurHH & sig }; }; + bool affichage = (Permet_affichage() > 5); + #ifdef MISE_AU_POINT + if (affichage) + {cout << "\n === donnees d'entree "; + if (en_base_orthonormee) + {cout << "\n calcul en base orthonormee: "; + cout << "\n epsBB_tdt(absolu)= "; epsBB.Ecriture(cout); + cout << "\n DepsBB(absolu)= "; DepsBB.Ecriture(cout); + cout << "\n delta_epsBB(absolu)= "; delta_epsBB.Ecriture(cout); + cout << "\n sigHH_t(absolu)= "; sigHH_t.Ecriture(cout); + } + else + {cout << "\n calcul en base naturelle: "; + cout << "\n epsBB_tdt(local)= "; epsBB.Ecriture(cout); + cout << "\n DepsBB(local)= "; DepsBB.Ecriture(cout); + cout << "\n delta_epsBB(local)= "; delta_epsBB.Ecriture(cout); + cout << "\n sigHH_t(local)= "; sigHH_t.Ecriture(cout); + // en absolue + Tenseur3BB tiutiu; + epsBB.BaseAbsolue(tiutiu,*(ex.giH_tdt)); + cout << "\n eps en absolu :";tiutiu.Ecriture(cout); + DepsBB.BaseAbsolue(tiutiu,*(ex.giH_tdt)); + cout << "\n Deps en absolu :";tiutiu.Ecriture(cout); + delta_epsBB.BaseAbsolue(tiutiu,*(ex.giH_tdt)); + cout << "\n delta_eps en absolu :";tiutiu.Ecriture(cout); + Tenseur3HH titi; + sigHH_t.BaseAbsolue(titi,*(ex.giB_tdt)); + cout << "\n sig_t en absolu :";titi.Ecriture(cout); + }; + } + #endif + // opération de transmission de la métrique const Met_abstraite::Impli* ex_impli = NULL; const Met_abstraite::Expli_t_tdt* ex_expli_tdt = NULL; @@ -1879,6 +2025,14 @@ void Hypo_hooke3D::Calcul_dsigma_deps (bool en_base_orthonormee, TenseurHH & sig save_resul.Kc = Kc_use; save_resul.mu = mu_use; + #ifdef MISE_AU_POINT + if (affichage) + {cout << "\n giB_tdt" << (*ex.giB_tdt); + cout << "\n giH_tdt" << (*ex.giH_tdt); + cout << "\n mu= "<< mu_use << ", K= "<< Kc_use; + }; + #endif + // recup de l'incrément de temps double deltat=ParaGlob::Variables_de_temps().IncreTempsCourant(); // le calcul de la contrainte correspond à l'intégration d'une équation différencielle @@ -1950,6 +2104,25 @@ void Hypo_hooke3D::Calcul_dsigma_deps (bool en_base_orthonormee, TenseurHH & sig }; }; + #ifdef MISE_AU_POINT + if (affichage) + {cout << "\n IDeps= "<< IDeps; + + if (en_base_orthonormee) + {cout << "\n Deps_barre_BH(absolu)= "; Deps_barre_BH.Ecriture(cout); + cout << "\n sig_tdt en absolu :";sigHH.Ecriture(cout); + } + else + {Tenseur3BH tiutiu; + Deps_barre_BH.BaseAbsolue(tiutiu,*(ex.giB_tdt),*(ex.giH_tdt)); + cout << "\n Deps_barre_BH en absolu :";tiutiu.Ecriture(cout); + Tenseur3HH titi; + sigHH.BaseAbsolue(titi,*(ex.giB_tdt)); + cout << "\n sig_tdt en absolu :";titi.Ecriture(cout); + }; + } + #endif + // // diff --git a/comportement/Hypo_elastique/Hypo_hooke3D.h b/comportement/Hypo_elastique/Hypo_hooke3D.h index dbb4708..4187df5 100644 --- a/comportement/Hypo_elastique/Hypo_hooke3D.h +++ b/comportement/Hypo_elastique/Hypo_hooke3D.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/LesLoisDeComp.cc b/comportement/LesLoisDeComp.cc index f93360e..7d37a05 100644 --- a/comportement/LesLoisDeComp.cc +++ b/comportement/LesLoisDeComp.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/LesLoisDeComp.h b/comportement/LesLoisDeComp.h index 5434918..1827920 100644 --- a/comportement/LesLoisDeComp.h +++ b/comportement/LesLoisDeComp.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/LoiAbstraiteGeneral.cc b/comportement/LoiAbstraiteGeneral.cc index b810982..263030c 100644 --- a/comportement/LoiAbstraiteGeneral.cc +++ b/comportement/LoiAbstraiteGeneral.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/LoiAbstraiteGeneral.h b/comportement/LoiAbstraiteGeneral.h index 05a8fa6..e73d1a0 100644 --- a/comportement/LoiAbstraiteGeneral.h +++ b/comportement/LoiAbstraiteGeneral.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/Loi_comp_abstraite.cc b/comportement/Loi_comp_abstraite.cc index d82dae3..6672cfb 100644 --- a/comportement/Loi_comp_abstraite.cc +++ b/comportement/Loi_comp_abstraite.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -44,6 +44,7 @@ Loi_comp_abstraite::Loi_comp_abstraite () : // Constructeur par defaut ,temperature(NULL),dilatation(false),def_en_cours(NULL) ,temps_loi() ,epsBB_totale(NULL),epsBB_therm(NULL) + ,delta_epsBB_totale(NULL),delta_epsBB_therm(NULL) ,DepsBB_totale(NULL),DepsBB_therm(NULL),DepsBB_umat(NULL) ,listQuelc_mis_en_acces_localement(),listdeTouslesQuelc_dispo_localement() ,ptintmeca_en_cours(NULL),permet_affich_loi(0) @@ -60,6 +61,7 @@ Loi_comp_abstraite::Loi_comp_abstraite (Enum_comp id_compor,Enum_categorie_loi_c ,temperature(NULL),dilatation(false),def_en_cours(NULL) ,temps_loi() ,epsBB_totale(NULL),epsBB_therm(NULL) + ,delta_epsBB_totale(NULL),delta_epsBB_therm(NULL) ,DepsBB_totale(NULL),DepsBB_therm(NULL),DepsBB_umat(NULL) ,listQuelc_mis_en_acces_localement(),listdeTouslesQuelc_dispo_localement() ,ptintmeca_en_cours(NULL),permet_affich_loi(0) @@ -77,6 +79,7 @@ Loi_comp_abstraite::Loi_comp_abstraite (char* nom,Enum_categorie_loi_comp catego ,temperature(NULL),dilatation(false),def_en_cours(NULL) ,temps_loi() ,epsBB_totale(NULL),epsBB_therm(NULL) + ,delta_epsBB_totale(NULL),delta_epsBB_therm(NULL) ,DepsBB_totale(NULL),DepsBB_therm(NULL),DepsBB_umat(NULL) ,listQuelc_mis_en_acces_localement(),listdeTouslesQuelc_dispo_localement() ,ptintmeca_en_cours(NULL),permet_affich_loi(0) @@ -95,6 +98,7 @@ Loi_comp_abstraite::Loi_comp_abstraite (const Loi_comp_abstraite & a ) : ,temps_loi(a.temps_loi) ,temperature_tdt(-1.),temperature_0(-1.),temperature_t(-1.),temperature(NULL) ,epsBB_totale(NULL),epsBB_therm(NULL) + ,delta_epsBB_totale(NULL),delta_epsBB_therm(NULL) ,DepsBB_totale(NULL),DepsBB_therm(NULL),DepsBB_umat(NULL) ,listQuelc_mis_en_acces_localement(a.listQuelc_mis_en_acces_localement) ,listdeTouslesQuelc_dispo_localement(a.listdeTouslesQuelc_dispo_localement) @@ -127,6 +131,8 @@ Loi_comp_abstraite::Loi_comp_abstraite (const Loi_comp_abstraite & a ) : Loi_comp_abstraite::~Loi_comp_abstraite () { if (epsBB_totale != NULL) delete epsBB_totale; if (epsBB_therm != NULL) delete epsBB_therm; + if (delta_epsBB_totale != NULL) delete delta_epsBB_totale; + if (delta_epsBB_therm != NULL) delete delta_epsBB_therm; if (DepsBB_totale != NULL) delete DepsBB_totale; if (DepsBB_therm != NULL) delete DepsBB_therm; if (DepsBB_umat != NULL) delete DepsBB_umat; @@ -203,6 +209,12 @@ const Met_abstraite::Expli& Loi_comp_abstraite::Cal_explicit_t *epsBB_totale = epsBB_t; if (epsBB_therm == NULL) { epsBB_therm = NevezTenseurBB(dim_tens);} else if (epsBB_therm->Dimension() != dim_tens) { delete epsBB_therm;epsBB_therm = NevezTenseurBB(dim_tens);}; + // -- cas de l'incrément de déformation + if (delta_epsBB_totale == NULL) { delta_epsBB_totale = NevezTenseurBB(dim_tens);} + else if (delta_epsBB_totale->Dimension() != dim_tens) { delete delta_epsBB_totale;delta_epsBB_totale = NevezTenseurBB(dim_tens);}; + *delta_epsBB_totale = DeltaEpsBB_; + if (delta_epsBB_therm == NULL) { delta_epsBB_therm = NevezTenseurBB(dim_tens);} + else if (delta_epsBB_therm->Dimension() != dim_tens) { delete delta_epsBB_therm;epsBB_therm = NevezTenseurBB(dim_tens);}; // -- cas de la vitesse de déformation if (DepsBB_totale == NULL) { DepsBB_totale = NevezTenseurBB(dim_tens);} else if (DepsBB_totale->Dimension() != dim_tens) { delete DepsBB_totale;DepsBB_totale = NevezTenseurBB(dim_tens);}; @@ -211,9 +223,18 @@ const Met_abstraite::Expli& Loi_comp_abstraite::Cal_explicit_t else if (DepsBB_therm->Dimension() != dim_tens) { delete DepsBB_therm;DepsBB_totale = NevezTenseurBB(dim_tens);}; // -- calcul du partage entre thermique et mécanique bool avec_repercution_sur_def_meca = true; - def.DeformationThermoMecanique(temperature_0,*(ex.gijBB_t),dTP,*epsBB_totale - ,*epsBB_therm,temperature_t,epsBB_t,temperature_t - ,*DepsBB_totale,*DepsBB_therm,DepsBB_,false,avec_repercution_sur_def_meca); + // des pointeurs pour des sorties en absolue + const Met_abstraite::Impli* ex_impli= NULL; + const Met_abstraite::Expli_t_tdt ex_temp = ex.T_dans_tdt(); + const Met_abstraite::Expli_t_tdt* ex_expli_tdt = &ex_temp; + const Met_abstraite::Umat_cont* ex_umat = NULL; + def.DeformationThermoMecanique(temperature_0,dTP,*epsBB_totale + ,*epsBB_therm,temperature_t,epsBB_t + ,*delta_epsBB_totale,*delta_epsBB_therm,DeltaEpsBB_ + ,temperature_t + ,*DepsBB_totale,*DepsBB_therm,DepsBB_ + ,ex_impli,ex_expli_tdt,ex_umat + ,false,avec_repercution_sur_def_meca); }; if ((thermo_dependant) || dilatation) // répercussion éventuelle du changement de température dans les classes dérivées { RepercuteChangeTemperature(TEMPS_t); }; @@ -332,7 +353,13 @@ const Met_abstraite::Expli_t_tdt& Loi_comp_abstraite::Cal_explicit_tdt *epsBB_totale = epsBB_tdt; if (epsBB_therm == NULL) { epsBB_therm = NevezTenseurBB(dim_tens);} else if (epsBB_therm->Dimension() != dim_tens) { delete epsBB_therm;epsBB_therm = NevezTenseurBB(dim_tens);}; - // -- cas de la vitesse de déformation + // -- cas de l'incrément de déformation + if (delta_epsBB_totale == NULL) { delta_epsBB_totale = NevezTenseurBB(dim_tens);} + else if (delta_epsBB_totale->Dimension() != dim_tens) { delete delta_epsBB_totale;delta_epsBB_totale = NevezTenseurBB(dim_tens);}; + *delta_epsBB_totale = delta_epsBB; + if (delta_epsBB_therm == NULL) { delta_epsBB_therm = NevezTenseurBB(dim_tens);} + else if (delta_epsBB_therm->Dimension() != dim_tens) { delete delta_epsBB_therm;epsBB_therm = NevezTenseurBB(dim_tens);}; + // -- cas de la vitesse de déformation if (DepsBB_totale == NULL) { DepsBB_totale = NevezTenseurBB(dim_tens);} else if (DepsBB_totale->Dimension() != dim_tens) { delete DepsBB_totale;DepsBB_totale = NevezTenseurBB(dim_tens);}; *DepsBB_totale = DepsBB_; @@ -340,9 +367,17 @@ const Met_abstraite::Expli_t_tdt& Loi_comp_abstraite::Cal_explicit_tdt else if (DepsBB_therm->Dimension() != dim_tens) { delete DepsBB_therm;DepsBB_totale = NevezTenseurBB(dim_tens);}; // -- calcul du partage entre thermique et mécanique bool avec_repercution_sur_def_meca = true; - def.DeformationThermoMecanique(temperature_0,*(ex.gijBB_tdt),dTP,*epsBB_totale - ,*epsBB_therm,temperature_tdt,epsBB_tdt,temperature_t - ,*DepsBB_totale,*DepsBB_therm,DepsBB_,true,avec_repercution_sur_def_meca); + // des pointeurs pour des sorties en absolue + const Met_abstraite::Impli* ex_impli = NULL; + const Met_abstraite::Expli_t_tdt* ex_expli_tdt =&ex; + const Met_abstraite::Umat_cont* ex_umat = NULL; + def.DeformationThermoMecanique(temperature_0,dTP,*epsBB_totale + ,*epsBB_therm,temperature_tdt,epsBB_tdt + ,*delta_epsBB_totale,*delta_epsBB_therm,delta_epsBB + ,temperature_t + ,*DepsBB_totale,*DepsBB_therm,DepsBB_ + ,ex_impli,ex_expli_tdt,ex_umat + ,true,avec_repercution_sur_def_meca); }; if ((thermo_dependant) || dilatation) // répercussion éventuelle du changement de température dans les classes dérivées { RepercuteChangeTemperature(TEMPS_tdt); }; @@ -463,19 +498,19 @@ const Met_abstraite::Impli& Loi_comp_abstraite::Cal_implicit if (Permet_affichage() > 2) { // on regarde la taille des déformations double maxgijBB = ex.gijBB_tdt->MaxiComposante(); - if (( maxgijBB > ConstMath::grand) + if (( maxgijBB > ConstMath::pasmalgrand) || (!isfinite(maxgijBB)) || (isnan(maxgijBB)) ) sortie_metrique = true; double maxepsBB_tdt = epsBB_tdt.MaxiComposante(); - if (( maxepsBB_tdt > ConstMath::grand) + if (( maxepsBB_tdt > ConstMath::pasmalgrand) || (!isfinite(maxepsBB_tdt)) || (isnan(maxepsBB_tdt)) ) sortie_metrique = true; double maxgijHH = ex.gijHH_tdt->MaxiComposante(); - if (( maxgijHH > ConstMath::grand) + if (( maxgijHH > ConstMath::pasmalgrand) || (!isfinite(maxgijHH)) || (isnan(maxgijHH)) ) sortie_metrique = true; @@ -531,7 +566,13 @@ const Met_abstraite::Impli& Loi_comp_abstraite::Cal_implicit *epsBB_totale = epsBB_tdt; if (epsBB_therm == NULL) { epsBB_therm = NevezTenseurBB(dim_tens);} else if (epsBB_therm->Dimension() != dim_tens) { delete epsBB_therm;epsBB_therm = NevezTenseurBB(dim_tens);}; - // -- cas de la vitesse de déformation + // -- cas de l'incrément de déformation + if (delta_epsBB_totale == NULL) { delta_epsBB_totale = NevezTenseurBB(dim_tens);} + else if (delta_epsBB_totale->Dimension() != dim_tens) { delete delta_epsBB_totale;delta_epsBB_totale = NevezTenseurBB(dim_tens);}; + *delta_epsBB_totale = delta_epsBB; + if (delta_epsBB_therm == NULL) { delta_epsBB_therm = NevezTenseurBB(dim_tens);} + else if (delta_epsBB_therm->Dimension() != dim_tens) { delete delta_epsBB_therm;epsBB_therm = NevezTenseurBB(dim_tens);}; + // -- cas de la vitesse de déformation if (DepsBB_totale == NULL) { DepsBB_totale = NevezTenseurBB(dim_tens);} else if (DepsBB_totale->Dimension() != dim_tens) { delete DepsBB_totale;DepsBB_totale = NevezTenseurBB(dim_tens);}; *DepsBB_totale = DepsBB_; @@ -539,9 +580,18 @@ const Met_abstraite::Impli& Loi_comp_abstraite::Cal_implicit else if (DepsBB_therm->Dimension() != dim_tens) { delete DepsBB_therm;DepsBB_totale = NevezTenseurBB(dim_tens);}; // -- calcul du partage entre thermique et mécanique bool avec_repercution_sur_def_meca = true; - def.DeformationThermoMecanique(temperature_0,*(ex.gijBB_tdt),dTP,*epsBB_totale - ,*epsBB_therm,temperature_tdt,epsBB_tdt,temperature_t - ,*DepsBB_totale,*DepsBB_therm,DepsBB_,true,avec_repercution_sur_def_meca); + // des pointeurs pour des sorties en absolue + const Met_abstraite::Impli* ex_impli=&ex; + const Met_abstraite::Expli_t_tdt* ex_expli_tdt = NULL; + const Met_abstraite::Umat_cont* ex_umat = NULL; + + def.DeformationThermoMecanique(temperature_0,dTP,*epsBB_totale + ,*epsBB_therm,temperature_tdt,epsBB_tdt + ,*delta_epsBB_totale,*delta_epsBB_therm,delta_epsBB + ,temperature_t + ,*DepsBB_totale,*DepsBB_therm,DepsBB_ + ,ex_impli,ex_expli_tdt,ex_umat + ,true,avec_repercution_sur_def_meca); }; if ((thermo_dependant) || dilatation) // répercussion éventuelle du changement de température dans les classes dérivées { RepercuteChangeTemperature(TEMPS_tdt); }; @@ -590,13 +640,15 @@ const Met_abstraite::Impli& Loi_comp_abstraite::Cal_implicit if (Permet_affichage() > 2) { // on regarde la taille des déformations double maxsig = sigHH.MaxiComposante(); - if (( maxsig > ConstMath::grand) + if (( maxsig > ConstMath::pasmalgrand) || (!isfinite(maxsig)) || (isnan(maxsig)) ) if (!sortie_metrique) {cout << "\n *** pb sur le calcul de la contrainte: le resultat est " << " soit infini soit un nan "; Signature_pti_encours(cout); + cout << "\n Loi_comp_abstraite::Cal_implicit: sigHH_tdt "; + sigHH.Ecriture(cout); def.Affiche(); }; @@ -698,6 +750,12 @@ void Loi_comp_abstraite::Cal_flamb_lin *epsBB_totale = epsBB_tdt; if (epsBB_therm == NULL) { epsBB_therm = NevezTenseurBB(dim_tens);} else if (epsBB_therm->Dimension() != dim_tens) { delete epsBB_therm;epsBB_therm = NevezTenseurBB(dim_tens);}; + // -- cas de l'incrément de déformation + if (delta_epsBB_totale == NULL) { delta_epsBB_totale = NevezTenseurBB(dim_tens);} + else if (delta_epsBB_totale->Dimension() != dim_tens) { delete delta_epsBB_totale;delta_epsBB_totale = NevezTenseurBB(dim_tens);}; + *delta_epsBB_totale = delta_epsBB; + if (delta_epsBB_therm == NULL) { delta_epsBB_therm = NevezTenseurBB(dim_tens);} + else if (delta_epsBB_therm->Dimension() != dim_tens) { delete delta_epsBB_therm;epsBB_therm = NevezTenseurBB(dim_tens);}; // -- cas de la vitesse de déformation if (DepsBB_totale == NULL) { DepsBB_totale = NevezTenseurBB(dim_tens);} else if (DepsBB_totale->Dimension() != dim_tens) { delete DepsBB_totale;DepsBB_totale = NevezTenseurBB(dim_tens);}; @@ -706,9 +764,18 @@ void Loi_comp_abstraite::Cal_flamb_lin else if (DepsBB_therm->Dimension() != dim_tens) { delete DepsBB_therm;DepsBB_totale = NevezTenseurBB(dim_tens);}; // -- calcul du partage entre thermique et mécanique bool avec_repercution_sur_def_meca = true; - def.DeformationThermoMecanique(temperature_0,*(ex.gijBB_tdt),dTP,*epsBB_totale - ,*epsBB_therm,temperature_tdt,epsBB_tdt,temperature_tdt - ,*DepsBB_totale,*DepsBB_therm,DepsBB_,true,avec_repercution_sur_def_meca); + // des pointeurs pour des sorties en absolue + const Met_abstraite::Impli* ex_impli=&ex; + const Met_abstraite::Expli_t_tdt* ex_expli_tdt = NULL; + const Met_abstraite::Umat_cont* ex_umat = NULL; + + def.DeformationThermoMecanique(temperature_0,dTP,*epsBB_totale + ,*epsBB_therm,temperature_tdt,epsBB_tdt + ,*delta_epsBB_totale,*delta_epsBB_therm,delta_epsBB + ,temperature_tdt + ,*DepsBB_totale,*DepsBB_therm,DepsBB_ + ,ex_impli,ex_expli_tdt,ex_umat + ,true,avec_repercution_sur_def_meca); }; if ((thermo_dependant) || dilatation) // répercussion éventuelle du changement de température dans les classes dérivées { RepercuteChangeTemperature(TEMPS_tdt); }; @@ -858,6 +925,11 @@ void Loi_comp_abstraite::ComportementUmat else if (epsBB_totale->Dimension() != dim_tens) { delete epsBB_totale;epsBB_totale = NevezTenseurBB(dim_tens);}; if (epsBB_therm == NULL) { epsBB_therm = NevezTenseurBB(dim_tens);} else if (epsBB_therm->Dimension() != dim_tens) { delete epsBB_therm;epsBB_therm = NevezTenseurBB(dim_tens);}; + // -- cas de l'incrément de déformation + if (delta_epsBB_totale == NULL) { delta_epsBB_totale = NevezTenseurBB(dim_tens);} + else if (delta_epsBB_totale->Dimension() != dim_tens) { delete delta_epsBB_totale;delta_epsBB_totale = NevezTenseurBB(dim_tens);}; + if (delta_epsBB_therm == NULL) { delta_epsBB_therm = NevezTenseurBB(dim_tens);} + else if (delta_epsBB_therm->Dimension() != dim_tens) { delete delta_epsBB_therm;epsBB_therm = NevezTenseurBB(dim_tens);}; // -- cas de la vitesse de déformation if (DepsBB_totale == NULL) { DepsBB_totale = NevezTenseurBB(dim_tens);} else if (DepsBB_totale->Dimension() != dim_tens) { delete DepsBB_totale;DepsBB_totale = NevezTenseurBB(dim_tens);}; @@ -865,9 +937,17 @@ void Loi_comp_abstraite::ComportementUmat else if (DepsBB_therm->Dimension() != dim_tens) { delete DepsBB_therm;DepsBB_totale = NevezTenseurBB(dim_tens);}; // -- calcul du partage entre thermique et mécanique bool avec_repercution_sur_def_meca = false; - def.DeformationThermoMecanique(temperature_0,*(ex.gijBB_tdt),dTP,*epsBB_totale - ,*epsBB_therm,temperature_tdt,*(umatAbaqusqus.eps_meca),temperature_t - ,*DepsBB_totale,*DepsBB_therm,*DepsBB_umat,true,avec_repercution_sur_def_meca); + // des pointeurs pour des sorties en absolue + const Met_abstraite::Impli* ex_impli = NULL; + const Met_abstraite::Expli_t_tdt* ex_expli_tdt = NULL; + const Met_abstraite::Umat_cont* ex_umat =&ex; + def.DeformationThermoMecanique(temperature_0,dTP,*epsBB_totale + ,*epsBB_therm,temperature_tdt,*(umatAbaqusqus.eps_meca) + ,*delta_epsBB_totale,*delta_epsBB_therm,*(umatAbaqusqus.delta_eps_meca) + ,temperature_t + ,*DepsBB_totale,*DepsBB_therm,*DepsBB_umat + ,ex_impli,ex_expli_tdt,ex_umat + ,true,avec_repercution_sur_def_meca); }; // cas des énergie méca // tout d'abord celles précédentes @@ -900,9 +980,7 @@ void Loi_comp_abstraite::ComportementUmat // affichage de certaines données de def d'entrée du calcul Calcul_dsigma_deps // car elles sont différentes (car calculées) en fonction des entrées #ifdef MISE_AU_POINT - if (((ParaGlob::NiveauImpression() > 8) && (Permet_affichage() == 0)) - || (Permet_affichage() > 4) - ) + if (Permet_affichage() > 4) { cout << "\n affichage des def avant appel de Calcul_dsigma_deps \n "; int dim = ParaGlob::Dimension(); // def en orthonormee @@ -1538,7 +1616,14 @@ Tableau Loi_comp_abstraite::Valeur_multi_interpoler_ou_calculer ,const Met_abstraite::Umat_cont* ex_umat ,const List_io* exclure_dd_etend ) - { // on a besoin a priori de ptintmeca_en_cours, donc s'il n'est pas définit -> erreur + { // def du tableau de retour: init 0. + Tableau tab_ret (enu.size(),0.); + // si on détecte qu'il n'y a pas de valeur à calculer, on retourne directement + if (enu.size() == 0) + return tab_ret; + // sinon on continue + + // on a besoin a priori de ptintmeca_en_cours, donc s'il n'est pas définit -> erreur #ifdef MISE_AU_POINT if (ptintmeca_en_cours == NULL) {cout << "\n *** cas non prevu : aucun conteneur de point d'integration transmis " @@ -1555,8 +1640,9 @@ Tableau Loi_comp_abstraite::Valeur_multi_interpoler_ou_calculer int dim = ptintmeca_en_cours->EpsBB_const().Dimension(); int dim_sortie_tenseur = dim; // dans le cas ou l'on veut une sortie en base absolue, il faut que dim_sortie_tenseur = la dimension de la base absolue + int dim_espace = ParaGlob::Dimension(); if (absolue) - dim_sortie_tenseur = ParaGlob::Dimension(); + dim_sortie_tenseur = dim_espace; // --- pour ne faire qu'un seul test ensuite bool prevoir_change_dim_tenseur = false; if (absolue) @@ -1564,6 +1650,16 @@ Tableau Loi_comp_abstraite::Valeur_multi_interpoler_ou_calculer // car BaseAbsolue(.. modifie tenseur passé en paramètre, donc dans tous les cas de sortie absolue // il faut un tenseur intermédiaire qui a ou non une dimension différente prevoir_change_dim_tenseur = true; + + // si on n'est pas en absolue, donc on est en ad hoc (c'est l'un ou l'autre) + // et si la dim ad hoc est différente de dim_espace, alors il faut aussi + // un tenseur intermédiaire mais de dim ad hoc + bool transfert_tenseur = false; + if ((!absolue)&&(dim != dim_espace)) + {dim_sortie_tenseur = dim; // la dimension des tenseurs intermédiaires créés + transfert_tenseur = true; + }; + // recup de l'incrément de temps double deltat=ParaGlob::Variables_de_temps().IncreTempsCourant(); double unSurDeltat=0; @@ -1577,6 +1673,11 @@ Tableau Loi_comp_abstraite::Valeur_multi_interpoler_ou_calculer }; // -- def des tenseurs locaux + TenseurHH* sigHH=NULL;TenseurBB* epsBB=NULL;TenseurBB* epslogBB=NULL; + TenseurBB* epsAlmBB=NULL;TenseurBB* eps0BB=NULL;TenseurBB* DepsBB = NULL; + TenseurBB* epsAlmTotalBB=NULL;TenseurBB* epsGLTotalBB=NULL;TenseurBB* epsLogTotalBB=NULL; + TenseurBB* DeltaEpsBB = NULL; + Coordonnee* Mtdt = NULL; // coordonnées finales éventuelles du point d'intégration considéré Coordonnee* Mt=NULL; // coordonnées à t Coordonnee* M0 = NULL; // coordonnées initiales éventuelles du point d'intégration considéré @@ -1584,9 +1685,59 @@ Tableau Loi_comp_abstraite::Valeur_multi_interpoler_ou_calculer Coordonnee* N_surf_t = NULL; // coordonnée d'un vecteur normal à t si c'est adéquate Coordonnee* N_surf_t0 = NULL; // coordonnée d'un vecteur normal à t0 si c'est adéquate Coordonnee* Vitesse = NULL; // cas des vitesses + Coordonnee* Deplacement = NULL; // cas du déplacement - Tableau tab_ret (enu.size()); + // pour les valeurs propres + Coordonnee* valPropreSig=NULL;Coordonnee* valPropreEps=NULL; + Coordonnee* valPropreDeps=NULL; + + // pour les vecteurs propres + Tableau base_propre_sigma , base_propre_eps , base_propre_D; + + // pour les bases + Tableau base_ad_hoc , base_giH , base_giB; + // grandeurs scalaires + double* Mises = NULL; double* defDualMises = NULL; double* Tresca = NULL; + double* erreur = NULL;double* erreur_rel = NULL; + double* spherique_eps=NULL,* Q_eps=NULL,* cos3phi_eps=NULL; + double* spherique_sig=NULL,* Q_sig=NULL,* cos3phi_sig=NULL; + double* spherique_Deps=NULL,* Q_Deps=NULL,* cos3phi_Deps=NULL; + double* def_equivalente=NULL, * defDualMisesMaxi=NULL; + + double* sig_mises= NULL; // *** peut-être en trop + double* sig_tresca = NULL; // *** peut-être en trop + + // --- dev d'un ensemble de variable booléenne pour gérer les sorties en une passe ----- + // on se réfère au informations définit dans la méthode: Les_type_evolues_internes() + bool deformationCourante=false; bool vitesseDeformationCourante=false; + bool almansi=false; bool greenLagrange=false; + bool logarithmique=false; bool deltaDef=false; + bool almansiTotal=false; bool greenLagrangeTotale=false; + bool logarithmiqueTotale=false; bool contrainteCourante=false; + bool defPrincipales=false; bool sigmaPrincipales=false; + bool vitPrincipales=false; bool contrainteMises=false; + // bool contraintesTresca=false; bool erreurQ=false; + // bool erreurRel = false; + bool defPlastiqueCumulee=false; bool def_duale_mises=false; + bool besoin_des_contraintes=false; bool besoin_des_deformation=false; + bool besoin_des_contraintes_barre=false; bool besoin_des_deformation_barre=false; + bool besoin_des_vitesses_deformation=false; bool besoin_des_vitesses_deformation_barre=false; + bool besoin_des_valpropre_sigma=false; + bool besoin_des_valpropre_deformation = false; bool besoin_des_valpropre_vitdef = false; + bool besoin_coordonnees = false; + bool besoin_coordonnees_t = false;bool besoin_coordonnees_t0 = false; + bool besoin_dir_princ_sig = false; bool besoin_dir_princ_eps = false; + bool besoin_dir_princ_D = false; + bool besoin_rep_local_ortho=false; + bool besoin_rep_giH = false; bool besoin_rep_giB = false; + bool def_SPHERIQUE_EPS = false; bool def_Q_EPS = false; bool def_COS3PHI_EPS = false; + bool def_SPHERIQUE_SIG = false; bool def_Q_SIG = false; bool def_COS3PHI_SIG = false; + bool def_SPHERIQUE_DEPS = false; bool def_Q_DEPS = false; bool def_COS3PHI_DEPS = false; + bool def_def_equivalente = false; bool def_duale_mises_maxi = false; + bool def_sig_mises= false; // *** peut-être en trop + bool def_sig_tresca= false; // *** peut-être en trop + // éléments de métrique et matrices de passage TenseurHH* gijHH;TenseurBB* gijBB;BaseB* giB; BaseH* giH_0;BaseH* giH; BaseB* giB_0;BaseB* giB_t; @@ -1617,12 +1768,73 @@ Tableau Loi_comp_abstraite::Valeur_multi_interpoler_ou_calculer // on définie des indicateurs pour ne pas faire plusieurs fois le même calcul List_io::const_iterator ie,iefin=enu.end(); - bool besoin_coordonnees = false; bool besoin_deplacements = false; - bool besoin_coordonnees_t = false;bool besoin_coordonnees_t0 = false; + bool besoin_des_vitesse_deformation_barre=false; + bool besoin_deformation_greenlagrange = false; + bool besoin_deformation_logarithmique = false; + bool besoin_deformation_almansi = false; + bool besoin_deplacements = false; + // init pour l'utilisation de la liste d'exclusion + List_io::const_iterator itt_deb; + List_io::const_iterator itt_fin; + if (exclure_dd_etend != NULL) + { itt_deb = exclure_dd_etend->begin(); + itt_fin = exclure_dd_etend->end(); + }; + for (ie=enu.begin(); ie!=iefin;ie++) - { int posi = (*ie).Position()-NbEnum_ddl(); + {// on commence par regarder s'il faut traiter ou pas + bool a_atraiter = true; + if (exclure_dd_etend != NULL) + if (find(itt_deb,itt_fin,(*ie)) != itt_fin) + a_atraiter = false; + if (a_atraiter) + { if (Meme_famille((*ie).Enum(),SIG11)) besoin_des_contraintes=true; + if (Meme_famille((*ie).Enum(),EPS11)) besoin_des_deformation=true; + if (Meme_famille((*ie).Enum(),DEPS11)) besoin_des_vitesses_deformation=true; + if (Meme_famille((*ie).Enum(),X1)) besoin_coordonnees=true; + if (Meme_famille((*ie).Enum(),UX)) {besoin_deplacements=true;besoin_coordonnees=true;}; + int posi = (*ie).Position()-NbEnum_ddl(); switch (posi) - { + {case 1: case 2: case 3: case 4: case 5: case 6: + {besoin_deformation_greenlagrange=true; + eps0BB = NevezTenseurBB(dim_sortie_tenseur) ;break;} + case 7: case 8: case 9: case 10: case 11: case 12: + {besoin_deformation_almansi=true; + epsAlmBB =NevezTenseurBB(dim_sortie_tenseur) ;break;} + case 28: case 29: case 30: case 31: case 32: + {besoin_des_valpropre_sigma=true; + valPropreSig = new Coordonnee(dim_sortie_tenseur);break;} + case 25: case 26: case 27: case 77: + {besoin_des_valpropre_deformation=true; + valPropreEps = new Coordonnee(dim_sortie_tenseur);break;} + case 40: case 41: case 42: + {besoin_des_valpropre_vitdef=true; + valPropreDeps = new Coordonnee(dim_sortie_tenseur);break;} + case 49: case 50: case 51: case 52: case 53: case 54: + {besoin_deformation_logarithmique=true; + epslogBB =NevezTenseurBB(dim_sortie_tenseur) ;break;} + case 55: case 56: case 57: case 58: case 59: case 60: + {if ((epsAlmTotalBB == NULL) && (dilatation)) + {epsAlmTotalBB = (NevezTenseurBB(dim_sortie_tenseur));}; + break; + } + case 61: case 62: case 63: case 64: case 65: case 66: + { if ((epsGLTotalBB == NULL) && (dilatation)) + {epsGLTotalBB = (NevezTenseurBB(dim_sortie_tenseur));}; + break; + } + case 67: case 68: case 69: case 70: case 71: case 72: + {if ((epsLogTotalBB == NULL) && (dilatation)) + {epsLogTotalBB = (NevezTenseurBB(dim_sortie_tenseur));}; + break; + } + case 78: case 79: case 80: + {besoin_des_deformation_barre=true;break;} + case 81: case 82: case 83: + {besoin_des_contraintes_barre=true;break;} + case 84: case 85: case 86: + {besoin_des_vitesse_deformation_barre=true;break;} + case 114: case 115: case 116: // le vecteur normal { N_surf = new Coordonnee(ParaGlob::Dimension()); break;} case 117: case 118: case 119: // le vecteur normal à t @@ -1644,11 +1856,581 @@ Tableau Loi_comp_abstraite::Valeur_multi_interpoler_ou_calculer break; }; }; + }; - // définition des tenseurs si nécessaire - + // on complète les définitions de tenseurs si besoin + // les tenseurs restants en locale + TenseurHB* sigHB = NULL ;TenseurHB* sig_barreHB = NULL ; + TenseurHB* epsHB = NULL ;TenseurHB* eps_barreHB = NULL ; + TenseurHB* DepsHB = NULL ; TenseurHB* Deps_barreHB = NULL ; + // -- def de tenseurs pour la sortie + if ((besoin_des_contraintes) || (besoin_des_valpropre_sigma)) + {sigHH = NevezTenseurHH(dim_sortie_tenseur) ; + sigHB = (NevezTenseurHB(dim)) ; + sig_barreHB = (NevezTenseurHB(dim)) ; + } + if ((besoin_des_deformation) || (besoin_des_valpropre_deformation)) + {epsBB = NevezTenseurBB(dim_sortie_tenseur) ; + epsHB = (NevezTenseurHB(dim)) ; + eps_barreHB = (NevezTenseurHB(dim)) ; + } + if ((besoin_des_vitesses_deformation) || (besoin_des_valpropre_vitdef)) + {DepsBB = NevezTenseurBB(dim_sortie_tenseur); + DepsHB = (NevezTenseurHB(dim)); + Deps_barreHB = (NevezTenseurHB(dim)) ; + } + + // on statut sur le fait d'avoir besoin ou non des chgt de base + bool besoin_matrice_chg_base = false; + if ( besoin_des_contraintes + || besoin_des_deformation + || besoin_des_vitesses_deformation + || besoin_rep_local_ortho + ) + {besoin_matrice_chg_base = true;}; + + // on ne change pas le numéro de point d'intégration courant + // on considère ici que c'est déjà le bon, puisque c'est appelé par un élément + // a priori ... + + + // on recupère le tableau pour la lecture des coordonnées des tenseurs + int nbcompo = ParaGlob::NbCompTens(); + // définition des grandeurs qui sont indépendante de la boucle sur les ddl_enum_etendue + + // matrices de passage + int dim_effective = dim; // init + if (absolue) dim_effective = ParaGlob::Dimension(); + Mat_pleine* Aa0 = NULL;Mat_pleine* Aafin = NULL; + Mat_pleine* gamma0 = NULL;Mat_pleine* gammafin = NULL; + Mat_pleine* beta0 = NULL;Mat_pleine* betafin = NULL; + if (besoin_matrice_chg_base) + // dans le cas où on n'est pas en absolue => on sort dans un repère ad hoc donc + // il a la dimension locale + // sinon on sort dans le repère globale => il a la dimension globale + {Aa0 = new Mat_pleine(dim_effective,dim_effective); + Aafin = new Mat_pleine(dim_effective,dim_effective); + gamma0 = new Mat_pleine(dim_effective,dim_effective); + gammafin = new Mat_pleine(dim_effective,dim_effective); + beta0 = new Mat_pleine(dim_effective,dim_effective); + betafin = new Mat_pleine(dim_effective,dim_effective); + }; + // on considère que les métriques sont directement utilisables + // si elles sont disponibles + if (besoin_matrice_chg_base) + {if (pas_de_metrique_dispo) + {cout << "\n *** erreur : on a besoin de matrices de changement de base et il n'y a pas " + << " de metrique disponible: impossible de continuer" + << "\n Loi_comp_abstraite::Valeur_multi_interpoler_ou_calculer..." << endl; + Sortie(1); + } + else if (def_en_cours== NULL) + {cout << "\n *** erreur : on a besoin de l'objet Deformation et il n'y a pas " + << " de pointeur de deformation disponible: impossible de continuer" + << "\n Loi_comp_abstraite::Valeur_multi_interpoler_ou_calculer..." << endl; + Sortie(1); + } + else + // on peut calculer + {Mat_pleine Aat(dim_effective,dim_effective); + // a priori Aat ne sert pas par la suite, mais est nécessaire pour le passage de par + const Met_abstraite::Info_et_metrique_0_t_tdt ex + = def_en_cours->Remont_et_metrique_0_t_tdtSansCalMet(absolue,*Aa0,Aat,*Aafin); + // pour les formules de passage de repère il nous faut : + // Ip_a = beta_a^{.j} g_j et Ip^b = gamma^b_{.j} g^j + // on a: [beta_a^{.j}] = [Aa^j_{.a}]^T + // et [gamma^b_{.j}] = [beta_a^{.j}]^{-1T} = [Aa^j_{.a}]^{-1} + (*gamma0) = (Aa0->Inverse()); + (*gammafin) = (Aafin->Inverse()); + // on détermine également les matrices beta + (*beta0) = (Aa0->Transpose()); + (*betafin) = (Aafin->Transpose()); + }; + }; + + // récup des bases si besoin + if (besoin_rep_local_ortho) + {if ((!absolue)&&(dim_espace==3)&&(dim==2)) + // cas d'éléments 2D, pour lesquels on veut un repère local ad hoc + // on ramène une base à 3 vecteurs + { *(base_ad_hoc(1)) = jBfin(1,1) * giB->Coordo(1) + jBfin(2,1) * giB->Coordo(2); + *(base_ad_hoc(2)) = jBfin(1,2) * giB->Coordo(1) + jBfin(2,2) * giB->Coordo(2); + *(base_ad_hoc(3)) = Util::ProdVec_coor(*(base_ad_hoc(1)),*(base_ad_hoc(2))); + } + else if((!absolue)&&(dim_espace>1)&&(dim==1)) + // cas d'éléments 1D, dans un espace 2D ou 3D + // on ramène un seul vecteur non nul, les autres ne peuvent être calculé sans info supplémentaire + { *(base_ad_hoc(1)) = jBfin(1,1) * giB->Coordo(1); + (base_ad_hoc(2))->Zero(); (base_ad_hoc(3))->Zero(); // init à 0 par défaut + } + else // dans tous les autres cas + { switch (dim_espace) // on se contente de ramener le repère identité + {case 3: (base_ad_hoc(3))->Zero();(*(base_ad_hoc(3)))(3)=1.; + case 2: (base_ad_hoc(2))->Zero();(*(base_ad_hoc(2)))(2)=1.; + case 1: (base_ad_hoc(1))->Zero();(*(base_ad_hoc(1)))(1)=1.; + default:break; + }; + }; + }; + if (besoin_rep_giH) + {switch (dim) {case 3: *(base_giH(3)) = giH->Coordo(3); + case 2: *(base_giH(2)) = giH->Coordo(2); + case 1: *(base_giH(1)) = giH->Coordo(1); + default:break; + }; + }; + if (besoin_rep_giB) + {switch (dim) {case 3: *(base_giB(3)) = giB->Coordo(3); + case 2: *(base_giB(2)) = giB->Coordo(2); + case 1: *(base_giB(1)) = giB->Coordo(1); + default:break; + }; + }; + + // ----- maintenant on calcule les grandeurs nécessaires ----- + + // calcul des tenseurs initiaux + bool plusZero = true; // s'il faut rajouter des termes, on met des 0 + if (besoin_des_contraintes) + {(*sigHB) = (ptintmeca_en_cours->SigHH_const()) * (*gijBB); + if (contrainteCourante) // on n'intervient ici que si on veut une sortie des contraintes courantes + {if (absolue) {(ptintmeca_en_cours->SigHH_const()).BaseAbsolue(*sigHH,*giB);}// changement de base finale + else if (transfert_tenseur) + { TenseurHH* sigHH_inter = NevezTenseurHH(dim) ; + *sigHH_inter = (ptintmeca_en_cours->SigHH_const()); sigHH_inter->ChBase(*gammafin); + sigHH->Affectation_trans_dimension(*sigHH_inter,false); + delete sigHH_inter; + } + else + { *sigHH = (ptintmeca_en_cours->SigHH_const());sigHH->ChBase(*gammafin);}; + }; + }; + + if (besoin_des_deformation) + {// cas de delta_eps + if(DeltaEpsBB != NULL) + {if (absolue)// changement de base finale + {(ptintmeca_en_cours->DeltaEpsBB_const()).BaseAbsolue(*DeltaEpsBB,*giH);} + else if (transfert_tenseur) + { TenseurBB* DeltaEpsBB_inter = NevezTenseurBB(dim) ; + *DeltaEpsBB_inter = (ptintmeca_en_cours->DeltaEpsBB_const()); DeltaEpsBB_inter->ChBase(*betafin); + DeltaEpsBB->Affectation_trans_dimension(*DeltaEpsBB_inter,false); + delete DeltaEpsBB_inter; + } + else {*DeltaEpsBB = (ptintmeca_en_cours->DeltaEpsBB_const());DeltaEpsBB->ChBase(*betafin);}; + }; + // cas de la déformation + (*epsHB) = (*gijHH) * ((ptintmeca_en_cours->EpsBB_const())); + if (deformationCourante)// on n'intervient ici que si on veut une sortie des déformations courantes + {if (absolue)// changement de base finale + {(ptintmeca_en_cours->EpsBB_const()).BaseAbsolue(*epsBB,*giH);} + else if (transfert_tenseur) + { TenseurBB* epsBB_inter = NevezTenseurBB(dim) ; + *epsBB_inter = (ptintmeca_en_cours->EpsBB_const()); epsBB_inter->ChBase(*betafin); + epsBB->Affectation_trans_dimension(*epsBB_inter,false); + delete epsBB_inter; + } + else {*epsBB = (ptintmeca_en_cours->EpsBB_const());epsBB->ChBase(*betafin);}; + }; + switch (def_en_cours->Type_de_deformation()) + {case DEFORMATION_STANDART : // c'est à dire almansi + {if (greenLagrange) + {if (absolue) + {(ptintmeca_en_cours->EpsBB_const()).BaseAbsolue(*eps0BB,*giH_0);}// changement de base finale + else if (transfert_tenseur) + { TenseurBB* eps0BB_inter = NevezTenseurBB(dim) ; + *eps0BB_inter = (ptintmeca_en_cours->EpsBB_const()); eps0BB_inter->ChBase(*beta0); + eps0BB->Affectation_trans_dimension(*eps0BB_inter,false); + delete eps0BB_inter; + } + else {eps0BB->ChBase(*beta0);}; + }; + if (almansi) *epsAlmBB = *epsBB;// le changement de base a été fait juste plus haut + if (almansiTotal) // cas avec dilatation et demande de def Almansi totale + {TenseurBB* epsAlmTotal_local_BB = epsAlmTotalBB; // par défaut + if ((prevoir_change_dim_tenseur)|| transfert_tenseur) + epsAlmTotal_local_BB = NevezTenseurBB(dim); + def_en_cours->Cal_deformation (temps,*epsAlmTotal_local_BB); + if (absolue)// changement de base finale + {epsAlmTotal_local_BB->BaseAbsolue(*epsAlmTotalBB,*giH);} + else if (transfert_tenseur) + { epsAlmTotal_local_BB->ChBase(*betafin); + epsAlmTotalBB->Affectation_trans_dimension(*epsAlmTotal_local_BB,false); + } + else {epsAlmTotalBB->ChBase(*betafin);}; // ici epsAlmTotal_local_BB == epsAlmTotalBB + if ((prevoir_change_dim_tenseur)|| transfert_tenseur) delete epsAlmTotal_local_BB; // car pas utilisé ensuite + }; + if (greenLagrangeTotale) // cas avec dilatation et demande de def Green_Lagrange totale + {TenseurBB* epsGLTotal_local_BB = epsGLTotalBB; // par défaut + if ((prevoir_change_dim_tenseur)|| transfert_tenseur) + epsGLTotal_local_BB = NevezTenseurBB(dim); + def_en_cours->Cal_deformation (temps,*epsGLTotal_local_BB); + if (absolue)// changement de base finale + {epsGLTotal_local_BB->BaseAbsolue(*epsGLTotalBB,*giH_0);} + else if (transfert_tenseur) + { epsGLTotal_local_BB->ChBase(*beta0); + epsGLTotalBB->Affectation_trans_dimension(*epsGLTotal_local_BB,false); + } + else {epsGLTotalBB->ChBase(*beta0);}; // ici epsGLTotal_local_BB == epsGLTotalBB + if ((prevoir_change_dim_tenseur)|| transfert_tenseur) delete epsGLTotal_local_BB; // car pas utilisé ensuite + }; + // si l'on veut sortir la déformation logarithmique le plus simple est de la calculer + if (logarithmiqueTotale || logarithmique) + {def_en_cours->Change_type_de_deformation(DEFORMATION_LOGARITHMIQUE); + if (logarithmique) // cas du calcul de la def logarithmique + {TenseurBB* epslog_local_BB = epslogBB; // par défaut + if ((prevoir_change_dim_tenseur)|| transfert_tenseur) + epslog_local_BB = NevezTenseurBB(dim); + def_en_cours->Cal_deformation (temps,*epslog_local_BB); + if (absolue)// changement de base finale + {epslog_local_BB->BaseAbsolue(*epslogBB,*giH);} + else if (transfert_tenseur) + { epslog_local_BB->ChBase(*betafin); + epslogBB->Affectation_trans_dimension(*epslog_local_BB,false); + } + else {epslogBB->ChBase(*betafin);}; // ici epslog_local_BB == epslogBB + if ((prevoir_change_dim_tenseur)|| transfert_tenseur) delete epslog_local_BB; // car pas utilisé ensuite + }; + if (logarithmiqueTotale) // cas avec dilatation et demande de def log totale + {TenseurBB* epsLogTotal_local_BB = epsLogTotalBB; // par défaut + if ((prevoir_change_dim_tenseur)|| transfert_tenseur) + epsLogTotal_local_BB = NevezTenseurBB(dim); + def_en_cours->Cal_deformation (temps,*epsLogTotal_local_BB); + if (absolue)// changement de base finale + {epsLogTotal_local_BB->BaseAbsolue(*epsLogTotalBB,*giH);} + else if (transfert_tenseur) + { epsLogTotal_local_BB->ChBase(*betafin); + epsLogTotalBB->Affectation_trans_dimension(*epsLogTotal_local_BB,false); + } + else {epsLogTotalBB->ChBase(*betafin);}; // ici epsLogTotal_local_BB == epsLogTotalBB + if ((prevoir_change_dim_tenseur)|| transfert_tenseur) delete epsLogTotal_local_BB; // car pas utilisé ensuite + }; + def_en_cours->Change_type_de_deformation(DEFORMATION_STANDART); // on revient au type initial + }; + break; + } + case DEFORMATION_LOGARITHMIQUE : + { if (logarithmique) *epslogBB=*epsBB; + if (logarithmiqueTotale) // cas avec dilatation et demande de def log totale + {TenseurBB* epsLogTotal_local_BB = epsLogTotalBB; // par défaut + if ((prevoir_change_dim_tenseur)|| transfert_tenseur) + epsLogTotal_local_BB = NevezTenseurBB(dim); + def_en_cours->Cal_deformation (temps,*epsLogTotal_local_BB); + if (absolue)// changement de base finale + {epsLogTotal_local_BB->BaseAbsolue(*epsLogTotalBB,*giH);} + else if (transfert_tenseur) + { epsLogTotal_local_BB->ChBase(*betafin); + epsLogTotalBB->Affectation_trans_dimension(*epsLogTotal_local_BB,false); + } + else {epsLogTotalBB->ChBase(*betafin);}; // ici epsLogTotal_local_BB == epsLogTotalBB + if ((prevoir_change_dim_tenseur)|| transfert_tenseur) delete epsLogTotal_local_BB; // car pas utilisé ensuite + }; + // si l'on veut sortir la déformation d'Almansi ou de green-lagrange le plus simple est de les calculer + if (almansi || greenLagrangeTotale || almansiTotal) + {def_en_cours->Change_type_de_deformation(DEFORMATION_STANDART); + if (almansi) // cas de la def d'almansi + { TenseurBB* eps_local_BB = epsAlmBB; // par défaut + if ((prevoir_change_dim_tenseur)|| transfert_tenseur) + eps_local_BB = NevezTenseurBB(dim); + def_en_cours->Cal_deformation (temps,*eps_local_BB); + if (absolue)// changement de base finale + {eps_local_BB->BaseAbsolue(*epsAlmBB,*giH);} + else if (transfert_tenseur) + { eps_local_BB->ChBase(*betafin); + epsAlmBB->Affectation_trans_dimension(*eps_local_BB,false); + } + else {epsAlmBB->ChBase(*betafin);};// ici eps_local_BB == epsAlmBB + if(greenLagrange) + {if (absolue)// changement de base finale + {eps_local_BB->BaseAbsolue(*eps0BB,*giH_0);} + else if (transfert_tenseur) + { eps_local_BB->ChBase(*beta0); + eps0BB->Affectation_trans_dimension(*eps_local_BB,false); + } + else {eps0BB->ChBase(*beta0);}; // ici eps_local_BB == eps0BB + }; + if ((prevoir_change_dim_tenseur)|| transfert_tenseur) delete eps_local_BB; // car pas utilisé ensuite + }; + if (almansiTotal) // cas avec dilatation et demande de def Almansi totale + {TenseurBB* epsAlmTotal_local_BB = epsAlmTotalBB; // par défaut + if ((prevoir_change_dim_tenseur)|| transfert_tenseur) + epsAlmTotal_local_BB = NevezTenseurBB(dim); + def_en_cours->Cal_deformation (temps,*epsAlmTotal_local_BB); + if (absolue)// changement de base finale + {epsAlmTotal_local_BB->BaseAbsolue(*epsAlmTotalBB,*giH);} + else if (transfert_tenseur) + { epsAlmTotal_local_BB->ChBase(*betafin); + epsAlmTotalBB->Affectation_trans_dimension(*epsAlmTotal_local_BB,false); + } + else {epsAlmTotalBB->ChBase(*betafin);}; // ici epsAlmTotal_local_BB == epsAlmTotalBB + if ((prevoir_change_dim_tenseur)|| transfert_tenseur) delete epsAlmTotal_local_BB; // car pas utilisé ensuite + }; + if (greenLagrangeTotale) // cas avec dilatation et demande de def Green_Lagrange totale + {TenseurBB* epsGLTotal_local_BB = epsGLTotalBB; // par défaut + if ((prevoir_change_dim_tenseur)|| transfert_tenseur) + epsGLTotal_local_BB = NevezTenseurBB(dim); + def_en_cours->Cal_deformation (temps,*epsGLTotal_local_BB); + if (absolue)// changement de base finale + {epsGLTotal_local_BB->BaseAbsolue(*epsGLTotalBB,*giH_0);} + else if (transfert_tenseur) + { epsGLTotal_local_BB->ChBase(*beta0); + epsGLTotalBB->Affectation_trans_dimension(*epsGLTotal_local_BB,false); + } + else {epsGLTotalBB->ChBase(*beta0);}; // ici epsGLTotal_local_BB == epsGLTotalBB + if ((prevoir_change_dim_tenseur)|| transfert_tenseur) delete epsGLTotal_local_BB; // car pas utilisé ensuite + }; + def_en_cours->Change_type_de_deformation(DEFORMATION_LOGARITHMIQUE); // on revient au type initial + }; + break; + } + default: + cout << "\n cas de deformation non encore implante en sortie de visualisation " + << Nom_type_deformation(def_en_cours->Type_de_deformation()) + << " affichage donc errone des valeurs !!!"; + }; + }; //-- fin de if (besoin_des_deformation) + if (besoin_des_vitesses_deformation) + { *DepsHB = (*gijHH) * ((ptintmeca_en_cours->DepsBB_const())); + if (absolue)// changement de base finale + {(ptintmeca_en_cours->DepsBB_const()).BaseAbsolue(*DepsBB,*giH);} + else if (transfert_tenseur) + { TenseurBB* DepsBB_inter = NevezTenseurBB(dim) ; + *DepsBB_inter = (ptintmeca_en_cours->DepsBB_const()); DepsBB_inter->ChBase(*betafin); + DepsBB->Affectation_trans_dimension(*DepsBB_inter,false); + delete DepsBB_inter; + } + else {*DepsBB = (ptintmeca_en_cours->DepsBB_const());DepsBB->ChBase(*betafin);}; + }; + + if (besoin_des_contraintes_barre) + {double Isig = sigHB->Trace(); // trace de la déformation + *sig_barreHB = (*sigHB) - (Isig/dim_espace) * (*Id_dim_HB(dim)); + }; + if (besoin_des_deformation_barre) + {double Ieps = epsHB->Trace(); // trace de la déformation + *eps_barreHB = (*epsHB) - (Ieps/dim_espace) * (*Id_dim_HB(dim)); + }; + if (besoin_des_vitesses_deformation_barre) + {double IDeps = DepsHB->Trace(); // trace de la déformation + *Deps_barreHB = (*DepsHB) - (IDeps/dim_espace) * (*Id_dim_HB(dim)); + }; + + + // cas des valeurs propres et éventuellement des vecteurs propres + {int caas=0; + ////----- debug + //cout << "\n besoin_des_valpropre_sigma= "<< besoin_des_valpropre_sigma + // << " besoin_dir_princ_sig= "<< besoin_dir_princ_sig << endl; + ////--- fin debug + if (besoin_des_valpropre_sigma && besoin_dir_princ_sig)// on veut les directions et les valeurs propres + { Mat_pleine mat(dim,dim); // contiendra par colonne les vecteurs principaux, exprimé en giH + Coordonnee inter(sigHB->ValPropre(caas,mat)); + inter.Change_dim(dim_sortie_tenseur); // on étant la taille éventuellement + *valPropreSig = inter; // sauvegarde des valeurs propres + // puis des directions principales, que l'on doit exprimer dans le repère absolue + Tableau tab = mat.CoordonneeH_Base_associee(); // récup en tab de coor + // on regarde le cas particulier ou les valeurs propres sont toutes nulles + // si c'est le cas, on ne fait rien, en sortie on aura des vecteurs propres nulles + if (inter.Max_val_abs() > ConstMath::petit) + // et s'il y a eu un pb dans le calcul des valeurs propres ou vecteurs propres on évite + {if (caas != -1) + {switch (dim) + {case 3: giB->BaseAbsolue( *(base_propre_sigma(3)),tab(3));(base_propre_sigma(3))->Normer(); + giB->BaseAbsolue( *(base_propre_sigma(2)),tab(2));(base_propre_sigma(2))->Normer(); + case 1: giB->BaseAbsolue( *(base_propre_sigma(1)),tab(1));(base_propre_sigma(1))->Normer(); + break; + case 2: // en 2D le premier vecteur en giB et le second en giH !! + giB->BaseAbsolue( *(base_propre_sigma(1)),tab(1));(base_propre_sigma(1))->Normer(); + giH->BaseAbsolue( *(base_propre_sigma(2)),mat.CoordonneeB_Base_associee(2)); + (base_propre_sigma(2))->Normer(); + break; + default:break; + }; + }; + }; + } + else if (besoin_dir_princ_sig) // cas où on ne veut que les directions principales + { Mat_pleine mat(dim,dim); // contiendra par colonne les vecteurs principaux, exprimé en giH + Coordonnee inter(sigHB->ValPropre(caas,mat)); + // sauvegarde des directions principales + Tableau tab = mat.CoordonneeH_Base_associee(); // récup en tab de coor + // on regarde le cas particulier ou les valeurs propres sont toutes nulles + // si c'est le cas, on ne fait rien, en sortie on aura des vecteurs propres nulles + if (inter.Max_val_abs() > ConstMath::petit) + // et s'il y a eu un pb dans le calcul des valeurs propres ou vecteurs propres on évite + {if (caas != -1) + {switch (dim) + {case 3: giB->BaseAbsolue( *(base_propre_sigma(3)),tab(3));(base_propre_sigma(3))->Normer(); + giB->BaseAbsolue( *(base_propre_sigma(2)),tab(2));(base_propre_sigma(2))->Normer(); + case 1: giB->BaseAbsolue( *(base_propre_sigma(1)),tab(1));(base_propre_sigma(1))->Normer(); + break; + case 2: // en 2D le premier vecteur en en giB et le second en giH !! + giB->BaseAbsolue( *(base_propre_sigma(1)),tab(1));(base_propre_sigma(1))->Normer(); + giH->BaseAbsolue( *(base_propre_sigma(2)),mat.CoordonneeB_Base_associee(2)); + (base_propre_sigma(2))->Normer(); + break; + default:break; + }; + }; + }; + } + else if (besoin_des_valpropre_sigma)// on ne veut que les valeurs propres + { Coordonnee inter(sigHB->ValPropre(caas)); + inter.Change_dim(dim_sortie_tenseur); // on étend la taille éventuellement + *valPropreSig = inter; // sauvegarde des valeurs propres + }; + // gestion d'une erreur éventuelle + if (caas == -1) + { cout << "\n warning *** erreur dans le calcul des valeurs propres et-ou vecteurs propres de la contrainte "; + if (ParaGlob::NiveauImpression() > 5) {sigHB->Ecriture(cout);cout << "\n cas = "<< caas ; + cout << "\n Loi_comp_abstraite::Valeur_multi_interpoler_ou_calculer(...";}; + cout << endl; + }; + }; // -- fin de l'encapsulation du cas des contraintes + + {int caas=0; + if (besoin_des_valpropre_deformation && besoin_dir_princ_eps)// on veut les directions et les valeurs propres + { Mat_pleine mat(dim,dim); // contiendra par colonne les vecteurs principaux, exprimé en giH + // 1) calcul des valeurs propres dans un vecteur de travail inter, et des vecteurs propres stockés + Coordonnee inter(epsHB->ValPropre(caas,mat)); // dans la matrice mat + inter.Change_dim(dim_sortie_tenseur); // on étend la taille, dans le cas ou le nb de valeurs + // propre est inférieur à la dimension de l'espace + *valPropreEps = inter; // sauvegarde des valeurs propres + + // 2) puis des directions principales, que l'on doit exprimer dans le repère absolue + Tableau tab = mat.CoordonneeH_Base_associee(); // récup en tab de coor + // on regarde le cas particulier ou les valeurs propres sont toutes nulles + // si c'est le cas, on ne fait rien, en sortie on aura des vecteurs propres nulles + if (inter.Max_val_abs() > ConstMath::petit) + // et s'il y a eu un pb dans le calcul des valeurs propres ou vecteurs propres on évite + {if (caas != -1) + {switch (dim) + {case 3: giB->BaseAbsolue( *(base_propre_eps(3)),tab(3));(base_propre_eps(3))->Normer(); + giB->BaseAbsolue( *(base_propre_eps(2)),tab(2));(base_propre_eps(2))->Normer(); + case 1: giB->BaseAbsolue( *(base_propre_eps(1)),tab(1));(base_propre_eps(1))->Normer(); + break; + case 2: // en 2D le premier vecteur en en giB et le second en giH !! + giB->BaseAbsolue( *(base_propre_eps(1)),tab(1));(base_propre_eps(1))->Normer(); + giH->BaseAbsolue( *(base_propre_eps(2)),mat.CoordonneeB_Base_associee(2)); + (base_propre_eps(2))->Normer(); + break; + + default:break; + }; + }; + }; + } + else if (besoin_dir_princ_eps) // cas où on ne veut que les directions principales + { Mat_pleine mat(dim,dim); // contiendra par colonne les vecteurs principaux, exprimé en giH + Coordonnee inter(epsHB->ValPropre(caas,mat)); // dans la matrice mat + // puis des directions principales, que l'on doit exprimer dans le repère absolue + Tableau tab = mat.CoordonneeH_Base_associee(); // récup en tab de coor + // on regarde le cas particulier ou les valeurs propres sont toutes nulles + // si c'est le cas, on ne fait rien, en sortie on aura des vecteurs propres nulles + if (inter.Max_val_abs() > ConstMath::petit) + // et s'il y a eu un pb dans le calcul des valeurs propres ou vecteurs propres on évite + {if (caas != -1) + {switch (dim) + {case 3: giB->BaseAbsolue( *(base_propre_eps(3)),tab(3));(base_propre_eps(3))->Normer(); + giB->BaseAbsolue( *(base_propre_eps(2)),tab(2));(base_propre_eps(2))->Normer(); + case 1: giB->BaseAbsolue( *(base_propre_eps(1)),tab(1));(base_propre_eps(1))->Normer(); + break; + case 2: // en 2D le premier vecteur en en giB et le second en giH !! + giB->BaseAbsolue( *(base_propre_eps(1)),tab(1));(base_propre_eps(1))->Normer(); + giH->BaseAbsolue( *(base_propre_eps(2)),mat.CoordonneeB_Base_associee(2)); + (base_propre_eps(2))->Normer(); + break; + default:break; + }; + }; + }; + } + else if (besoin_des_valpropre_deformation)// on ne veut que les valeurs propres + { Coordonnee inter(epsHB->ValPropre(caas)); + inter.Change_dim(dim_sortie_tenseur); // on étant la taille éventuellement + *valPropreEps = inter; // sauvegarde des valeurs propres + }; + // gestion d'une erreur éventuelle + if (caas == -1) + { cout << "\n warning *** erreur dans le calcul des valeurs propres et-ou vecteurs propres de la deformation"; + if (ParaGlob::NiveauImpression() >= 7) {epsHB->Ecriture(cout);cout << "\n cas = "<< caas ; + cout << "\n Loi_comp_abstraite::Valeur_multi_interpoler_ou_calculer(...";}; + cout << endl; + }; + }; // -- fin de l'encapsulation du cas des déformations + + {int caas=0; // il faut l'initialiser sinon il peut prendre la valeur du cas précédant + if (besoin_des_valpropre_vitdef && besoin_dir_princ_D)// on veut les directions et les valeurs propres + { Mat_pleine mat(dim,dim); // contiendra par colonne les vecteurs principaux, exprimé en giH + // 1) calcul des valeurs propres dans un vecteur de travail inter, et des vecteurs propres stockés + Coordonnee inter(DepsHB->ValPropre(caas,mat)); // dans la matrice mat + inter.Change_dim(dim_sortie_tenseur); // on étend la taille, dans le cas ou le nb de valeurs + // propre est inférieur à la dimension de l'espace + *valPropreDeps = inter; // sauvegarde des valeurs propres + + // 2) puis des directions principales, que l'on doit exprimer dans le repère absolue + Tableau tab = mat.CoordonneeH_Base_associee(); // récup en tab de coor + // on regarde le cas particulier ou les valeurs propres sont toutes nulles + // si c'est le cas, on ne fait rien, en sortie on aura des vecteurs propres nulles + if (inter.Max_val_abs() > ConstMath::petit) + // et s'il y a eu un pb dans le calcul des valeurs propres ou vecteurs propres on évite + {if (caas != -1) + {switch (dim) + {case 3: giB->BaseAbsolue( *(base_propre_D(3)),tab(3));(base_propre_D(3))->Normer(); + giB->BaseAbsolue( *(base_propre_D(2)),tab(2));(base_propre_D(2))->Normer(); + case 1: giB->BaseAbsolue( *(base_propre_D(1)),tab(1));(base_propre_D(1))->Normer(); + break; + case 2: // en 2D le premier vecteur en en giB et le second en giH !! + giB->BaseAbsolue( *(base_propre_D(1)),tab(1));(base_propre_D(1))->Normer(); + giH->BaseAbsolue( *(base_propre_D(2)),mat.CoordonneeB_Base_associee(2)); + (base_propre_D(2))->Normer(); + break; + default:break; + }; + }; + }; + } + else if (besoin_dir_princ_D) // cas où on ne veut que les directions principales + { Mat_pleine mat(dim,dim); // contiendra par colonne les vecteurs principaux, exprimé en giH + Coordonnee inter(DepsHB->ValPropre(caas,mat)); // dans la matrice mat + // puis des directions principales, que l'on doit exprimer dans le repère absolue + Tableau tab = mat.CoordonneeH_Base_associee(); // récup en tab de coor + // on regarde le cas particulier ou les valeurs propres sont toutes nulles + // si c'est le cas, on ne fait rien, en sortie on aura des vecteurs propres nulles + if (inter.Max_val_abs() > ConstMath::petit) + // et s'il y a eu un pb dans le calcul des valeurs propres ou vecteurs propres on évite + {if (caas != -1) + {switch (dim) + {case 3: giB->BaseAbsolue( *(base_propre_D(3)),tab(3));(base_propre_D(3))->Normer(); + giB->BaseAbsolue( *(base_propre_D(2)),tab(2));(base_propre_D(2))->Normer(); + case 1: giB->BaseAbsolue( *(base_propre_D(1)),tab(1));(base_propre_D(1))->Normer(); + break; + case 2: // en 2D le premier vecteur en en giB et le second en giH !! + giB->BaseAbsolue( *(base_propre_D(1)),tab(1));(base_propre_D(1))->Normer(); + giH->BaseAbsolue( *(base_propre_D(2)),mat.CoordonneeB_Base_associee(2)); + (base_propre_D(2))->Normer(); + break; + default:break; + }; + }; + }; + } + else if (besoin_des_valpropre_vitdef)// on ne veut que les valeurs propres + { Coordonnee inter(DepsHB->ValPropre(caas)); + inter.Change_dim(dim_sortie_tenseur); // on étant la taille + *valPropreDeps = inter; // sauvegarde des valeurs propres + }; + // gestion d'une erreur éventuelle + if (caas == -1) + { cout << "\n warning *** erreur dans le calcul des valeurs propres et-ou vecteurs propres de la vitesse de deformation"; + if (ParaGlob::NiveauImpression() >= 7) {DepsHB->Ecriture(cout);cout << "\n cas = "<< caas ; + cout << "\n Loi_comp_abstraite::Valeur_multi_interpoler_ou_calculer(...";}; + cout << endl; + }; + }; // -- fin de l'encapsulation du cas des vitesses de déformations + if (besoin_coordonnees) {Mtdt = new Coordonnee(ParaGlob::Dimension()); *Mtdt = def_en_cours->Position_tdt(); @@ -1740,16 +2522,80 @@ Tableau Loi_comp_abstraite::Valeur_multi_interpoler_ou_calculer // pb au niveau des iso par exemple, du au fait que l'on va faire des moyennes sur des éléments // de type différents (à moins de grouper par type du coup on n'aura pas le warning }; + + // cas du déplacement et de la vitesse + if (Deplacement != NULL) + (*Deplacement) = (*Mtdt) - def_en_cours->Position_0(); + if (Vitesse != NULL) + (*Vitesse) = def_en_cours->VitesseM_tdt(); + + // cas de la deformation équivalente cumulée + if (def_def_equivalente) {*def_equivalente = ptintmeca_en_cours->Deformation_equi_const()(1);}; + // cas de la deformation duale au sens de mises, + if (def_duale_mises) {*defDualMises = ptintmeca_en_cours->Deformation_equi_const()(2);}; + // cas de la deformation maxi duale au sens de mises, + if (def_duale_mises_maxi) {*defDualMisesMaxi = ptintmeca_en_cours->Deformation_equi_const()(3);}; + + // cas des contraintes: mises et tresca + if (def_sig_mises) {*sig_mises = ptintmeca_en_cours->Sig_equi_const()(1);}; + if (def_sig_tresca) {*sig_tresca = ptintmeca_en_cours->Sig_equi_const()(2);}; + + // //contrainte_tresca + // if (contraintesTresca) + // { switch (dim) {case 1: *Tresca=0.5 * (*valPropreSig)(1);break; + // case 2: *Tresca=0.5 * ((*valPropreSig)(1)-(*valPropreSig)(2));break; + // case 3: *Tresca=0.5 * ((*valPropreSig)(1)-(*valPropreSig)(3));break; + // }; + // }; + + + // --- cas des grandeurs de la décomposition polaire + // cas de la déformation + if (def_SPHERIQUE_EPS) {*spherique_eps = epsHB->Trace()/3.;}; //ParaGlob::Dimension();}; modif 5/2/2012 + double mini_Q = 5.e-5; + if (def_Q_EPS) {*Q_eps = sqrt(eps_barreHB->II());}; + if (cos3phi_eps) + { double Qepsilon = ( def_Q_EPS ? *Q_eps : sqrt(eps_barreHB->II())); + double Qepsilon3 = Qepsilon * Qepsilon * Qepsilon; + if (Qepsilon > mini_Q ) + { // on peut calculer un cos3phi pas débile + double bIIIb = eps_barreHB->III() / 3.; + *cos3phi_eps = 3. * sqrt(6.) * bIIIb/ Qepsilon3; + } + else *cos3phi_eps=0.; // sinon on le met à 0 + }; + // cas de la contrainte + if (def_SPHERIQUE_SIG) {*spherique_sig = sigHB->Trace()/3.;}; //ParaGlob::Dimension();}; modif 5/2/2012 + if (def_Q_SIG) {*Q_sig = sqrt(sig_barreHB->II());}; + if (cos3phi_sig) + { double Qsig = ( def_Q_SIG ? *Q_sig : sqrt(sig_barreHB->II())); + double Qsig3 = Qsig * Qsig * Qsig; + if (Qsig > mini_Q ) + { // on peut calculer un cos3phi pas débile + double bIIIb = sig_barreHB->III() / 3.; + *cos3phi_sig = 3. * sqrt(6.) * bIIIb/ Qsig3; + } + else *cos3phi_sig=0.; // sinon on le met à 0 + }; + // cas de la vitesse de déformation + if (def_SPHERIQUE_DEPS) {*spherique_Deps = DepsHB->Trace()/3.;}; //ParaGlob::Dimension();}; modif 5/2/2012 + if (def_Q_DEPS) {*Q_Deps = sqrt(Deps_barreHB->II());}; + if (cos3phi_Deps) + { double QDepsilon = ( def_Q_DEPS ? *Q_Deps : sqrt(Deps_barreHB->II())); + double QDepsilon3 = QDepsilon * QDepsilon * QDepsilon; + if (QDepsilon > mini_Q ) + { // on peut calculer un cos3phi pas débile + double bIIIb = Deps_barreHB->III() / 3.; + *cos3phi_Deps = 3. * sqrt(6.) * bIIIb/ QDepsilon3; + } + else *cos3phi_Deps=0.; // sinon on le met à 0 + }; + + + //----- fin du calcul des grandeurs nécessaires ----- - - // init pour l'utilisation de la liste d'exclusion - List_io::const_iterator itt_deb; - List_io::const_iterator itt_fin; - if (exclure_dd_etend != NULL) - { itt_deb = exclure_dd_etend->begin(); - itt_fin = exclure_dd_etend->end(); - }; + // on balaie maintenant la liste des grandeurs à sortir int it; // it est l'indice dans le tableau de retour @@ -1859,14 +2705,44 @@ Tableau Loi_comp_abstraite::Valeur_multi_interpoler_ou_calculer }; };// -- fin de la boucle sur la liste de Ddl_enum_etendu - // delet e des tenseurs - if (Mtdt != NULL) delete Mtdt; // coordonnée du point à tdt + + // delete des tenseurs + if (sigHH != NULL); delete sigHH; + if (eps0BB != NULL); delete eps0BB; + if (epsBB != NULL); delete epsBB; + if (epslogBB != NULL); delete epslogBB; + if (epsAlmBB != NULL); delete epsAlmBB; + if (sigHB != NULL); delete sigHB; + if (epsHB != NULL); delete epsHB; + if (DepsBB != NULL); delete DepsBB; + if (DepsHB != NULL); delete DepsHB; + if (DeltaEpsBB != NULL); delete DeltaEpsBB; + if (eps_barreHB != NULL); delete eps_barreHB; + if (Deps_barreHB != NULL); delete Deps_barreHB; + if (sig_barreHB != NULL); delete sig_barreHB; + // cas des pointeurs + if (epsAlmTotalBB!=NULL) delete epsAlmTotalBB; // pour la déformation totale d'almansi + if (epsGLTotalBB!=NULL) delete epsGLTotalBB; // pour la déformation totale de green_lagrange + if (epsLogTotalBB!=NULL) delete epsLogTotalBB; // pour la déformation totale logarithmique + if (Q_sig != NULL) delete Q_sig; // grandeurs polaires + if (Q_eps != NULL) delete Q_eps; // grandeurs polaires + if (Mtdt != NULL) delete Mtdt; // coordonnée du point à t if (Mt != NULL ) delete Mt; // la position à t if (M0 != NULL ) delete M0; // coordonnée du point à 0 if (N_surf != NULL) delete N_surf; // vecteur normal à la surface - if (N_surf_t != NULL) delete N_surf_t; // vecteur normal à t à la surface - if (N_surf_t0 != NULL) delete N_surf_t0; // vecteur normal à la surface + if (N_surf_t != NULL) delete N_surf_t; // vecteur normal à la surface à t + if (N_surf_t0 != NULL) delete N_surf_t0; // vecteur normal à la surface à t0 if (Vitesse != NULL) delete Vitesse; // vitesse + // pointeurs de matrice + if (Aa0 != NULL) delete Aa0; + if (Aafin != NULL) delete Aafin; + if (gamma0 != NULL) delete gamma0; + if (gammafin != NULL) delete gammafin; + if (beta0 != NULL) delete beta0; + if (betafin != NULL) delete betafin; + + + // liberation des tenseurs intermediaires LibereTenseur(); return tab_ret; @@ -1906,7 +2782,11 @@ void Loi_comp_abstraite::Valeurs_Tensorielles_interpoler_ou_calculer // exemple: base ad hoc : dim 1, espace 3 -> eps11 sera stocké dans le conteneur // en 11, les autres seront nulles -{ // on a besoin a priori de ptintmeca_en_cours, donc s'il n'est pas définit -> erreur +{ // on ne continue que s'il y a des grandeurs à calculer + if (enu.size() == 0) + return; + + // on a besoin a priori de ptintmeca_en_cours, donc s'il n'est pas définit -> erreur #ifdef MISE_AU_POINT if (ptintmeca_en_cours == NULL) {cout << "\n *** cas non prevu : aucun conteneur de point d'integration transmis " @@ -1947,8 +2827,7 @@ void Loi_comp_abstraite::Valeurs_Tensorielles_interpoler_ou_calculer if ((!absolue)&&(dim != dim_espace)) {dim_sortie_tenseur = dim; // la dimension des tenseurs intermédiaires créés transfert_tenseur = true; - } - + }; // éléments de métrique et matrices de passage TenseurHH* gijHH;TenseurBB* gijBB;BaseB* giB; BaseH* giH_0;BaseH* giH; @@ -2002,8 +2881,6 @@ void Loi_comp_abstraite::Valeurs_Tensorielles_interpoler_ou_calculer // pour les bases Tableau base_ad_hoc , base_giH , base_giB; - // grandeurs scalaires - // grandeurs scalaires double* Mises = NULL; double* defDualMises = NULL; double* Tresca = NULL; double* erreur = NULL;double* erreur_rel = NULL; @@ -2764,7 +3641,7 @@ void Loi_comp_abstraite::Valeurs_Tensorielles_interpoler_ou_calculer if (caas == -1) { cout << "\n warning *** erreur dans le calcul des valeurs propres et-ou vecteurs propres de la contrainte "; if (ParaGlob::NiveauImpression() > 5) {sigHB->Ecriture(cout);cout << "\n cas = "<< caas ; - cout << "\Loi_comp_abstraite::Valeurs_Tensorielles_interpoler_ou_calculer(...";}; + cout << "\n Loi_comp_abstraite::Valeurs_Tensorielles_interpoler_ou_calculer(...";}; cout << endl; }; }; // -- fin de l'encapsulation du cas des contraintes @@ -2835,7 +3712,7 @@ void Loi_comp_abstraite::Valeurs_Tensorielles_interpoler_ou_calculer if (caas == -1) { cout << "\n warning *** erreur dans le calcul des valeurs propres et-ou vecteurs propres de la deformation"; if (ParaGlob::NiveauImpression() >= 7) {epsHB->Ecriture(cout);cout << "\n cas = "<< caas ; - cout << "\Loi_comp_abstraite::Valeurs_Tensorielles_interpoler_ou_calculer(...";}; + cout << "\n Loi_comp_abstraite::Valeurs_Tensorielles_interpoler_ou_calculer(...";}; cout << endl; }; }; // -- fin de l'encapsulation du cas des déformations @@ -2905,7 +3782,7 @@ void Loi_comp_abstraite::Valeurs_Tensorielles_interpoler_ou_calculer if (caas == -1) { cout << "\n warning *** erreur dans le calcul des valeurs propres et-ou vecteurs propres de la vitesse de deformation"; if (ParaGlob::NiveauImpression() >= 7) {DepsHB->Ecriture(cout);cout << "\n cas = "<< caas ; - cout << "\Loi_comp_abstraite::Valeurs_Tensorielles_interpoler_ou_calculer(...";}; + cout << "\n Loi_comp_abstraite::Valeurs_Tensorielles_interpoler_ou_calculer(...";}; cout << endl; }; }; // -- fin de l'encapsulation du cas des vitesses de déformations diff --git a/comportement/Loi_comp_abstraite.h b/comportement/Loi_comp_abstraite.h index 524cc59..5e2d3c6 100644 --- a/comportement/Loi_comp_abstraite.h +++ b/comportement/Loi_comp_abstraite.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -164,6 +164,7 @@ class Loi_comp_abstraite : public LoiAbstraiteGeneral // au niveau du point d'intégration par exemple: exemple: un repère d'anisotropie // completer est appelé apres sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois + // ramène NULL si ne fait rien virtual SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor ,const Loi_comp_abstraite* loi) = 0; // test si le conteneur est complet @@ -654,7 +655,8 @@ Tableau & Loi_comp_Valeur_FnD_Evoluee // du calcul de la contrainte // ------- variables de travail utilisées dans le cadre de la dilatation thermique : pour l'instant en locales // mais pourraient très bien être dimensionnées dans les éléments si on en avait besoin - TenseurBB * epsBB_totale, * epsBB_therm; + TenseurBB * epsBB_totale, * epsBB_therm; + TenseurBB * delta_epsBB_totale, * delta_epsBB_therm; TenseurBB * DepsBB_totale, * DepsBB_therm; TenseurBB * DepsBB_umat; // pour l'umat // fonction interne utilisée par les classes dérivées diff --git a/comportement/anisotropie/Hypo_ortho3D_entrainee.cc b/comportement/anisotropie/Hypo_ortho3D_entrainee.cc index 86983c9..6553a65 100755 --- a/comportement/anisotropie/Hypo_ortho3D_entrainee.cc +++ b/comportement/anisotropie/Hypo_ortho3D_entrainee.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -1455,7 +1455,7 @@ void Hypo_ortho3D_entrainee::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& ,DdlE // Tenseur3BB delta_eps_p_BB(delta_epsBB); //cout <<"\n delta_eps_p_BB: "; delta_eps_p_BB.Ecriture(cout); // il faut passer en 2 fois contravariant - Tenseur3HH delta_eps_p_HH(gijHH * delta_epsBB * gijHH); + Tenseur3HH delta_eps_p_HH = gijHH * delta_epsBB * gijHH; delta_eps_p_HH.ChBase(gamma); // res = (gamma * res) * gamma.Transpose(); //cout <<"\n delta_eps_p_HH: "; delta_eps_p_HH.Ecriture(cout); //Tenseur3HH toto(delta_eps_p_HH); @@ -1575,7 +1575,7 @@ void Hypo_ortho3D_entrainee::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& ,DdlE // dans le cas où on veut une sortie des grandeurs locale on sauvegarde if (sortie_post) - { Tenseur3HH eps_p_HH(gijHH * epsBB * gijHH); + { Tenseur3HH eps_p_HH = gijHH * epsBB * gijHH; eps_p_HH.ChBase(gamma); Tenseur3HH sig_p_HH(sigHH); sig_p_HH.ChBase(gamma); @@ -1586,7 +1586,7 @@ void Hypo_ortho3D_entrainee::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& ,DdlE // beta_inv = beta.Inverse(); // sig_BB.ChBase(beta_inv); // passage dans la bonne variance - Tenseur3BH sigBH(gijBB * sigHH ); + Tenseur3BH sigBH = gijBB * sigHH ; switch (cas_calcul) { case 0: // calcul normal (tous les termes) { // on ne fait rien de spécial @@ -1688,9 +1688,7 @@ void Hypo_ortho3D_entrainee::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& }; #endif - bool affichage = ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 5) - ); + bool affichage = (Permet_affichage() > 5); const Tenseur3BB & delta_epsBB = *((Tenseur3BB*) &delta_epsBB_); // passage en dim 3 const Tenseur3BB & epsBB = *((Tenseur3BB*) &epsBB_tdt); // passage en dim 3 const Tenseur3HH & gijHH = *((Tenseur3HH*) &gijHH_tdt); // " " " " @@ -1825,7 +1823,7 @@ void Hypo_ortho3D_entrainee::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& // ------- partie déformation Tenseur3BH delta_epsBH = delta_epsBB * gijHH; // accroissement de deformation en mixte - Tenseur3HH delta_epsHH(gijHH * delta_epsBH); // en deuxfois contra + Tenseur3HH delta_epsHH = gijHH * delta_epsBH; // en deuxfois contra // calcul des coordonnées de l'incrément de déformation dans le repère O'^i #ifdef MISE_AU_POINT if (affichage) @@ -1843,7 +1841,7 @@ void Hypo_ortho3D_entrainee::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& Tenseur3HH toto(delta_eps_p_HH); toto.ChBase(beta_transpose); cout << "\n retour dans la base g^i de eps^{ij} :";toto.Ecriture(cout); - Tenseur3BB titi(gijBB * toto * gijBB); + Tenseur3BB titi = gijBB * toto * gijBB; cout << "\n def eps_ij :";titi.Ecriture(cout); }; #endif @@ -1962,7 +1960,7 @@ void Hypo_ortho3D_entrainee::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& // dans le cas où on veut une sortie des grandeurs locale on sauvegarde if (sortie_post) - { Tenseur3HH eps_p_HH(gijHH * epsBB * gijHH); + { Tenseur3HH eps_p_HH = gijHH * epsBB * gijHH; eps_p_HH.ChBase(gamma); Tenseur3HH sig_p_HH(sigHH); sig_p_HH.ChBase(gamma); @@ -1971,7 +1969,7 @@ void Hypo_ortho3D_entrainee::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& }; // passage dans la bonne variance - Tenseur3BH sigBH(gijBB * sigHH ); + Tenseur3BH sigBH = gijBB * sigHH ; switch (cas_calcul) { case 0: // calcul normal (tous les termes) { // on ne fait rien de spécial @@ -2304,9 +2302,7 @@ void Hypo_ortho3D_entrainee::Calcul_dsigma_deps (bool en_base_orthonormee, Tense Sortie(1); }; #endif - bool affichage = ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 5) - ); + bool affichage = (Permet_affichage() > 5); #ifdef MISE_AU_POINT if (affichage) {cout << "\n --- loi de comportement orthotrope entrainee --- "; @@ -2464,7 +2460,7 @@ void Hypo_ortho3D_entrainee::Calcul_dsigma_deps (bool en_base_orthonormee, Tense // ------- partie déformation Tenseur3BH delta_epsBH = delta_epsBB * gijHH; // accroissement de deformation en mixte - Tenseur3HH delta_epsHH(gijHH * delta_epsBH); // en deuxfois contra + Tenseur3HH delta_epsHH = gijHH * delta_epsBH; // en deuxfois contra // calcul des coordonnées de l'incrément de déformation dans le repère O'^i // calcul des coordonnées de la déformation dans le repère O'_i #ifdef MISE_AU_POINT @@ -2485,7 +2481,7 @@ void Hypo_ortho3D_entrainee::Calcul_dsigma_deps (bool en_base_orthonormee, Tense Tenseur3HH toto(delta_eps_p_HH); toto.ChBase(beta_transpose); cout << "\n retour dans la base g^i de eps^{ij} :";toto.Ecriture(cout); - Tenseur3BB titi(gijBB * toto * gijBB); + Tenseur3BB titi = gijBB * toto * gijBB; cout << "\n def eps_ij :";titi.Ecriture(cout); }; #endif @@ -2618,7 +2614,7 @@ void Hypo_ortho3D_entrainee::Calcul_dsigma_deps (bool en_base_orthonormee, Tense // dans le cas où on veut une sortie des grandeurs locale on sauvegarde if (sortie_post) - { Tenseur3HH eps_p_HH(gijHH * epsBB * gijHH); + { Tenseur3HH eps_p_HH = gijHH * epsBB * gijHH; eps_p_HH.ChBase(gamma); Tenseur3HH sig_p_HH(sigHH); sig_p_HH.ChBase(gamma); @@ -2628,7 +2624,7 @@ void Hypo_ortho3D_entrainee::Calcul_dsigma_deps (bool en_base_orthonormee, Tense // passage dans la variance mixte - Tenseur3BH sigBH(gijBB * sigHH ); + Tenseur3BH sigBH = gijBB * sigHH ; switch (cas_calcul) { case 0: // calcul normal (tous les termes) { // on ne fait rien de spécial diff --git a/comportement/anisotropie/Hypo_ortho3D_entrainee.h b/comportement/anisotropie/Hypo_ortho3D_entrainee.h index 2f135dc..e450e08 100755 --- a/comportement/anisotropie/Hypo_ortho3D_entrainee.h +++ b/comportement/anisotropie/Hypo_ortho3D_entrainee.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/anisotropie/Loi_ortho2D_C_entrainee.cc b/comportement/anisotropie/Loi_ortho2D_C_entrainee.cc index 70146b5..7065267 100755 --- a/comportement/anisotropie/Loi_ortho2D_C_entrainee.cc +++ b/comportement/anisotropie/Loi_ortho2D_C_entrainee.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -1233,9 +1233,7 @@ void Loi_ortho2D_C_entrainee::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& ,Ddl }; #endif - bool affichage = ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 5) - ); + bool affichage = (Permet_affichage() > 5); #ifdef MISE_AU_POINT if (affichage) {cout << "\n --- loi de comportement orthotrope entrainee --- "; @@ -1362,7 +1360,9 @@ void Loi_ortho2D_C_entrainee::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& ,Ddl Tenseur2BB eps_p_BB(epsBB); //cout <<"\n eps_p_BB: "; eps_p_BB.Ecriture(cout); // il faut passer en 2 fois contravariant - Tenseur2HH eps_p_HH(gijHH * eps_p_BB * gijHH); + // on utilise l'opérateur d'affectation, car le résultat doit-être symétrique, or + // les multiplications intermédiaires vont générer un tenseur systématiquement non symétrique + Tenseur2HH eps_p_HH = gijHH * eps_p_BB * gijHH; eps_p_HH.ChBase(gamma); // res = (gamma * res) * gamma.Transpose(); #ifdef MISE_AU_POINT if (affichage) @@ -1481,7 +1481,7 @@ void Loi_ortho2D_C_entrainee::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& ,Ddl // beta_inv = beta.Inverse(); // sig_BB.ChBase(beta_inv); // passage dans la bonne variance - Tenseur2BH sigBH(gijBB * sigHH ); + Tenseur2BH sigBH = gijBB * sigHH ; switch (cas_calcul) { case 0: // calcul normal (tous les termes) { // on ne fait rien de spécial @@ -1621,9 +1621,7 @@ void Loi_ortho2D_C_entrainee::Calcul_DsigmaHH_tdt (TenseurHH& ,TenseurBB& ,DdlEl }; #endif - bool affichage = ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 5) - ); + bool affichage = (Permet_affichage() > 5); #ifdef MISE_AU_POINT if (affichage) {cout << "\n --- loi de comportement orthotrope entrainee --- "; @@ -1635,7 +1633,7 @@ void Loi_ortho2D_C_entrainee::Calcul_DsigmaHH_tdt (TenseurHH& ,TenseurBB& ,DdlEl const Tenseur2BB & gijBB = *((Tenseur2BB*) &gijBB_tdt); // " " " " Tenseur2BH epsBH = epsBB * gijHH; // deformation en mixte - Tenseur2HH epsHH(gijHH * epsBH); // en deuxfois contra + Tenseur2HH epsHH = gijHH * epsBH; // en deuxfois contra int dim = ParaGlob::Dimension(); // pour les affichages de vecteurs // récup du conteneur spécifique @@ -1880,7 +1878,7 @@ void Loi_ortho2D_C_entrainee::Calcul_DsigmaHH_tdt (TenseurHH& ,TenseurBB& ,DdlEl }; #endif // passage dans la bonne variance - Tenseur2BH sigBH(gijBB * sigHH ); + Tenseur2BH sigBH = gijBB * sigHH ; switch (cas_calcul) { case 0: // calcul normal (tous les termes) { // on ne fait rien de spécial @@ -2217,9 +2215,7 @@ void Loi_ortho2D_C_entrainee::Calcul_dsigma_deps (bool en_base_orthonormee, Tens }; #endif - bool affichage = ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 5) - ); + bool affichage = (Permet_affichage() > 5); #ifdef MISE_AU_POINT if (affichage) {cout << "\n --- loi de comportement orthotrope entrainee --- "; @@ -2497,7 +2493,7 @@ void Loi_ortho2D_C_entrainee::Calcul_dsigma_deps (bool en_base_orthonormee, Tens // passage dans la variance mixte - Tenseur2BH sigBH(gijBB * sigHH ); + Tenseur2BH sigBH = gijBB * sigHH ; switch (cas_calcul) { case 0: // calcul normal (tous les termes) { // on ne fait rien de spécial @@ -3007,9 +3003,7 @@ bool Loi_ortho2D_C_entrainee::Verif_convexite() { // double E1,E2,E3,nu12,nu13,nu23,G12,G13,G23; // paramètres de la loi //1. - \nu_{12} . \nu_{13} . \nu_{23}. \left ( \frac{E_3}{E_1} - \frac{E_2}{E_1}. \frac{E_3}{E_2} \right ) - \nu_{12}^2 . \frac{E_2}{E_1}-\nu_{13}^2 . \frac{E_3}{E_1}-\nu_{23}^2 . \frac{E_3}{E_2} > 0 bool convexe = true; // vrai a priori - bool affichage = ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 2)) - || (Permet_affichage() > 0) - ); + bool affichage = (Permet_affichage() > 0); if (1. <= nu12*nu12*E2/E1) {if (affichage) diff --git a/comportement/anisotropie/Loi_ortho2D_C_entrainee.h b/comportement/anisotropie/Loi_ortho2D_C_entrainee.h index 7840037..22dc3ca 100755 --- a/comportement/anisotropie/Loi_ortho2D_C_entrainee.h +++ b/comportement/anisotropie/Loi_ortho2D_C_entrainee.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/anisotropie/Loi_ortho3D_entrainee.cc b/comportement/anisotropie/Loi_ortho3D_entrainee.cc index b6a4faa..43da32b 100755 --- a/comportement/anisotropie/Loi_ortho3D_entrainee.cc +++ b/comportement/anisotropie/Loi_ortho3D_entrainee.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -1227,9 +1227,7 @@ void Loi_ortho_elas3D::Calcul_SigmaHH (TenseurHH& ,TenseurBB& ,DdlElement & tab_ }; #endif - bool affichage = ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 3) - ); + bool affichage = (Permet_affichage() > 3); #ifdef MISE_AU_POINT if (affichage) {cout << "\n --- loi de comportement orthotrope entrainee Calcul_SigmaHH --- "; @@ -1362,7 +1360,7 @@ void Loi_ortho_elas3D::Calcul_SigmaHH (TenseurHH& ,TenseurBB& ,DdlElement & tab_ #endif Tenseur3BB eps_p_BB(epsBB); // il faut passer en 2 fois contravariant - Tenseur3HH eps_p_HH(gijHH * eps_p_BB * gijHH); + Tenseur3HH eps_p_HH = gijHH * eps_p_BB * gijHH; #ifdef MISE_AU_POINT if (affichage) {cout <<"\n eps_p_HH en g_i: "; eps_p_HH.Ecriture(cout); @@ -1376,7 +1374,7 @@ void Loi_ortho_elas3D::Calcul_SigmaHH (TenseurHH& ,TenseurBB& ,DdlElement & tab_ Tenseur3HH toto(eps_p_HH); toto.ChBase(beta_transpose); cout << "\n retour dans la base g^i de eps^{ij} :";toto.Ecriture(cout); - Tenseur3BB titi(gijBB * toto * gijBB); + Tenseur3BB titi = gijBB * toto * gijBB; cout << "\n def eps_ij :";titi.Ecriture(cout); }; #endif @@ -1496,7 +1494,7 @@ void Loi_ortho_elas3D::Calcul_SigmaHH (TenseurHH& ,TenseurBB& ,DdlElement & tab_ // beta_inv = beta.Inverse(); // sig_BB.ChBase(beta_inv); // passage dans la bonne variance - Tenseur3BH sigBH(gijBB * sigHH ); + Tenseur3BH sigBH = gijBB * sigHH ; switch (cas_calcul) { case 0: // calcul normal (tous les termes) { // on ne fait rien de spécial @@ -1613,9 +1611,7 @@ void Loi_ortho_elas3D::Calcul_DsigmaHH_tdt (TenseurHH& ,TenseurBB& ,DdlElement & }; #endif - bool affichage = ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 3) - ); + bool affichage = (Permet_affichage() > 3); #ifdef MISE_AU_POINT if (affichage) {cout << "\n --- loi de comportement orthotrope entrainee Calcul_DsigmaHH_tdt --- "; @@ -1628,7 +1624,7 @@ void Loi_ortho_elas3D::Calcul_DsigmaHH_tdt (TenseurHH& ,TenseurBB& ,DdlElement & const Tenseur3BB & gijBB = *((Tenseur3BB*) &gijBB_tdt); // " " " " Tenseur3BH epsBH = epsBB * gijHH; // deformation en mixte - Tenseur3HH epsHH(gijHH * epsBH); // en deuxfois contra + Tenseur3HH epsHH = gijHH * epsBH; // en deuxfois contra // récup du conteneur spécifique SaveResulLoi_ortho_elas3D & save_resul = *((SaveResulLoi_ortho_elas3D*) saveResul); @@ -1747,7 +1743,7 @@ void Loi_ortho_elas3D::Calcul_DsigmaHH_tdt (TenseurHH& ,TenseurBB& ,DdlElement & Tenseur3HH toto(eps_p_HH); toto.ChBase(beta_transpose); cout << "\n retour dans la base g^i de eps^{ij} :";toto.Ecriture(cout); - Tenseur3BB titi(gijBB * toto * gijBB); + Tenseur3BB titi = gijBB * toto * gijBB; cout << "\n def eps_ij :";titi.Ecriture(cout); }; #endif @@ -1862,7 +1858,7 @@ void Loi_ortho_elas3D::Calcul_DsigmaHH_tdt (TenseurHH& ,TenseurBB& ,DdlElement & // l'inverse de gamma c'est beta transposée sigHH.ChBase(beta_transpose); // passage dans la bonne variance - Tenseur3BH sigBH(gijBB * sigHH ); + Tenseur3BH sigBH = gijBB * sigHH ; switch (cas_calcul) { case 0: // calcul normal (tous les termes) { // on ne fait rien de spécial @@ -2168,9 +2164,7 @@ void Loi_ortho_elas3D::Calcul_dsigma_deps (bool en_base_orthonormee, TenseurHH & Sortie(1); }; #endif - bool affichage = ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 3) - ); + bool affichage = (Permet_affichage() > 3); #ifdef MISE_AU_POINT if (affichage) {cout << "\n --- loi de comportement orthotrope entrainee Calcul_dsigma_deps --- "; @@ -2184,7 +2178,7 @@ void Loi_ortho_elas3D::Calcul_dsigma_deps (bool en_base_orthonormee, TenseurHH & Tenseur3HHHH& d_sigma_deps = *((Tenseur3HHHH*) &d_sigma_deps_); Tenseur3BH epsBH = epsBB * gijHH; // deformation en mixte - Tenseur3HH epsHH(gijHH * epsBH); // en deuxfois contra + Tenseur3HH epsHH = gijHH * epsBH; // en deuxfois contra // récup du conteneur spécifique @@ -2323,7 +2317,7 @@ void Loi_ortho_elas3D::Calcul_dsigma_deps (bool en_base_orthonormee, TenseurHH & Tenseur3HH toto(eps_p_HH); toto.ChBase(beta_transpose); cout << "\n retour dans la base g^i de eps^{ij} :";toto.Ecriture(cout); - Tenseur3BB titi(gijBB * toto * gijBB); + Tenseur3BB titi = gijBB * toto * gijBB; cout << "\n def eps_ij :";titi.Ecriture(cout); }; #endif @@ -2452,7 +2446,7 @@ void Loi_ortho_elas3D::Calcul_dsigma_deps (bool en_base_orthonormee, TenseurHH & // passage dans la variance mixte - Tenseur3BH sigBH(gijBB * sigHH ); + Tenseur3BH sigBH = gijBB * sigHH ; switch (cas_calcul) { case 0: // calcul normal (tous les termes) { // on ne fait rien de spécial @@ -2946,9 +2940,7 @@ bool Loi_ortho_elas3D::Verif_convexite() { // double E1,E2,E3,nu12,nu13,nu23,G12,G13,G23; // paramètres de la loi //1. - \nu_{12} . \nu_{13} . \nu_{23}. \left ( \frac{E_3}{E_1} - \frac{E_2}{E_1}. \frac{E_3}{E_2} \right ) - \nu_{12}^2 . \frac{E_2}{E_1}-\nu_{13}^2 . \frac{E_3}{E_1}-\nu_{23}^2 . \frac{E_3}{E_2} > 0 bool convexe = true; // vrai a priori - bool affichage = ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 2)) - || (Permet_affichage() > 0) - ); + bool affichage = (Permet_affichage() > 0); if (1. <= nu12*nu12*E2/E1) {if (affichage) diff --git a/comportement/anisotropie/Loi_ortho3D_entrainee.h b/comportement/anisotropie/Loi_ortho3D_entrainee.h index 2d46ff1..e31c639 100755 --- a/comportement/anisotropie/Loi_ortho3D_entrainee.h +++ b/comportement/anisotropie/Loi_ortho3D_entrainee.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/anisotropie/Projection_anisotrope_3D.cc b/comportement/anisotropie/Projection_anisotrope_3D.cc index ff8ee89..ff908e3 100755 --- a/comportement/anisotropie/Projection_anisotrope_3D.cc +++ b/comportement/anisotropie/Projection_anisotrope_3D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -321,7 +321,7 @@ void Projection_anisotrope_3D::SaveResulProjection_anisotrope_3D::Lecture_base_i {delete para_loi;para_loi=NULL;} } else // sinon cas où on a des données additionnelles - { if (para_loi == NULL) para_loi = new Vecteur (9); + { if (para_loi == NULL) para_loi = new Vecteur (6); ent >> *para_loi; }; @@ -359,7 +359,7 @@ void Projection_anisotrope_3D::SaveResulProjection_anisotrope_3D::Lecture_base_i {delete para_loi;para_loi=NULL;} } else // sinon cas où on a des données additionnelles - { if (para_loi == NULL) para_loi = new Vecteur(9); + { if (para_loi == NULL) para_loi = new Vecteur(6); ent >> *para_loi; }; @@ -1406,7 +1406,7 @@ void Projection_anisotrope_3D::ListeGrandeurs_particulieres(bool absolue,List_io tyTQ.Change_taille(taille); nexistePas = false; }; if (nexistePas) - {Vecteur tens(9); // les 9 paramètres + {Vecteur tens(6); // les 6 paramètres Tab_Grandeur_Vecteur gr_vec_para(tens,1); // def d'un type quelconque représentatif TypeQuelconque typQ(PARA_ORTHO,EPS11,gr_vec_para); @@ -1635,7 +1635,14 @@ void Projection_anisotrope_3D::Ecriture_base_info_loi(ofstream& sort,const int c }; // calcul d'un module d'young équivalent à la loi pour un chargement nul double Projection_anisotrope_3D::Module_young_equivalent(Enum_dure temps,const Deformation & def,SaveResul * ) - { /*if (!thermo_dependant) + { cout << "\n *** methode non encore implante " + << " Projection_anisotrope_3D::Module_young_equivalent(Enum_dure temps,const Deformation & def,SaveResul * ) " + << endl; + Sortie(1); + return 0.; // taire le compilo + + + /*if (!thermo_dependant) { return E;} else { temperature_tdt = def.DonneeInterpoleeScalaire(TEMP,temps); @@ -1650,6 +1657,7 @@ double Projection_anisotrope_3D::Module_compressibilite_equivalent(Enum_dure tem << " pour l'instant le calcul du module de compressibilite equivalent n'est pas possible " << "\n Projection_anisotrope_3D::Module_compressibilite_equivalent(... " << flush; Sortie(1); + return 0.; } else { // récup du conteneur spécifique @@ -1679,9 +1687,7 @@ void Projection_anisotrope_3D::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& Dep }; #endif - bool affichage = ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 3) - ); + bool affichage = (Permet_affichage() > 3); #ifdef MISE_AU_POINT if (affichage) {cout << "\n --- loi Projection_anisotrope_3D Calcul_SigmaHH --- "; @@ -1756,7 +1762,7 @@ void Projection_anisotrope_3D::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& Dep Sortie(1); }; #endif - BaseB& O_B = (*save_resul.O_B); // pour simplifier +// BaseB& O_B = (*save_resul.O_B); // pour simplifier for (int a=1; a<4;a++) { // tout d'abord la base non normalisée CoordonneeB& Op_B_a = Op_B.CoordoB(a); @@ -1920,7 +1926,7 @@ void Projection_anisotrope_3D::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& Dep }; // passage dans la bonne variance - Tenseur3BH sigBH(gijBB * sigHH ); + Tenseur3BH sigBH = gijBB * sigHH ; double trace_sig = sigBH.Trace(); switch (cas_calcul) @@ -2054,9 +2060,7 @@ void Projection_anisotrope_3D::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& Dep }; #endif - bool affichage = ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 3) - ); + bool affichage = (Permet_affichage() > 3); #ifdef MISE_AU_POINT if (affichage) {cout << "\n --- loi Projection_anisotrope_3D Calcul_DsigmaHH_tdt --- "; @@ -2069,7 +2073,7 @@ void Projection_anisotrope_3D::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& Dep const Tenseur3BB & gijBB = *((Tenseur3BB*) &gijBB_tdt); // " " " " Tenseur3BH epsBH = epsBB * gijHH; // deformation en mixte - Tenseur3HH epsHH(gijHH * epsBH); // en deuxfois contra + Tenseur3HH epsHH = gijHH * epsBH; // en deuxfois contra int dim_tens = sigHH_tdt.Dimension(); // ici 3, mais on laisse le cas général TenseurHH* zeroHH = (NevezTenseurHH(dim_tens,0.)); @@ -2145,7 +2149,7 @@ void Projection_anisotrope_3D::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& Dep Sortie(1); }; #endif - BaseB& O_B = (*save_resul.O_B); // pour simplifier +// BaseB& O_B = (*save_resul.O_B); // pour simplifier for (int a=1; a<4;a++) { // tout d'abord la base non normalisée CoordonneeB& Op_B_a = Op_B.CoordoB(a); @@ -2208,7 +2212,7 @@ void Projection_anisotrope_3D::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& Dep Tenseur3HH toto(eps_p_HH); toto.ChBase(beta_transpose); cout << "\n retour dans la base g^i de eps^{ij} :";toto.Ecriture(cout); - Tenseur3BB titi(gijBB * toto * gijBB); + Tenseur3BB titi = gijBB * toto * gijBB; cout << "\n def eps_ij :";titi.Ecriture(cout); }; #endif @@ -2409,7 +2413,7 @@ void Projection_anisotrope_3D::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& Dep }; // passage dans la bonne variance - Tenseur3BH sigBH(gijBB * sigHH ); + Tenseur3BH sigBH = gijBB * sigHH ; double trace_sig = sigBH.Trace(); switch (cas_calcul) { case 0: // calcul normal (tous les termes) @@ -2534,12 +2538,12 @@ void Projection_anisotrope_3D::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& Dep Tenseur3HH & dsigHH = *((Tenseur3HH*) (d_sigHH(i))); // passage en dim 3 const Tenseur3HH & dgijHH = *((Tenseur3HH*)(d_gijHH_tdt(i))) ; // pour simplifier l'ecriture const Tenseur3BB & dgijBB = *((Tenseur3BB*)(d_gijBB_tdt(i))) ; // pour simplifier l'ecriture - const Tenseur3BB & depsBB = *((Tenseur3BB *) (d_epsBB(i))); // " +// const Tenseur3BB & depsBB = *((Tenseur3BB *) (d_epsBB(i))); // " Tenseur3HH & dsig_ref_HH = *((Tenseur3HH*) (d_sigRef_HH(i))); // passage en dim 3 //Tableau * d_giB_tdt - BaseB & d_giB = (*ex.d_giB_tdt)(i); - BaseH & d_giH = (*ex.d_giH_tdt)(i); +// BaseB & d_giB = (*ex.d_giB_tdt)(i); +// BaseH & d_giH = (*ex.d_giH_tdt)(i); // on calcul la variation de matrice de passage de la base g_i vers la base O'_a @@ -2663,9 +2667,7 @@ void Projection_anisotrope_3D::Calcul_dsigma_deps Sortie(1); }; #endif - bool affichage = ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 3) - ); + bool affichage = (Permet_affichage() > 3); #ifdef MISE_AU_POINT if (affichage) {cout << "\n --- loi de comportement Projection anisotrope 3D Calcul_dsigma_deps --- "; @@ -2679,9 +2681,9 @@ void Projection_anisotrope_3D::Calcul_dsigma_deps Tenseur3HHHH& d_sigma_deps = *((Tenseur3HHHH*) &d_sigma_deps_); Tenseur3BH epsBH = epsBB * gijHH; // deformation en mixte - Tenseur3HH epsHH(gijHH * epsBH); // en deuxfois contra + Tenseur3HH epsHH = gijHH * epsBH; // en deuxfois contra - int dim_tens = sigHH_tdt.Dimension(); // ici 3, mais on laisse le cas général +// int dim_tens = sigHH_tdt.Dimension(); // ici 3, mais on laisse le cas général // TenseurHH* zeroHH = (NevezTenseurHH(dim_tens,0.)); // récup du conteneur spécifique @@ -2754,7 +2756,7 @@ void Projection_anisotrope_3D::Calcul_dsigma_deps Sortie(1); }; #endif - BaseB& O_B = (*save_resul.O_B); // pour simplifier +// BaseB& O_B = (*save_resul.O_B); // pour simplifier for (int a=1; a<4;a++) { // tout d'abord la base non normalisée CoordonneeB& Op_B_a = Op_B.CoordoB(a); @@ -2999,7 +3001,7 @@ void Projection_anisotrope_3D::Calcul_dsigma_deps }; // passage dans la variance mixte - Tenseur3BH sigBH(gijBB * sigHH ); + Tenseur3BH sigBH = gijBB * sigHH ; double trace_sig = sigBH.Trace(); switch (cas_calcul) { case 0: // calcul normal (tous les termes) @@ -3132,7 +3134,7 @@ void Projection_anisotrope_3D::Calcul_dsigma_deps if (type_transport == 0) // transport de type contravariant { // on calcule les coordonnées de la base O' dans la base naturelle - BaseH& O_H = (*save_resul.O_H); // pour simplifier + // BaseH& O_H = (*save_resul.O_H); // pour simplifier for (int a=1;a<4;a++) {// calcul de la norme du vecteur O'_a CoordonneeH alpha_H_a = alpha_H(a); @@ -3399,9 +3401,7 @@ void Projection_anisotrope_3D::Calcul_dsigma_deps }; }; #ifdef MISE_AU_POINT - if (((ParaGlob::NiveauImpression() > 8) && (Permet_affichage() == 0)) - || (Permet_affichage() > 7) - ) + if (Permet_affichage() > 7) { cout << "\n init temperatures:\n " << " loi_ili->temperature_0= " << loi_ili->temperature_0 << " loi_ili->temperature_t= " << loi_ili->temperature_t diff --git a/comportement/anisotropie/Projection_anisotrope_3D.h b/comportement/anisotropie/Projection_anisotrope_3D.h index 79e501d..6baccba 100755 --- a/comportement/anisotropie/Projection_anisotrope_3D.h +++ b/comportement/anisotropie/Projection_anisotrope_3D.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/hysteresis/Hysteresis1D.cc b/comportement/hysteresis/Hysteresis1D.cc index a3fe249..c401f5a 100644 --- a/comportement/hysteresis/Hysteresis1D.cc +++ b/comportement/hysteresis/Hysteresis1D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -824,7 +824,7 @@ Hysteresis1D::~Hysteresis1D () else if(nom != "fin_parametres_reglage_Hysteresis_") { cout << "\n erreur en lecture d'un parametre, le mot cle est inconnu " << " on a lu : " << nom << endl; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 3)) + if (Permet_affichage() > 3) cout << "\n Hysteresis3D::LectureDonneesParticulieres(UtilLecture * entreePrinc) " << endl ; throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie(1); diff --git a/comportement/hysteresis/Hysteresis1D.h b/comportement/hysteresis/Hysteresis1D.h index e873012..ffadc36 100644 --- a/comportement/hysteresis/Hysteresis1D.h +++ b/comportement/hysteresis/Hysteresis1D.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -149,7 +149,7 @@ class Hysteresis1D : public Loi_comp_abstraite // completer est appelé apres sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor - ,const Loi_comp_abstraite* loi) {}; + ,const Loi_comp_abstraite* loi) {return NULL;}; // ---- méthodes spécifiques // initialise les informations de travail concernant le pas de temps en cours diff --git a/comportement/hysteresis/Hysteresis1D_2.cc b/comportement/hysteresis/Hysteresis1D_2.cc index 20a089f..a6484d2 100644 --- a/comportement/hysteresis/Hysteresis1D_2.cc +++ b/comportement/hysteresis/Hysteresis1D_2.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -177,7 +177,7 @@ void Hysteresis1D::CalculContrainte_tdt(Tableau& indicateurs_resolution) int erreur=0; //init d'une erreur de calcul de Sigma_point Sigma_point(tdeb,sig_initiale,dersig_initiale,erreur); if (erreur) // cas où le calcul de la dérivée initiale n'est pas possible, on ne peut pas aller plus loin - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 0)) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) cout << "\n erreur dans l'algo de la resolution du schema constitutif" << " au niveau du calcul de la derivee initiale " << "\n Hysteresis1D::CalculContrainte_tdt() (..." << endl; @@ -211,14 +211,14 @@ void Hysteresis1D::CalculContrainte_tdt(Tableau& indicateurs_resolution) ,tdeb,deltat,sig_finale,estime_erreur); if (estime_erreur(1) >= ConstMath::tresgrand) { // là on ne peur rien faire - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 0)) || (Permet_affichage() > 0)) + if (Permet_affichage() > 0) cout << "\n erreur fatale dans l'algo de la resolution du schema constitutif" << " au niveau de l'appel directe de calcul de alg_edp.Runge_Kutta_step45 " << "\n Hysteresis1D::CalculContrainte_tdt() (..." << endl; // on génère une exception throw ErrNonConvergence_loiDeComportement();break; } - else if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 4)) || (Permet_affichage() > 4)) + else if (Permet_affichage() > 4) {cout << "\n erreur dans la resolution de l'equation constitutive avec Runge Kutta" << " indication de retour = " << conver << "appel direct de kutta45-> erreur estimee= " << estime_erreur(1) diff --git a/comportement/hysteresis/Hysteresis3D.cc b/comportement/hysteresis/Hysteresis3D.cc index bc740c7..f01f329 100644 --- a/comportement/hysteresis/Hysteresis3D.cc +++ b/comportement/hysteresis/Hysteresis3D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -2520,7 +2520,7 @@ bool Hysteresis3D::Coincidence(bool bascule_fct_aide,double& unSur_wBaseCarre // aa doit être sup à 0, si ce n'est pas le cas du à des arrondis ou des pb de transport on le met à 0 if (aa < ConstMath::pasmalpetit) { aa = 0.; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 0)) + if (Permet_affichage() > 0) cout << "\n warning algo coincidence, dans la recherche des racines de l'equa 2 degre " << " on a sig_tdt : sig_tdt qui est negatif !! = " << aa <<" on le met a 0 mais ce n'est pas normal " << "\n Hysteresis3D::Coincidence(... "; @@ -2571,7 +2571,7 @@ bool Hysteresis3D::Coincidence(bool bascule_fct_aide,double& unSur_wBaseCarre { bon_calcul = true;} #ifdef MISE_AU_POINT else // sinon cela signifie que la méthode n'est pas bonne - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) cout << "\n warning algo coincidence, dans la recherche des racines de l'equa 2 degre " << " la seconde racine " << racine2 <<" est superieur a 1" << "\n Hysteresis3D::Coincidence(... "; @@ -2583,7 +2583,7 @@ bool Hysteresis3D::Coincidence(bool bascule_fct_aide,double& unSur_wBaseCarre #ifdef MISE_AU_POINT // normalement aa >=0 donc avec cc <0 on ne doit pas avoir 2 racines du même signe if(!aucun_pt_inversion) // sauf dans le cas de la première charge - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) cout << "\n erreur algo coincidence, dans la recherche des racines de l'equa 2 degre " << " les deux racines sont du meme signe ??, a= " < 1.)) - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) cout << "\n erreur algo coincidence, dans la recherche de racine2 simplifiee" << "\n racine2= " << racine2 << " delta_r2= " << delta_r2 << " delta_r1= " << delta_r1 << " Q_OiaR= " << Q_OiaR << " -> divergence ! " @@ -2675,7 +2675,7 @@ bool Hysteresis3D::Coincidence(bool bascule_fct_aide,double& unSur_wBaseCarre // coïncidence, on va donc vérifier que "racine2" est correcte double nouveau_rayon_tdt = sqrt((sigma_i_barre_BH - oc_BH_R).II()); // Q_OiaR if ((Abs(nouveau_rayon_tdt - Q_OiaR) > tol_coincidence_reelle) ) - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 4)) || (Permet_affichage() > 4)) + if (Permet_affichage() > 4) { cout << "\n erreur2 algo coincidence, dans la recherche de racine2 " << "\n racine2= " << racine2 << " nouveau_rayon_tdt= " << nouveau_rayon_tdt << " Q_OiaR= " << Q_OiaR << " -> divergence ! " @@ -3171,7 +3171,7 @@ int Hysteresis3D::CentreCercle(Tenseur3BH& sig0i_BH,const Tenseur3BH& oc_BH_R // message d'info au cas où if (retour) - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) { double cosalpha = (delta_sigma_barre_BH_OiaR && delta_sigma_barre_BH_Rat) /sqrt((delta_sigma_barre_BH_OiaR.II()*delta_sigma_barre_BH_Rat.II())); @@ -3215,11 +3215,11 @@ void Hysteresis3D::Gestion_pointeur_coincidence(double& unSur_wBaseCarre if (!pt_sur_principal) { if (iatens != save_resul.sigma_barre_BH_R_t_a_tdt.begin()) - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 0 )) + { if (Permet_affichage() > 0) cout << "\n incoherence, on devrait avoir ici le premier element de la liste secondaire" << " des sig d'inversion" << "\n Hysteresis3D::Gestion_pointeur_coïncidence(..."<< endl; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 4)) || (Permet_affichage() > 4)) + if (Permet_affichage() > 4) Affiche_debug(unSur_wBaseCarre,save_resul,iatens,iadef_equi,pt_sur_principal ,iaOi,oi_sur_principal,iatens_princ,iadef_equi_princ,iaOi_princ); // on génère une exception @@ -3263,10 +3263,10 @@ void Hysteresis3D::Gestion_pointeur_coincidence(double& unSur_wBaseCarre iatens_princ = iatens;iadef_equi_princ=iadef_equi;iafct_princ = iafct; } else // sinon il y a un pb car comme c'est une coïncidence il devrait rester un pointeur valide - {if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 0)) + {if (Permet_affichage() > 0) cout << "\n incoherence, il devrait rester un pointeur de valide sur la liste de pt de ref" << "\n Hysteresis3D::Gestion_pointeur_coincidence(..." << endl; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 4)) || (Permet_affichage() > 4)) + if (Permet_affichage() > 4) Affiche_debug(unSur_wBaseCarre,save_resul,iatens,iadef_equi,pt_sur_principal ,iaOi,oi_sur_principal,iatens_princ,iadef_equi_princ,iaOi_princ); // cout << "\n tapper quelque chose "; @@ -3280,10 +3280,10 @@ void Hysteresis3D::Gestion_pointeur_coincidence(double& unSur_wBaseCarre if (!oi_sur_principal) { if (iaOi != save_resul.oc_BH_t_a_tdt.begin()) - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) cout << "\n incoherence, on devrait avoir ici le premier element de la liste secondaire des centres" << "\n Hysteresis3D::Gestion_pointeur_coïncidence(..."<< endl; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 4)) || (Permet_affichage() > 4)) + if (Permet_affichage() > 4) Affiche_debug(unSur_wBaseCarre,save_resul,iatens,iadef_equi,pt_sur_principal ,iaOi,oi_sur_principal,iatens_princ,iadef_equi_princ,iaOi_princ); // on génère une exception diff --git a/comportement/hysteresis/Hysteresis3D.h b/comportement/hysteresis/Hysteresis3D.h index 63ca158..a810ff9 100644 --- a/comportement/hysteresis/Hysteresis3D.h +++ b/comportement/hysteresis/Hysteresis3D.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -139,7 +139,7 @@ class Hysteresis3D : public Loi_comp_abstraite // completer est appelé apres sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor - ,const Loi_comp_abstraite* loi) {}; + ,const Loi_comp_abstraite* loi) {return NULL;}; // ---- méthodes spécifiques // initialise les informations de travail concernant le pas de temps en cours diff --git a/comportement/hysteresis/Hysteresis3D_2.cc b/comportement/hysteresis/Hysteresis3D_2.cc index e3f8a4e..0611f17 100644 --- a/comportement/hysteresis/Hysteresis3D_2.cc +++ b/comportement/hysteresis/Hysteresis3D_2.cc @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -300,10 +300,10 @@ Vecteur& Hysteresis3D::Residu_constitutif (const double & alpha,const Vecteur & // if ((phidt < 0) && force_phi_zero_si_negatif) // -- modif 16 juin 2012 -- if (phidt < 0) // -- modif 9 fev 2015 -- - {if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 8)) || (Permet_affichage() > 8) ) + {if (Permet_affichage() > 8) cout << "\n phidt= " << phidt << "\n Hysteresis3D::Residu_constitutif(..." << endl; if ( Dabs(phidt) < force_phi_zero_si_negatif) // -- modif 9 fev 2015 -- - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (Permet_affichage() > 5) ) + { if (Permet_affichage() > 5) { cout << "\n attention on utilise une valeur de phi negative dans pour le calcul de l'equation constitutive " << " phidt= " << phidt; if (Ptintmeca_en_cours() != NULL) Ptintmeca_en_cours()->Signature(); @@ -403,10 +403,10 @@ Mat_abstraite& Hysteresis3D::Mat_tangente_constitutif // if ((phidt < 0) && force_phi_zero_si_negatif) // -- modif 16 juin 2012 -- if (phidt < 0) // -- modif 9 fev 2015 -- - {if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 8)) || (Permet_affichage() > 8) ) + {if (Permet_affichage() > 8) cout << "\n phidt= " << phidt << "\n Hysteresis3D::Mat_tangente_constitutif(..." << endl; if ( Dabs(phidt) < force_phi_zero_si_negatif) // -- modif 9 fev 2015 -- - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (Permet_affichage() > 5)) + { if (Permet_affichage() > 5) { cout << "\n attention on utilise une valeur de phi negative dans pour le calcul de l'equation constitutive " << " phidt= " << phidt; if (Ptintmeca_en_cours() != NULL) Ptintmeca_en_cours()->Signature(); @@ -980,7 +980,7 @@ void Hysteresis3D::Avancement_temporel(const Tenseur3BB & delta_epsBB,const Tens // et donc doit être inférieur au maxi) if (!aucun_pt_inversion) // si on a déjà des pt d'inversion, on vérifie les niveaux de la fonction d'aide if (W_a > *iafct) - {if ( (ParaGlob::NiveauImpression() > 5) || (Permet_affichage() > 5)) + {if (Permet_affichage() > 5) {cout << "\n warning dans l'algorithme de gestion de la memoire discrete, " << " bien que l'on ait detecte un point d'inversion, il se trouve que la fonction d'aide " << " est superieur au dernier maxi, ce qui signifie que le calcul de l'integrale de la puissance " @@ -1484,7 +1484,7 @@ void Hysteresis3D::Avancement_temporel(const Tenseur3BB & delta_epsBB,const Tens if (nb_coin_inver > Abs(nb_maxInvCoinSurUnPas)) { // dans ce cas cela signifie qu'il y a pb et on arrête en générant éventuellement // une interruption d'erreur de convergence dans une loi de comportement - if (((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 3)) + if (Permet_affichage() > 3) {cout << "\n warning dans le calcul de la contrainte a t+dt, le nombre de coincidence et/ou" << " d'inversion (" << nb_coin_inver << ") est superieur a la limite fixee: = " << nb_maxInvCoinSurUnPas ; @@ -1503,7 +1503,7 @@ void Hysteresis3D::Avancement_temporel(const Tenseur3BB & delta_epsBB,const Tens // succession des rayons on contraire d'imposer l'inversion, qui conduira à un rayon incohérent (ce qui conduit // normalement tout de suite après à une coïncidence) force_fin_traitement = true; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 3)) + if (Permet_affichage() > 3) cout << " on est dans le cas d'aller-retour identiques !! on impose la coincidence " << endl; } else // on regarde s'il faut imposer la valeur finale obtenue ou générer une erreur @@ -1511,7 +1511,7 @@ void Hysteresis3D::Avancement_temporel(const Tenseur3BB & delta_epsBB,const Tens { throw ErrNonConvergence_loiDeComportement();break;} // envoie d'un signal a traiter en dehors else { force_fin_traitement = true; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 3)) + if (Permet_affichage() > 3) cout << " on impose la coincidence " << endl; }; // cas où on impose coûte que coûte (résultat pas sûr !!) }; @@ -1582,7 +1582,7 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic } catch ( ... ) //(ErrNonConvergence_Newton erreur) { double absracinemax=racine.Max_val_abs(); - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 0)) + if (Permet_affichage() > 0) {cout << "\n non convergence 2 sur l'algo de la resolution du schema constitutif" << " abs_racine_max " << absracinemax; if (Ptintmeca_en_cours() != NULL) Ptintmeca_en_cours()->Signature(); @@ -1605,7 +1605,7 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic // if (!conver) double absracinemax=racine.Max_val_abs(); if ((!conver) || (!isfinite(absracinemax)) || (isnan(absracinemax)) ) - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) {cout << "\n non convergence sur l'algo de la resolution du schema constitutif" << " abs_racine_max " << absracinemax; if (Ptintmeca_en_cours() != NULL) Ptintmeca_en_cours()->Signature(); @@ -1619,14 +1619,12 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic delta_sigma_barre_tdt_BH.Coor(Tenseur3BH::idx_i(ig),Tenseur3BH::idx_j(ig))=racine(ig); sigma_t_barre_tdt = sigma_i_barre_BH + delta_sigma_barre_tdt_BH; -//---- debug - if ((ParaGlob::NiveauImpression() > 5)|| (Permet_affichage() > 5)) + if (Permet_affichage() > 5) // on vérifie que l'amplitude de la contrainte transmise, n'est pas supérieure à la saturation { double sigma_tau_II = sigma_tauBH.II(); if ( sigma_tau_II > Qzero*Qzero) cout << "\n sigma_tau_II= "<< sigma_tau_II << " Hysteresis3D::CalculContrainte_tdt" << endl; }; -//---- fin debug // ici il n'est pas nécessaire de calculer QdeltaSigmaRatdt, et wprime,wprime_point // car ces grandeurs sont calculées à l'intérieur de la boucle de Newton, et @@ -1638,7 +1636,7 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic // on vérifie que l'amplitude de la contrainte calculée {double QdeltaSigma = sqrt(delta_sigma_barre_R_a_tauBH.II()); if ( QdeltaSigma > (Qzero*depassement_Q0*wBase)) - {if ((ParaGlob::NiveauImpression() > 3)|| (Permet_affichage() > 0)) + {if (Permet_affichage() > 0) {cout << "\n erreur10 fatale dans l'algo de la resolution du schema constitutif" << " concernant le niveau de saturation de la contrainte " << "\n QdeltaSigma =" << QdeltaSigma << " au lieu de "<< (Qzero*depassement_Q0*wBase); @@ -1668,7 +1666,7 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic //// --- fin debug --- if (erreur) // cas où le calcul de la dérivée initiale n'est pas possible, on ne peut pas aller plus loin - { if ((ParaGlob::NiveauImpression() > 3)|| (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) {cout << "\n erreur0 fatale dans l'algo de la resolution du schema constitutif" << " au niveau du calcul de la derivee initiale " << "\n QdeltaSigma =" << sqrt(delta_sigma_barre_R_a_tauBH.II()) @@ -1695,13 +1693,10 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic indicateurs_resolution(5)+=erreur_maxi_global; }; // gestion de l'erreur de retour -// if ((conver != 2) || (sig_finale.Max_val_abs() > ConstMath::tresgrand)) -// --- debug piloté --- - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << "\n Hysteresis3D::CalculContrainte_tdt " << "nombreAppelF= " << nombreAppelF << " nb_step= " << nb_step << " erreur_maxi_global= " << erreur_maxi_global << endl; -// --- fin debug piloté--- double abssigmax=sig_finale.Max_val_abs(); if ((conver != 2) || (!isfinite(abssigmax)) || (isnan(abssigmax)) ) @@ -1732,7 +1727,7 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic // pour t+dt donc pas de pb delta_sigma_barre_BH_Ratdt = sigma_t_barre_tdt - sigma_barre_BH_R; passage_par_newton = true; // on indique donc que l'on est passé par du newton - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 3)) + if (Permet_affichage() > 3) { cout << "\n probleme dans la resolution de l'equation constitutive avec Runge Kutta"; if (Ptintmeca_en_cours() != NULL) Ptintmeca_en_cours()->Signature(); cout << flush; if (conver != 2) @@ -1741,11 +1736,11 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic cout << " abssigmax n'est pas fini = " << abssigmax ; if (isnan(abssigmax)) cout << " abssigmax = nan = " << abssigmax ; - if (Permet_affichage() > 2) + if (Permet_affichage() > 3) { cout << "\n abs_racine_max " << absracinemax;} if (Permet_affichage() > 4) {cout << " (2) utilisation avec succes de la linearisation ";}; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << "\n Hysteresis3D::CalculContrainte_tdt (..."<& indic if (Ptintmeca_en_cours() != NULL) Ptintmeca_en_cours()->Signature(); Sortie(1); }; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 3)) + if (Permet_affichage() > 3) {cout << "\n probleme dans la resolution de l'equation constitutive avec Runge Kutta"; alg_edp.Affiche_Explication_erreur_RG(conver); cout << ", appel direct de kutta-> erreur estimee= " << estime_erreur(1) @@ -1833,7 +1828,7 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic // on vérifie que l'amplitude de la contrainte calculée {double QdeltaSigma = sqrt(delta_sigma_barre_R_a_tauBH.II()); if ( QdeltaSigma > (Qzero*depassement_Q0*wBase)) - {if ((ParaGlob::NiveauImpression() > 3)|| (Permet_affichage() > 0)) + {if (Permet_affichage() > 0) {cout << "\n erreur11 fatale dans l'algo de la resolution du schema constitutif" << " concernant le niveau de saturation de la contrainte " << "\n QdeltaSigma =" << QdeltaSigma << " au lieu de "<< (Qzero*depassement_Q0*wBase) @@ -1858,7 +1853,7 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic // calcul de la dérivée initiale Sigma_point(tdeb,sig_initiale,dersig_initiale,erreur); if (erreur) // cas où le calcul de la dérivée initiale n'est pas possible, on ne peut pas aller plus loin - { if ((ParaGlob::NiveauImpression() > 3)|| (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) {cout << "\n erreur1 fatale dans l'algo de la resolution du schema constitutif" << " au niveau du calcul de la derivee initiale " << "\n QdeltaSigma =" << sqrt(delta_sigma_barre_R_a_tauBH.II()) << " au lieu de "<< Qzero @@ -1884,17 +1879,14 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic {indicateurs_resolution(3)+=nombreAppelF;indicateurs_resolution(4)+=nb_step; indicateurs_resolution(5)+=erreur_maxi_global; }; -// --- debug piloté --- - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << "\n Hysteresis3D::CalculContrainte_tdt " << "nombreAppelF= " << nombreAppelF << " nb_step= " << nb_step << " erreur_maxi_global= " << erreur_maxi_global << endl; -// --- fin debug piloté--- // gestion de l'erreur de retour -// if ((conver != 2) || (sig_finale.Max_val_abs() > ConstMath::tresgrand)) double abssigmax=sig_finale.Max_val_abs(); if ((conver != 2) || (!isfinite(abssigmax)) || (isnan(abssigmax)) ) - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) {cout << "\n non convergence sur l'algo de la resolution du schema constitutif" << "\n Hysteresis3D::CalculContrainte_tdt(.." ; if (Ptintmeca_en_cours() != NULL) Ptintmeca_en_cours()->Signature();cout << flush; @@ -1915,7 +1907,7 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic //modif : 11 juin 2014 // on vérifie que l'amplitude de la contrainte calculée {if ( QdeltaSigmaRatdt > (Qzero*depassement_Q0*wBase)) - {if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 0)) + {if (Permet_affichage() > 0) {cout << "\n erreur12 fatale dans l'algo de la resolution du schema constitutif" << " concernant le niveau de saturation de la contrainte " << "\n QdeltaSigma =" << QdeltaSigmaRatdt << " au lieu de "<< (Qzero*depassement_Q0*wBase) @@ -1938,7 +1930,7 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic int erreur=0; //init d'une erreur de calcul de Sigma_point Sigma_point(tdeb,sig_initiale,dersig_initiale,erreur); if (erreur) // cas où le calcul de la dérivée initiale n'est pas possible, on ne peut pas aller plus loin - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) {cout << "\n erreur2 fatale dans l'algo de la resolution du schema constitutif" << " au niveau du calcul de la derivee initiale " << "\n QdeltaSigma =" << sqrt(delta_sigma_barre_R_a_tauBH.II()) << " au lieu de "<< (Qzero*depassement_Q0*wBase) @@ -1963,16 +1955,13 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic {indicateurs_resolution(3)+=nombreAppelF;indicateurs_resolution(4)+=nb_step; indicateurs_resolution(5)+=erreur_maxi_global; }; -// --- debug piloté --- - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) {cout << "\n Hysteresis3D::CalculContrainte_tdt " << "nombreAppelF= " << nombreAppelF << " nb_step= " << nb_step << " erreur_maxi_global= " << erreur_maxi_global; if (Ptintmeca_en_cours() != NULL) Ptintmeca_en_cours()->Signature(); cout << flush; }; -// --- fin debug piloté--- // gestion de l'erreur de retour -// if ((conver != 2) || (sig_finale.Max_val_abs() > ConstMath::tresgrand)) double abssigmax=sig_finale.Max_val_abs(); if ((conver != 2) || (!isfinite(abssigmax)) || (isnan(abssigmax)) ) {// dans le cas où le Runge ne marche pas on essaie avec la première méthode @@ -2001,7 +1990,7 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic // pour t+dt donc pas de pb delta_sigma_barre_BH_Ratdt = sigma_t_barre_tdt - sigma_barre_BH_R; passage_par_newton = true; // on indique donc que l'on est passé par du newton - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 2)) || (Permet_affichage() > 2)) + if (Permet_affichage() > 3) { if (Permet_affichage() > 4) {cout << " -> probleme dans la resolution de l'equation constitutive avec Runge Kutta"; alg_edp.Affiche_Explication_erreur_RG(conver); @@ -2009,7 +1998,7 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic cout << "\n abs_racine_max " << absracinemax; if (Ptintmeca_en_cours() != NULL) Ptintmeca_en_cours()->Signature();cout << flush; }; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << "\n Hysteresis3D::CalculContrainte_tdt (..."<& indic break; } else - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 2)) || (Permet_affichage() > 2)) + { if (Permet_affichage() > 3) {cout << "\n non convergence sur l'algo de la resolution du schema constitutif" << " abs_racine_max " << absracinemax << " conver= " << conver << " abssigmax= " << abssigmax; if (Ptintmeca_en_cours() != NULL) Ptintmeca_en_cours()->Signature();cout << flush; }; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) || (Permet_affichage() > 7)) + if (Permet_affichage() > 7) cout << "\n Hysteresis3D::CalculContrainte_tdt(.." << endl; // on génère une exception throw ErrNonConvergence_loiDeComportement();break; @@ -2045,7 +2034,7 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic // on vérifie que l'amplitude de la contrainte calculée {double QdeltaSigma = sqrt(delta_sigma_barre_R_a_tauBH.II()); if ( QdeltaSigma > (Qzero*depassement_Q0*wBase)) - {if ((ParaGlob::NiveauImpression() > 3)|| (Permet_affichage() > 0)) + {if (Permet_affichage() > 0) {cout << "\n erreur13 fatale dans l'algo de la resolution du schema constitutif" << " concernant le niveau de saturation de la contrainte " << "\n QdeltaSigma =" << QdeltaSigma << " au lieu de "<< (Qzero*depassement_Q0*wBase) @@ -2069,7 +2058,7 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic int erreur=0; //init d'une erreur de calcul de Sigma_point Sigma_point(tdeb,sig_initiale,dersig_initiale,erreur); if (erreur) // cas où le calcul de la dérivée initiale n'est pas possible, on ne peut pas aller plus loin - { if ((ParaGlob::NiveauImpression() > 3)|| (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) {cout << "\n erreur3 fatale dans l'algo de la resolution du schema constitutif" << " au niveau du calcul de la derivee initiale " << "\n QdeltaSigma =" << sqrt(delta_sigma_barre_R_a_tauBH.II()) << " au lieu de " @@ -2095,14 +2084,11 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic {indicateurs_resolution(3)+=nombreAppelF;indicateurs_resolution(4)+=nb_step; indicateurs_resolution(5)+=erreur_maxi_global; }; -// --- debug piloté --- - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << "\n Hysteresis3D::CalculContrainte_tdt " << "nombreAppelF= " << nombreAppelF << " nb_step= " << nb_step << " erreur_maxi_global= " << erreur_maxi_global << endl; -// --- fin debug piloté--- // gestion de l'erreur de retour -// if ((conver != 2) || (sig_finale.Max_val_abs() > ConstMath::tresgrand)) double abssigmax=sig_finale.Max_val_abs(); if ((conver != 2) || (!isfinite(abssigmax)) || (isnan(abssigmax)) ) {// dans le cas où le Runge ne marche pas on essaie avec la première méthode @@ -2133,7 +2119,7 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic // pour t+dt donc pas de pb delta_sigma_barre_BH_Ratdt = sigma_t_barre_tdt - sigma_barre_BH_R; passage_par_newton = true; // on indique donc que l'on est passé par du newton - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 2)) || (Permet_affichage() > 2)) + if (Permet_affichage() > 3) { cout << "\n estime_erreur= " << estime_erreur(1); if (Ptintmeca_en_cours() != NULL) Ptintmeca_en_cours()->Signature();cout << flush; if (Permet_affichage() > 4) @@ -2141,7 +2127,7 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic alg_edp.Affiche_Explication_erreur_RG(conver); cout << ", (3) utilisation avec succes de la linearisation "; }; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << "\n Hysteresis3D::CalculContrainte_tdt (..."<& indic int erreur=0; //init d'une erreur de calcul de Sigma_point Sigma_point(tdeb,sig_initiale,dersig_initiale,erreur); if (erreur) // cas où le calcul de la dérivée initiale n'est pas possible, on ne peut pas aller plus loin - { if ((ParaGlob::NiveauImpression() > 3)|| (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) {cout << "\n erreur4 fatale dans l'algo de la resolution du schema constitutif" << " au niveau du calcul de la derivee initiale " << "\n QdeltaSigma =" << sqrt(delta_sigma_barre_R_a_tauBH.II()) << " au lieu de "<< Qzero @@ -2198,14 +2184,12 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic {indicateurs_resolution(3)+=nombreAppelF;indicateurs_resolution(4)+=nb_step; indicateurs_resolution(5)+=erreur_maxi_global; }; -// --- debug piloté --- - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << "\n Hysteresis3D::CalculContrainte_tdt " << "nombreAppelF= " << nombreAppelF << " nb_step= " << nb_step << " erreur_maxi_global= " << erreur_maxi_global << endl; -// --- fin debug piloté--- if (nb_boucle > 10) // si en * par 10^10 on n'a pas réussi on arrête - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) {cout << "\n non convergence extreme !! sur l'algo de la resolution du schema constitutif" << "\n Hysteresis3D::CalculContrainte_tdt(.." ; if (Ptintmeca_en_cours() != NULL) Ptintmeca_en_cours()->Signature();cout << flush; @@ -2218,7 +2202,7 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic while ((conver_interne != 2) || (!isfinite(abssigmax)) || (isnan(abssigmax)) ); - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 3)) + if (Permet_affichage() > 3) {cout << "\n probleme dans la resolution de l'equation constitutive avec Runge Kutta"; if (Ptintmeca_en_cours() != NULL) Ptintmeca_en_cours()->Signature();cout << flush; alg_edp.Affiche_Explication_erreur_RG(conver); @@ -2244,7 +2228,7 @@ void Hysteresis3D::CalculContrainte_tdt(double & phi_2_dt,Tableau& indic // on vérifie que l'amplitude de la contrainte calculée {double QdeltaSigma = sqrt(delta_sigma_barre_R_a_tauBH.II()); if ( QdeltaSigma > (Qzero*depassement_Q0*wBase)) - {if ((ParaGlob::NiveauImpression() > 3)|| (Permet_affichage() > 0)) + {if (Permet_affichage() > 0) {cout << "\n erreur14 fatale dans l'algo de la resolution du schema constitutif" << " concernant le niveau de saturation de la contrainte " << "\n QdeltaSigma =" << QdeltaSigma << " au lieu de "<< (Qzero*depassement_Q0*wBase) @@ -2356,11 +2340,9 @@ Vecteur& Hysteresis3D::Sigma_point(const double & tau, const Vecteur & sigma_tau // dépasser le Qzero, localement, mais ce sera invalidé ensuite avec l'algo de coincidence if ( QdeltaSigma > (Qzero*depassement_Q0*wBase)) {erreur = 1; - //--- pour le debug - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << "\n QdeltaSigma =" << QdeltaSigma << " au lieu de "<< (Qzero*depassement_Q0*wBase) << " Hysteresis3D::Sigma_point " << endl ; - //--- fin debug } else // sinon on continue { erreur = 0; @@ -2385,11 +2367,10 @@ Vecteur& Hysteresis3D::Sigma_point(const double & tau, const Vecteur & sigma_tau // -- calcul de phidt // if ((phitau < 0) && force_phi_zero_si_negatif) if (phitau < 0) // -- modif 9 fev 2015 -- - {if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 8)) || (Permet_affichage() > 8) ) + {if (Permet_affichage() > 8) cout << "\n phidt= " << phitau << "\n Hysteresis3D::Sigma_point(..." << endl; if ( Dabs(phitau) < force_phi_zero_si_negatif) // -- modif 9 fev 2015 -- - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (Permet_affichage() > 5)) - // if (MaX(ParaGlob::NiveauImpression(),Permet_affichage()) >= 5) + { if (Permet_affichage() > 5) { cout << "\n attention on utilise une valeur de phi negative dans pour le calcul de l'equation constitutive " << " phitau= " << phitau << "\n Hysteresis3D::Sigma_point(..." ; @@ -2480,7 +2461,7 @@ Vecteur& Hysteresis3D::Sigma_point(const double & tau, const Vecteur & sigma_tau if (deuxmuQdeltaeps > ConstMath::petit) if (QdeltaSigma > marge * deuxmuQdeltaeps) // normalement pb {sigma_pointBH *= marge*deuxmuQdeltaeps/QdeltaSigma; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (Permet_affichage() > 3)) + if (Permet_affichage() > 3) {cout << "\n limitation de sigma_point "; if (Ptintmeca_en_cours() != NULL) Ptintmeca_en_cours()->Signature();cout << flush; }; @@ -2533,11 +2514,9 @@ void Hysteresis3D::Verif_integrite_Sigma(const double & , const Vecteur & sigma_ // dépasser le Qzero, localement, mais ce sera invalidé ensuite avec l'algo de coincidence if ( QdeltaSigma > (Qzero*depassement_Q0*wBase)) {erreur = 1; - //--- pour le debug - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << "\n QdeltaSigma =" << QdeltaSigma << " au lieu de "<< (Qzero*depassement_Q0*wBase) - << " Hysteresis3D::Sigma_point " << endl ; - //--- fin debug + << " Hysteresis3D::Verif_integrite_Sigma " << endl ; } else // sinon on continue { erreur = 0; @@ -2625,11 +2604,9 @@ void Hysteresis3D::UpdateEnergieHyste(EnergieMeca & energ // on considère donc tau_C = 0 double delta_energie_elastique = - delta_ener_interne - unsurwprime * phi_2_dt ; double delta_energie_frotteurs = unsurwprime * ( phi_2_dt ); -//-----pour le debug - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) if (delta_energie_frotteurs < 0) cout << "\n (2) delta_energie_frotteurs= " << delta_energie_frotteurs << endl; -// ----- fin débug EnergieMeca delta_ener(delta_energie_elastique,delta_energie_frotteurs,0.); energ += delta_ener; }; diff --git a/comportement/hysteresis/Hysteresis3D_3.cc b/comportement/hysteresis/Hysteresis3D_3.cc index f281c61..aed2d0c 100644 --- a/comportement/hysteresis/Hysteresis3D_3.cc +++ b/comportement/hysteresis/Hysteresis3D_3.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/hysteresis/Hysteresis_bulk.cc b/comportement/hysteresis/Hysteresis_bulk.cc index a89644f..074162f 100755 --- a/comportement/hysteresis/Hysteresis_bulk.cc +++ b/comportement/hysteresis/Hysteresis_bulk.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -1356,9 +1356,7 @@ void Hysteresis_bulk::ListeGrandeurs_particulieres(bool absolue,List_io& listEnuQuelc) - { // def du conteneur de grandeurs quelconques, initialisée à 0 - Grandeur_scalaire_double grand_courant(0.); - // récup de la liste de stockage + { // récup de la liste de stockage list & listlocale = ListQuelc_mis_en_acces_localement(); // on parcours la liste des grandeurs à activer // et on remplit la liste locale diff --git a/comportement/hysteresis/Hysteresis_bulk.h b/comportement/hysteresis/Hysteresis_bulk.h index 2c6d8a2..a37ff00 100755 --- a/comportement/hysteresis/Hysteresis_bulk.h +++ b/comportement/hysteresis/Hysteresis_bulk.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -139,7 +139,7 @@ class Hysteresis_bulk : public Loi_comp_abstraite // completer est appelé apres sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor - ,const Loi_comp_abstraite* loi) {}; + ,const Loi_comp_abstraite* loi) {return NULL;}; // ---- méthodes spécifiques // initialise les informations de travail concernant le pas de temps en cours diff --git a/comportement/hysteresis/Hysteresis_bulk_2.cc b/comportement/hysteresis/Hysteresis_bulk_2.cc index 11a468c..bee95f5 100755 --- a/comportement/hysteresis/Hysteresis_bulk_2.cc +++ b/comportement/hysteresis/Hysteresis_bulk_2.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -65,7 +65,7 @@ Vecteur& Hysteresis_bulk::Pression_point(const double & tau, const Vecteur & pre if ( QdeltaPression > (Qzero*depassement_Q0*wprime)) {erreur = 1; //--- pour le debug - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (abs(Permet_affichage()) > 5)) + if (Permet_affichage() > 5) cout << "\n QdeltaPression =" << QdeltaPression << " au lieu de "<< (Qzero*depassement_Q0*wprime) << " Hysteresis_bulk::Pression_point( " << endl ; //--- fin debug @@ -121,7 +121,7 @@ void Hysteresis_bulk::Verif_integrite_Pression(const double & , const Vecteur & if ( QdeltaPression > (Qzero*depassement_Q0*wprime)) {erreur = 1; //--- pour le debug - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (abs(Permet_affichage()) > 5)) + if (Permet_affichage() > 5) cout << "\n QdeltaPression =" << QdeltaPression << " au lieu de "<< (Qzero*depassement_Q0*wprime) << " Hysteresis_bulk::Verif_integrite_Pression( " << endl ; //--- fin debug @@ -169,7 +169,7 @@ void Hysteresis_bulk::CalculPression_tdt(Tableau& indicateurs_resolution } catch ( ... ) //(ErrNonConvergence_Newton erreur) { double absracinemax=racine.Max_val_abs(); - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (abs(Permet_affichage()) > 0)) + if (Permet_affichage() > 0) {cout << "\n non convergence 2 sur l'algo de la resolution du schema constitutif" << " abs_racine_max " << absracinemax << "\n Hysteresis_bulk::CalculPression_tdt (..." << endl; @@ -183,7 +183,7 @@ void Hysteresis_bulk::CalculPression_tdt(Tableau& indicateurs_resolution if(sortie_post) // sauvegarde éventuelle des indicateurs {indicateurs_resolution(1)+=nb_incr_total;indicateurs_resolution(2)+=nb_iter_total;}; // --- debug piloté --- - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (abs(Permet_affichage()) > 5)) + if (Permet_affichage() > 5) cout << "\n Hysteresis_bulk::CalculContrainte_tdt " << "nombreIncre= " << nb_incr_total << " nb_iter_total= " << nb_iter_total << endl; // --- fin debug piloté--- @@ -200,7 +200,7 @@ void Hysteresis_bulk::CalculPression_tdt(Tableau& indicateurs_resolution // on vérifie l'amplitude de la pression calculée {double QdeltaPression = Abs(rdelta_MPr_Ratdt); // calcul de QdeltaPression if ( QdeltaPression > (Qzero*depassement_Q0*wprime)) - {if ((ParaGlob::NiveauImpression() > 3)|| (abs(Permet_affichage()) > 0)) + {if (Permet_affichage() > 0) cout << "\n erreur10 fatale dans l'algo de la resolution du schema constitutif (en sortie de Newton) " << " concernant le niveau de saturation de la pression " << "\n QdeltaPression =" << QdeltaPression << " au lieu de "<< (Qzero*depassement_Q0*wprime) @@ -220,7 +220,7 @@ void Hysteresis_bulk::CalculPression_tdt(Tableau& indicateurs_resolution // on vérifie également le niveau de la pression totale calculée {double AbsPression = Abs(MPr_t___tdt); if ( AbsPression > (Qzero*depassement_Q0)) - {if ((ParaGlob::NiveauImpression() > 3)|| (abs(Permet_affichage()) > 0)) + { if (Permet_affichage() > 0) cout << "\n erreur101 fatale dans l'algo de la resolution du schema constitutif (en sortie de Newton) " << " concernant le niveau de saturation de la pression " << "\n AbsPression =" << AbsPression << " au lieu de "<< (Qzero*depassement_Q0) @@ -273,7 +273,7 @@ void Hysteresis_bulk::CalculPression_tdt(Tableau& indicateurs_resolution indicateurs_resolution(5)+=erreur_maxi_global; }; // --- debug piloté --- - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (abs(Permet_affichage()) > 5)) + if (Permet_affichage() > 5) cout << "\n Hysteresis_bulk::CalculContrainte_tdt " << " pres_finale= "<< pres_finale(1) << " nombreAppelF= " << nombreAppelF << " nb_step= " << nb_step << " erreur_maxi_global= " @@ -297,7 +297,7 @@ void Hysteresis_bulk::CalculPression_tdt(Tableau& indicateurs_resolution // on génère une exception throw ErrNonConvergence_loiDeComportement();break; } - else if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (abs(Permet_affichage()) > 3)) + else if (Permet_affichage() > 3) {cout << "\n erreur dans la resolution de l'equation constitutive avec Runge Kutta" << " indication de retour = " << conver << "appel direct de kutta45-> erreur estimee= " << estime_erreur(1) @@ -329,7 +329,7 @@ void Hysteresis_bulk::CalculPression_tdt(Tableau& indicateurs_resolution // on vérifie l'amplitude de la pression calculée {double QdeltaPression = Abs(rdelta_MPr_Ratdt); // calcul de QdeltaPression if ( QdeltaPression > (Qzero*depassement_Q0*wprime)) - {if ((ParaGlob::NiveauImpression() > 3)|| (abs(Permet_affichage()) > 0)) + {if (Permet_affichage() > 0) cout << "\n erreur1005 fatale dans l'algo de la resolution du schema constitutif (en sortie de kutta) " << " concernant le niveau de saturation de la pression " << "\n QdeltaPression =" << QdeltaPression << " au lieu de "<< (Qzero*depassement_Q0*wprime) @@ -352,7 +352,7 @@ void Hysteresis_bulk::CalculPression_tdt(Tableau& indicateurs_resolution // d'un point sur une branche secondaire qui démarre près de la saturation {double AbsPression = Abs(MPr_t___tdt); if ( AbsPression > (Qzero*(1.+wprime)*depassement_Q0)) - {if ((ParaGlob::NiveauImpression() > 3)|| (abs(Permet_affichage()) > 0)) + {if (Permet_affichage() > 3) cout << "\n erreur1015 fatale dans l'algo de la resolution du schema constitutif (en sortie de kutta) " << " concernant le niveau de saturation de la pression (meme transitoirement avant coincidence) " << "\n AbsPression =" << AbsPression << " au lieu de "<< (Qzero*(1.+wprime)*depassement_Q0) @@ -391,7 +391,7 @@ void Hysteresis_bulk::CalculPression_tdt(Tableau& indicateurs_resolution } catch ( ... ) //(ErrNonConvergence_Newton erreur) { double absracinemax=racine.Max_val_abs(); - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (abs(Permet_affichage()) > 0)) + if (Permet_affichage() > 0) {cout << "\n non convergence 29 sur l'algo de la resolution du schema constitutif" << " abs_racine_max " << absracinemax << "\n Hysteresis_bulk::CalculPression_tdt (..." << endl; @@ -405,7 +405,7 @@ void Hysteresis_bulk::CalculPression_tdt(Tableau& indicateurs_resolution if(sortie_post) // sauvegarde éventuelle des indicateurs {indicateurs_resolution(1)+=nb_incr_total;indicateurs_resolution(2)+=nb_iter_total;}; // --- debug piloté --- - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) || (abs(Permet_affichage()) > 5)) + if (Permet_affichage() > 5) cout << "\n Hysteresis_bulk::CalculContrainte_tdt " << "nombreIncre= " << nb_incr_total << " nb_iter_total= " << nb_iter_total << endl; // --- fin debug piloté--- @@ -429,7 +429,7 @@ void Hysteresis_bulk::CalculPression_tdt(Tableau& indicateurs_resolution delta_MPr_tatdt = MPr_t___tdt - MPr_i___; - if ((ParaGlob::NiveauImpression() > 3)|| (abs(Permet_affichage()) > 0)) + if (Permet_affichage() > 0) cout << "\n ** warning dans l'algo de la resolution du schema constitutif (en sortie de Newton) " << " concernant le niveau de saturation de la pression " << "\n QdeltaPression =" << QdeltaPression << " au lieu de "<< (Qzero*depassement_Q0*wprime) @@ -450,7 +450,7 @@ void Hysteresis_bulk::CalculPression_tdt(Tableau& indicateurs_resolution { // dans ce cas on impose la saturation AbsPression = (Qzero*depassement_Q0); MPr_t___tdt = AbsPression * DSigne(MPr_t___tdt); - if ((ParaGlob::NiveauImpression() > 3)|| (abs(Permet_affichage()) > 0)) + if (Permet_affichage() > 0) cout << "\n ** warning dans l'algo de la resolution du schema constitutif (en sortie de Newton) " << " concernant le niveau de saturation de la pression " << "\n AbsPression =" << AbsPression << " au lieu de "<< (Qzero*depassement_Q0) @@ -689,7 +689,7 @@ bool Hysteresis_bulk::Coincidence(bool & aucun_pt_inversion,double& unSur_wprime { bon_calcul = true;} #ifdef MISE_AU_POINT else // sinon cela signifie que la méthode n'est pas bonne - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (abs(Permet_affichage()) > 0)) + { if (Permet_affichage() > 0) cout << "\n warning algo coincidence, dans la recherche des racines de l'equa 2 degre " << " la seconde racine " << racine2 << " est superieur a 1" << "\n Hysteresis_bulk::Coincidence(... "; @@ -701,7 +701,7 @@ bool Hysteresis_bulk::Coincidence(bool & aucun_pt_inversion,double& unSur_wprime #ifdef MISE_AU_POINT // normalement a >=0 donc avec c <0 on ne doit pas avoir 2 racines du même signe if(!premiere_charge) // sauf dans le cas de la première charge - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (abs(Permet_affichage()) > 0)) + { if (Permet_affichage() > 0) cout << "\n erreur algo coincidence, dans la recherche des racines de l'equa 2 degre " << " les deux racines sont du meme signe ??, a= " < 3)) || (abs(Permet_affichage()) > 0)) + if (Permet_affichage() > 0) {if ( (racine2 < 0.) || (racine2 > 1.)) { cout << "\n erreur algo coincidence, dans la recherche de racine2 a l'aide de la fonction de charge " << " W_ref= " <<*iafct<<" W_t= " << W_t << " delta_W_a= " << delta_W_a @@ -872,11 +872,11 @@ void Hysteresis_bulk::Gestion_pointeur_coincidence(double& unSur_wprimeCarre if (!pt_sur_principal) { if (iatens != save_resul.MPr_R_t_a_tdt.begin()) - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (abs(Permet_affichage()) > 0 )) + { if (Permet_affichage() > 0) cout << "\n incoherence, on devrait avoir ici le premier element de la liste secondaire" << " des Mpr d'inversion" << "\n Hysteresis_bulk::Gestion_pointeur_coïncidence(..."<< endl; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 4)) || (abs(Permet_affichage()) > 4)) + if (Permet_affichage() > 4) Affiche_debug(unSur_wprimeCarre,save_resul,iatens,pt_sur_principal ,iatens_princ); // on génère une exception @@ -915,7 +915,7 @@ void Hysteresis_bulk::Gestion_pointeur_coincidence(double& unSur_wprimeCarre save_resul.fct_aide_t_a_tdt.clear(); // plus clair } else // sinon là il y a un pb - {if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (abs(Permet_affichage()) > 3 )) + {if (Permet_affichage() > 3) cout << "\n warning il semble que l'on ait une inversion sur liste secondaire puis " << " coïncidence avec liste principale avec " << "\n Hysteresis_bulk::Gestion_pointeur_coïncidence(..." @@ -1069,7 +1069,7 @@ void Hysteresis_bulk::Gestion_pointeur_coincidence(double& unSur_wprimeCarre #endif W_a = *iafct; // on met la vrai valeur sans approx if (iatens == posi0) - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (abs(Permet_affichage()) > 0 )) + { if (Permet_affichage() > 0) cout << "\n warning: Hysteresis_bulk::Gestion_pointeur_coincidence(.." << " on cherche a appliquer deux depilages, alors qu'un seul n'est possible !! " << " peut-etre un probleme de precision de la coincidence (diminuer la tolerance ?) "; @@ -1102,10 +1102,10 @@ void Hysteresis_bulk::Gestion_pointeur_coincidence(double& unSur_wprimeCarre iatens_princ = iatens;iafct_princ = iafct; } else // sinon il y a un pb car comme c'est une coïncidence il devrait rester un pointeur valide - {if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (abs(Permet_affichage()) > 0)) + {if (Permet_affichage() > 0) cout << "\n incoherence, il devrait rester un pointeur de valide sur la liste de pt de ref" << "\n Hysteresis_bulk::Gestion_pointeur_coincidence(..." << endl; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 4)) || (abs(Permet_affichage()) > 4)) + if (Permet_affichage() > 4) Affiche_debug(unSur_wprimeCarre,save_resul,iatens,pt_sur_principal ,iatens_princ); // on génère une exception @@ -1172,11 +1172,11 @@ void Hysteresis_bulk::Gestion_pointeur_Inversion_et_Coincidence(double& unSur_wp if (!pt_sur_principal) { if (iatens != save_resul.MPr_R_t_a_tdt.begin()) - { if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (abs(Permet_affichage()) > 0 )) + { if (Permet_affichage() > 0) cout << "\n incoherence, on devrait avoir ici le premier element de la liste secondaire" << " des Mpr d'inversion" << "\n Hysteresis_bulk::Gestion_pointeur_Inversion_et_Coincidence(..."<< endl; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 4)) || (abs(Permet_affichage()) > 4)) + if (Permet_affichage() > 4) Affiche_debug(unSur_wprimeCarre,save_resul,iatens,pt_sur_principal ,iatens_princ); // on génère une exception @@ -1193,11 +1193,11 @@ void Hysteresis_bulk::Gestion_pointeur_Inversion_et_Coincidence(double& unSur_wp {double MPr_a_l_inversion = *(save_resul.MPr_R_t_a_tdt.begin()); // la -pression à l'inversion if (MPr_tdt * MPr_a_l_inversion < 0.) // si négatif, on est passé de l'autre coté, ce n'est pas normal // on met un message d'erreur - {if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (abs(Permet_affichage()) > 0)) + {if (Permet_affichage() > 0) cout << "\n incoherence sur la liste secondaire, on a change de sens au niveau de la coincidence or " << " ce cas n'est pas prevu lors d'une inversion-coincidence !! " << "\n Hysteresis_bulk::Gestion_pointeur_Inversion_et_Coincidence(..." << endl; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 4)) || (abs(Permet_affichage()) > 4)) + if (Permet_affichage() > 4) Affiche_debug(unSur_wprimeCarre,save_resul,iatens,pt_sur_principal ,iatens_princ); // on génère une exception @@ -1262,11 +1262,11 @@ void Hysteresis_bulk::Gestion_pointeur_Inversion_et_Coincidence(double& unSur_wp && (iafact_posi1 == iafact_posi0)) ) ) // si négatif, on est passé de l'autre coté, - {if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (abs(Permet_affichage()) > 0)) + {if (Permet_affichage() > 0) cout << "\n incoherence sur la liste principale, on a change de sens au niveau de la coincidence or " << " ce cas n'est pas prevu lors d'une inversion-coincidence !! " << "\n Hysteresis_bulk::Gestion_pointeur_Inversion_et_Coincidence(..." << endl; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 4)) || (abs(Permet_affichage()) > 4)) + if (Permet_affichage() > 4) Affiche_debug(unSur_wprimeCarre,save_resul,iatens,pt_sur_principal ,iatens_princ); // on génère une exception @@ -1290,10 +1290,10 @@ void Hysteresis_bulk::Gestion_pointeur_Inversion_et_Coincidence(double& unSur_wp iatens_princ = iatens;iafct_princ = iafct; } else // sinon il y a un pb car comme c'est une coïncidence il devrait rester un pointeur valide - {if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (abs(Permet_affichage()) > 0)) + {if (Permet_affichage() > 0) cout << "\n incoherence, il devrait rester un pointeur de valide sur la liste de pt de ref" << "\n Hysteresis_bulk::Gestion_pointeur_Inversion_et_Coincidence(..." << endl; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 4)) || (abs(Permet_affichage()) > 4)) + if (Permet_affichage() > 4) Affiche_debug(unSur_wprimeCarre,save_resul,iatens,pt_sur_principal ,iatens_princ); // on génère une exception @@ -1636,8 +1636,7 @@ void Hysteresis_bulk::Init_thermo_dependance() // --- avant d'enregistrer on filtre si on a dépassé la saturation, ------ // sinon l'erreur va rester pour toute la suite du calcul if (Dabs(MPr_t___tdt) > Qzero) - {if (((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) - || (abs(Permet_affichage()) > 3)) + {if (Permet_affichage() > 3) cout << "\n ** warning dans le calcul de la contrainte a t+dt, on trouve " << " une valeur de pression -P= (" << MPr_t___tdt << ") > a la saturation = "<< Qzero @@ -1749,7 +1748,7 @@ void Hysteresis_bulk::Init_thermo_dependance() if (nb_coin_inver > Abs(nb_maxInvCoinSurUnPas)) { // dans ce cas cela signifie qu'il y a pb et on arrête en générant éventuellement // une interruption d'erreur de convergence dans une loi de comportement - if (((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (abs(Permet_affichage()) > 3)) + if (Permet_affichage() > 3) cout << "\n warning dans le calcul de la contrainte a t+dt, le nombre de coincidence et/ou" << " d'inversion (" << nb_coin_inver << ") est superieur a la limite fixee: = " << nb_maxInvCoinSurUnPas << endl; @@ -1762,7 +1761,7 @@ void Hysteresis_bulk::Init_thermo_dependance() // succession des rayons on contraire d'imposer l'inversion, qui conduira à un rayon incohérent (ce qui conduit // normalement tout de suite après à une coïncidence) force_fin_traitement = true; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (abs(Permet_affichage()) > 3)) + if (Permet_affichage() > 3) cout << " on est dans le cas d'aller-retour identiques !! on impose la coincidence " << endl; } else // on regarde s'il faut imposer la valeur finale obtenue ou générer une erreur @@ -1770,7 +1769,7 @@ void Hysteresis_bulk::Init_thermo_dependance() { throw ErrNonConvergence_loiDeComportement();break;} // envoie d'un signal a traiter en dehors else { force_fin_traitement = true; - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) || (abs(Permet_affichage()) > 3)) + if (Permet_affichage() > 3) cout << " on impose la coincidence " << endl; }; // cas où on impose coûte que coûte (résultat pas sûr !!) }; @@ -1783,8 +1782,7 @@ void Hysteresis_bulk::Init_thermo_dependance() // --- avant d'enregistrer on filtre si on a dépassé la saturation, ------ // sinon l'erreur va rester pour toute la suite du calcul if (Dabs(MPr_t___tdt) > Qzero) - {if (((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 3)) - || (abs(Permet_affichage()) > 3)) + {if (Permet_affichage() > 3) cout << "\n ** hysteresis bulk: warning dans le calcul de la contrainte a t+dt, on trouve " << " une valeur de pression -P= (" << MPr_t___tdt << ") > a la saturation = "<< Qzero diff --git a/comportement/iso_elas_hooke/Loi_iso_elas1D.cc b/comportement/iso_elas_hooke/Loi_iso_elas1D.cc index ddb70e3..72ddf18 100644 --- a/comportement/iso_elas_hooke/Loi_iso_elas1D.cc +++ b/comportement/iso_elas_hooke/Loi_iso_elas1D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -834,9 +834,7 @@ void Loi_iso_elas1D::Insertion_conteneur_dans_save_result(SaveResul * sr) // activation du stockage de grandeurs quelconques qui pourront ensuite être récupéré // via le conteneur SaveResul, si la grandeur n'existe pas ici, aucune action void Loi_iso_elas1D::Activation_stockage_grandeurs_quelconques(list & listEnuQuelc) - { // def du conteneur de grandeurs quelconques, initialisée à 0 - Grandeur_scalaire_double grand_courant(0.); - // récup de la liste de stockage + { // récup de la liste de stockage list & listlocale = ListQuelc_mis_en_acces_localement(); // on parcours la liste des grandeurs à activer // et on remplit la liste locale diff --git a/comportement/iso_elas_hooke/Loi_iso_elas1D.h b/comportement/iso_elas_hooke/Loi_iso_elas1D.h index b937392..5d4bfc8 100644 --- a/comportement/iso_elas_hooke/Loi_iso_elas1D.h +++ b/comportement/iso_elas_hooke/Loi_iso_elas1D.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/iso_elas_hooke/Loi_iso_elas2D_C.cc b/comportement/iso_elas_hooke/Loi_iso_elas2D_C.cc index 74ab5bc..733209d 100644 --- a/comportement/iso_elas_hooke/Loi_iso_elas2D_C.cc +++ b/comportement/iso_elas_hooke/Loi_iso_elas2D_C.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -999,9 +999,7 @@ void Loi_iso_elas2D_C::Insertion_conteneur_dans_save_result(SaveResul * sr) // activation du stockage de grandeurs quelconques qui pourront ensuite être récupéré // via le conteneur SaveResul, si la grandeur n'existe pas ici, aucune action void Loi_iso_elas2D_C::Activation_stockage_grandeurs_quelconques(list & listEnuQuelc) - { // def du conteneur de grandeurs quelconques, initialisée à 0 - Grandeur_scalaire_double grand_courant(0.); - // récup de la liste de stockage + { // récup de la liste de stockage list & listlocale = ListQuelc_mis_en_acces_localement(); // on parcours la liste des grandeurs à activer // et on remplit la liste locale diff --git a/comportement/iso_elas_hooke/Loi_iso_elas2D_C.h b/comportement/iso_elas_hooke/Loi_iso_elas2D_C.h index 25585b5..7f813a1 100644 --- a/comportement/iso_elas_hooke/Loi_iso_elas2D_C.h +++ b/comportement/iso_elas_hooke/Loi_iso_elas2D_C.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/iso_elas_hooke/Loi_iso_elas2D_D.cc b/comportement/iso_elas_hooke/Loi_iso_elas2D_D.cc index 59345b5..fc2e400 100644 --- a/comportement/iso_elas_hooke/Loi_iso_elas2D_D.cc +++ b/comportement/iso_elas_hooke/Loi_iso_elas2D_D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -876,9 +876,7 @@ void Loi_iso_elas2D_D::Insertion_conteneur_dans_save_result(SaveResul * sr) // activation du stockage de grandeurs quelconques qui pourront ensuite être récupéré // via le conteneur SaveResul, si la grandeur n'existe pas ici, aucune action void Loi_iso_elas2D_D::Activation_stockage_grandeurs_quelconques(list & listEnuQuelc) - { // def du conteneur de grandeurs quelconques, initialisée à 0 - Grandeur_scalaire_double grand_courant(0.); - // récup de la liste de stockage + { // récup de la liste de stockage list & listlocale = ListQuelc_mis_en_acces_localement(); // on parcours la liste des grandeurs à activer // et on remplit la liste locale diff --git a/comportement/iso_elas_hooke/Loi_iso_elas2D_D.h b/comportement/iso_elas_hooke/Loi_iso_elas2D_D.h index 5376a4e..1218145 100644 --- a/comportement/iso_elas_hooke/Loi_iso_elas2D_D.h +++ b/comportement/iso_elas_hooke/Loi_iso_elas2D_D.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/iso_elas_hooke/Loi_iso_elas3D.cc b/comportement/iso_elas_hooke/Loi_iso_elas3D.cc index a7579a0..ad55d66 100644 --- a/comportement/iso_elas_hooke/Loi_iso_elas3D.cc +++ b/comportement/iso_elas_hooke/Loi_iso_elas3D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -677,7 +677,7 @@ double Loi_iso_elas3D::Module_young_equivalent(Enum_dure temps,const Deformation recup = false; }; // dans tous les autres cas on utilise soit les fonctions - // si elles existent sinon on concerve les valeurs par défaut + // si elles existent sinon on conserve les valeurs par défaut if (!recup) {//on essaie un calcul // cas des courbes d'évolution @@ -882,9 +882,7 @@ void Loi_iso_elas3D::Insertion_conteneur_dans_save_result(SaveResul * sr) // activation du stockage de grandeurs quelconques qui pourront ensuite être récupéré // via le conteneur SaveResul, si la grandeur n'existe pas ici, aucune action void Loi_iso_elas3D::Activation_stockage_grandeurs_quelconques(list & listEnuQuelc) - { // def du conteneur de grandeurs quelconques, initialisée à 0 - Grandeur_scalaire_double grand_courant(0.); - // récup de la liste de stockage + { // récup de la liste de stockage list & listlocale = ListQuelc_mis_en_acces_localement(); // on parcours la liste des grandeurs à activer // et on remplit la liste locale diff --git a/comportement/iso_elas_hooke/Loi_iso_elas3D.h b/comportement/iso_elas_hooke/Loi_iso_elas3D.h index b273b11..2452eed 100644 --- a/comportement/iso_elas_hooke/Loi_iso_elas3D.h +++ b/comportement/iso_elas_hooke/Loi_iso_elas3D.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/iso_elas_nonlinear/Iso_elas_SE1D.cc b/comportement/iso_elas_nonlinear/Iso_elas_SE1D.cc index 8335b76..7f5fd3f 100644 --- a/comportement/iso_elas_nonlinear/Iso_elas_SE1D.cc +++ b/comportement/iso_elas_nonlinear/Iso_elas_SE1D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/iso_elas_nonlinear/Iso_elas_SE1D.h b/comportement/iso_elas_nonlinear/Iso_elas_SE1D.h index be9bccf..b92fd47 100644 --- a/comportement/iso_elas_nonlinear/Iso_elas_SE1D.h +++ b/comportement/iso_elas_nonlinear/Iso_elas_SE1D.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/iso_elas_nonlinear/Iso_elas_expo1D.cc b/comportement/iso_elas_nonlinear/Iso_elas_expo1D.cc index 1211de3..479f79e 100644 --- a/comportement/iso_elas_nonlinear/Iso_elas_expo1D.cc +++ b/comportement/iso_elas_nonlinear/Iso_elas_expo1D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -809,9 +809,7 @@ double Iso_elas_expo1D::Module_compressibilite_equivalent( Enum_dure temps,const // activation du stockage de grandeurs quelconques qui pourront ensuite être récupéré // via le conteneur SaveResul, si la grandeur n'existe pas ici, aucune action void Iso_elas_expo1D::Activation_stockage_grandeurs_quelconques(list & listEnuQuelc) - { // def du conteneur de grandeurs quelconques, initialisée à 0 - Grandeur_scalaire_double grand_courant(0.); - // récup de la liste de stockage + { // récup de la liste de stockage list & listlocale = ListQuelc_mis_en_acces_localement(); // on parcours la liste des grandeurs à activer // et on remplit la liste locale diff --git a/comportement/iso_elas_nonlinear/Iso_elas_expo1D.h b/comportement/iso_elas_nonlinear/Iso_elas_expo1D.h index c71e353..c3db6ec 100644 --- a/comportement/iso_elas_nonlinear/Iso_elas_expo1D.h +++ b/comportement/iso_elas_nonlinear/Iso_elas_expo1D.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/iso_elas_nonlinear/Iso_elas_expo3D.h b/comportement/iso_elas_nonlinear/Iso_elas_expo3D.h index 62150f9..62aabef 100644 --- a/comportement/iso_elas_nonlinear/Iso_elas_expo3D.h +++ b/comportement/iso_elas_nonlinear/Iso_elas_expo3D.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/iso_elas_nonlinear/iso_elas_expo3D.cc b/comportement/iso_elas_nonlinear/iso_elas_expo3D.cc index 025a3c1..a9df7d2 100644 --- a/comportement/iso_elas_nonlinear/iso_elas_expo3D.cc +++ b/comportement/iso_elas_nonlinear/iso_elas_expo3D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -225,7 +225,8 @@ double Iso_elas_expo3D::Module_young_equivalent(Enum_dure ,const Deformation & d double Iso_elas_expo3D::Module_compressibilite_equivalent(Enum_dure ,const Deformation & def) { cout << "\n pas implante !! " << "\n Iso_elas_expo3D::Module_compressibilite_equivalent(Deformation & def)"; - Sortie(1); + Sortie(1); + return 0.; // pour taire le compilo /*if (!thermo_dependant) {return E/(3.*(1.-2.*nu));} @@ -349,7 +350,7 @@ void Iso_elas_expo3D::Calcul_DsigmaHH_tdt (TenseurHH& ,TenseurBB& ,DdlElement & { // on fait de faire uniquement une égalité d'adresse et de ne pas utiliser // le constructeur d'ou la profusion d'* et de () Tenseur3HH & dsigHH = *((Tenseur3HH*) (d_sigHH(i))); // passage en dim 3 - const Tenseur3BB & d_gijBB = *((Tenseur3BB*)(d_gijBB_tdt(i))); // passage en dim 3 +// const Tenseur3BB & d_gijBB = *((Tenseur3BB*)(d_gijBB_tdt(i))); // passage en dim 3 const Tenseur3HH & dgijHH = *((Tenseur3HH*)(d_gijHH_tdt(i))) ; // pour simplifier l'ecriture const Tenseur3BB & depsBB = *((Tenseur3BB *) (d_epsBB(i))); // " // pour chacun des ddl on calcul les tenseurs derivees diff --git a/comportement/loi_Umat/Loi_Umat.cc b/comportement/loi_Umat/Loi_Umat.cc index 9099b47..0c1fc62 100644 --- a/comportement/loi_Umat/Loi_Umat.cc +++ b/comportement/loi_Umat/Loi_Umat.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -700,7 +700,7 @@ void Loi_Umat::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t_,TenseurBB& DepsBB_,DdlEl // donc maintenant umat_cont_2D contient via ses pointeurs les nouvelles bases #ifdef MISE_AU_POINT if (Permet_affichage() > 5) - {cout << "\n\n Loi_Umat::Calcul_SigmaHH (.. "; + {cout << "\n\n Loi_Umat::Calcul_DsigmaHH_tdt (.. "; cout << "\n gamma= "; Aa.Affiche(); cout << " base ex.giB_0:" << (*ex.giB_0); cout << "\n base Ip : "< 5) + {cout << "\n\n Loi_Umat::Calcul_DsigmaHH_tdt (.. "; + cout << "\n eps en absolu :";epsAA.Ecriture(cout); + cout << "\n Deps en absolu :";D_abs_epsBB.Ecriture(cout); + cout << "\n delta_eps en absolu :";delta_epsAA.Ecriture(cout); + cout << "\n sig_t en absolu :";sigAA.Ecriture(cout); + } + #endif + // construction de la métrique umat associée à la métrique actuelle, // c'est-à-dire construction de la métrique correspondant aux coordonnées initiales // considérées comme paramétrage matériel diff --git a/comportement/loi_Umat/Loi_Umat.h b/comportement/loi_Umat/Loi_Umat.h index d44e65f..d980f99 100644 --- a/comportement/loi_Umat/Loi_Umat.h +++ b/comportement/loi_Umat/Loi_Umat.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -150,7 +150,7 @@ class Loi_Umat : public Loi_comp_abstraite // completer est appelé apres sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor - ,const Loi_comp_abstraite* loi) {}; + ,const Loi_comp_abstraite* loi) {return NULL;}; // données protégées SaveResul* save_pour_loi_ext; diff --git a/comportement/lois_combinees/LoiAdditiveEnSigma.cc b/comportement/lois_combinees/LoiAdditiveEnSigma.cc index 16a34d3..0f1352d 100644 --- a/comportement/lois_combinees/LoiAdditiveEnSigma.cc +++ b/comportement/lois_combinees/LoiAdditiveEnSigma.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -2151,9 +2151,7 @@ void LoiAdditiveEnSigma::Calcul_dsigma_deps (bool en_base_orthonormee, TenseurHH }; }; #ifdef MISE_AU_POINT - if (((ParaGlob::NiveauImpression() > 8) && (Permet_affichage() == 0)) - || (Permet_affichage() > 7) - ) + if (Permet_affichage() > 7) { cout << "\n init temperatures:\n " << " loi_ili->temperature_0= " << loi_ili->temperature_0 << " loi_ili->temperature_t= " << loi_ili->temperature_t diff --git a/comportement/lois_combinees/LoiAdditiveEnSigma.h b/comportement/lois_combinees/LoiAdditiveEnSigma.h index 95b2b5c..a701055 100644 --- a/comportement/lois_combinees/LoiAdditiveEnSigma.h +++ b/comportement/lois_combinees/LoiAdditiveEnSigma.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_combinees/LoiContraintesPlanes.cc b/comportement/lois_combinees/LoiContraintesPlanes.cc index a9d4b36..734f702 100644 --- a/comportement/lois_combinees/LoiContraintesPlanes.cc +++ b/comportement/lois_combinees/LoiContraintesPlanes.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -1961,9 +1961,7 @@ void LoiContraintesPlanes::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& DepsBB, module_compressibilite=module_cisaillement=0.; // init energ.Inita(0.); // initialisation des énergies mises en jeux - bool affichage = ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 2) - ); + bool affichage = (Permet_affichage() > 3); if (affichage) {cout << "\n --- LoiContraintesPlanes::Calcul_SigmaHH --- "; Signature_pti_encours(cout); @@ -2035,7 +2033,7 @@ void LoiContraintesPlanes::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& DepsBB, val_initiale(1)=save_resul.h_tsurh0; // on démarre la recherche à la valeur à t // on impose que les grandeurs soient dans les limites admises if (Limitation_h(val_initiale(1))) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "\n loi CP: (newton local) val initiales: " << flush; }; racine.Zero(); // init du résultat à 0., mais c'est une grandeur de sortie donc cela ne sert à rien @@ -2079,8 +2077,7 @@ void LoiContraintesPlanes::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& DepsBB, // on récupère le premier élément du tableau uniquement double tol = tab_val(1); #ifdef MISE_AU_POINT - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << "\n Newton_prec: tol_= "<< tol; #endif alg_zero.Modif_prec_res_abs(tol); @@ -2115,8 +2112,7 @@ void LoiContraintesPlanes::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& DepsBB, // on récupère le premier élément du tableau uniquement double tol_rel = tab_val(1); #ifdef MISE_AU_POINT - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << ", tol_relative= "<< tol_rel; #endif alg_zero.Modif_prec_res_rel(tol_rel); @@ -2135,7 +2131,7 @@ void LoiContraintesPlanes::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& DepsBB, // on vérifie qu'il n'y a pas de pb de convergence double absracinemax=racine.Max_val_abs(); if ((!conver) || (!isfinite(absracinemax)) || (isnan(absracinemax)) ) - { if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) { cout << "\n loi CP: non convergence sur l'algo de la resolution de sig33(hsurh0)=0 " << " h/h_0(t+dt)= " << racine(1) << " a t on avait: " << save_resul.h_tsurh0 << "\n nb_incr_total=" << nb_incr_total @@ -2146,7 +2142,7 @@ void LoiContraintesPlanes::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& DepsBB, }; // on vérifie que les nouvelles dimensions transversales ne sont pas négatives if (racine(1) < 0.) - { if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) { cout << "\n loi CP: **** erreur dans la resolution : on obtient une " << " epaisseur negative " << ", h/h_0(t+dt)= " << racine(1) << " a t on avait: " << save_resul.h_tsurh0; @@ -2157,7 +2153,7 @@ void LoiContraintesPlanes::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& DepsBB, } catch (ErrNonConvergence_Newton erreur) { - if ((ParaGlob::NiveauImpression() > 2) || (Permet_affichage() > 0)) + if (Permet_affichage() > 0) { cout << "\n loi CP: erreur de non convergence avec l'algo de la resolution de sig33(hsurh0)=0 " << " on obtient une valeur infinie ou NaN "; }; @@ -2172,7 +2168,7 @@ void LoiContraintesPlanes::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& DepsBB, } catch ( ... ) { // dans le cas d'une erreur inconnue, on génère également une exception - if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 0)) + if (Permet_affichage() > 0) { cout << "\n loi CP: erreur non identifiee sur l'algo de la resolution de sig33(hsurh0)=0 "; //// ----- debug //cout << "\n debug : LoiContraintesPlanes::Calcul_SigmaHH ( "; @@ -2220,7 +2216,7 @@ void LoiContraintesPlanes::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& DepsBB, // récup de l'épaisseur de départ // on impose que les grandeurs sauvegardées soient dans les limites admises if (Limitation_h(sauve_hsurh0)) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "loi CP: calcul direct sans Newton " << flush; }; save_resul.hsurh0 = sauve_hsurh0; @@ -2241,7 +2237,7 @@ void LoiContraintesPlanes::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& DepsBB, // passage des tenseurs résultats à l'ordre 2 ((Tenseur2HH*) &sigHH)->Affectation_3D_a_2D(sig_HH_3D); - if ((ParaGlob::NiveauImpression() > 4) || (Permet_affichage() > 0)) + if (Permet_affichage() > 0) { cout << "\n loi CP: valeur final de h/h_0(t+dt)= " << save_resul.hsurh0 << flush; }; } @@ -2261,7 +2257,7 @@ void LoiContraintesPlanes::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& DepsBB, // calcul de la déformation d'épaisseur correspondant à la condition de contraintes planes {Tenseur3BH sigBH = gijBB_tdt_3D * sig_HH_3D; Calcul_eps33_parVarVolume(jacobien_0,module_compressibilite,jacobien,sigBH); - if (((ParaGlob::NiveauImpression() > 4) || (Permet_affichage() > 0)) && mauvaise_convergence) + if ((Permet_affichage() > 0) && mauvaise_convergence) { cout << "\n loi CP: valeur final de h/h_0(t+dt)= " << save_resul.hsurh0 << flush; }; }; @@ -2282,7 +2278,7 @@ void LoiContraintesPlanes::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& DepsBB, // sigHH_tdt.Ecriture(cout); LibereTenseur(); LibereTenseurQ(); - if ((ParaGlob::NiveauImpression() > 8) || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << "\n fin: LoiContraintesPlanes::Calcul_SigmaHH(... " << flush; }; @@ -2304,9 +2300,7 @@ void LoiContraintesPlanes::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& De module_compressibilite=module_cisaillement=0.; // init energ.Inita(0.); // initialisation des énergies mises en jeux - bool affichage = ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 2) - ); + bool affichage = (Permet_affichage() > 3); if (affichage) {cout << "\n --- LoiContraintesPlanes::Calcul_DsigmaHH_tdt --- "; Signature_pti_encours(cout); @@ -2385,7 +2379,7 @@ void LoiContraintesPlanes::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& De val_initiale(1)=save_resul.h_tsurh0; // on démarre la recherche à la valeur à t // on impose que les grandeurs soient dans les limites admises if (Limitation_h(val_initiale(1))) - {if (affichage || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "\n loi CP: (newton local) val initiales: " << flush; }; racine.Zero(); // init du résultat à 0., mais c'est une grandeur de sortie donc cela ne sert à rien @@ -2429,7 +2423,7 @@ void LoiContraintesPlanes::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& De // on récupère le premier élément du tableau uniquement double tol = tab_val(1); #ifdef MISE_AU_POINT - if ( affichage || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << "\n loi CP: Newton_prec: tol_= "<< tol; #endif alg_zero.Modif_prec_res_abs(tol); @@ -2464,7 +2458,7 @@ void LoiContraintesPlanes::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& De // on récupère le premier élément du tableau uniquement double tol_rel = tab_val(1); #ifdef MISE_AU_POINT - if ( affichage || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << ", tol_relative= "<< tol_rel; #endif alg_zero.Modif_prec_res_rel(tol_rel); @@ -2483,7 +2477,7 @@ void LoiContraintesPlanes::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& De // on vérifie qu'il n'y a pas de pb de convergence double absracinemax=racine.Max_val_abs(); if ((!conver) || (!isfinite(absracinemax)) || (isnan(absracinemax)) ) - { if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) { cout << "\n loi CP: non convergence sur l'algo de la resolution de sig33(hsurh0)=0 " << " h/h_0(t+dt)= " << racine(1) << " a t on avait: " << save_resul.h_tsurh0 << "\n nb_incr_total=" << nb_incr_total @@ -2494,7 +2488,7 @@ void LoiContraintesPlanes::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& De }; // on vérifie que les nouvelles dimensions transversales ne sont pas négatives if (racine(1) < 0.) - { if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) { cout << "\n loi CP: **** erreur dans la resolution : on obtient une " << " epaisseur negative " << ", h/h_0(t+dt)= " << racine(1) << " a t on avait: " << save_resul.h_tsurh0; @@ -2505,7 +2499,7 @@ void LoiContraintesPlanes::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& De } catch (ErrNonConvergence_Newton erreur) { - if ((ParaGlob::NiveauImpression() > 2) || (Permet_affichage() > 0)) + if (Permet_affichage() > 0) { cout << "\n loi CP: erreur de non convergence avec l'algo de la resolution de sig33(hsurh0)=0 " << " on obtient une valeur infinie ou NaN "; }; @@ -2520,7 +2514,7 @@ void LoiContraintesPlanes::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& De } catch ( ... ) { // dans le cas d'une erreur inconnue, on génère également une exception - if ((ParaGlob::NiveauImpression() > 2) || (Permet_affichage() > 0)) + if (Permet_affichage() > 0) { cout << "\n loi CP: erreur non identifiee sur l'algo de la resolution de sig33(hsurh0)=0 "; //// ----- debug //cout << "\n debug : LoiContraintesPlanes::Calcul_DSigmaHH ( "; @@ -2630,7 +2624,7 @@ void LoiContraintesPlanes::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& De // récup de l'épaisseur de départ // on impose que les grandeurs sauvegardées soient dans les limites admises if (Limitation_h(sauve_hsurh0)) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "calcul direct sans Newton " << flush; }; save_resul.hsurh0 = sauve_hsurh0; @@ -2655,7 +2649,7 @@ void LoiContraintesPlanes::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& De ((Tenseur2HH*) &sigHH_tdt)->Affectation_3D_a_2D(sig_HH_3D); if (mauvaise_convergence) - {if ((ParaGlob::NiveauImpression() > 4) || (Permet_affichage() > 0)) + {if (Permet_affichage() > 0) { cout << "\n loi CP: valeur final de h/h_0(t+dt)= " << save_resul.hsurh0; }; // on annulle les dérivées des épaisseurs @@ -2694,7 +2688,7 @@ void LoiContraintesPlanes::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& De {Tenseur2BH sigBH = gijBB_tdt * sigHH_tdt; Calcul_d_eps33_parVarVolume(jacobien_0,module_compressibilite,jacobien,sigHH_tdt,d_jacobien_tdt ,d_sigHH,d_gijBB_tdt,gijBB_tdt); - if (((ParaGlob::NiveauImpression() > 4) || (Permet_affichage() > 0)) && mauvaise_convergence) + if ((Permet_affichage() > 0) && mauvaise_convergence) { cout << "\n loi CP: valeur final de h/h_0(t+dt)= " << save_resul.hsurh0; }; }; @@ -2711,7 +2705,7 @@ void LoiContraintesPlanes::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB& De LibereTenseur(); LibereTenseurQ(); - if ((ParaGlob::NiveauImpression() > 8) || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << "\n fin: LoiContraintesPlanes::Calcul_DsigmaHH_tdt(... " << flush; }; @@ -2732,9 +2726,7 @@ void LoiContraintesPlanes::Calcul_dsigma_deps (bool en_base_orthonormee, Tenseur module_compressibilite=module_cisaillement=0.; // init energ.Inita(0.); // initialisation des énergies mises en jeux - bool affichage = ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 2) - ); + bool affichage = (Permet_affichage() > 3); if (affichage) {cout << "\n --- LoiContraintesPlanes::Calcul_dsigma_deps --- "; Signature_pti_encours(cout); @@ -2796,7 +2788,7 @@ void LoiContraintesPlanes::Calcul_dsigma_deps (bool en_base_orthonormee, Tenseur val_initiale(1)=save_resul.h_tsurh0; // on démarre la recherche à la valeur à t // on impose que les grandeurs soient dans les limites admises if (Limitation_h(val_initiale(1))) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "\n (newton local) val initiales: " << flush; }; racine.Zero(); // init du résultat à 0., mais c'est une grandeur de sortie donc cela ne sert à rien @@ -2840,7 +2832,7 @@ void LoiContraintesPlanes::Calcul_dsigma_deps (bool en_base_orthonormee, Tenseur // on récupère le premier élément du tableau uniquement double tol = tab_val(1); #ifdef MISE_AU_POINT - if ( affichage || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << "\n loi CP: Newton_prec: tol_= "<< tol; #endif alg_zero.Modif_prec_res_abs(tol); @@ -2875,7 +2867,7 @@ void LoiContraintesPlanes::Calcul_dsigma_deps (bool en_base_orthonormee, Tenseur // on récupère le premier élément du tableau uniquement double tol_rel = tab_val(1); #ifdef MISE_AU_POINT - if ( affichage || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << ", tol_relative= "<< tol_rel; #endif alg_zero.Modif_prec_res_rel(tol_rel); @@ -2894,7 +2886,7 @@ void LoiContraintesPlanes::Calcul_dsigma_deps (bool en_base_orthonormee, Tenseur // on vérifie qu'il n'y a pas de pb de convergence double absracinemax=racine.Max_val_abs(); if ((!conver) || (!isfinite(absracinemax)) || (isnan(absracinemax)) ) - { if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) { cout << "\n loi CP: non convergence sur l'algo de la resolution de sig33(hsurh0)=0 " << " h/h_0(t+dt)= " << racine(1) << " a t on avait: " << save_resul.h_tsurh0 << "\n nb_incr_total=" << nb_incr_total @@ -2905,7 +2897,7 @@ void LoiContraintesPlanes::Calcul_dsigma_deps (bool en_base_orthonormee, Tenseur }; // on vérifie que les nouvelles dimensions transversales ne sont pas négatives if (racine(1) < 0.) - { if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) { cout << "\n loi CP: **** erreur dans la resolution : on obtient une " << " epaisseur negative " << ", h/h_0(t+dt)= " << racine(1) << " a t on avait: " << save_resul.h_tsurh0; @@ -2916,7 +2908,7 @@ void LoiContraintesPlanes::Calcul_dsigma_deps (bool en_base_orthonormee, Tenseur } catch (ErrNonConvergence_Newton erreur) { - if ((ParaGlob::NiveauImpression() > 2) || (Permet_affichage() > 0)) + if (Permet_affichage() > 0) { cout << "\n loi CP: erreur de non convergence avec l'algo de la resolution de sig33(hsurh0)=0 " << " on obtient une valeur infinie ou NaN "; }; @@ -2931,7 +2923,7 @@ void LoiContraintesPlanes::Calcul_dsigma_deps (bool en_base_orthonormee, Tenseur } catch ( ... ) { // dans le cas d'une erreur inconnue, on génère également une exception - if ((ParaGlob::NiveauImpression() > 2) || (Permet_affichage() > 0)) + if (Permet_affichage() > 0) { cout << "\n loi CP: erreur non identifiee sur l'algo de la resolution de sig33(hsurh0)=0 "; //// ----- debug //cout << "\n debug : LoiContraintesPlanes::Calcul_DSigma_deps ( "; @@ -3012,7 +3004,7 @@ void LoiContraintesPlanes::Calcul_dsigma_deps (bool en_base_orthonormee, Tenseur // récup de l'épaisseur de départ // on impose que les grandeurs sauvegardées soient dans les limites admises if (Limitation_h(sauve_hsurh0)) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "calcul direct sans Newton " << flush; }; save_resul.hsurh0 = sauve_hsurh0; @@ -3032,7 +3024,7 @@ void LoiContraintesPlanes::Calcul_dsigma_deps (bool en_base_orthonormee, Tenseur ((Tenseur2HH*) &sigHH_tdt)->Affectation_3D_a_2D(sig_HH_3D); if (mauvaise_convergence) - {if ((ParaGlob::NiveauImpression() > 4) || (Permet_affichage() > 0)) + {if (Permet_affichage() > 0) { cout << "\n loi CP: valeur final de h/h_0(t+dt)= " << save_resul.hsurh0; }; // on annulle les dérivées des épaisseurs @@ -3064,7 +3056,7 @@ void LoiContraintesPlanes::Calcul_dsigma_deps (bool en_base_orthonormee, Tenseur // calcul de la déformation d'épaisseur correspondant à la condition de contraintes planes {Tenseur2BH sigBH = *(ex.gijBB_tdt) * sigHH_tdt; Calcul_eps33_parVarVolume(jacobien_0,module_compressibilite,jacobien,sigBH); - if (((ParaGlob::NiveauImpression() > 4) || (Permet_affichage() > 0)) && mauvaise_convergence) + if ((Permet_affichage() > 0) && mauvaise_convergence) { cout << "\n loi CP: valeur final de h/h_0(t+dt)= " << save_resul.hsurh0; }; }; @@ -3085,7 +3077,7 @@ void LoiContraintesPlanes::Calcul_dsigma_deps (bool en_base_orthonormee, Tenseur // fin debug LibereTenseur(); LibereTenseurQ(); - if ((ParaGlob::NiveauImpression() > 8) || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << "\n fin: LoiContraintesPlanes::Calcul_dsigma_deps(... " << flush; }; @@ -3823,7 +3815,7 @@ void LoiContraintesPlanes::Calcul_eps33_parVarVolume(double& jaco_2D_0,const dou // on test les mini-maxi if (Limitation_h(hSurh_0)) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) {cout << "\n LoiContraintesPlanes::Calcul_eps_trans_parVarVolume(... " << flush; }; }; @@ -3854,7 +3846,7 @@ void LoiContraintesPlanes::Calcul_d_eps33_parVarVolume(double& jaco_2D_0,const d // on test les mini-maxi if (Limitation_h(hSurh_0)) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) {cout << "\n LoiContraintesPlanes::Calcul_d_eps33_parVarVolume(... " << flush; }; }; @@ -3948,7 +3940,7 @@ Vecteur& LoiContraintesPlanes::Residu_constitutif (const double & alpha,const Ve // vérif des grandeurs if (Limitation_h(hsurh0)) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "\n LoiContraintesPlanes::Residu_constitutif(... " << flush; erreur_sortie = true; test = -1; // l'erreur n'est pas fatale mais elle signifie que ce n'est pas très normal !! @@ -4016,7 +4008,7 @@ Mat_abstraite& LoiContraintesPlanes::Mat_tangente_constitutif bool erreur_sortie = false; // pour gestion de sortie d'infos supplémentaires // vérif des grandeurs if (Limitation_h(hsurh0)) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "\n LoiContraintesPlanes::Mat_tangente_constitutif(... " << flush; erreur_sortie = true; test = -1; // l'erreur n'est pas fatale mais elle signifie que ce n'est pas très normal !! @@ -4098,7 +4090,7 @@ bool LoiContraintesPlanes::Limitation_h(double& hsurh0) { bool retour = false; // il ne faut pas que la nouvelle épaisseur soit inf au mini if (hsurh0 < mini_hsurh0) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) {cout << "\n *** attention hsurh0 " << hsurh0 << ", est inferieur a la limite fixee "< maxi_hsurh0) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) {cout << "\n *** attention hsurh0 " << hsurh0 << ", est superieur a la limite fixee "< 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "\n val initiales: LoiContraintesPlanesDouble::Calcul_SigmaHH(... " << endl; }; racine.Zero(); // init du résultat à 0., mais c'est une grandeur de sortie donc cela ne sert à rien @@ -2122,11 +2122,10 @@ void LoiContraintesPlanesDouble::Calcul_SigmaHH #endif // on récupère le premier élément du tableau uniquement double tol = tab_val(1); - #ifdef MISE_AU_POINT - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 5)) - cout << "\n Newton_prec: tol_= "<< tol; - #endif + #ifdef MISE_AU_POINT + if (Permet_affichage() > 5) + cout << "\n Newton_prec: tol_= "<< tol; + #endif alg_zero.Modif_prec_res_abs(tol); }; @@ -2159,8 +2158,7 @@ void LoiContraintesPlanesDouble::Calcul_SigmaHH // on récupère le premier élément du tableau uniquement double tol_rel = tab_val(1); #ifdef MISE_AU_POINT - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << ", tol_relative= "<< tol_rel; #endif alg_zero.Modif_prec_res_rel(tol_rel); @@ -2184,7 +2182,7 @@ void LoiContraintesPlanesDouble::Calcul_SigmaHH // on vérifie qu'il n'y a pas de pb de convergence double absracinemax=racine.Max_val_abs(); if ((!conver) || (!isfinite(absracinemax)) || (isnan(absracinemax)) ) - { if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) { cout << "\n non convergence sur l'algo de la resolution de sig22_33(bsurb0,hsurh0)=(0,0) " << "\n b/b_0(t+dt)= " << racine(1) << " a t = " << save_resul.b_tsurb0 << " h/h_0(t+dt)= " << racine(2) << " a t = " << save_resul.h_tsurh0 @@ -2197,7 +2195,7 @@ void LoiContraintesPlanesDouble::Calcul_SigmaHH }; // on vérifie que les nouvelles dimensions transversales ne sont pas négatives if ((racine(1) < 0.) || (racine(2) < 0.) ) - { if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) { cout << "\n **** erreur dans la resolution : on obtient une " << " dimension transversale negative " << "\n b/b_0(t+dt)= " << racine(1) << " a t = " << save_resul.b_tsurb0 @@ -2210,7 +2208,7 @@ void LoiContraintesPlanesDouble::Calcul_SigmaHH } catch (ErrNonConvergence_Newton erreur) { - if ((ParaGlob::NiveauImpression() > 2) || (Permet_affichage() > 0)) + if (Permet_affichage() > 0) { cout << "\n erreur de non convergence avec l'algo de la resolution de sig22_33(bsurb0,hsurh0)=(0,0) " << " on obtient une valeur infinie ou NaN " << "\n LoiContraintesPlanesDouble::Calcul_SigmaHH_tdt (..."; @@ -2226,7 +2224,7 @@ void LoiContraintesPlanesDouble::Calcul_SigmaHH } catch ( ... ) { // dans le cas d'une erreur inconnue, on génère également une exception - if ((ParaGlob::NiveauImpression() > 2) || (Permet_affichage() > 0)) + if (Permet_affichage() > 0) { cout << "\n erreur non identifiee sur l'algo de la resolution de sig22_33(bsurb0,hsurh0)=(0,0) " << "\n LoiContraintesPlanesDouble::Calcul_SigmaHH (..."; }; @@ -2256,7 +2254,7 @@ void LoiContraintesPlanesDouble::Calcul_SigmaHH // récup de l'épaisseur et la largeur de départ // on impose que les grandeurs sauvegardées soient dans les limites admises if (Limitation_h_b(sauve_hsurh0,sauve_bsurb0)) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "calcul direct sans Newton " << "\n LoiContraintesPlanesDouble::Calcul_SigmaHH(... " << endl; }; @@ -2276,7 +2274,7 @@ void LoiContraintesPlanesDouble::Calcul_SigmaHH // passage des tenseurs résultats à l'ordre 1 ((Tenseur1HH*) &sigHH)->Affectation_trans_dimension(sig_HH_3D,false); - if (((ParaGlob::NiveauImpression() > 4) || (Permet_affichage() > 0))&& mauvaise_convergence) + if ((Permet_affichage() > 0) && mauvaise_convergence) { cout << "\n valeur final de h/h_0(t+dt)= " << save_resul.hsurh0 << " et de b/b_0(t+dt)= " << save_resul.bsurb0; }; @@ -2300,7 +2298,7 @@ void LoiContraintesPlanesDouble::Calcul_SigmaHH {Tenseur3BH sigBH = gijBB_tdt_3D * sig_HH_3D; Tenseur3BH sigBH_t = gijBB_t_3D * sig_HH_t_3D; Calcul_eps_trans_parVarVolume1(sigBH_t,jacobien_0,module_compressibilite,jacobien,sigBH,*(ex.jacobien_t)); - if (((ParaGlob::NiveauImpression() > 4) || (Permet_affichage() > 0)) && mauvaise_convergence) + if ((Permet_affichage() > 0) && mauvaise_convergence) { cout << "\n valeur final de h/h_0(t+dt)= " << save_resul.hsurh0 << " et de b/b_0(t+dt)= " << save_resul.bsurb0; }; @@ -2419,7 +2417,7 @@ void LoiContraintesPlanesDouble::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,Tenseur val_initiale(2)=save_resul.h_tsurh0; // on démarre la recherche à la valeur à t // on impose que les grandeurs soient dans les limites admises if (Limitation_h_b(val_initiale(2),val_initiale(1))) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "\n val initiales: LoiContraintesPlanesDouble::Calcul_DsigmaHH_tdt(... " << endl; }; racine.Zero(); // init du résultat à 0., mais c'est une grandeur de sortie donc cela ne sert à rien @@ -2464,8 +2462,7 @@ void LoiContraintesPlanesDouble::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,Tenseur // on récupère le premier élément du tableau uniquement double tol = tab_val(1); #ifdef MISE_AU_POINT - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 5)) + if (Permet_affichage() >5) cout << "\n Newton_prec: tol_= "<< tol; #endif alg_zero.Modif_prec_res_abs(tol); @@ -2500,8 +2497,7 @@ void LoiContraintesPlanesDouble::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,Tenseur // on récupère le premier élément du tableau uniquement double tol_rel = tab_val(1); #ifdef MISE_AU_POINT - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << ", tol_relative= "<< tol_rel; #endif alg_zero.Modif_prec_res_rel(tol_rel); @@ -2524,7 +2520,7 @@ void LoiContraintesPlanesDouble::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,Tenseur // on vérifie qu'il n'y a pas de pb de convergence double absracinemax=racine.Max_val_abs(); if ((!conver) || (!isfinite(absracinemax)) || (isnan(absracinemax)) ) - { if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) { cout << "\n non convergence sur l'algo de la resolution de sig22_33(bsurb0,hsurh0)=(0,0) " << "\n b/b_0(t+dt)= " << racine(1) << " a t = " << save_resul.b_tsurb0 << " h/h_0(t+dt)= " << racine(2) << " a t = " << save_resul.h_tsurh0 @@ -2537,7 +2533,7 @@ void LoiContraintesPlanesDouble::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,Tenseur }; // on vérifie que les nouvelles dimensions transversales ne sont pas négatives if ((racine(1) < 0.) || (racine(2) < 0.) ) - { if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) { cout << "\n **** erreur dans la resolution : on obtient une " << " dimension transversale negative " << "\n b/b_0(t+dt)= " << racine(1) << " a t = " << save_resul.b_tsurb0 @@ -2550,7 +2546,7 @@ void LoiContraintesPlanesDouble::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,Tenseur } catch (ErrNonConvergence_Newton erreur) { - if ((ParaGlob::NiveauImpression() > 2) || (Permet_affichage() > 0)) + if (Permet_affichage() > 0) { cout << "\n erreur de non convergence avec l'algo de la resolution de sig22_33(bsurb0,hsurh0)=(0,0) " << " on obtient une valeur infinie ou NaN " << "\n LoiContraintesPlanesDouble::Calcul_DsigmaHH_tdt (..."; @@ -2566,7 +2562,7 @@ void LoiContraintesPlanesDouble::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,Tenseur } catch ( ... ) { // dans le cas d'une erreur inconnue, on génère également une exception - if ((ParaGlob::NiveauImpression() > 2) || (Permet_affichage() > 0)) + if (Permet_affichage() > 0) { cout << "\n erreur non identifiee sur l'algo de la resolution de sig22_33(bsurb0,hsurh0)=(0,0) " << "\n LoiContraintesPlanesDouble::Calcul_DsigmaHH_tdt (..."; }; @@ -2663,7 +2659,7 @@ void LoiContraintesPlanesDouble::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,Tenseur save_resul.bsurb0 = sauve_bsurb0; // on impose que les grandeurs sauvegardées soient dans les limites admises if (Limitation_h_b(sauve_hsurh0,sauve_bsurb0)) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "calcul direct sans Newton " << "\n LoiContraintesPlanesDouble::Calcul_DsigmaHH_tdt(... " << endl; }; @@ -2689,7 +2685,7 @@ void LoiContraintesPlanesDouble::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,Tenseur ((Tenseur1HH*) d_sigHH(k))->Affectation_trans_dimension(*d_sig_HH_3D_P(k),false); if (mauvaise_convergence) - {if ((ParaGlob::NiveauImpression() > 4) || (Permet_affichage() > 0)) + {if (Permet_affichage() > 0) { cout << "\n valeur final de h/h_0(t+dt)= " << save_resul.hsurh0 << " et de b/b_0(t+dt)= " << save_resul.bsurb0; }; @@ -2732,7 +2728,7 @@ void LoiContraintesPlanesDouble::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,Tenseur Tenseur3BH sigBH = gijBB_tdt_3D * sig_HH_3D; Calcul_d_eps_trans_parVarVolume(jacobien_0,module_compressibilite,jacobien,sigHH_tdt,d_jacobien_tdt ,d_sigHH,d_gijBB_tdt,gijBB_tdt); - if (((ParaGlob::NiveauImpression() > 4) || (Permet_affichage() > 0)) && mauvaise_convergence) + if ((Permet_affichage() > 0) && mauvaise_convergence) { cout << "\n valeur final de h/h_0(t+dt)= " << save_resul.hsurh0 << " et de b/b_0(t+dt)= " << save_resul.bsurb0; }; @@ -2847,7 +2843,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps val_initiale(2)=save_resul.h_tsurh0; // on démarre la recherche à la valeur à t // on impose que les grandeurs soient dans les limites admises if (Limitation_h_b(val_initiale(2),val_initiale(1))) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "\n val initiales: LoiContraintesPlanesDouble::Calcul_dsigma_deps(... " << endl; }; @@ -2904,8 +2900,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps // on récupère le premier élément du tableau uniquement double tol = tab_val(1); #ifdef MISE_AU_POINT - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << "\n Newton_prec: tol_= "<< tol; #endif alg_zero.Modif_prec_res_abs(tol); @@ -2940,8 +2935,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps // on récupère le premier élément du tableau uniquement double tol_rel = tab_val(1); #ifdef MISE_AU_POINT - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << ", tol_relative= "<< tol_rel; #endif alg_zero.Modif_prec_res_rel(tol_rel); @@ -2960,7 +2954,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps // on vérifie qu'il n'y a pas de pb de convergence double absracinemax=racine.Max_val_abs(); if ((!conver) || (!isfinite(absracinemax)) || (isnan(absracinemax)) ) - { if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) { cout << "\n non convergence sur l'algo de la resolution de sig22_33(bsurb0,hsurh0)=(0,0) " << "\n b/b_0(t+dt)= " << racine(1) << " a t = " << save_resul.b_tsurb0 << " h/h_0(t+dt)= " << racine(2) << " a t = " << save_resul.h_tsurh0 @@ -2973,7 +2967,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps }; // on vérifie que les nouvelles dimensions transversales ne sont pas négatives if ((racine(1) < 0.) || (racine(2) < 0.) ) - { if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) { cout << "\n **** erreur dans la resolution : on obtient une " << " dimension transversale negative " << "\n b/b_0(t+dt)= " << racine(1) << " a t = " << save_resul.b_tsurb0 @@ -2986,7 +2980,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps } catch (ErrNonConvergence_Newton erreur) { - if ((ParaGlob::NiveauImpression() > 2) || (Permet_affichage() > 0)) + if (Permet_affichage() > 0) { cout << "\n erreur de non convergence avec l'algo de la resolution de sig22_33(bsurb0,hsurh0)=(0,0) " << " on obtient une valeur infinie ou NaN " << "\n LoiContraintesPlanesDouble::Calcul_deps_tdt (..."; @@ -3002,7 +2996,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps } catch ( ... ) { // dans le cas d'une erreur inconnue, on génère également une exception - if ((ParaGlob::NiveauImpression() > 2) || (Permet_affichage() > 0)) + if (Permet_affichage() > 0) { cout << "\n erreur non identifiee sur l'algo de la resolution de sig22_33(bsurb0,hsurh0)=(0,0) " << "\n LoiContraintesPlanesDouble::Calcul_deps_tdt (..."; }; @@ -3092,7 +3086,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps // récup de l'épaisseur et la largeur de départ // on impose que les grandeurs sauvegardées soient dans les limites admises if (Limitation_h_b(sauve_hsurh0,sauve_bsurb0)) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "calcul direct sans Newton " << "\n LoiContraintesPlanesDouble::Calcul_dsigma_deps(... " << endl; }; @@ -3126,7 +3120,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps d_sigma_deps.Affectation_trans_dimension(d_sigma_deps_3D, pluszero); if (mauvaise_convergence) - {if ((ParaGlob::NiveauImpression() > 4) || (Permet_affichage() > 0)) + {if (Permet_affichage() > 0) { cout << "\n valeur final de h/h_0(t+dt)= " << save_resul.hsurh0 << " et de b/b_0(t+dt)= " << save_resul.bsurb0; }; @@ -3155,7 +3149,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps Tenseur3BH sigBH = gijBB_tdt_3D * sig_HH_3D; Tenseur3BH sigBH_t = gijBB_t_3D * sig_HH_t_3D; Calcul_eps_trans_parVarVolume1(sigBH_t,jacobien_0,module_compressibilite,jacobien,sigBH,*(ex.jacobien_t)); - if (((ParaGlob::NiveauImpression() > 4) || (Permet_affichage() > 0)) && mauvaise_convergence) + if ((Permet_affichage() > 0) && mauvaise_convergence) { cout << "\n valeur final de h/h_0(t+dt)= " << save_resul.hsurh0 << " et de b/b_0(t+dt)= " << save_resul.bsurb0; }; diff --git a/comportement/lois_combinees/LoiContraintesPlanesDouble.h b/comportement/lois_combinees/LoiContraintesPlanesDouble.h index 66a6747..1d76196 100755 --- a/comportement/lois_combinees/LoiContraintesPlanesDouble.h +++ b/comportement/lois_combinees/LoiContraintesPlanesDouble.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_combinees/LoiContraintesPlanesDouble_2.cc b/comportement/lois_combinees/LoiContraintesPlanesDouble_2.cc index 9b31794..469e260 100755 --- a/comportement/lois_combinees/LoiContraintesPlanesDouble_2.cc +++ b/comportement/lois_combinees/LoiContraintesPlanesDouble_2.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -89,8 +89,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps // on récupère la dimension de l'espace de travail qui doit-être de dimension 3 // ainsi que le nombre de vecteur: pour l'instant 3 #ifdef MISE_AU_POINT - {if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 5)) - || (Permet_affichage() > 5)) + {if (Permet_affichage() > 5) cout << "\n LoiContraintesPlanesDouble::Calcul_dsigma_deps(..."; if ((ViB->Dimension() != 3) || (ViH->Dimension() != 3)) { cout << "\n***Erreur : la dimension de la base ViB = "<< ViB->Dimension() @@ -161,8 +160,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps #ifdef MISE_AU_POINT - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 8)) - || (Permet_affichage() > 6)) + if (Permet_affichage() > 6) {cout << "\n Vi_B(1)= "<<(*ViB)(1) << " Vi_B(2)= "<<(*ViB)(2) << " Vi_B(3)= "<<(*ViB)(3); cout << "\n Vi_H(1)= "<<(*ViH)(1) << " Vi_H(2)= "<<(*ViH)(2) << " Vi_H(3)= "<<(*ViH)(3); cout << "\n Vi_B(i) = {beta'}_i^{.j} hat{vec g}_j --> beta'= ";betaP_3D.Affiche(); @@ -178,8 +176,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps DepsBB_cin = ((Tenseur3BB*) &DepsBB); // passage en dim 3 delta_epsBB_cin = ((Tenseur3BB*) &delta_epsBB); // passage en dim 3 #ifdef MISE_AU_POINT - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 8)) - || (Permet_affichage() > 6)) + if (Permet_affichage() > 6) {cout << "\n epsBB_tdt_cin "<< (*epsBB_tdt_cin) << "\n DepsBB_cin "<< (*DepsBB_cin) << "\n delta_epsBB_cin "<< (*delta_epsBB_cin) << flush; // en base orthonormee @@ -194,8 +191,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps // on passe ensuite dans le repère V_a qui est donc le nouveau repère, pour ce passage eps_P_BB.ChBase(betaP_3D); #ifdef MISE_AU_POINT - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 6)) + if (Permet_affichage() > 6) {cout << "\n eps_mecaBB_t= "; eps_mecaBB_t.Ecriture(cout); cout << "\n eps_P_BB apres change base donc en V_a "<< eps_P_BB; }; @@ -212,8 +208,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps delta_eps_P_BB.Coor(1,1) += (*delta_epsBB_cin)(k,l) * gamma3D(k,1) * gamma3D(l,1); }; #ifdef MISE_AU_POINT - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 6)) + if (Permet_affichage() > 6) {cout << "\n eps_P_BB avec la cinematique "<< eps_P_BB; cout << "\n Deps_P_BB avec la cinematique "<< Deps_P_BB; cout << "\n delta_eps_P_BB avec la cinematique "<< delta_eps_P_BB << flush; @@ -294,7 +289,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps double& hsurh0 = save_resul.h_tsurh0;double& bsurb0 = save_resul.b_tsurb0; // init // la méthode va mettre à jour les variations bsurb0 et hsurh0 et le jacobien if (Calcul_et_Limitation2_h_b(hsurh0,eps_P_BB,bsurb0,jacobien_tdt_3D,jacobien_0_3D)) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "\n pb limitation val initiales: LoiContraintesPlanesDouble::Calcul_dsigma_deps(... " << flush; }; @@ -352,8 +347,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps // on récupère le premier élément du tableau uniquement double tol = tab_val(1); #ifdef MISE_AU_POINT - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << "\n Newton_prec: tol_= "<< tol; #endif alg_zero.Modif_prec_res_abs(tol); @@ -388,8 +382,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps // on récupère le premier élément du tableau uniquement double tol_rel = tab_val(1); #ifdef MISE_AU_POINT - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) cout << ", tol_relative= "<< tol_rel; #endif alg_zero.Modif_prec_res_rel(tol_rel); @@ -408,7 +401,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps // on vérifie qu'il n'y a pas de pb de convergence double absracinemax=racine_3D.Max_val_abs(); if ((!conver) || (!isfinite(absracinemax)) || (isnan(absracinemax)) ) - { if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 0)) + { if (Permet_affichage() > 0) { cout << "\n**>> non convergence sur l'algo de la resolution de (sigma.V_2=0, sigma.V_3=0),\n"; if (ptintmeca_en_cours != NULL) ptintmeca_en_cours->Signature(); cout << ", nb_incr_total=" << nb_incr_total @@ -425,7 +418,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps } catch (ErrNonConvergence_Newton erreur) { - if ((ParaGlob::NiveauImpression() > 2) || (Permet_affichage() > 0)) + if (Permet_affichage() > 0) { cout << "\n erreur de non convergence avec l'algo de la resolution de" << " (sig'22, sig'33, sig'12)=(0,0,0) " << " on obtient une valeur infinie ou NaN " @@ -443,7 +436,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps } catch ( ... ) { // dans le cas d'une erreur inconnue, on génère également une exception - if ((ParaGlob::NiveauImpression() > 2) || (Permet_affichage() > 0)) + if (Permet_affichage() > 0) { cout << "\n erreur non identifiee sur l'algo de la resolution de " << " (sig'22, sig'33, sig'12)=(0,0,0) " << "\n dernier_residu: "<< residu_3D(1) <<", "< 7)) - || (Permet_affichage() > 6)) + if (Permet_affichage() > 6) { cout << "\nLoiContraintesPlanesDouble::Calcul_dsigma_deps: bonne convergence de Newton "; TenseurHH* ptHH = NevezTenseurHH(sig_HH_3D); sig_HH_3D.BaseAbsolue(*ptHH,giB_tdt_3D); @@ -525,7 +517,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps sig_HH_3D.Inita(0.); // dans le cas ou on est passé par la méthode de newton et que cela n'a pas // convergé, on doit réinitialiser les variables de départ - if ((newtonlocal) && ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2))) + if ((newtonlocal) && (Permet_affichage() > 3)) cout << "\n calcul direct sans Newton "; save_resul.hsurh0 = sauve_hsurh0; save_resul.bsurb0 = sauve_bsurb0; @@ -537,7 +529,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps module_cisaillement= module_cisaillement_3D; if (mauvaise_convergence) - {if ((ParaGlob::NiveauImpression() > 4) || (Permet_affichage() > 0)) + {if (Permet_affichage() > 0) { cout << ": valeur final de h/h_0(t+dt)= " << save_resul.hsurh0 << " et de b/b_0(t+dt)= " << save_resul.bsurb0; }; @@ -566,7 +558,7 @@ void LoiContraintesPlanesDouble::Calcul_dsigma_deps Tenseur3BH sigBH = gijBB_tdt_3D * sig_HH_3D; Tenseur3BH sigBH_t = gijBB_t_3D * sig_HH_t_3D; Calcul_eps_trans_parVarVolume2(sigBH_t,jacobien_0,module_compressibilite,jacobien,sigBH,*(ex.jacobien_t)); - if (((ParaGlob::NiveauImpression() > 4) || (Permet_affichage() > 0)) && mauvaise_convergence) + if ((Permet_affichage() > 0) && mauvaise_convergence) { cout << "\n valeur final de h/h_0(t+dt)= " << save_resul.hsurh0 << " et de b/b_0(t+dt)= " << save_resul.bsurb0; }; @@ -1558,7 +1550,7 @@ void LoiContraintesPlanesDouble::Calcul_eps_trans_parVarVolume1(Tenseur3BH& sigB double hSurh_0 = sqrt((jaco_1D_0 / jaco_1D_tdt) * exp_log_VsurV0) ; // on test les mini-maxi if (hSurh_0 < mini_hsurh0) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) {cout << "\n *** attention hsurh0 " << hSurh_0 << "est inferieur a la limite fixee "< maxi_hsurh0) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) {cout << "\n *** attention bsurb0 " << maxi_hsurh0 << "est superieur a la limite fixee "< 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) {cout << "\n *** attention hsurh0 " << hSurh_0 << "est inferieur a la limite fixee "< maxi_hsurh0) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) {cout << "\n *** attention bsurb0 " << maxi_hsurh0 << "est superieur a la limite fixee "< 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) {cout << "\n *** attention hsurh0 " << hSurh_0 << "est inferieur a la limite fixee "< maxi_hsurh0) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) {cout << "\n *** attention bsurb0 " << maxi_hsurh0 << "est superieur a la limite fixee "< 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "\n LoiContraintesPlanesDouble::Residu_constitutif(... " << endl; erreur_sortie = true; test = -1; // l'erreur n'est pas fatale mais elle signifie que ce n'est pas très normal !! @@ -1941,7 +1933,7 @@ Mat_abstraite& LoiContraintesPlanesDouble::Mat_tangente_constitutif // vérif des grandeurs bool erreur_sortie = false; // pour gestion de sortie d'infos supplémentaires if (Limitation_h_b(hsurh0,bsurb0)) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "\n LoiContraintesPlanesDouble::Mat_tangente_constitutif(... " << endl; erreur_sortie = true; test = -1; // l'erreur n'est pas fatale mais elle signifie que ce n'est pas très normal !! @@ -2056,7 +2048,7 @@ Vecteur& LoiContraintesPlanesDouble::Residu_constitutif_3D(const double & alpha, bool erreur_sortie = false; // pour gestion de sortie d'infos supplémentaires int info_limit = Calcul_et_Limitation2_h_b(hsurh0,eps_P_BB,bsurb0,jacobien_tdt_3D,jacobien_0_3D); if (info_limit) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "\n LoiContraintesPlanesDouble::Residu_constitutif_3D(... " << endl; erreur_sortie = true;test = info_limit - 2; }; @@ -2205,7 +2197,7 @@ Mat_abstraite& LoiContraintesPlanesDouble::Mat_tangente_constitutif_3D {cout << "\n eps_P_BB (dans Va) avant limitation : " ;eps_P_BB.Ecriture(cout);}; int info_limit = Calcul_et_Limitation2_h_b(hsurh0,eps_P_BB,bsurb0,jacobien_tdt_3D,jacobien_0_3D); if (info_limit) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "\n LoiContraintesPlanesDouble::Mat_tangente_constitutif_3D(... " << endl; erreur_sortie = true;test = info_limit - 2; }; @@ -2394,7 +2386,7 @@ bool LoiContraintesPlanesDouble::Limitation_h_b(double& hsurh0, double& bsurb0) { bool retour = false; // il ne faut pas que la nouvelle épaisseur soit inf au mini if (hsurh0 < mini_hsurh0) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) {cout << "\n *** attention hsurh0 " << hsurh0 << ", est inferieur a la limite fixee "< 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) {cout << "\n *** attention bsurb0 " << bsurb0 << ", est inferieur a la limite fixee "< maxi_hsurh0) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) {cout << "\n *** attention hsurh0 " << hsurh0 << ", est superieur a la limite fixee "< maxi_bsurb0) - {if ((ParaGlob::NiveauImpression() > 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) {cout << "\n *** attention bsurb0 " << bsurb0 << ", est superieur a la limite fixee "< formule classique // epsBB33 = 1/2 * (1. -(h_0/h_tdt)**2) avec un maxi de o.5 if (eps_P_BB_3D(3,3) > 0.5) - {if (((Permet_affichage() == 0) && ParaGlob::NiveauImpression() > 0) - || (Permet_affichage() > 0)) + {if (Permet_affichage() > 0) cout << "\n LoiContraintesPlanesDouble::Calcul_et_Limitation2_h_b(.." << "\n **erreur: la deformation d'epaisseur dans V_a "< 3) - || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) {cout << "\n *** attention hsurh0 " << hsurh0 << ", est inferieur a la limite fixee "< maxi_hsurh0) - {if (((Permet_affichage() == 0) && ParaGlob::NiveauImpression() > 3) - || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) {cout << "\n *** attention hsurh0 " << hsurh0 << ", est superieur a la limite fixee "< 0.5) || (epsP_II > 0.5)) if (epsP_I > 0.5) - {if (((Permet_affichage() == 0) && ParaGlob::NiveauImpression() > 0) - || (Permet_affichage() > 0)) + {if (Permet_affichage() > 0) cout << "\n LoiContraintesPlanesDouble::Calcul_et_Limitation2_h_b(.." << "\n **erreur: la deformation eps'_I "< 0.5) - {if (((Permet_affichage() == 0) && ParaGlob::NiveauImpression() > 0) - || (Permet_affichage() > 0)) + {if (Permet_affichage() > 0) cout << "\n LoiContraintesPlanesDouble::Calcul_et_Limitation2_h_b(.." << "\n **erreur: la deformation eps'_II "< 3) - || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) {cout << "\n *** attention bsurb0 " << bsurb0 << ", est inferieur a la limite fixee "< maxi_bsurb0) - {if (((Permet_affichage() == 0) && ParaGlob::NiveauImpression() > 3) - || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) {cout << "\n *** attention bsurb0 " << bsurb0 << ", est superieur a la limite fixee "< 0.5) - {if (((Permet_affichage() == 0) && ParaGlob::NiveauImpression() > 0) - || (Permet_affichage() > 0)) + {if (Permet_affichage() > 0) cout << "\n LoiContraintesPlanesDouble::Calcul_et_Limitation2_h_b(.." << "\n **erreur: la deformation eps'_I (deuxieme passe!!) "< 0.5) - {if (((Permet_affichage() == 0) && ParaGlob::NiveauImpression() > 0) - || (Permet_affichage() > 0)) + {if (Permet_affichage() > 0) cout << "\n LoiContraintesPlanesDouble::Calcul_et_Limitation2_h_b(.." << "\n **erreur: la deformation eps'_II (deuxieme passe!!) "< 3) || (Permet_affichage() > 2)) + {if (Permet_affichage() > 3) cout << "\n LoiContraintesPlanesDouble::Cal_avec_perturbation2(... " << endl; erreur_sortie = true; }; @@ -3043,8 +3026,7 @@ int LoiContraintesPlanesDouble::Calcul_et_Limitation2_h_b Vi_B.CoordoB(a) = gijBB_t_3D * Vi_H(a); #ifdef MISE_AU_POINT - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 4)) + if (Permet_affichage() > 4) {cout << "\n LoiContraintesPlanesDouble::Passage_Calcul_1D_3D_dsigma_DsigmaHH_td( "; cout << "\n base Vi_B(1) "<< Vi_B(1) << "\n base Vi_B(2) "<< Vi_B(2) << "\n base Vi_B(3) "<< Vi_B(3) diff --git a/comportement/lois_combinees/LoiCritere.cc b/comportement/lois_combinees/LoiCritere.cc index 202ce87..13194a9 100755 --- a/comportement/lois_combinees/LoiCritere.cc +++ b/comportement/lois_combinees/LoiCritere.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -2604,9 +2604,7 @@ void LoiCritere::Ecriture_base_info_loi(ofstream& sort,const int cas) // activation du stockage de grandeurs quelconques qui pourront ensuite être récupéré // via le conteneur SaveResul, si la grandeur n'existe pas ici, aucune action void LoiCritere::Activation_stockage_grandeurs_quelconques(list & listEnuQuelc) - { // def du conteneur de grandeurs quelconques, initialisée à 0 - Grandeur_scalaire_double grand_courant(0.); - // récup de la liste de stockage + { // récup de la liste de stockage list & listlocale = ListQuelc_mis_en_acces_localement(); // on parcours la liste des grandeurs à activer // et on remplit la liste locale @@ -2767,8 +2765,7 @@ void LoiCritere::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& DepsBB,DdlElement ptBB->Ecriture(cout); TenseurHH* ptHH = NevezTenseurHH((*(*isig))); (*(*isig)).BaseAbsolue(*ptHH,giB); - cout << "\n base giB(1) "<< giB(1) - << "\n base giB(2) "<< giB(2); + cout << "\n base giB "<< giB; cout << "\n sigHH= en giB "; (*(*isig)).Ecriture(cout); cout << "\n sigma en absolu: "; ptHH->Ecriture(cout); @@ -2981,8 +2978,7 @@ void LoiCritere::Calcul_DsigmaHH_tdt(TenseurHH& sigHH_t,TenseurBB& DepsBB,DdlEle ptBB->Ecriture(cout); TenseurHH* ptHH = NevezTenseurHH(sigHH_tdt); sigHH_tdt.BaseAbsolue(*ptHH,giB_tdt); - cout << "\n base giB(1) "<< giB_tdt(1) - << "\n base giB(2) "<< giB_tdt(2); + cout << "\n base giB "<< giB_tdt; cout << "\n sigHH= en giB "; sigHH_tdt.Ecriture(cout); cout << "\n sigma en absolu: "; ptHH->Ecriture(cout); diff --git a/comportement/lois_combinees/LoiCritere.h b/comportement/lois_combinees/LoiCritere.h index 161d531..97e2155 100755 --- a/comportement/lois_combinees/LoiCritere.h +++ b/comportement/lois_combinees/LoiCritere.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_combinees/LoiCritere2.cc b/comportement/lois_combinees/LoiCritere2.cc index 1bd59c9..3db7614 100755 --- a/comportement/lois_combinees/LoiCritere2.cc +++ b/comportement/lois_combinees/LoiCritere2.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_combinees/LoiDeformationsPlanes.cc b/comportement/lois_combinees/LoiDeformationsPlanes.cc index 834e621..0e3c64b 100755 --- a/comportement/lois_combinees/LoiDeformationsPlanes.cc +++ b/comportement/lois_combinees/LoiDeformationsPlanes.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_combinees/LoiDeformationsPlanes.h b/comportement/lois_combinees/LoiDeformationsPlanes.h index 5a9fca2..b9b7844 100755 --- a/comportement/lois_combinees/LoiDeformationsPlanes.h +++ b/comportement/lois_combinees/LoiDeformationsPlanes.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_combinees/LoiDesMelangesEnSigma.cc b/comportement/lois_combinees/LoiDesMelangesEnSigma.cc index 84c9768..350df5b 100644 --- a/comportement/lois_combinees/LoiDesMelangesEnSigma.cc +++ b/comportement/lois_combinees/LoiDesMelangesEnSigma.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -2539,8 +2539,7 @@ void LoiDesMelangesEnSigma::CalculGrandeurTravail // --- arrivée ici on a une proposition de proportion = proportion_locale #ifdef MISE_AU_POINT - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 5)) + if (Permet_affichage() > 5) { cout << "\n loi melange: proportion avant limitation "<< proportion_locale; } @@ -2550,8 +2549,7 @@ void LoiDesMelangesEnSigma::CalculGrandeurTravail if (proportion_locale < 0.) proportion_locale = 0; if (proportion_locale > 1.) proportion_locale = 1.; #ifdef MISE_AU_POINT - if ( ((Permet_affichage()==0) && (ParaGlob::NiveauImpression() > 7)) - || (Permet_affichage() > 4)) + if (Permet_affichage() > 4) { cout << "\n proportion apres limitation "<< proportion_locale; } @@ -2658,9 +2656,7 @@ void LoiDesMelangesEnSigma::CalculGrandeurTravail }; }; #ifdef MISE_AU_POINT - if (((ParaGlob::NiveauImpression() > 8) && (Permet_affichage() == 0)) - || (Permet_affichage() > 7) - ) + if (Permet_affichage() > 7) { cout << "\n init temperatures:\n " << " lois_internes1->temperature_0= " << lois_internes1->temperature_0 << " lois_internes1->temperature_t= " << lois_internes1->temperature_t diff --git a/comportement/lois_combinees/LoiDesMelangesEnSigma.h b/comportement/lois_combinees/LoiDesMelangesEnSigma.h index 7250209..6ce3b2b 100644 --- a/comportement/lois_combinees/LoiDesMelangesEnSigma.h +++ b/comportement/lois_combinees/LoiDesMelangesEnSigma.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_speciales/Loi_rien1D.cc b/comportement/lois_speciales/Loi_rien1D.cc index f84e7a9..da5c89a 100644 --- a/comportement/lois_speciales/Loi_rien1D.cc +++ b/comportement/lois_speciales/Loi_rien1D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_speciales/Loi_rien1D.h b/comportement/lois_speciales/Loi_rien1D.h index cfac426..7509a8d 100644 --- a/comportement/lois_speciales/Loi_rien1D.h +++ b/comportement/lois_speciales/Loi_rien1D.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_speciales/Loi_rien2D_C.cc b/comportement/lois_speciales/Loi_rien2D_C.cc index cb70855..ec2ce56 100755 --- a/comportement/lois_speciales/Loi_rien2D_C.cc +++ b/comportement/lois_speciales/Loi_rien2D_C.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_speciales/Loi_rien2D_C.h b/comportement/lois_speciales/Loi_rien2D_C.h index 9510239..478b2f1 100755 --- a/comportement/lois_speciales/Loi_rien2D_C.h +++ b/comportement/lois_speciales/Loi_rien2D_C.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_speciales/Loi_rien2D_D.cc b/comportement/lois_speciales/Loi_rien2D_D.cc index 9e87813..4e822fb 100755 --- a/comportement/lois_speciales/Loi_rien2D_D.cc +++ b/comportement/lois_speciales/Loi_rien2D_D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_speciales/Loi_rien2D_D.h b/comportement/lois_speciales/Loi_rien2D_D.h index cbd5fc3..212b0eb 100755 --- a/comportement/lois_speciales/Loi_rien2D_D.h +++ b/comportement/lois_speciales/Loi_rien2D_D.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_speciales/Loi_rien3D.cc b/comportement/lois_speciales/Loi_rien3D.cc index a4dfa11..0c8bc6a 100644 --- a/comportement/lois_speciales/Loi_rien3D.cc +++ b/comportement/lois_speciales/Loi_rien3D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_speciales/Loi_rien3D.h b/comportement/lois_speciales/Loi_rien3D.h index 36f666b..b773ae0 100644 --- a/comportement/lois_speciales/Loi_rien3D.h +++ b/comportement/lois_speciales/Loi_rien3D.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_visco_elastiques/Loi_maxwell1D.cc b/comportement/lois_visco_elastiques/Loi_maxwell1D.cc index b303cce..ace4cbc 100644 --- a/comportement/lois_visco_elastiques/Loi_maxwell1D.cc +++ b/comportement/lois_visco_elastiques/Loi_maxwell1D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_visco_elastiques/Loi_maxwell1D.h b/comportement/lois_visco_elastiques/Loi_maxwell1D.h index c7957cb..e63021c 100644 --- a/comportement/lois_visco_elastiques/Loi_maxwell1D.h +++ b/comportement/lois_visco_elastiques/Loi_maxwell1D.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_visco_elastiques/Loi_maxwell2D_C.cc b/comportement/lois_visco_elastiques/Loi_maxwell2D_C.cc index 66a3161..177525f 100644 --- a/comportement/lois_visco_elastiques/Loi_maxwell2D_C.cc +++ b/comportement/lois_visco_elastiques/Loi_maxwell2D_C.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_visco_elastiques/Loi_maxwell2D_C.h b/comportement/lois_visco_elastiques/Loi_maxwell2D_C.h index 42ac0aa..4002795 100644 --- a/comportement/lois_visco_elastiques/Loi_maxwell2D_C.h +++ b/comportement/lois_visco_elastiques/Loi_maxwell2D_C.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -151,7 +151,7 @@ class Loi_maxwell2D_C : public Loi_comp_abstraite // completer est appelé apres sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor - ,const Loi_comp_abstraite* loi) {}; + ,const Loi_comp_abstraite* loi) {return NULL;}; // ---- récupération d'information: spécifique à certaine classe dérivée double Deformation_plastique() {return 0.;}; diff --git a/comportement/lois_visco_elastiques/Loi_maxwell2D_D.cc b/comportement/lois_visco_elastiques/Loi_maxwell2D_D.cc index 0e53b08..d666f5e 100644 --- a/comportement/lois_visco_elastiques/Loi_maxwell2D_D.cc +++ b/comportement/lois_visco_elastiques/Loi_maxwell2D_D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_visco_elastiques/Loi_maxwell2D_D.h b/comportement/lois_visco_elastiques/Loi_maxwell2D_D.h index 2d0a522..9e91236 100644 --- a/comportement/lois_visco_elastiques/Loi_maxwell2D_D.h +++ b/comportement/lois_visco_elastiques/Loi_maxwell2D_D.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -149,7 +149,7 @@ class Loi_maxwell2D_D : public Loi_comp_abstraite // completer est appelé apres sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor - ,const Loi_comp_abstraite* loi) {}; + ,const Loi_comp_abstraite* loi) {return NULL;}; // ---- récupération d'information: spécifique à certaine classe dérivée double Deformation_plastique() {return 0.;}; diff --git a/comportement/lois_visco_elastiques/Loi_maxwell3D.cc b/comportement/lois_visco_elastiques/Loi_maxwell3D.cc index 12c5f78..b85f238 100644 --- a/comportement/lois_visco_elastiques/Loi_maxwell3D.cc +++ b/comportement/lois_visco_elastiques/Loi_maxwell3D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_visco_elastiques/Loi_maxwell3D.h b/comportement/lois_visco_elastiques/Loi_maxwell3D.h index 450f1ec..ab0539d 100644 --- a/comportement/lois_visco_elastiques/Loi_maxwell3D.h +++ b/comportement/lois_visco_elastiques/Loi_maxwell3D.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -160,7 +160,7 @@ class Loi_maxwell3D : public Loi_comp_abstraite // completer est appelé apres sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois virtual SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor - ,const Loi_comp_abstraite* loi) {}; + ,const Loi_comp_abstraite* loi) {return NULL;}; //------------------------------------------------------------------- diff --git a/comportement/lois_visco_elastiques/Loi_newton1D.cc b/comportement/lois_visco_elastiques/Loi_newton1D.cc index f0f1739..685b67a 100644 --- a/comportement/lois_visco_elastiques/Loi_newton1D.cc +++ b/comportement/lois_visco_elastiques/Loi_newton1D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_visco_elastiques/Loi_newton1D.h b/comportement/lois_visco_elastiques/Loi_newton1D.h index aee4f94..a79af87 100644 --- a/comportement/lois_visco_elastiques/Loi_newton1D.h +++ b/comportement/lois_visco_elastiques/Loi_newton1D.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_visco_elastiques/Loi_newton2D_D.cc b/comportement/lois_visco_elastiques/Loi_newton2D_D.cc index 007e112..956323a 100644 --- a/comportement/lois_visco_elastiques/Loi_newton2D_D.cc +++ b/comportement/lois_visco_elastiques/Loi_newton2D_D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_visco_elastiques/Loi_newton2D_D.h b/comportement/lois_visco_elastiques/Loi_newton2D_D.h index f55d5e8..49f242b 100644 --- a/comportement/lois_visco_elastiques/Loi_newton2D_D.h +++ b/comportement/lois_visco_elastiques/Loi_newton2D_D.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_visco_elastiques/Loi_newton3D.cc b/comportement/lois_visco_elastiques/Loi_newton3D.cc index 8a76d1e..07d0702 100644 --- a/comportement/lois_visco_elastiques/Loi_newton3D.cc +++ b/comportement/lois_visco_elastiques/Loi_newton3D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/lois_visco_elastiques/Loi_newton3D.h b/comportement/lois_visco_elastiques/Loi_newton3D.h index 359d8e0..5e18703 100644 --- a/comportement/lois_visco_elastiques/Loi_newton3D.h +++ b/comportement/lois_visco_elastiques/Loi_newton3D.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/plasticite/Prandtl_Reuss.cc b/comportement/plasticite/Prandtl_Reuss.cc index 2992e67..4a2160d 100755 --- a/comportement/plasticite/Prandtl_Reuss.cc +++ b/comportement/plasticite/Prandtl_Reuss.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/plasticite/Prandtl_Reuss.h b/comportement/plasticite/Prandtl_Reuss.h index 141188d..02c573a 100644 --- a/comportement/plasticite/Prandtl_Reuss.h +++ b/comportement/plasticite/Prandtl_Reuss.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -155,7 +155,7 @@ class Prandtl_Reuss : public Loi_comp_abstraite // completer est appelé apres sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor - ,const Loi_comp_abstraite* loi) {}; + ,const Loi_comp_abstraite* loi) {return NULL;}; // ---- récupération d'information: spécifique à certaine classe dérivée double Deformation_plastique() { return epsilon_barre_t;} diff --git a/comportement/plasticite/Prandtl_Reuss1D.cc b/comportement/plasticite/Prandtl_Reuss1D.cc index a41b297..047e79b 100755 --- a/comportement/plasticite/Prandtl_Reuss1D.cc +++ b/comportement/plasticite/Prandtl_Reuss1D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/plasticite/Prandtl_Reuss1D.h b/comportement/plasticite/Prandtl_Reuss1D.h index 872c0cb..a3a3d45 100644 --- a/comportement/plasticite/Prandtl_Reuss1D.h +++ b/comportement/plasticite/Prandtl_Reuss1D.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -143,7 +143,7 @@ class Prandtl_Reuss1D : public Loi_comp_abstraite // completer est appelé apres sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor - ,const Loi_comp_abstraite* loi) {}; + ,const Loi_comp_abstraite* loi) {return NULL;}; // ---- récupération d'information: spécifique à certaine classe dérivée double Deformation_plastique() { return epsilon_barre_t;} @@ -184,6 +184,7 @@ class Prandtl_Reuss1D : public Loi_comp_abstraite virtual double HsurH0(SaveResul * saveResul) const { cout << "\n Prandtl_Reuss1D::HsurH0(.. , methode non implante pour l'instant "; Sortie(1); + return 0.; // taire le compilo }; // création d'une loi à l'identique et ramène un pointeur sur la loi créée diff --git a/comportement/plasticite/Prandtl_Reuss2D_D.cc b/comportement/plasticite/Prandtl_Reuss2D_D.cc index c40c9c1..ba827d0 100755 --- a/comportement/plasticite/Prandtl_Reuss2D_D.cc +++ b/comportement/plasticite/Prandtl_Reuss2D_D.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/plasticite/Prandtl_Reuss2D_D.h b/comportement/plasticite/Prandtl_Reuss2D_D.h index 91b2da9..a3701b2 100644 --- a/comportement/plasticite/Prandtl_Reuss2D_D.h +++ b/comportement/plasticite/Prandtl_Reuss2D_D.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -143,7 +143,7 @@ class Prandtl_Reuss2D_D : public Loi_comp_abstraite // completer est appelé apres sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor - ,const Loi_comp_abstraite* loi) {}; + ,const Loi_comp_abstraite* loi) {return NULL;}; // ---- récupération d'information: spécifique à certaine classe dérivée double Deformation_plastique() { return epsilon_barre_t;} diff --git a/comportement/thermique/Loi_de_Tait.cc b/comportement/thermique/Loi_de_Tait.cc index 1ae3f5b..97ffc2b 100644 --- a/comportement/thermique/Loi_de_Tait.cc +++ b/comportement/thermique/Loi_de_Tait.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/thermique/Loi_de_Tait.h b/comportement/thermique/Loi_de_Tait.h index f4cc4f4..8ee8fa4 100644 --- a/comportement/thermique/Loi_de_Tait.h +++ b/comportement/thermique/Loi_de_Tait.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -172,7 +172,7 @@ class Loi_de_Tait : public CompThermoPhysiqueAbstraite // completer est appelé apres sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor - ,const CompThermoPhysiqueAbstraite* loi) {}; + ,const CompThermoPhysiqueAbstraite* loi) {return NULL;}; // idem sur un ofstream void Affiche(ofstream& sort); diff --git a/comportement/thermique/Loi_iso_thermo.cc b/comportement/thermique/Loi_iso_thermo.cc index 71b671b..7f33fd7 100644 --- a/comportement/thermique/Loi_iso_thermo.cc +++ b/comportement/thermique/Loi_iso_thermo.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/thermique/Loi_iso_thermo.h b/comportement/thermique/Loi_iso_thermo.h index ae3f70c..e0b17b5 100644 --- a/comportement/thermique/Loi_iso_thermo.h +++ b/comportement/thermique/Loi_iso_thermo.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -168,7 +168,7 @@ class Loi_iso_thermo : public CompThermoPhysiqueAbstraite // completer est appelé apres sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor - ,const CompThermoPhysiqueAbstraite* loi) {}; + ,const CompThermoPhysiqueAbstraite* loi) {return NULL;}; // idem sur un ofstream void Affiche(ofstream& sort); diff --git a/comportement/thermique/Taux_crista/CristaliniteAbstraite.cc b/comportement/thermique/Taux_crista/CristaliniteAbstraite.cc index 6e6a2d0..dd9e967 100644 --- a/comportement/thermique/Taux_crista/CristaliniteAbstraite.cc +++ b/comportement/thermique/Taux_crista/CristaliniteAbstraite.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/thermique/Taux_crista/CristaliniteAbstraite.h b/comportement/thermique/Taux_crista/CristaliniteAbstraite.h index 6c96015..afd3e11 100644 --- a/comportement/thermique/Taux_crista/CristaliniteAbstraite.h +++ b/comportement/thermique/Taux_crista/CristaliniteAbstraite.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/thermique/Taux_crista/Hoffman1.cc b/comportement/thermique/Taux_crista/Hoffman1.cc index 4a2d4cc..b25aa7b 100644 --- a/comportement/thermique/Taux_crista/Hoffman1.cc +++ b/comportement/thermique/Taux_crista/Hoffman1.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/thermique/Taux_crista/Hoffman1.h b/comportement/thermique/Taux_crista/Hoffman1.h index db7d376..9f89399 100644 --- a/comportement/thermique/Taux_crista/Hoffman1.h +++ b/comportement/thermique/Taux_crista/Hoffman1.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/thermique/Taux_crista/Hoffman2.cc b/comportement/thermique/Taux_crista/Hoffman2.cc index ec1ddc6..6dd0d2b 100644 --- a/comportement/thermique/Taux_crista/Hoffman2.cc +++ b/comportement/thermique/Taux_crista/Hoffman2.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/thermique/Taux_crista/Hoffman2.h b/comportement/thermique/Taux_crista/Hoffman2.h index 12008c3..4174f39 100644 --- a/comportement/thermique/Taux_crista/Hoffman2.h +++ b/comportement/thermique/Taux_crista/Hoffman2.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/thermique/ThermoDonnee.cc b/comportement/thermique/ThermoDonnee.cc index 9a01e10..c4eca22 100644 --- a/comportement/thermique/ThermoDonnee.cc +++ b/comportement/thermique/ThermoDonnee.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/comportement/thermique/ThermoDonnee.h b/comportement/thermique/ThermoDonnee.h index 1712b02..c5776f6 100644 --- a/comportement/thermique/ThermoDonnee.h +++ b/comportement/thermique/ThermoDonnee.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/contact/Cercle.cc b/contact/Cercle.cc index 90e3943..43a6e9a 100644 --- a/contact/Cercle.cc +++ b/contact/Cercle.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/contact/Cercle.h b/contact/Cercle.h index 62a4be9..0c252a7 100644 --- a/contact/Cercle.h +++ b/contact/Cercle.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/contact/Cylindre.cc b/contact/Cylindre.cc index ab95d6e..ba870dc 100644 --- a/contact/Cylindre.cc +++ b/contact/Cylindre.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/contact/Cylindre.h b/contact/Cylindre.h index 39092ea..c955d2c 100644 --- a/contact/Cylindre.h +++ b/contact/Cylindre.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/contact/Droite.cc b/contact/Droite.cc index 5ad2293..0fd95ce 100644 --- a/contact/Droite.cc +++ b/contact/Droite.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -28,6 +28,20 @@ // // For more information, please consult: . +#include + +//#define BOOST_STACKTRACE_LINK +//#include +//#include +//#include +//#include +// +//#include "unwind.h" + +//#include +#include +#include +//#include #include "Droite.h" #include "ConstMath.h" @@ -56,14 +70,36 @@ Droite::Droite ( const Coordonnee& B, const Coordonnee& vec) : { cout << "\nErreur : les dimensions du point et du vecteur ne sont pas identique !"; cout <<"\ndim point = " < une seule solution pour la normale { Coordonnee ve(2); ve(1) = -U(2); ve(2) = U(1); @@ -288,6 +357,16 @@ Coordonnee Droite::UneNormale() return ve; } break; + case 4: + // cas ou l'on est en dimension axi -> une seule solution pour la normale + // dans le plan xy car on travaille uniquement dans ce plan + { Coordonnee ve(3); // init à 0. des 3 composantes + ve(1) = -U(2); + ve(2) = U(1); + return ve; + } + break; + } }; diff --git a/contact/Droite.h b/contact/Droite.h index 884b0a9..5489a4c 100644 --- a/contact/Droite.h +++ b/contact/Droite.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -101,6 +101,7 @@ class Droite // calcul l'intercection M de la droite avec une autre droite, ramene 0 s'il n'y // a pas d'Intersection, ramene -1 si l'Intersection ne peut pas etre calculee // et 1 s'il y a un point d'Intersection + // NB: en axisymétrique, on considère que les droites sont dans le plan xy int Intersection( const Droite & D,Coordonnee& M); // calcul si un point donné appartient ou non à la droite (à la précision donnée) @@ -108,6 +109,7 @@ class Droite // ramene une normale, en 2D il y a une solution, en 3D a chaque appel on ramene // une nouvelle normale calculée aleatoirement + // en 3D axi ramène la normale dans le plan xy : solution unique si elle peut-être calculée Coordonnee UneNormale(); // calcul la distance d'un point à la droite diff --git a/contact/ElContact.cc b/contact/ElContact.cc index 18084d7..d72c84a 100644 --- a/contact/ElContact.cc +++ b/contact/ElContact.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -50,6 +50,45 @@ double ElContact::dep_max=1.e15; // au début un nombre très grand par défaut int ElContact::niveau_commentaire=0; // init par défaut -> est mis à jour par les_contacts Fonction_nD * ElContact::fct_pilotage_contact4=NULL ; // pour le pilotage du type de contact 4 + +// stockage transitoire pour les quelconques vraiment quelconque +Tableau ElContact::Fct_nD_contact::tqi_const_fct_nD_penalisationPenetration; +Tableau < TypeQuelconque * > ElContact::Fct_nD_contact::tqi_fct_nD_penalisationPenetration; +Tableau ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penalisationPenetration; + +Tableau ElContact::Fct_nD_contact::tqi_const_fct_nD_penetration_contact_maxi; +Tableau < TypeQuelconque * > ElContact::Fct_nD_contact::tqi_fct_nD_penetration_contact_maxi; +Tableau ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penetration_contact_maxi; + +Tableau ElContact::Fct_nD_contact::tqi_const_fct_nD_penetration_borne_regularisation; +Tableau < TypeQuelconque * > ElContact::Fct_nD_contact::tqi_fct_nD_penetration_borne_regularisation; +Tableau ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penetration_borne_regularisation; + +Tableau ElContact::Fct_nD_contact::tqi_const_fct_nD_force_contact_noeud_maxi; +Tableau < TypeQuelconque * > ElContact::Fct_nD_contact::tqi_fct_nD_force_contact_noeud_maxi; +Tableau ElContact::Fct_nD_contact::t_num_ordre_fct_nD_force_contact_noeud_maxi; + +Tableau ElContact::Fct_nD_contact::tqi_const_fct_nD_penalisationTangentielle; +Tableau < TypeQuelconque * > ElContact::Fct_nD_contact::tqi_fct_nD_penalisationTangentielle; +Tableau ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penalisationTangentielle; + +Tableau ElContact::Fct_nD_contact::tqi_const_fct_nD_tangentielle_contact_maxi; +Tableau < TypeQuelconque * > ElContact::Fct_nD_contact::tqi_fct_nD_tangentielle_contact_maxi; +Tableau ElContact::Fct_nD_contact::t_num_ordre_fct_nD_tangentielle_contact_maxi; + +Tableau ElContact::Fct_nD_contact::tqi_const_fct_nD_tangentielle_borne_regularisation; +Tableau < TypeQuelconque * > ElContact::Fct_nD_contact::tqi_fct_nD_tangentielle_borne_regularisation; +Tableau ElContact::Fct_nD_contact::t_num_ordre_fct_nD_tangentielle_borne_regularisation; + +Tableau ElContact::Fct_nD_contact::tqi_const_fct_nD_force_tangentielle_noeud_maxi; +Tableau < TypeQuelconque * > ElContact::Fct_nD_contact::tqi_fct_nD_force_tangentielle_noeud_maxi; +Tableau ElContact::Fct_nD_contact::t_num_ordre_fct_nD_force_tangentielle_noeud_maxi; + +Tableau ElContact::Fct_nD_contact::tqi_const_fct_nD_niveau_commentaire; +Tableau < TypeQuelconque * > ElContact::Fct_nD_contact::tqi_fct_nD_niveau_commentaire; +Tableau ElContact::Fct_nD_contact::t_num_ordre_fct_nD_niveau_commentaire; + + //----------- fin variables statiques ---------- ///------- particularité class Fct_nD_contact ------------------ @@ -62,6 +101,7 @@ ElContact::Fct_nD_contact::Fct_nD_contact(): ,fct_nD_tangentielle_contact_maxi(NULL) ,fct_nD_tangentielle_borne_regularisation(NULL) ,fct_nD_force_tangentielle_noeud_maxi(NULL) + ,fct_niveau_commentaire(NULL) {}; ElContact::Fct_nD_contact::Fct_nD_contact(const Fct_nD_contact& a) : @@ -73,6 +113,7 @@ ElContact::Fct_nD_contact::Fct_nD_contact(const Fct_nD_contact& a) : ,fct_nD_tangentielle_contact_maxi(a.fct_nD_tangentielle_contact_maxi) ,fct_nD_tangentielle_borne_regularisation(a.fct_nD_tangentielle_borne_regularisation) ,fct_nD_force_tangentielle_noeud_maxi(a.fct_nD_force_tangentielle_noeud_maxi) + ,fct_niveau_commentaire(a.fct_niveau_commentaire) {}; ElContact::Fct_nD_contact::~Fct_nD_contact() @@ -87,29 +128,279 @@ ElContact::Fct_nD_contact& ElContact::Fct_nD_contact::operator= (const ElContact fct_nD_tangentielle_contact_maxi = a.fct_nD_tangentielle_contact_maxi; fct_nD_tangentielle_borne_regularisation = a.fct_nD_tangentielle_borne_regularisation; fct_nD_force_tangentielle_noeud_maxi = a.fct_nD_force_tangentielle_noeud_maxi; + fct_niveau_commentaire = a.fct_niveau_commentaire; return *this; }; + + // initialisation des conteneurs statique des fonction nD + void ElContact::Fct_nD_contact::Init_conteneur_statique() + {// on initialise chaque fct nD + if (fct_nD_penalisationPenetration != NULL) + Definition_conteneurs_static_TypeQuelconque + (fct_nD_penalisationPenetration + ,tqi_fct_nD_penalisationPenetration,tqi_const_fct_nD_penalisationPenetration + ,t_num_ordre_fct_nD_penalisationPenetration); + if (fct_nD_penetration_contact_maxi != NULL) + Definition_conteneurs_static_TypeQuelconque + (fct_nD_penetration_contact_maxi + ,tqi_fct_nD_penetration_contact_maxi,tqi_const_fct_nD_penetration_contact_maxi + ,t_num_ordre_fct_nD_penetration_contact_maxi); + if (fct_nD_penetration_borne_regularisation != NULL) + Definition_conteneurs_static_TypeQuelconque + (fct_nD_penetration_borne_regularisation + ,tqi_fct_nD_penetration_borne_regularisation,tqi_const_fct_nD_penetration_borne_regularisation + ,t_num_ordre_fct_nD_penetration_borne_regularisation); + if (fct_nD_force_contact_noeud_maxi != NULL) + Definition_conteneurs_static_TypeQuelconque + (fct_nD_force_contact_noeud_maxi + ,tqi_fct_nD_force_contact_noeud_maxi,tqi_const_fct_nD_force_contact_noeud_maxi + ,t_num_ordre_fct_nD_force_contact_noeud_maxi); + if (fct_nD_penalisationTangentielle != NULL) + Definition_conteneurs_static_TypeQuelconque + (fct_nD_penalisationTangentielle + ,tqi_fct_nD_penalisationTangentielle,tqi_const_fct_nD_penalisationTangentielle + ,t_num_ordre_fct_nD_penalisationTangentielle); + if (fct_nD_tangentielle_contact_maxi != NULL) + Definition_conteneurs_static_TypeQuelconque + (fct_nD_tangentielle_contact_maxi + ,tqi_fct_nD_tangentielle_contact_maxi,tqi_const_fct_nD_tangentielle_contact_maxi + ,t_num_ordre_fct_nD_tangentielle_contact_maxi); + if (fct_nD_tangentielle_borne_regularisation != NULL) + Definition_conteneurs_static_TypeQuelconque + (fct_nD_tangentielle_borne_regularisation + ,tqi_fct_nD_tangentielle_borne_regularisation,tqi_const_fct_nD_tangentielle_borne_regularisation + ,t_num_ordre_fct_nD_tangentielle_borne_regularisation); + if (fct_nD_force_tangentielle_noeud_maxi != NULL) + Definition_conteneurs_static_TypeQuelconque + (fct_nD_force_tangentielle_noeud_maxi + ,tqi_fct_nD_force_tangentielle_noeud_maxi,tqi_const_fct_nD_force_tangentielle_noeud_maxi + ,t_num_ordre_fct_nD_force_tangentielle_noeud_maxi); + if (fct_niveau_commentaire != NULL) + Definition_conteneurs_static_TypeQuelconque + (fct_niveau_commentaire + ,tqi_fct_nD_niveau_commentaire,tqi_const_fct_nD_niveau_commentaire + ,t_num_ordre_fct_nD_niveau_commentaire); + + }; + + // définition des conteneurs static des TypeQuelconque + void ElContact::Fct_nD_contact::Definition_conteneurs_static_TypeQuelconque + (Fonction_nD * pt_fonct,Tableau < TypeQuelconque * >& tqi,Tableau < const TypeQuelconque * >& tqii + ,Tableau & t_num_ordre ) + {// on commence par récupérer le conteneurs des grandeurs à fournir + const Tableau & tab_queconque = pt_fonct->Tab_enu_quelconque(); + // on dimensionne + int tail_tab_queconque = tab_queconque.Taille(); + tqi.Change_taille(tail_tab_queconque); + t_num_ordre.Change_taille(tail_tab_queconque); + Grandeur_scalaire_entier grand_courant_entier(0); // par défaut pour la création des conteneurs quelconques + Grandeur_scalaire_double grand_courant_double(0.); // par défaut pour la création des conteneurs quelconques + // grandeurs de travail + int dim = ParaGlob::Dimension(); + Coordonnee inter(dim); + Grandeur_coordonnee grand_coor_courant(inter); + + // on va balayer les grandeurs quelconques + for (int i=1;i<= tail_tab_queconque;i++) + { bool trouver = false; + EnumTypeQuelconque enu = tab_queconque(i); + + tqi(i) = NULL; // init + t_num_ordre(i) = 1; //***** pour l'instant uniquement la première coordonnée s'il s'agit d'un Coordonnee + // *** à abonder par la suite !!!!!!!!!! + + // on regarde tout d'abord les grandeurs spécifiques à l'élément contact + switch (enu) + { // il y a des grandeurs vectorielles qui pour l'instant ne sont pas prises en compte + // cf. fct nD + // NORMALE_CONTACT, GLISSEMENT_CONTACT ,PENETRATION_CONTACT,FORCE_CONTACT, + case CONTACT_NB_DECOL: + { tqi(i) = new TypeQuelconque(CONTACT_NB_DECOL,X1,grand_courant_entier); + trouver = true; + break; + } + case CONTACT_PENALISATION_N: + { tqi(i) = new TypeQuelconque(CONTACT_PENALISATION_N,X1,grand_courant_double); + trouver = true; + break; + } + case CONTACT_PENALISATION_T: + { tqi(i) = new TypeQuelconque(CONTACT_PENALISATION_T,X1,grand_courant_double); + trouver = true; + break; + } + case CONTACT_NB_PENET: + { tqi(i) = new TypeQuelconque(CONTACT_NB_PENET,X1,grand_courant_entier); + trouver = true; + break; + } + case CONTACT_CAS_SOLIDE: + { tqi(i) = new TypeQuelconque(CONTACT_CAS_SOLIDE,X1,grand_courant_entier); + trouver = true; + break; + } + case CONTACT_ENERG_GLISSE_ELAS: + { tqi(i) = new TypeQuelconque(CONTACT_ENERG_GLISSE_ELAS,X1,grand_courant_double); + trouver = true; + break; + } + case CONTACT_ENERG_GLISSE_PLAS: + { tqi(i) = new TypeQuelconque(CONTACT_ENERG_GLISSE_PLAS,X1,grand_courant_double); + trouver = true; + break; + } + case CONTACT_ENERG_GLISSE_VISQ: + { tqi(i) = new TypeQuelconque(CONTACT_ENERG_GLISSE_VISQ,X1,grand_courant_double); + trouver = true; + break; + } + case CONTACT_ENERG_PENAL: + { tqi(i) = new TypeQuelconque(CONTACT_ENERG_PENAL,X1,grand_courant_double); + trouver = true; + break; + } + case NOEUD_PROJECTILE_EN_CONTACT: + { tqi(i) = new TypeQuelconque(NOEUD_PROJECTILE_EN_CONTACT,X1,grand_courant_double); + trouver = true; + break; + } + case NOEUD_FACETTE_EN_CONTACT: + { tqi(i) = new TypeQuelconque(NOEUD_FACETTE_EN_CONTACT,X1,grand_courant_double); + Grandeur_scalaire_double& gr= *((Grandeur_scalaire_double*) ((*tqi(i)).Grandeur_pointee())); + trouver = true; + break; + } + case NUM_NOEUD: + { tqi(i) = new TypeQuelconque(NUM_NOEUD,X1,grand_courant_entier); + trouver = true; + break; + } + case NUM_MAIL_NOEUD: + { tqi(i) = new TypeQuelconque(NUM_MAIL_NOEUD,X1,grand_courant_entier); + trouver = true; + break; + } + case POSITION_GEOMETRIQUE: + {tqi(i) = new TypeQuelconque(POSITION_GEOMETRIQUE,X1,grand_coor_courant); + trouver = true; + break; + } + case POSITION_GEOMETRIQUE_t: + {tqi(i) = new TypeQuelconque(POSITION_GEOMETRIQUE_t,X1,grand_coor_courant); + trouver = true; + break; + } + case POSITION_GEOMETRIQUE_t0: + {tqi(i) = new TypeQuelconque(POSITION_GEOMETRIQUE_t0,X1,grand_coor_courant); + trouver = true; + break; + } + // *** pour l'instant la suite n'est pas opérationelle car il s'agit de vecteur + // dont les composantes n'ont pas d'équivalent en ddl_enum_etendu + // il faudrait les définir si on veut pouvoir s'en servir + case PENETRATION_CONTACT: + {tqi(i) = new TypeQuelconque(PENETRATION_CONTACT,X1,grand_coor_courant); + trouver = true; + break; + } + case PENETRATION_CONTACT_T: + {tqi(i) = new TypeQuelconque(PENETRATION_CONTACT_T,X1,grand_coor_courant); + trouver = true; + break; + } + case GLISSEMENT_CONTACT: + {tqi(i) = new TypeQuelconque(GLISSEMENT_CONTACT,X1,grand_coor_courant); + trouver = true; + break; + } + case GLISSEMENT_CONTACT_T: + {tqi(i) = new TypeQuelconque(GLISSEMENT_CONTACT_T,X1,grand_coor_courant); + trouver = true; + break; + } + case NORMALE_CONTACT: + {tqi(i) = new TypeQuelconque(NORMALE_CONTACT,X1,grand_coor_courant); + trouver = true; + break; + } + case FORCE_CONTACT: + {tqi(i) = new TypeQuelconque(FORCE_CONTACT,X1,grand_coor_courant); + trouver = true; + break; + } + case FORCE_CONTACT_T: + {tqi(i) = new TypeQuelconque(POSITION_GEOMETRIQUE,X1,grand_coor_courant); + trouver = true; + break; + } + case CONTACT_COLLANT: + { tqi(i) = new TypeQuelconque(CONTACT_COLLANT,X1,grand_courant_entier); + trouver = true; + break; + } + case NUM_ZONE_CONTACT: + { tqi(i) = new TypeQuelconque(NUM_ZONE_CONTACT,X1,grand_courant_entier); + trouver = true; + break; + } + case NUM_ELEMENT: + { tqi(i) = new TypeQuelconque(NUM_ELEMENT,X1,grand_courant_entier); + trouver = true; + break; + } + case NUM_MAIL_ELEM: + { tqi(i) = new TypeQuelconque(NUM_MAIL_ELEM,X1,grand_courant_entier); + trouver = true; + break; + } + //*** fin + + default: + trouver = false; + break; + }; + + // si on n'a rien trouvé + if (!trouver) + {cout << "\n erreur***: la grandeur " << NomTypeQuelconque(enu) + << " n'existe pas les elements de contact " + << " la fonction nD " << pt_fonct->NomFonction() + << " ne peut pas etre renseignee " + << "\n ElContact::Fct_nD_contact::Definition_conteneurs_static_TypeQuelconque(.." << flush; + pt_fonct->Affiche(); + Sortie(1); + }; + + }; + // tableau de const intermédiaire pour l'appel de la fonction + tqii.Change_taille(tail_tab_queconque); + for (int i=1;i<= tail_tab_queconque;i++) + tqii(i) = tqi(i); + }; + ///------- fin particularité class Fct_nD_contact ------------------ // CONSTRUCTEURS : // par defaut ElContact::ElContact () : - tabNoeud(),Mtdt(ParaGlob::Dimension()),Mt(0) // Mt de dim 0, au début pour dire qu'il n'est pas activé + tabNoeud(),tabNoeud_t() + ,Mtdt(ParaGlob::Dimension()),Mt(0) // Mt de dim 0, au début pour dire qu'il n'est pas activé ,M_noeud_tdt_avant_projection(ParaGlob::Dimension()) ,phi_theta_0() ,force_contact(),force_contact_t(),tabForce_cont(),tabForce_cont_t() ,F_N_max(0.),F_T_max(0.),F_N_max_t(0.),F_T_max_t(0.) ,ddlElement_assemblage(NULL),raideur(NULL),residu(NULL) - ,energie_penalisation(0.),energie_frottement(),elfront(NULL),noeud(NULL) - ,num_zone_contact(0) + ,energie_penalisation(0.),energie_frottement() + ,elfront(NULL),elfront_t(NULL),noeud(NULL),noeud_t(NULL) + ,num_zone_contact(0),normale_lisser(0) ,nb_decol_t(0),nb_decol_tdt(0),gap_t(0.),gap_tdt(0.),nb_pene_t(0.),nb_pene_tdt(0.) ,dep_T_t(0.),dep_T_tdt(0.) ,mult_pene_t(1.),mult_pene_tdt(1.) ,mult_tang_t(1.),mult_tang_tdt(1.) ,actif(1),type_trajectoire_t(0),type_trajectoire_tdt(0) - ,cas_solide(0),cas_collant(0) + ,cas_solide(0),cas_collant(0),nb_change_frontiere(0) ,tabNoeud_pour_assemblage(),tab_posi_esclave() ,nb_posi_esclave_stocker_t(0),nb_posi_esclave_stocker_tdt(0) ,indice_stockage_glissant_t(1),indice_stockage_glissant_tdt(1) @@ -125,20 +416,22 @@ ElContact::ElContact () : // fonction d'un pointeur d'element frontiere et d'un pointeur de noeud // du fait éventuel qu'il peut-être collant ou pas ElContact::ElContact ( const Front * elf, const Noeud * noe, Fct_nD_contact & fct_contact_,int collant): - tabNoeud(),Mtdt(ParaGlob::Dimension()),Mt(0) // Mt de dim 0, au début pour dire qu'il n'est pas activé + tabNoeud(),tabNoeud_t() + ,Mtdt(ParaGlob::Dimension()),Mt(0) // Mt de dim 0, au début pour dire qu'il n'est pas activé ,M_noeud_tdt_avant_projection(ParaGlob::Dimension()) ,phi_theta_0() ,force_contact(ParaGlob::Dimension()),tabForce_cont() ,force_contact_t(ParaGlob::Dimension()),tabForce_cont_t() ,F_N_max(0.),F_T_max(0.),F_N_max_t(0.),F_T_max_t(0.) ,ddlElement_assemblage(NULL),raideur(NULL),residu(NULL) - ,energie_penalisation(0.),energie_frottement(),elfront(NULL),noeud(NULL) - ,num_zone_contact(0) + ,energie_penalisation(0.),energie_frottement() + ,elfront(NULL),elfront_t(NULL),noeud(NULL),noeud_t(NULL) + ,num_zone_contact(0),normale_lisser(0) ,nb_decol_t(0),nb_decol_tdt(0),gap_t(0.),gap_tdt(0.),nb_pene_t(0.),nb_pene_tdt(0.) ,dep_T_t(0.),dep_T_tdt(0.) ,mult_pene_t(1.),mult_pene_tdt(1.),mult_tang_t(1.),mult_tang_tdt(1.) ,actif(1),type_trajectoire_t(0),type_trajectoire_tdt(0) - ,cas_solide(0),cas_collant(collant) + ,cas_solide(0),cas_collant(collant),nb_change_frontiere(0) ,tabNoeud_pour_assemblage(),tab_posi_esclave() ,nb_posi_esclave_stocker_t(0),nb_posi_esclave_stocker_tdt(0) ,indice_stockage_glissant_t(1),indice_stockage_glissant_tdt(1) @@ -151,7 +444,9 @@ ElContact::ElContact ( const Front * elf, const Noeud * noe, Fct_nD_contact & fc // pour le contact 4, pour le calcul de la pénalisation avec une moyenne glissante ,val_penal(10),pt_dans_val_penal(1) { noeud = ( Noeud *) noe; // le noeud esclave + noeud_t = noeud; elfront = new Front(*elf); + elfront_t=elfront; // on cree un nouvelle element generique frontiere identique // pour stocker les info specifique aux intersections et tangence // par contre les info generique (noeuds etc) sont identiques @@ -162,7 +457,8 @@ ElContact::ElContact ( const Front * elf, const Noeud * noe, Fct_nD_contact & fc }; // de copie ElContact::ElContact ( const ElContact & a): - tabNoeud(),Mtdt(a.Mtdt),Mt(a.Mt),M_noeud_tdt_avant_projection(a.M_noeud_tdt_avant_projection) + tabNoeud(),tabNoeud_t() + ,Mtdt(a.Mtdt),Mt(a.Mt),M_noeud_tdt_avant_projection(a.M_noeud_tdt_avant_projection) ,phi_theta_0(a.phi_theta_0) ,force_contact(a.force_contact),tabForce_cont(a.tabForce_cont) ,force_contact_t(a.force_contact_t),tabForce_cont_t(a.tabForce_cont_t) @@ -171,8 +467,9 @@ ElContact::ElContact ( const ElContact & a): ,ddlElement_assemblage(a.ddlElement_assemblage) ,raideur(a.raideur),residu(a.residu) ,energie_penalisation(a.energie_penalisation) - ,energie_frottement(a.energie_frottement),elfront(NULL),noeud(NULL) - ,num_zone_contact(a.num_zone_contact) + ,energie_frottement(a.energie_frottement) + ,elfront(NULL),elfront_t(NULL),noeud(NULL),noeud_t(NULL) + ,num_zone_contact(a.num_zone_contact),normale_lisser(a.normale_lisser) ,nb_decol_t(a.nb_decol_t),nb_decol_tdt(a.nb_decol_tdt) ,gap_t(a.gap_t),gap_tdt(a.gap_tdt),nb_pene_t(a.nb_pene_t),nb_pene_tdt(a.nb_pene_tdt) ,dep_T_t(a.dep_T_t),dep_T_tdt(a.dep_T_tdt) @@ -180,7 +477,7 @@ ElContact::ElContact ( const ElContact & a): ,mult_tang_t(a.mult_tang_t),mult_tang_tdt(a.mult_tang_tdt) ,actif(a.actif),type_trajectoire_t(a.type_trajectoire_t) ,type_trajectoire_tdt(a.type_trajectoire_tdt) - ,cas_solide(a.cas_solide),cas_collant(a.cas_collant) + ,cas_solide(a.cas_solide),cas_collant(a.cas_collant),nb_change_frontiere(a.nb_change_frontiere) ,tabNoeud_pour_assemblage(a.tabNoeud_pour_assemblage),tab_posi_esclave(a.tab_posi_esclave) ,nb_posi_esclave_stocker_t(a.nb_posi_esclave_stocker_t),nb_posi_esclave_stocker_tdt(a.nb_posi_esclave_stocker_tdt) ,indice_stockage_glissant_t(a.indice_stockage_glissant_t),indice_stockage_glissant_tdt(a.indice_stockage_glissant_t) @@ -193,7 +490,9 @@ ElContact::ElContact ( const ElContact & a): // pour le contact 4, pour le calcul de la pénalisation avec une moyenne glissante ,val_penal(a.val_penal),pt_dans_val_penal(a.pt_dans_val_penal) { noeud = a.noeud; + noeud_t = noeud; elfront = new Front(*(a.Elfront())); + elfront_t=elfront; // on cree un nouvelle element generique frontiere identique // pour stocker les info specifique aux intersections et tangence // par contre les info generique (noeuds etc) sont identiques @@ -207,67 +506,127 @@ ElContact::~ElContact () // METHODES PUBLIQUES : // affichage à l'écran des informations liées au contact -void ElContact::Affiche() const - { cout << "\n element de contact "; - if (!actif) cout << " Inactif ! "; - cout << " constitue du noeud " << noeud->Num_noeud() << " du maillage " - << noeud->Num_Mail() << ", et de l'element de frontiere suivant: "; - elfront->Affiche(); - cout << "\n F_contact_noeud: "<< force_contact; - cout << "\n F_contact_facette: "<< tabForce_cont; - cout << "\n norme_F_N: " << F_N_max - << ", norme_F_T: " << F_T_max; - cout << "\n normale: "<< N - << " dep_tangentiel: " << dep_tangentiel; - cout << "\n num_zone_contact " << num_zone_contact - << ", Mtdt: "<< Mtdt - << ", M_noeud_tdt_avant_projection " << M_noeud_tdt_avant_projection - << ", energie_frottement= "<< energie_frottement - << ", energie_penalisation= "<< energie_penalisation - << ", cas_solide= " << cas_solide - << ", cas_collant= " << cas_collant - << ", nb_decol_tdt= " << nb_decol_tdt - << ", gap_tdt= " << gap_tdt - << ", dep_T_tdt= " << dep_T_tdt - << ", nb_pene_tdt= " << nb_pene_tdt - << ", mult_pene_tdt= " << mult_pene_tdt - << ", mult_tang_tdt= " << mult_tang_tdt - << ", penalisation= " << penalisation - << ", penalisation_tangentielle= " << penalisation_tangentielle - << ", type_trajectoire_tdt= " << type_trajectoire_tdt ; - if (niveau_commentaire > 2) - {cout << "\n fct_nD_penalisationPenetration: "; - if (fct_nD_contact.fct_nD_penalisationPenetration != NULL ) - {cout << fct_nD_contact.fct_nD_penalisationPenetration->NomFonction();} - else { cout << " NULL "; }; - cout << "\n fct_nD_penetration_contact_maxi: "; - if (fct_nD_contact.fct_nD_penetration_contact_maxi != NULL ) - {cout << fct_nD_contact.fct_nD_penetration_contact_maxi->NomFonction();} - else { cout << " NULL "; }; - cout << "\n fct_nD_penetration_borne_regularisation: "; - if (fct_nD_contact.fct_nD_penetration_borne_regularisation != NULL ) - {cout << fct_nD_contact.fct_nD_penetration_borne_regularisation->NomFonction();} - else { cout << " NULL "; }; - cout << "\n fct_nD_force_contact_noeud_maxi: "; - if (fct_nD_contact.fct_nD_force_contact_noeud_maxi != NULL ) - {cout << fct_nD_contact.fct_nD_force_contact_noeud_maxi->NomFonction();} - else { cout << " NULL "; }; - cout << "\n fct_nD_penalisationTangentielle: "; - if (fct_nD_contact.fct_nD_penalisationTangentielle != NULL ) - {cout << fct_nD_contact.fct_nD_penalisationTangentielle->NomFonction();} - else { cout << " NULL "; }; - cout << "\n fct_nD_tangentielle_contact_maxi: "; - if (fct_nD_contact.fct_nD_tangentielle_contact_maxi != NULL ) - {cout << fct_nD_contact.fct_nD_tangentielle_contact_maxi->NomFonction();} - else { cout << " NULL "; }; - cout << "\n fct_nD_tangentielle_borne_regularisation: "; - if (fct_nD_contact.fct_nD_tangentielle_borne_regularisation != NULL ) - {cout << fct_nD_contact.fct_nD_tangentielle_borne_regularisation->NomFonction();} - else { cout << " NULL "; }; - cout << "\n fct_nD_force_tangentielle_noeud_maxi: "; - if (fct_nD_contact.fct_nD_force_tangentielle_noeud_maxi != NULL ) - {cout << fct_nD_contact.fct_nD_force_tangentielle_noeud_maxi->NomFonction();} - else { cout << " NULL "; }; +// cas = 0 : affichage en fonction du niveau de commentaire voulu +// cas = 1 : affichage minimal nécessaire pour repérer l'élément +// cas = 2 : affichage minimal en fonction du niveau de commentaire pour les éléments de contact +void ElContact::Affiche(int cas) const + { + if (cas == 1) + {cout << "el contact: noe " + << noeud->Num_noeud() <<" mail. " << noeud->Num_Mail() + << " avec front:"; + if (elfront->Angle_mort()) + cout << "(angle mort)"; + if (normale_lisser) + cout << " (lissage N) "; + if (!actif) cout << " (inactif) "; + cout << elfront->Num_frontiere() + << " de l'EF " << elfront->PtEI()->Num_elt() << " du mail. " + << elfront->PtEI()->Num_maillage() << flush;; + if (Permet_affichage() > 6) + {const Tableau * tabmit = elfront->TabMitoyen(); + if (tabmit != NULL) + {int taille = tabmit->Taille(); + for (int i=1;i<= taille;i++) + cout << " ele_mitoy: "<< (*tabmit)(i)->PtEI()->Num_elt() + << " du mail. " + << (*tabmit)(i)->PtEI()->Num_maillage() << flush; + }; + }; + } + else if (cas == 2) + {if (Permet_affichage() > 5) + {cout << "\n el contact: noe " + << noeud->Num_noeud() <<" mail. " << noeud->Num_Mail() + << " avec front:"; + if (elfront->Angle_mort()) + cout << "(angle mort)"; + if (normale_lisser) + cout << " (lissage N) "; + if (!actif) cout << " (inactif) "; + cout << elfront->Num_frontiere() + << " de l'EF " << elfront->PtEI()->Num_elt() << " du mail. " + << elfront->PtEI()->Num_maillage() << flush; + if (Permet_affichage() > 6) + {const Tableau * tabmit = elfront->TabMitoyen(); + if (tabmit != NULL) + {int taille = tabmit->Taille(); + for (int i=1;i<= taille;i++) + cout << " ele_mitoy: "<< (*tabmit)(i)->PtEI()->Num_elt() + << " du mail. " + << (*tabmit)(i)->PtEI()->Num_maillage() << flush; + }; + }; + }; + // sinon pas d'affichage + } + else + { cout << "\n element de contact "; + if (!actif) cout << " Inactif ! "; + if (normale_lisser) cout << " (lissage N) "; + cout << " constitue du noeud " << noeud->Num_noeud() << " du maillage " + << noeud->Num_Mail() << ", et de l'element de frontiere suivant: "; + elfront->Affiche(); + cout << "\n F_contact_noeud: "<< force_contact; + cout << "\n F_contact_facette: "<< tabForce_cont; + cout << "\n norme_F_N: " << F_N_max + << ", norme_F_T: " << F_T_max; + cout << "\n normale: "<< N + << " dep_tangentiel: " << dep_tangentiel; + cout << "\n num_zone_contact " << num_zone_contact + << ", Mtdt: "<< Mtdt + << ", M_noeud_tdt_avant_projection " << M_noeud_tdt_avant_projection + << ", energie_frottement= "<< energie_frottement + << ", energie_penalisation= "<< energie_penalisation + << ", cas_solide= " << cas_solide + << ", cas_collant= " << cas_collant + << ", nb_decol_tdt= " << nb_decol_tdt + << ", gap_tdt= " << gap_tdt + << ", dep_T_tdt= " << dep_T_tdt + << ", nb_pene_tdt= " << nb_pene_tdt + << ", mult_pene_tdt= " << mult_pene_tdt + << ", mult_tang_tdt= " << mult_tang_tdt + << ", penalisation= " << penalisation + << ", penalisation_tangentielle= " << penalisation_tangentielle + << ", type_trajectoire_tdt= " << type_trajectoire_tdt ; + if (Permet_affichage() > 2) + {cout << "\n fct_nD_penalisationPenetration: "; + if (fct_nD_contact.fct_nD_penalisationPenetration != NULL ) + {cout << fct_nD_contact.fct_nD_penalisationPenetration->NomFonction();} + else { cout << " NULL "; }; + cout << "\n fct_nD_penetration_contact_maxi: "; + if (fct_nD_contact.fct_nD_penetration_contact_maxi != NULL ) + {cout << fct_nD_contact.fct_nD_penetration_contact_maxi->NomFonction();} + else { cout << " NULL "; }; + cout << "\n fct_nD_penetration_borne_regularisation: "; + if (fct_nD_contact.fct_nD_penetration_borne_regularisation != NULL ) + {cout << fct_nD_contact.fct_nD_penetration_borne_regularisation->NomFonction();} + else { cout << " NULL "; }; + cout << "\n fct_nD_force_contact_noeud_maxi: "; + if (fct_nD_contact.fct_nD_force_contact_noeud_maxi != NULL ) + {cout << fct_nD_contact.fct_nD_force_contact_noeud_maxi->NomFonction();} + else { cout << " NULL "; }; + cout << "\n fct_nD_penalisationTangentielle: "; + if (fct_nD_contact.fct_nD_penalisationTangentielle != NULL ) + {cout << fct_nD_contact.fct_nD_penalisationTangentielle->NomFonction();} + else { cout << " NULL "; }; + cout << "\n fct_nD_tangentielle_contact_maxi: "; + if (fct_nD_contact.fct_nD_tangentielle_contact_maxi != NULL ) + {cout << fct_nD_contact.fct_nD_tangentielle_contact_maxi->NomFonction();} + else { cout << " NULL "; }; + cout << "\n fct_nD_tangentielle_borne_regularisation: "; + if (fct_nD_contact.fct_nD_tangentielle_borne_regularisation != NULL ) + {cout << fct_nD_contact.fct_nD_tangentielle_borne_regularisation->NomFonction();} + else { cout << " NULL "; }; + cout << "\n fct_nD_force_tangentielle_noeud_maxi: "; + if (fct_nD_contact.fct_nD_force_tangentielle_noeud_maxi != NULL ) + {cout << fct_nD_contact.fct_nD_force_tangentielle_noeud_maxi->NomFonction();} + else { cout << " NULL "; }; + cout << "\n fct_niveau_commentaire: "; + if (fct_nD_contact.fct_niveau_commentaire != NULL ) + {cout << fct_nD_contact.fct_niveau_commentaire->NomFonction();} + else { cout << " NULL "; }; + }; }; }; @@ -285,11 +644,11 @@ void ElContact::Affiche() const // choisir le meilleur, puisque les choses changent entre avant et après le test de contact // donc ici la position du noeud esclave n'est pas modifiée bool ElContact::Contact( bool init) - { int test = false; // pas de contact par défaut - // on dimensionne éventuellement le tableau des positions successives - if (tab_posi_esclave.Taille() != ParaGlob::param->ParaAlgoControleActifs().Nb_moy_glissant()) - tab_posi_esclave.Change_taille - (ParaGlob::param->ParaAlgoControleActifs().Nb_moy_glissant(),Coordonnee(ParaGlob::Dimension())); + { int test = false; // pas de contact par défaut + // on dimensionne éventuellement le tableau des positions successives + if (tab_posi_esclave.Taille() != ParaGlob::param->ParaAlgoControleActifs().Nb_moy_glissant()) + tab_posi_esclave.Change_taille + (ParaGlob::param->ParaAlgoControleActifs().Nb_moy_glissant(),Coordonnee(ParaGlob::Dimension())); /* // on exclue les cas non traité actuellement // if ((ParaGlob::Dimension() == 3) && (elfront->Eleme()->ElementGeometrique().Dimension()==1)) @@ -328,19 +687,69 @@ bool ElContact::Contact( bool init) // }; // cela va modifier la manière de calculer la trajectoire // }; */ - // on exclue un cas particulier qui ne peut pas être pris en compte a priori - // c'est le cas 1D du contact de la frontière 1D d'un segment avec un point - // le déplacement est forcément colinéaire avec la frontière - // donc les vrais frontières pertinentes - // sont les points d'extrémité mais pas le segment, mais c'est cependant la ligne que - // l'on utilisera pour avoir la notion de in et out donc - if ((ParaGlob::Dimension() == 1) // on est dans un espace 1D - && (elfront->Eleme()->ElementGeometrique().Dimension()==1) // la frontière est une ligne ou un point - && (elfront->Eleme_const()->TabNoeud_const().Taille() > 1 ) // + d'un seul noeud: c'est une ligne - ) - {// le cas du contact avec des lignes en 1D n'est pas recevable a priori, ou plutôt il y a toujours intersection - return false; - }; + // on exclue un cas particulier qui ne peut pas être pris en compte a priori + // c'est le cas 1D du contact de la frontière 1D d'un segment avec un point + // le déplacement est forcément colinéaire avec la frontière + // donc les vrais frontières pertinentes + // sont les points d'extrémité mais pas le segment, mais c'est cependant la ligne que + // l'on utilisera pour avoir la notion de in et out donc + +////debug +// cout << "\n ElContact::Contact: "; this->Affiche(1); +//// fin debug + if ((ParaGlob::Dimension() == 1) // on est dans un espace 1D + && (elfront->Eleme()->ElementGeometrique().Dimension()==1) // la frontière est une ligne ou un point + && (elfront->Eleme_const()->TabNoeud_const().Taille() > 1 ) // + d'un seul noeud: c'est une ligne + ) + {// le cas du contact avec des lignes en 1D n'est pas recevable a priori, ou plutôt il y a toujours intersection + return false; + }; + + // 1) === le cas des angles morts est particulier, on commence par le traiter + if (elfront->Angle_mort()) + { ElFrontiere & elfro = *(elfront->Eleme()); // pour commodite + if (elfro.TypeFrontiere() == "FrontPointF") + {// s'il s'agit d'un point il n'y a pas d'existance de normale + // on remplace la notion de normale par le vecteur qui joint le noeud à la position + // du point frontière + // Coordonnee V = elfro.Ref()- noeud->Coord2(); + const TypeQuelconque& tiq = tabNoeud(2)->Grandeur_quelconque(N_FRONT_t); + const Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) (tiq.Const_Grandeur_pointee())); + N = gr.ConteneurCoordonnee_const(); + + // on utilise la normale au noeud +// oui, mais ici ne sert donc on ne récupère pas +// const TypeQuelconque& tiq = noeud->Grandeur_quelconque(N_FRONT_t); +// const Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) (tiq.Const_Grandeur_pointee())); +// Coordonnee V = gr.ConteneurCoordonnee_const(); +// +// // l'intersection avec la frontière est systématiquement le point frontière +// Coordonnee M1 = elfro.Ref(); + // la seule chose que l'on peut faire pour valider le fait qu'il y a contact ou pas + // c'est de tester si le noeud est à l'intérieur de l'élément d'angle mort ou pas + // c'est plus long qu'un test de surface mais il n'y a pas vraiment d'autre solution + int cas = elfront->PtEI()->Interne_tdt(noeud->Coord2()); + if (Permet_affichage() > 5) + {cout << "\n -- ElContact::Contact: "; + cout << " Interne_tdt ? cas= " << cas <<", "; + this->Affiche(1); + }; + + // cout << "\n debug ElContact::Actualisation, angle mort: cas = " << cas ; + // elfront->Affiche(); + // cout << "\n----------------------------------"; + + return cas; // si != 0 le point est interne + } + else + { cout << "\n *** cas element Angle_mort actuellement non implante: , " + << elfro.TypeFrontiere() + << "\n ElContact::Contact(..."; + Sortie(1); + }; + }; + + // 2) === suite pour le cas différent des angles morts // calcul de la trajectoire a utiliser Coordonnee V = Trajectoire(test); @@ -368,6 +777,8 @@ bool ElContact::Contact( bool init) // on peut alors dire qu'il ne peut pas y avoir contact donc retour if (M1.Dimension() == 0) return false; + + // pour la suite on suppose que l'on a trouvé une intersection // maintenant on regarde si l'intersection est acceptable // -- tout d'abord on arrete si l'intersection est vraiment trop loin du noeud @@ -411,7 +822,11 @@ bool ElContact::Contact( bool init) double gap= N * deltaX; // gap est négatif quand il y a pénétration double borne_regularisation; if (fct_nD_contact.fct_nD_penetration_borne_regularisation != NULL) - {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_borne_regularisation);} + {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penetration_borne_regularisation); + } else {borne_regularisation = ParaGlob::param->ParaAlgoControleActifs().Penetration_borne_regularisation();} // on calcul un facteur en fonction de la distance: = 0.25*exp(-gap/(0.25*borne)) if (gap > borne_regularisation) @@ -488,7 +903,13 @@ bool ElContact::Contact( bool init) if (elem.In_boite_emcombrement_elem(noeud->Coord2())) // on teste alors plus précisemment, si la position finale est dans l'élément // il y a contact - { if (elem.Interne_tdt(noeud->Coord2()) > 0) // point interne ou sur la frontière + { int cas = elem.Interne_tdt(noeud->Coord2()); + if (Permet_affichage() > 5) + {cout << "\n -- ElContact::Contact: "; + cout << " Interne_tdt (particulier 1 surface) ? cas= " << cas <<", "; + this->Affiche(1); + }; + if (cas > 0) // point interne ou sur la frontière { Mtdt = M1; // sauvegarde return true; } @@ -512,7 +933,13 @@ bool ElContact::Contact( bool init) if (elem.In_boite_emcombrement_elem(noeud->Coord2())) // on teste alors plus précisemment, si la position finale est dans l'élément // il y a contact - { if (elem.Interne_tdt(noeud->Coord2()) > 0) // point interne ou sur la frontière + { int cas = elem.Interne_tdt(noeud->Coord2()); + if (Permet_affichage() > 5) + {cout << "\n -- ElContact::Contact: "; + cout << " Interne_tdt (particulier 2 surface) ? cas= " << cas <<", "; + this->Affiche(1); + }; + if (cas > 0) // point interne ou sur la frontière { Mtdt = M1; // sauvegarde return true; } @@ -620,7 +1047,13 @@ bool ElContact::Contact( bool init) if (elem.In_boite_emcombrement_elem(noeud->Coord2())) // on teste alors plus précisemment, si la position finale est dans l'élément // il y a contact - { if (elem.Interne_tdt(noeud->Coord2()) > 0) // point interne ou sur la frontière + { int cas = elem.Interne_tdt(noeud->Coord2()); + if (Permet_affichage() > 5) + {cout << "\n -- ElContact::Contact: "; + cout << " Interne_tdt (particulier 3 surface) ? cas= " << cas <<", "; + this->Affiche(1); + }; + if (cas > 0) // point interne ou sur la frontière { Mtdt = M1; // sauvegarde return true; } @@ -644,7 +1077,13 @@ bool ElContact::Contact( bool init) if (elem.In_boite_emcombrement_elem(noeud->Coord2())) // on teste alors plus précisemment, si la position finale est dans l'élément // il y a contact - { if (elem.Interne_tdt(noeud->Coord2()) > 0) // point interne ou sur la frontière + { int cas = elem.Interne_tdt(noeud->Coord2()); + if (Permet_affichage() > 5) + {cout << "\n -- ElContact::Contact: "; + cout << " Interne_tdt (particulier 4 surface) ? cas= " << cas <<", "; + this->Affiche(1); + }; + if (cas > 0) // point interne ou sur la frontière { Mtdt = M1; // sauvegarde return true; } @@ -706,7 +1145,13 @@ bool ElContact::Contact( bool init) if (elem.In_boite_emcombrement_elem(noeud->Coord2())) // on teste alors plus précisemment, si la position finale est dans l'élément // il y a contact - { if (elem.Interne_tdt(noeud->Coord2()) > 0) // point interne ou sur la frontière + { int cas = elem.Interne_tdt(noeud->Coord2()); + if (Permet_affichage() > 5) + {cout << "\n -- ElContact::Contact: "; + cout << " Interne_tdt (particulier 5 surface) ? cas= " << cas <<", "; + this->Affiche(1); + }; + if (elem.Interne_tdt(noeud->Coord2()) > 0) // point interne ou sur la frontière { Mtdt = M1; // sauvegarde return true; } @@ -745,6 +1190,13 @@ Coordonnee ElContact::Trajectoire(int & test) { // ---> constitution de la droite de projection, et initialisation de V Coordonnee V = noeud->Coord2() - noeud->Coord1(); // trajectoire du noeud de t a tdt ElFrontiere & elfro = *(elfront->Eleme()); // pour commodite +// //debug +// cout << "\n debug ElContact::Trajectoire: "; this->Affiche(1); +// cout << "\n Vinitial= "<< V +// << "\n type de frontiere: " << (elfront->Eleme())->TypeFrontiere(); +// if (actif) +// cout << "\n actif " << actif; +// // fin debug // ------- cas où le contact était déjà effectif à t et que l'on impose la projection sur la surface ------- // if ((actif > 1) && (ParaGlob::param->ParaAlgoControleActifs().ContactType() == 1)) if ((actif > 1) // en fait c'est vrai quelque soit le type de contact @@ -759,84 +1211,89 @@ Coordonnee ElContact::Trajectoire(int & test) // recherche de la normale ,traitement suivant les different cas // dimensionnement des variables de tangence (plan ou droite) int dim = noeud->Dimension(); // dimension des points - if (elfro.TypeFrontiere() == "FrontPointF") - {// cas où la frontière est un point on utilise l'élément linéaire - // dont c'est la frontière, pour calculer la direction de la normale - // qui correspond à la tangent à l'élément - Element * elemf = elfront->PtEI(); // récup de l'élément fini - ElemGeomC0& elem_geom = elemf->ElementGeometrique(); // recup de l'élément géométrique correspondant - // on peut répondre directement s'il s'agit d'un élément de type segment - if (elem_geom.TypeGeometrie() == SEGMENT) - { // on doit avoir un élément de mécanique - ElemMeca & elMeca = (ElemMeca &) (*elemf); - // il n'y a qu'un seul noeud d'ou le pointeur du noeud frontière - Noeud * noe = elfro.TabNoeud()(1); - // récupération de la base locales au noeud noe, pour le temps: temps - const BaseB & baseB = elMeca.Gib_elemeca(TEMPS_tdt,noe); - // le premier vecteur est le vecteur tangent que l'on considère normal à la frontière - V = baseB(1).Coor(); - // on renseigne le point frontière du vecteur tangent qui lui est attribué, ceci pour l'utilisation - // de la fonction: duboncote - } - else - { cout << "\n cas actuellement non implante: element point, frontiere d'une geometrie autre que segment" - << "\n ElContact::Trajectoire(int & test)"; - Sortie(1); - } - } - else - { // dans le cas où il s'agit d'une frontière ligne ou surface - Plan pl(dim); Droite dr(dim); int indic; // def des variables de tangence - // constitution d'un plan tangent ou de la droite tangente au point de reference - elfro.TangentRef(dr,pl,indic); - V = Calcul_Normale(dim,pl,dr, indic); - } - test = type_trajectoire_tdt = 5; return V; - }; - - // ------- cas où soit le contact n'était pas effectif auparavant, - // soit il n'y a pas de projection sur la facette ------- - // on cherche dans quel cas de contact on se trouve - // 3 cas : le noeud bouge ou seul la frontiere bouge ou tout est immobile - double L = V.Norme(); // la distance de t a tdt - if (L <= ConstMath::trespetit) - // cas ou le vecteur est nul c-est a dire, cas ou le noeud n'a pas bouge, on regarde si - // l'element maitre a bougé - { const Tableau & tabnoeud = elfro.TabNoeud(); - int tail = tabnoeud.Taille(); - Coordonnee V11(V); // variation totale - // en fait on peut regarder le mvt du centre de gravité qui à NBE près est - // le V11 qui suit - for (int it=1;it<= tail;it++) - V11 += tabnoeud(it)->Coord2() - tabnoeud(it)->Coord1(); - double L11 = V11.Norme(); - if (L11 <= ConstMath::trespetit) - { // le centre de gravité ne bouge pas, donc soit la frontière est immobile, - // soit il y a rotation autour de G, - // dans ce cas on essaie le maxi du déplacement de chaque noeud - Coordonnee V12(V);double L12=0.; V11=V; L11= V11.Norme();// init - for (int itt=2;itt<=tail;itt++) - { V12=tabnoeud(itt)->Coord2() - tabnoeud(itt)->Coord1(); L12=V12.Norme(); - if (L12 > L11) {V11=V12;L11=L12; }; + + // ----- on traite les cas particuliers des éléments d'angle mort + if (elfront->Angle_mort()) + { if (elfro.TypeFrontiere() == "FrontPointF") + {// s'il s'agit d'un point il n'y a pas d'existance de normale +// // on remplace la notion de normale par le vecteur qui joint le noeud à la position +// // du point frontière +// V = elfro.Ref()- noeud->Coord2(); + // on utilise la normale au noeud + const TypeQuelconque& tiq = tabNoeud(2)->Grandeur_quelconque(N_FRONT_t); + const Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) (tiq.Const_Grandeur_pointee())); + N = gr.ConteneurCoordonnee_const(); + V=N; + test = type_trajectoire_tdt = 5; + } + else + { cout << "\n *** cas element Angle_mort actuellement non implante: , " + << elfro.TypeFrontiere() + << "\n ElContact::Trajectoire(int & test)"; + Sortie(1); }; - // on reteste la nouvelle longueur L11 finale - if (L11 > ConstMath::trespetit) - // cas où il y a rotation autour de G, et V11 est le maxi des déplacements - { test = type_trajectoire_tdt = 4; return V11;}; - // sinon on sort des deux if (on sera à: // -<<>>-- ) et on en conclue que vraiment rien ne bouge ! - } - else - // cas où le centre de gravité bouge et V11 est le déplacement de G - { test = type_trajectoire_tdt = 2; return V11;}; - // -<<>>-- là vraiment il n'y a rien qui bouge sur la frontière - // --on prendra comme direction la normale a l'element - // recherche de la normale ,traitement suivant les different cas - { // dimensionnement des variables de tangence (plan ou droite) - int dim = noeud->Dimension(); // dimension des points + } + // ---- maintenant on regarde si on veut une normale lissée + else if (normale_lisser) + {// dans le cas d'une normale lissée on va utiliser une interpolation des normales aux noeuds + ElFrontiere & elfro = *(elfront->Eleme()); // pour commodite + // recup et actualisation du dernier plan tangent, coordonnées locale etc. + // dimensionnement des variables de tangence + Plan pl(dim); Droite dr(dim); int indic; // def des variables de tangence +// //debug +// cout << "\n debug ElContact::Trajectoire: "; +// cout << "\n elfro.DernierTangent " << flush; +// // fin debug + elfro.DernierTangent(dr,pl,indic,false); + // récup des fonctions phi + const Vecteur& phii = elfro.Phi(); + // on parcours les noeuds de la frontière + // retourne le tableau de noeud en lecture lecture/écriture + Tableau & tNfront = elfro.TabNoeud(); + int nbNfront = tNfront.Taille(); + Coordonnee Nnoe(dim); // variable inter + for (int inoe = 1;inoe <= nbNfront;inoe++) + { const TypeQuelconque& tiq = tNfront(inoe)->Grandeur_quelconque(N_FRONT_t); + const Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) (tiq.Const_Grandeur_pointee())); + Nnoe = gr.ConteneurCoordonnee_const(); + N += phii(inoe)*Nnoe; + }; + double norme = N.Norme(); +// //debug +// cout << "\n debug ElContact::Trajectoire: "; +// cout << "\n norme= "<< norme; +// cout << " elfro.TypeFrontiere()= "<< elfro.TypeFrontiere() << flush; +// // fin debug + + // dans le cas improbable, mais qui arrive, que norme = 0: + // cas par exemple d'un élément dont la somme des normales aux == 0 + // on se rabat sur le calcul classique + if (Dabs(norme) < ConstMath::petit) + {// dans le cas où il s'agit d'une frontière ligne ou surface + Plan pl(dim); Droite dr(dim); int indic; // def des variables de tangence + // constitution d'un plan tangent ou de la droite tangente au point de reference + elfro.TangentRef(dr,pl,indic); + V= Calcul_Normale(dim,pl,dr, indic); + } + else // sinon c'est ok + {N /= norme; + V=N; + }; + + test = type_trajectoire_tdt = 5; + } + // --- on continue avec les éléments qui ne sont pas d'angle mort et sans lissage + else + { +// //debug +// cout << "\n debug ElContact::Trajectoire: "; +// cout << " elfro.TypeFrontiere()= "<< elfro.TypeFrontiere() << flush; +// // fin debug if (elfro.TypeFrontiere() == "FrontPointF") - {// cas où la frontière est un point on utilise l'élément linéaire dont c'est la frontière - // pour calculer la direction de la normale qui correspond à la tangent à l'élément + {// cas où la frontière est un point on utilise l'élément linéaire + // dont c'est la frontière, pour calculer la direction de la normale + // qui correspond à la tangent à l'élément Element * elemf = elfront->PtEI(); // récup de l'élément fini ElemGeomC0& elem_geom = elemf->ElementGeometrique(); // recup de l'élément géométrique correspondant // on peut répondre directement s'il s'agit d'un élément de type segment @@ -845,18 +1302,18 @@ Coordonnee ElContact::Trajectoire(int & test) ElemMeca & elMeca = (ElemMeca &) (*elemf); // il n'y a qu'un seul noeud d'ou le pointeur du noeud frontière Noeud * noe = elfro.TabNoeud()(1); - // récupération de la base locales au noeud noe, pour le temps: temps + // récupération de la base locales au noeud noe, pour le temps: temps const BaseB & baseB = elMeca.Gib_elemeca(TEMPS_tdt,noe); // le premier vecteur est le vecteur tangent que l'on considère normal à la frontière V = baseB(1).Coor(); // on renseigne le point frontière du vecteur tangent qui lui est attribué, ceci pour l'utilisation // de la fonction: duboncote - } + } else - { cout << "\n cas actuellement non implante: element point, frontiere d'une geometrie autre que segment" + { cout << "\n *** cas actuellement non implante: element point, frontiere d'une geometrie autre que segment" << "\n ElContact::Trajectoire(int & test)"; - Sortie(1); - } + Sortie(1); + } } else { // dans le cas où il s'agit d'une frontière ligne ou surface @@ -865,13 +1322,119 @@ Coordonnee ElContact::Trajectoire(int & test) elfro.TangentRef(dr,pl,indic); V = Calcul_Normale(dim,pl,dr, indic); }; - test = type_trajectoire_tdt = 0; return V; - }; + test = type_trajectoire_tdt = 5; + }; } else - // lorsque l'on arrive ici, c'est donc que le noeud bouge, et c'est son déplacement - // qui est retenue comme trajectoire - {test = type_trajectoire_tdt = 1; return V ; }; + { // ------- cas où soit le contact n'était pas effectif auparavant, + // soit il n'y a pas de projection sur la facette ------- + // on cherche dans quel cas de contact on se trouve + // 3 cas : le noeud bouge ou seul la frontiere bouge ou tout est immobile + double L = V.Norme(); // la distance de t a tdt + if (L <= ConstMath::trespetit) + // cas ou le vecteur est nul c-est a dire, cas ou le noeud n'a pas bouge, on regarde si + // l'element maitre a bougé + { const Tableau & tabnoeud = elfro.TabNoeud(); + int tail = tabnoeud.Taille(); + Coordonnee V11(V); // variation totale + // en fait on peut regarder le mvt du centre de gravité qui à NBE près est + // le V11 qui suit + for (int it=1;it<= tail;it++) + V11 += tabnoeud(it)->Coord2() - tabnoeud(it)->Coord1(); + double L11 = V11.Norme(); + bool rien_ne_bouge = true; + if (L11 <= ConstMath::trespetit) + { // le centre de gravité ne bouge pas, donc soit la frontière est immobile, + // soit il y a rotation autour de G, + // dans ce cas on essaie le maxi du déplacement de chaque noeud + Coordonnee V12(V);double L12=0.; V11=V; L11= V11.Norme();// init + for (int itt=2;itt<=tail;itt++) + { V12=tabnoeud(itt)->Coord2() - tabnoeud(itt)->Coord1(); L12=V12.Norme(); + if (L12 > L11) {V11=V12;L11=L12; }; + }; + // on reteste la nouvelle longueur L11 finale + if (L11 > ConstMath::trespetit) + // cas où il y a rotation autour de G, et V11 est le maxi des déplacements + { test = type_trajectoire_tdt = 4; V=V11;rien_ne_bouge=false;}; + // sinon on sort des deux if (on sera à: // -<<>>-- ) et on en conclue que vraiment rien ne bouge ! + } + else + // cas où le centre de gravité bouge et V11 est le déplacement de G + { test = type_trajectoire_tdt = 2; V = V11;rien_ne_bouge=false;}; + + // -<<>>-- là vraiment il n'y a rien qui bouge sur la frontière + // --on prendra comme direction la normale a l'element + if (rien_ne_bouge) + // recherche de la normale ,traitement suivant les different cas + { // dimensionnement des variables de tangence (plan ou droite) + int dim = noeud->Dimension(); // dimension des points + + // on traite les cas particuliers des éléments d'angle mort + if (elfront->Angle_mort()) + { if (elfro.TypeFrontiere() == "FrontPointF") + {// s'il s'agit d'un point il n'y a pas d'existance de normale + // // on remplace la notion de normale par le vecteur qui joint le noeud à la position + // // du point frontière + // V = elfro.Ref()- noeud->Coord2(); + + // on utilise la normale au noeud + const TypeQuelconque& tiq = tabNoeud(2)->Grandeur_quelconque(N_FRONT_t); + const Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) (tiq.Const_Grandeur_pointee())); + V = gr.ConteneurCoordonnee_const(); + } + else + { cout << "\n *** cas element Angle_mort actuellement non implante: , " + << elfro.TypeFrontiere() + << "\n ElContact::Trajectoire(int & test)"; + Sortie(1); + }; + } + else + { if (elfro.TypeFrontiere() == "FrontPointF") + {// cas où la frontière est un point on utilise l'élément linéaire dont c'est la frontière + // pour calculer la direction de la normale qui correspond à la tangent à l'élément + Element * elemf = elfront->PtEI(); // récup de l'élément fini + ElemGeomC0& elem_geom = elemf->ElementGeometrique(); // recup de l'élément géométrique correspondant + // on peut répondre directement s'il s'agit d'un élément de type segment + if (elem_geom.TypeGeometrie() == SEGMENT) + { // on doit avoir un élément de mécanique + ElemMeca & elMeca = (ElemMeca &) (*elemf); + // il n'y a qu'un seul noeud d'ou le pointeur du noeud frontière + Noeud * noe = elfro.TabNoeud()(1); + // récupération de la base locales au noeud noe, pour le temps: temps + const BaseB & baseB = elMeca.Gib_elemeca(TEMPS_tdt,noe); + // le premier vecteur est le vecteur tangent que l'on considère normal à la frontière + V = baseB(1).Coor(); + // on renseigne le point frontière du vecteur tangent qui lui est attribué, ceci pour l'utilisation + // de la fonction: duboncote + } + else + { cout << "\n **** cas actuellement non implante: element point, frontiere d'une geometrie autre que segment" + << "\n ElContact::Trajectoire(int & test)"; + Sortie(1); + } + } + else + { // dans le cas où il s'agit d'une frontière ligne ou surface + Plan pl(dim); Droite dr(dim); int indic; // def des variables de tangence + // constitution d'un plan tangent ou de la droite tangente au point de reference + elfro.TangentRef(dr,pl,indic); + V = Calcul_Normale(dim,pl,dr, indic); + }; + }; + test = type_trajectoire_tdt = 0; + }; + } + else + // lorsque l'on arrive ici, c'est donc que le noeud bouge, et c'est son déplacement + // qui est retenue comme trajectoire + {test = type_trajectoire_tdt = 1;}; + }; +// //debug +// cout << "\n debug ElContact::Trajectoire: V= " << V << flush; +// // fin debug + // retour + return V; }; @@ -885,184 +1448,226 @@ Coordonnee ElContact::Intersection( const Coordonnee& V,bool init) // dimensionnement des variables de tangence (plan ou droite) int dim = noeud->Dimension(); // dimension des points Plan pl(dim); Droite dr(dim); int indic; // def des variables de tangence - if (init) - // constitution d'un plan tangent ou de la droite tangente au point de reference - elfro.TangentRef(dr,pl,indic); - else - // on reactualise le dernier plan tangent - elfro.DernierTangent(dr,pl,indic); -////---- debug -//if (noeud->Num_noeud() == 2) -// {cout << "\n debug : ElContact::Intersection(.. "; -// // on vérifie la perpendicularité -// double perpen = dr.VecDroite() * V; -// cout << "\n diff normale : "<< perpen ; -// cout <Coord1(); - if (((actif > 1) - && ( (contactType == 1) || (contactType == 3) ) - ) - // dans le cas du type 4 on fait toujours une projection normale - || ((actif > 0) && (contactType == 4)) - ) - pointDeBase = noeud->Coord2(); -////---- debug -//if (noeud->Num_noeud() == 2) -// {cout << "\n debug : ElContact::Intersection(.. "; -// cout << "\n pointDeBase : "<< pointDeBase ; -// }; -////---- fin debug - Droite droite(pointDeBase,V); // la droite - // dans le cas très particulier où l'élément de frontière maître est un point: - if (indic == 0) - { // il n'y a qu'un seul noeud d'ou le pointeur du noeud frontière - Noeud * noe = elfro.TabNoeud()(1); - Coordonnee point_frontiere=noe->Coord2(); - // on regarde si le point frontière est sur la trajectoire - if (droite.Appartient_a_la_droite(point_frontiere)) - { // le point frontière est sur la trajectoire, l'intersection est donc au noeud frontière - // les fonctions d'interpolations du premier point en contact - if (init) - {phi_theta_0 = elfro.Phi();}; - return point_frontiere; + + // on traite tout d'abord les cas particuliers des éléments d'angle mort + if (elfront->Angle_mort()) + { if (elfro.TypeFrontiere() == "FrontPointF") + {// s'il s'agit d'un point il n'y a pas d'existance de normale + const TypeQuelconque& tiq = tabNoeud(2)->Grandeur_quelconque(N_FRONT_t); + const Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) (tiq.Const_Grandeur_pointee())); + N = gr.ConteneurCoordonnee_const(); + // l'intersection est considérée toujours valide et est égale aux coordonnées + // du point frontière + return elfro.Ref(); } else - { // il n'y a pas d'intersection, on ramène un point de dimension nulle - Coordonnee retour(0); - return retour; - } - }; - -////---- debug -//if (noeud->Num_noeud() == 2) -// {cout << "\n debug : ElContact::Intersection(.. "; -// // on vérifie la perpendicularité -// double perpen = dr.VecDroite() * droite.VecDroite(); -// cout << " diff normale2 : "<< perpen ; -// cout <ParaAlgoControleActifs().Nb_boucle_newton_position_sur_frontiere(); - // distance maxi entre le point d'inter du plan et le point correspondant de la surface - double dismini = ParaGlob::param->ParaAlgoControleActifs().Precision_pt_sur_front(); - //--------------------------------------- - // recherche du point d'intersection M - //--------------------------------------- - do - { - // calcul de l'intersection - if (indic == 1) - // cas d'une droite - { int ret = dr.Intersection(droite,M); - if (( ret == 0) || ( ret == -1)) // pas d'intersection, on essaie deux autres points - { for (int i=1;i<= 2; i++) - { elfro.AutreTangent(dr,pl,indic); // on suppose indic du meme type - ret = dr.Intersection(droite,M); - if (ret) { intp = 1; break;}; - }; - // dernier essai, on perturbe 2 fois la trajectoire - for (int i=1;i<=2; i++) - { Coordonnee newtra = droite.VecDroite() + 0.1 * droite.UneNormale(); - droite.Change_vect(newtra); - for (int i=1;i<= 2; i++) - { elfro.AutreTangent(dr,pl,indic); // on suppose indic du meme type - ret = dr.Intersection(droite,M); - if (ret) { intp = 1; break;}; - }; - if (intp) break; - }; - } - else - intp = 1; // on a trouve un point - } - else - // cas d'un plan - { int ret = pl.Intersection(droite,M); - if (( ret == 0) || ( ret == -1)) // pas d'intersection, on essaie trois autres points - { for (int i=1;i<= 3; i++) - { elfro.AutreTangent(dr,pl,indic); // on suppose indic du meme type - ret = pl.Intersection(droite,M); - if (ret) { intp = 1; break;}; - }; - // dernier essai, on perturbe 2 fois la trajectoire - for (int i=1;i<=2; i++) - { Coordonnee newtra = droite.VecDroite() + 0.1 * droite.UneNormale(); - droite.Change_vect(newtra); - for (int i=1;i<= 2; i++) - { elfro.AutreTangent(dr,pl,indic); // on suppose indic du meme type - ret = dr.Intersection(droite,M); - if (ret) { intp = 1; break;}; - }; - if (intp) break; - }; + { cout << "\n *** cas element Angle_mort actuellement non implante: , " + << elfro.TypeFrontiere() + << "\n ElContact::Intersection(..."; + Sortie(1); + }; + + } + else + { // cas des éléments de contact autres que ceux qui décrivent les angles morts + if (init) + // constitution d'un plan tangent ou de la droite tangente au point de reference + elfro.TangentRef(dr,pl,indic); + else + // on reactualise le dernier plan tangent + elfro.DernierTangent(dr,pl,indic); +// //---- debug +// if (noeud->Num_noeud() == 29) +// {cout << "\n debug : ElContact::Intersection(.. "; +// // on vérifie la perpendicularité +// double perpen = dr.VecDroite() * V; +// cout << "\n diff normale : "<< perpen ; +// cout << " N= "; +// cout <Coord1(); + if (((actif > 1) + && ( (contactType == 1) || (contactType == 3) ) + ) + // dans le cas du type 4 on fait toujours une projection normale + || ((actif > 0) && (contactType == 4)) + ) + pointDeBase = noeud->Coord2(); +// //---- debug +// if (noeud->Num_noeud() == 29) +// {cout << "\n debug : ElContact::Intersection(.. "; +// cout << "\n pointDeBase : "<< pointDeBase ; +// }; +// //---- fin debug + Droite droite(pointDeBase,V); // la droite + // dans le cas très particulier où l'élément de frontière maître est un point: + if (indic == 0) + { // il n'y a qu'un seul noeud d'ou le pointeur du noeud frontière + Noeud * noe = elfro.TabNoeud()(1); + Coordonnee point_frontiere=noe->Coord2(); + // on regarde si le point frontière est sur la trajectoire + if (droite.Appartient_a_la_droite(point_frontiere)) + { // le point frontière est sur la trajectoire, l'intersection est donc au noeud frontière + // les fonctions d'interpolations du premier point en contact + if (init) + {phi_theta_0 = elfro.Phi();}; + return point_frontiere; } else - intp = 1; // on a trouve un point + { // il n'y a pas d'intersection, on ramène un point de dimension nulle + Coordonnee retour(0); + return retour; + } }; - if (intp) - // calcul du point M1 de la surface correspondant a M - { elfro.Tangent(M,M1,dr,pl,indic); - nm = (M1 - M).Norme(); - } - else - { // on n'arrive pas à calculer un point d'intersection - if (niveau_commentaire >= 7) - {cout << "\n remarque , pas d'intersection " - << " entre la trajectoire du noeud esclave " - << noeud->Num_noeud() <<" mail= " << noeud->Num_Mail() - << " avec frontiere:" - << elfront->Num_frontiere() - << " de l'element " << elfront->PtEI()->Num_elt() << " du maillage " - << elfront->PtEI()->Num_maillage() << " \n "; - }; - if (niveau_commentaire >= 9) - { noeud->Affiche(); - elfro.Affiche(); - cout << "ElContact::Intersection(bool init, bool forcee)"<< endl; + +// //---- debug +// if (noeud->Num_noeud() == 29) +// {cout << "\n debug : ElContact::Intersection(.. "; +// // on vérifie la perpendicularité +// double perpen = dr.VecDroite() * droite.VecDroite(); +// cout << " diff normale2 : "<< perpen ; +// cout <ParaAlgoControleActifs().Nb_boucle_newton_position_sur_frontiere(); + // distance maxi entre le point d'inter du plan et le point correspondant de la surface + double dismini = ParaGlob::param->ParaAlgoControleActifs().Precision_pt_sur_front(); + //--------------------------------------- + // recherche du point d'intersection M + //--------------------------------------- + do + { + // calcul de l'intersection + if (indic == 1) + // cas d'une droite + { int ret = dr.Intersection(droite,M); + if (( ret == 0) || ( ret == -1)) // pas d'intersection, on essaie deux autres points + { for (int i=1;i<= 2; i++) + { elfro.AutreTangent(dr,pl,indic); // on suppose indic du meme type + ret = dr.Intersection(droite,M); + if (ret > 0 ) { intp = 1; break;}; + }; + // dernier essai, on perturbe 2 fois la trajectoire + for (int i=1;i<=2; i++) + { Coordonnee newtra = droite.VecDroite() + 0.1 * droite.UneNormale(); + //// debug + //{ double d = newtra.Norme(); + // // if (d <= ConstMath::trespetit) + // if (d <= ConstMath::petit) // *****pour test + // { cout << "\n*** (1) debug ElContact::Intersection : la norme du vecteur est trop petite !"; + // cout <<"\nnorme = " << d << " newtra= " << newtra ; + // } + //} + //// fin debug + droite.Change_vect(newtra); + for (int i=1;i<= 2; i++) + { elfro.AutreTangent(dr,pl,indic); // on suppose indic du meme type + ret = dr.Intersection(droite,M); + if (ret > 0) { intp = 1; break;}; + }; + if (intp) break; + }; + } + else + intp = 1; // on a trouve un point + } + else + // cas d'un plan + { int ret = pl.Intersection(droite,M); + if (( ret == 0) || ( ret == -1)) // pas d'intersection, on essaie trois autres points + { for (int i=1;i<= 3; i++) + { elfro.AutreTangent(dr,pl,indic); // on suppose indic du meme type + ret = pl.Intersection(droite,M); + if (ret > 0) { intp = 1; break;}; + }; + // dernier essai, on perturbe 2 fois la trajectoire + for (int i=1;i<=2; i++) + { Coordonnee newtra = droite.VecDroite() + 0.1 * droite.UneNormale(); + droite.Change_vect(newtra); + // // debug + // { double d = newtra.Norme(); + // // if (d <= ConstMath::trespetit) + // if (d <= ConstMath::petit) // *****pour test + // { cout << "\n*** (2) debug ElContact::Intersection : la norme du vecteur est trop petite !"; + // cout <<"\nnorme = " << d << " newtra= " << newtra ; + // } + // } + // // fin debug + for (int i=1;i<= 2; i++) + { elfro.AutreTangent(dr,pl,indic); // on suppose indic du meme type + ret = dr.Intersection(droite,M); + if (ret > 0) { intp = 1; break;}; + }; + if (intp) break; + }; + } + else + intp = 1; // on a trouve un point }; - // on considère qu'il n'y a pas d'intersection (donc on n'en tient pas compte) et retour - // évite au programme de planter globalement alors qu'il n'y a peut-être qu'un pb local - Coordonnee retour(0); - return retour; - }; - // test d'arret si l'on est en dehors de la boite d'encombrement - // sauf dans le cas d'un contact collant car pour le collant: l'intersection est toujours valide - // ensuite il y aura éventuellement un choix entre différents éléments de contact -// cout << "\n"; M1.Affiche();elfront->Encom_mini_FR().Affiche();elfront->Encom_maxi_FR().Affiche();cout << endl; - if (!cas_collant) - if (!(elfront->In_boite_emcombrement_front(M1))) - break; - compteur++; - } - while ((compteur <= max_compteur) && (nm >= dismini)) ; - // retour du point d'intersection -////////debug -// if (noeud->Num_noeud()==84) -// { -// cout << "\n debug ElContact::Intersection : noeud: " << noeud->Num_noeud() <<" mail= " << noeud->Num_Mail() -// << " avec frontiere:" << elfront->Num_frontiere() -// << " de l'element " << elfront->PtEI()->Num_elt() << " du maillage " -// << elfront->PtEI()->Num_maillage(); -// cout <<"\n Noe_atdt= " << noeud->Coord2() << "\n point projete= " << M1 << endl; -// }; -////// fin debug - // les fonctions d'interpolations du premier point en contact - if (init) - {phi_theta_0 = elfro.Phi();}; - // retour du point d'intersection - return M1; + if (intp) + // calcul du point M1 de la surface correspondant a M + { elfro.Tangent(M,M1,dr,pl,indic); + nm = (M1 - M).Norme(); + } + else + { // on n'arrive pas à calculer un point d'intersection + if (Permet_affichage() >= 7) + {cout << "\n remarque , pas d'intersection " + << " entre la trajectoire du noeud esclave " + << noeud->Num_noeud() <<" mail= " << noeud->Num_Mail() + << " avec frontiere:" + << elfront->Num_frontiere() + << " de l'element " << elfront->PtEI()->Num_elt() << " du maillage " + << elfront->PtEI()->Num_maillage() << " \n "; + }; + if (Permet_affichage() >= 9) + { noeud->Affiche(); + elfro.Affiche(); + cout << "ElContact::Intersection(bool init, bool forcee)"<< endl; + }; + // on considère qu'il n'y a pas d'intersection (donc on n'en tient pas compte) et retour + // évite au programme de planter globalement alors qu'il n'y a peut-être qu'un pb local + Coordonnee retour(0); + return retour; + }; + // test d'arret si l'on est en dehors de la boite d'encombrement + // sauf dans le cas d'un contact collant car pour le collant: l'intersection est toujours valide + // ensuite il y aura éventuellement un choix entre différents éléments de contact + // cout << "\n"; M1.Affiche();elfront->Encom_mini_FR().Affiche();elfront->Encom_maxi_FR().Affiche();cout << endl; + if (!cas_collant) + if (!(elfront->In_boite_emcombrement_front(M1))) + break; + compteur++; + } + while ((compteur <= max_compteur) && (nm >= dismini)) ; + // retour du point d'intersection + ////////debug + // if (noeud->Num_noeud()==84) + // { + // cout << "\n debug ElContact::Intersection : noeud: " << noeud->Num_noeud() <<" mail= " << noeud->Num_Mail() + // << " avec frontiere:" << elfront->Num_frontiere() + // << " de l'element " << elfront->PtEI()->Num_elt() << " du maillage " + // << elfront->PtEI()->Num_maillage(); + // cout <<"\n Noe_atdt= " << noeud->Coord2() << "\n point projete= " << M1 << endl; + // }; + ////// fin debug + // les fonctions d'interpolations du premier point en contact + if (init) + {phi_theta_0 = elfro.Phi();}; + // retour du point d'intersection + return M1; + }; }; // construction de la condition lineaire de contact @@ -1202,188 +1807,288 @@ Condilineaire ElContact::ConditionLi(int nb_assemb) // actualisation de la projection du noeud esclave en fonction de la position de l'element // maitre frontiere. Lorsque le noeud change d'element fontiere, on change l'element // frontiere de l'element de contact en consequence -// dans le cas ou on ne trouve pas d'intersection, cas d'un noeud qui sort d'une zone de -// contact, on retourne false, sinon retourne true -// en fonction de la méthode de contact, le noeud est ramené éventuellement sur la frontière -bool ElContact::Actualisation() +// retourne: +// 0 : dans le cas ou on ne trouve pas d'intersection, cas d'une intersection qui n'est pas calculable +// 1 : contact ok, sur l'élément +// -1 : contact ok, mais hors de l'élément (là, on a parcouru tous les mitoyens et aucun ne convient +// du coup on utilise l'élément initial pour la projection +// 2 : changement de frontière, et contact ok sur la nouvelle frontière +// NB: sauf pour le cas 0, dans tous les autres cas, les grandeurs locales sont correctement calculées +// c-a-d : la projection, la normale +// en fonction de la méthode de contact, le noeud est ramené éventuellement sur la frontière +int ElContact::Actualisation() { // comme le point est déjà en contact, son déplacement est grosso modo // à la surface // donc on ne peut pas utiliser sa trajectoire et faire une intersection avec la surface, cela ne veut rien dire // donc on cherche la projection du point sur la surface. Pour cela on calcule l'intersection d'une trajectoire qui a // comme direction, la normale à la surface // dans le cas d'un point avec ligne c'est idem - - // recup des dernières différentes informations calculées au niveau de la cinématique de contact - Coordonnee M_impact,N; // le point d'impact, la normale - Vecteur phii; - RecupInfo(N,M_impact,phii,false); - - // def de la pseudo-trajectoire a utiliser: ici ce sera une trajectoire normale à la surface maître - Coordonnee V = N; -// // debug -//if (noeud->Num_noeud() == 2) -// {cout << "\n debug : ElContact::Actualisation() " -// << " noeud: " << noeud->Num_noeud() <<" mailage:"<Num_Mail() -// << " normale= "; V.Affiche(); -// cout << "\n coordonnée à t ";noeud->Coord1().Affiche(); -// cout << "\n coordonnée à tdt ";noeud->Coord2().Affiche(); -// cout <Num_noeud() == 2) -// {cout << "\n debug : ElContact::Actualisation() " -// << " intersection "; M1.Affiche(); -// // défaut de projection -// Coordonnee Mtdt = noeud->Coord2(); -// Coordonnee deltaX = M1-Mtdt; -// double gap = N * deltaX; -// double diff = (deltaX - gap*N).Norme(); // on calcule pour vérifier -// double N_deltaX = deltaX.Norme(); -// cout << "\n diff de projection : "<< diff ; -// if(N_deltaX > ConstMath::trespetit) -// {Coordonnee deltaX_N = deltaX.Normer(); -// cout << " deltaX_N: " << deltaX_N ; -// }; -// cout <Eleme()); // pour commodite - // ici on recherche avec une précision donnée - double extra_in_surface = ParaGlob::param->ParaAlgoControleActifs().PointInternePrecThetaiInterne(); - int contactType = ElContact::Recup_et_mise_a_jour_type_contact(); - if (elfro.InSurf(extra_in_surface)) - // l'intersection est ok pour l'element - // cote droite : contrairement a Intersection() , on oblige ici éventuellement en fonction du modèle de contact - // le point a etre sur la surface, car a priori il y a toujours contact - { Mtdt = M1; // sauvegarde -/* // si l'élément n'est pas actuellement actif on regarde si le contact est valide c-a-d si le noeud est dans la matière - // si oui on active l'élément, sinon on laisse tel quel et on ne change pas le noeud par exemple. - -// if (!actif) -// {if (!(elfro.BonCote_tdt(noeud->Coord2()))) -// // le point final est dans la matière finale, le contact est donc valide -// { actif = 1; // init -// if (ParaGlob::NiveauImpression() >= 6) -// { Enum_type_geom type_front; // va être modifier par Num_frontiere -// cout << "\n reactivation (element contact) de l'element de contact entre noeud " << noeud->Num_noeud() -// << " du maillage " << noeud->Num_Mail() -// << " et frontiere " -// << elfront->Num_frontiere() -// << " de l'element " << elfront->PtEI()->Num_elt() << " du maillage " -// << tabNoeud(2)->Num_Mail() << endl; -// }; -// }; -// }; - // gestion du retour -// if (actif) */ - { if ((contactType == 1)|| (contactType == 3)|| (contactType == 4)) - { M_noeud_tdt_avant_projection = noeud->Coord2(); - // on change les coordonnées s'ils sont libres sinon on laisse inchangé - int dim = M_noeud_tdt_avant_projection.Dimension(); - switch (dim) - { case 3: if (!(noeud->Ddl_fixe(X3))) noeud->Change_val_tdt(X3,M1(3)); - case 2: if (!(noeud->Ddl_fixe(X2))) noeud->Change_val_tdt(X2,M1(2)); - case 1: if (!(noeud->Ddl_fixe(X1))) noeud->Change_val_tdt(X1,M1(1)); - default: - break; - }; -// noeud->Change_coord2(M1); -//noeud->Change_coord2(0.5*(M1+M_noeud_tdt_avant_projection)); - if (niveau_commentaire > 6) - {cout << "\n actualisation du noeud esclave " - << noeud->Num_noeud() <<" mail= " << noeud->Num_Mail() - << " ancienne position " << M_noeud_tdt_avant_projection - << " nouvelle position " << noeud->Coord2(); - }; - }; - return true; - } -/* // else -// {return false;}; // sinon pas de contact valide */ - } - else - // l'intersection est en dehors de la surface ou courbe maitre, on essaie une projection sur - // l'element voisin - // on itere sur les elements voisins - {const Tableau * ta = elfront->TabMitoyen(); -/* // debug -//cout << "\n debug Elcontact::Actualisation "; -//elfro.InSurf(extra_in_surface); -//// fin debug */ - if (ta != NULL) // cas où il y a des éléments voisins ! - {for (int i=1; i<= ta->Taille(); i++) - { ElContact elct((*ta)(i),noeud,fct_nD_contact); // on cree un element contact pour utiliser ses methodes - M1 = elct.Intersection(V,true); - // ici on recherche avec une précision donnée - double extra_in_surface = ParaGlob::param->ParaAlgoControleActifs().PointInternePrecThetaiInterne(); - // dans le cas ou M1 a une dimension nulle, signifie qu'il n'y a pas d'intersection, - // on n'examine que le cas où la dimension est différente de 0 - if (M1.Dimension() != 0) - { if (elct.Elfront()->Eleme()->InSurf(extra_in_surface)) - // on a trouve une bonne intersection - { // --- changement d'element frontiere - // on commence par sauvegarder (*ta)(i) - Front* newelfront = new Front(*((*ta)(i))); - Libere(); // on supprime le elfront actuel, donc le tableau ta - elfront = newelfront; // on récupére le nouvelle élément créé - Construction_TabNoeud(); // on reconstruit le tableau de noeud global - Mtdt = M1; -/* // si l'élément n'est pas actuellement actif on regarde si le contact est valide c-a-d si le noeud est dans la matière - // si oui on active l'élément, sinon on laisse tel quel et on ne change pas le noeud par exemple. -// if (!actif) -// {if (!(elfro.BonCote_tdt(noeud->Coord2()))) -// // le point final est dans la matière finale, le contact est donc valide -// { actif = 1; -// if (ParaGlob::NiveauImpression() >= 6) -// { Enum_type_geom type_front; // va être modifier par Num_frontiere -// cout << "\n reactivation de l'element de contact entre noeud " << noeud->Num_noeud() -// << " du maillage " << noeud->Num_Mail() -// << " et frontiere " -// << elfront->Num_frontiere() -// << " de l'element " << elfront->PtEI()->Num_elt() << " du maillage " -// << tabNoeud(2)->Num_Mail() << endl; -// }; -// }; -// }; */ - // gestion du retour - if ((contactType == 1)|| (contactType == 3)|| (contactType == 4)) - { M_noeud_tdt_avant_projection = noeud->Coord2(); - // on change les coordonnées s'ils sont libres sinon on laisse inchangé - int dim = M_noeud_tdt_avant_projection.Dimension(); - switch (dim) - { case 3: if (!(noeud->Ddl_fixe(X3))) noeud->Change_val_tdt(X3,M1(3)); - case 2: if (!(noeud->Ddl_fixe(X2))) noeud->Change_val_tdt(X2,M1(2)); - case 1: if (!(noeud->Ddl_fixe(X1))) noeud->Change_val_tdt(X1,M1(1)); - default: - break; - }; -// noeud->Change_coord2(M1); - if (niveau_commentaire > 6) - {cout << "\n actualisation du noeud esclave " - << noeud->Num_noeud() <<" mail= " << noeud->Num_Mail() - << " ancienne position " << M_noeud_tdt_avant_projection - << " nouvelle position " << noeud->Coord2(); - }; - }; - return true; - }; + int intersec = 0; // init: pour l'instant pas d'intersection + int passage_par_angle_mort=0; // pour le passage d'angle mort à normal + Coordonnee M1; + Coordonnee N_sauve = N; // pour un retour si l'intersection ne peut-être calculé + // cependant le cas des angles morts est particulier, on commence par le traiter + if (elfront->Angle_mort()) + { ElFrontiere & elfro = *(elfront->Eleme()); // pour commodite + if (elfro.TypeFrontiere() == "FrontPointF") + {// s'il s'agit d'un point il n'y a pas d'existance de normale +// // on remplace la notion de normale par le vecteur qui joint le noeud à la position +// // du point frontière +// Coordonnee V = elfro.Ref()- noeud->Coord2(); + const TypeQuelconque& tiq = tabNoeud(2)->Grandeur_quelconque(N_FRONT_t); + const Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) (tiq.Const_Grandeur_pointee())); + N = gr.ConteneurCoordonnee_const(); + + // l'intersection avec la frontière est systématiquement le point frontière + // même si on change de frontière (c'est pour simplifier le calcul de M1 + // qui sera mieux calculé au prochain appel) + M1 = elfro.Ref(); + + intersec=-1; // init à minima + + // la seule chose que l'on peut faire pour valider le fait qu'il y a contact ou pas + // c'est de tester si le noeud est à l'intérieur de l'élément d'angle mort ou pas + // c'est plus long qu'un test de surface mais il n'y a pas vraiment d'autre solution + int cas = elfront->PtEI()->Interne_tdt(noeud->Coord2()); + if (Permet_affichage() > 5) + {cout << "\n -- ElContact::Actualisation: "; + cout << " Interne_tdt ? cas= " << cas <<", "; + this->Affiche(1); + }; + + + // pour éviter les flip flop, si on a eu trop de changement de frontière + // on valide de manière arbitraire le choix actuel + if (nb_change_frontiere > nb_change_frontiere_max) + {cas = 1; + if (Permet_affichage() > 5) + {cout << "\n -- nb_change_frontiere: " << nb_change_frontiere + << " on impose cas = 1 " ; }; }; + if (!cas) + // le point n'est pas dans l'élément on essaie les éléments voisins + // on itere sur les elements voisins + {const Tableau * ta = elfront->TabMitoyen(); + if (ta != NULL) // cas où il y a des éléments voisins ! + { int ta_taille_et1 = 1+ta->Taille(); + for (int i=1; i < ta_taille_et1; i++) + { cas = (*ta)(i)->PtEI()->Interne_tdt(noeud->Coord2()); + if (Permet_affichage() > 5) + {cout << "\n -- ElContact::Actualisation: "; + cout << " Interne_tdt sur mitoyen d'angel mort ? cas= " << cas <<", "; + this->Affiche(1); + }; + if (cas) + // on a trouvé un élément mitoyen qui contient le point + {// --- changement d'element frontiere + if (Permet_affichage() > 2) + {cout << "\n change front. du noeud "<< noeud->Num_noeud() <<" mail= " << noeud->Num_Mail() + << " ==> "; + elfront->Affiche(1); + if (Permet_affichage() > 4) + cout << " ( mitoyen: " << i << " )" ; + }; + + // on commence par sauvegarder (*ta)(i) en créant une copie + Front* newelfront = new Front(*((*ta)(i))); +// Libere(); // on supprime le elfront actuel, donc le tableau ta + // on ne peut pas supprimer le elfront, car il est également pointé par elfront_t + // du coup ce sera fait dans la méthode ElContact::TdtversT() + elfront = newelfront; // on récupére le nouvelle élément créé + if (Permet_affichage() > 2) + {cout << " --> nevez "; + elfront->Affiche(1); + }; + Construction_TabNoeud(); // on reconstruit le tableau de noeud global + nb_change_frontiere++; // on incrémente + intersec = 2; + passage_par_angle_mort=2; + }; + if (intersec) + break; + }; + }; + } + else // l'intersection est ok + {intersec = 1; }; + } + else + { cout << "\n *** cas element Angle_mort actuellement non implante: , " + << elfro.TypeFrontiere() + << "\n ElContact::Actualisation()"; + Sortie(1); + }; + } + + // ---- la suite concerne des éléments autres que ceux d'angle mort + else + {// recup des dernières différentes informations calculées au niveau de la cinématique de contact + Coordonnee M_impact,N; // le point d'impact, la normale + Vecteur phii; + RecupInfo(N,M_impact,phii,false); + + // def de la pseudo-trajectoire a utiliser: ici ce sera une trajectoire normale à la surface maître + Coordonnee V = N; + // calcul de l'intersection de la pseudo-trajectoire avec la frontiere + M1 = Intersection(V,false); + + // dans le cas ou M1 a une dimension nulle, signifie qu'il n'y a pas d'intersection, + // on peut alors dire qu'il ne peut pas y avoir contact donc retour + if (M1.Dimension() == 0) + {intersec = 0;} + else // sinon on peut continuer + {intersec=-1; // init à minima + // maintenant on regarde si l'intersection est acceptable + // - cote surface + ElFrontiere & elfro = *(elfront->Eleme()); // pour commodite + // ici on recherche avec une précision donnée + double extra_in_surface = ParaGlob::param->ParaAlgoControleActifs().PointInternePrecThetaiInterne(); + int contactType = ElContact::Recup_et_mise_a_jour_type_contact(); + if ((elfro.InSurf(extra_in_surface)) + || (nb_change_frontiere > nb_change_frontiere_max) // pour limiter les flip-flop + ) + // l'intersection est ok pour l'element + // cote droite : contrairement a Intersection() , on oblige ici éventuellement en fonction du modèle de contact + // le point a etre sur la surface, car a priori il y a toujours contact + { intersec = 1; + } + else + // l'intersection est en dehors de la surface ou courbe maitre, on essaie une projection sur + // l'element voisin + // on itere sur les elements voisins + {const Tableau * ta = elfront->TabMitoyen(); + if (ta != NULL) // cas où il y a des éléments voisins ! + {for (int i=1; i<= ta->Taille(); i++) + { bool mitoyen_valider = false; + // le cas des angles morts est particulier, on commence par le traiter + if ((*ta)(i)->Angle_mort()) + { ElFrontiere & elfroto = *((*ta)(i)->Eleme()); // pour commodite + if (elfroto.TypeFrontiere() == "FrontPointF") + {// s'il s'agit d'un point il n'y a pas d'existance de normale + const TypeQuelconque& tiq = tabNoeud(2)->Grandeur_quelconque(N_FRONT_t); + const Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) (tiq.Const_Grandeur_pointee())); + V = gr.ConteneurCoordonnee_const(); + + // la seule chose que l'on peut faire pour valider le fait qu'il y a contact ou pas + // c'est de tester si le noeud est à l'intérieur de l'élément d'angle mort ou pas + // c'est plus long qu'un test de surface mais il n'y a pas vraiment d'autre solution + int cas = (*ta)(i)->PtEI()->Interne_tdt(noeud->Coord2()); + if (Permet_affichage() > 5) + {cout << "\n -- ElContact::Actualisation: "; + cout << " Interne_tdt sur mitoyen ? cas= " << cas <<", "; + this->Affiche(1); + }; + + if (cas) // si true, le point est interne + {M1 = elfroto.Ref(); + N = V; + mitoyen_valider = true; + }; + } + else + { cout << "\n *** cas element Angle_mort actuellement non implante: , " + << elfroto.TypeFrontiere() + << "\n ElContact::Actualisation()"; + Sortie(1); + }; + } + else // ---- la suite concerne des éléments autres que ceux d'angle mort + {ElContact elct((*ta)(i),noeud,fct_nD_contact); // on cree un element contact pour utiliser ses methodes + Coordonnee M1_new; + M1_new = elct.Intersection(V,true); + // ici on recherche avec une précision donnée + double extra_in_surface = ParaGlob::param->ParaAlgoControleActifs().PointInternePrecThetaiInterne(); + // dans le cas ou M1 a une dimension nulle, signifie qu'il n'y a pas d'intersection, + // on n'examine que le cas où la dimension est différente de 0 + if (M1_new.Dimension() != 0) + { if ((elct.Elfront()->Eleme()->InSurf(extra_in_surface)) + || (nb_change_frontiere > nb_change_frontiere_max) // pour éviter les flip-flop + ) + // on a trouve une bonne intersection + { mitoyen_valider = true;M1 = M1_new;}; + }; + }; + + // si le mitoyen est validé on change de Front pour l'élément de contact + if (mitoyen_valider) + { // --- changement d'element frontiere + if (Permet_affichage() > 2) + {cout << "\n change front. du noeud "<< noeud->Num_noeud() <<" mail= " << noeud->Num_Mail() + << " == "; + elfront->Affiche(1); + if (Permet_affichage() > 4) + cout << " ( mitoyen: " << i << " )" ; + }; + + // on commence par sauvegarder (*ta)(i) + Front* newelfront = new Front(*((*ta)(i))); + // Libere(); // on supprime le elfront actuel, donc le tableau ta + // on ne peut pas supprimer le elfront, car il est également pointé par elfront_t + // du coup ce sera fait dans la méthode ElContact::TdtversT() + elfront = newelfront; // on récupére le nouvelle élément créé + if (Permet_affichage() > 2) + {cout << " --> nevez "; + elfront->Affiche(1); + }; + Construction_TabNoeud(); // on reconstruit le tableau de noeud global + nb_change_frontiere++; + intersec = 2; + // si le nouvel élément de frontière est un angle mort, alors la normale + // a été calculée dans Intersection, donc pas la peine de la recalculer + break; + }; + }; + }; + }; + }; + }; // fin du test sur les front d'angle mort + + if (intersec != 0) + {Mtdt = M1; // sauvegarde du point d'intersection + int contactType = ElContact::Recup_et_mise_a_jour_type_contact(); + // gestion du retour + if ((contactType == 1)|| (contactType == 3)|| (contactType == 4)) + { M_noeud_tdt_avant_projection = noeud->Coord2(); + // on change les coordonnées s'ils sont libres sinon on laisse inchangé + int dim = M_noeud_tdt_avant_projection.Dimension(); + switch (dim) + { case 3: if (!(noeud->Ddl_fixe(X3))) noeud->Change_val_tdt(X3,M1(3)); + case 2: if (!(noeud->Ddl_fixe(X2))) noeud->Change_val_tdt(X2,M1(2)); + case 1: if (!(noeud->Ddl_fixe(X1))) noeud->Change_val_tdt(X1,M1(1)); + default: + break; + }; + if (Permet_affichage() > 6) + {cout << "\n actualisation du noeud esclave " + << noeud->Num_noeud() <<" mail= " << noeud->Num_Mail() + << " ancienne position " << M_noeud_tdt_avant_projection + << " nouvelle position " << noeud->Coord2(); + }; }; - }; - // cas ou l'on n'a pas trouve d'intersection, - return false; + } + else // cas où l'intersection n'est pas calculable + // on remet les choses à l'état initiale + {Mtdt = Mt; + N = N_sauve; + } + + #ifdef MISE_AU_POINT + if (Permet_affichage() > 2) + {cout << "\n ElContact::Actualisation(., intersec= "<< intersec; + }; + #endif + + // retour du type d'intersection + return intersec; }; @@ -1401,7 +2106,7 @@ bool ElContact::Decol() // calcul du dernier plan tangent (elfront->Eleme())->DernierTangent(dr,pl,indic); // recherche de la normale ,traitement suivant les different cas - Coordonnee N = Calcul_Normale(dim,pl,dr, indic); // elle pointe vers l'extérieur de l'élément + N = Calcul_Normale(dim,pl,dr, indic); // elle pointe vers l'extérieur de l'élément // donc vers l'intérieur de l'élément esclave // def du decollement double r = - force_contact * N; @@ -1425,7 +2130,11 @@ cout << "\n noeud: " << noeud->Num_noeud() << ": gap= " << gap << ", F_N= " << r double borne_regularisation; if (fct_nD_contact.fct_nD_penetration_borne_regularisation != NULL) - {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_borne_regularisation);} + {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penetration_borne_regularisation); + } else {borne_regularisation = ParaGlob::param->ParaAlgoControleActifs().Penetration_borne_regularisation();} // NB: nb_decol_tdt est également mis à 0 lors de l'inactivation ou de l'activation de l'élément: cf. Met_Inactif() et Met_actif() if (r <= 0) @@ -1436,12 +2145,15 @@ cout << "\n noeud: " << noeud->Num_noeud() << ": gap= " << gap << ", F_N= " << r int typededecolement = ParaGlob::param->ParaAlgoControleActifs().TypeDeDecolement(); if (!typededecolement) // dans le cas classique (==0), on regarde uniquement la réaction { if (nb_decol_tdt >= ParaGlob::param->ParaAlgoControleActifs().NbDecolAutorise()) - { if (niveau_commentaire >= 4) - cout << "\n cas d'une reaction positive: + nb decollement nb_decol_tdt= (" - << nb_decol_tdt << "): qui depasse le nombre de decollement (" - << ParaGlob::param->ParaAlgoControleActifs().NbDecolAutorise() - << ") tolere "; - if (niveau_commentaire >= 7) + { if (Permet_affichage() > 4) + {cout << "\n cas d'une reaction negative:"<<-r<<", nb decollement (" + << nb_decol_tdt << "): >= le nombre de decollement (" + << ParaGlob::param->ParaAlgoControleActifs().NbDecolAutorise() + << ") tolere "; + Affiche(1); + }; + + if (Permet_affichage() >= 7) {cout << "\n force de contact: "<< force_contact; cout << "\n normale: "<< N; cout << "\n intensite du contact (r = - force_contact * N;) " @@ -1457,14 +2169,17 @@ cout << "\n noeud: " << noeud->Num_noeud() << ": gap= " << gap << ", F_N= " << r // et peut-être évite les oscillation {if (gap_tdt > Dabs(borne_regularisation) * typededecolement) {if (nb_decol_tdt >= ParaGlob::param->ParaAlgoControleActifs().NbDecolAutorise()) - { if (niveau_commentaire >= 4) - cout << "\n cas d'un gap > Dabs(borne_regularisation) (" + { if (Permet_affichage() > 4) + {cout << "\n cas d'une reaction negative:"<<-r<<", et " + << "d'un gap > Dabs(borne_regularisation) (" << Dabs(borne_regularisation) << " * typededecolement (" - << typededecolement << ") : + nb decollement nb_decol_tdt= (" - << nb_decol_tdt << "): qui depasse le nombre de decollement (" + << typededecolement << "), nb decollement (" + << nb_decol_tdt << "): >= le nombre de decollement (" << ParaGlob::param->ParaAlgoControleActifs().NbDecolAutorise() << ") tolere "; - if (niveau_commentaire >= 7) + Affiche(1); + }; + if (Permet_affichage() >= 7) {cout << "\n gap_tdt= " << gap_tdt << ", force de contact: "<< force_contact; cout << "\n normale: "<< N; @@ -1513,7 +2228,11 @@ double ElContact::Pas_de_temps_ideal()const // limitation au niveau du gap double borne_regularisation; if (fct_nD_contact.fct_nD_penetration_borne_regularisation != NULL) - {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_borne_regularisation);} + {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penetration_borne_regularisation); + } else {borne_regularisation = ParaGlob::param->ParaAlgoControleActifs().Penetration_borne_regularisation();} int contactType = ElContact::Recup_et_mise_a_jour_type_contact(); if (actif && (borne_regularisation < 0) @@ -1557,6 +2276,15 @@ void ElContact::TdtversT() F_N_max_t = F_N_max; F_T_max_t=F_T_max; penalisation_t = penalisation; penalisation_tangentielle_t = penalisation_tangentielle; + // on regarde si on a changé de elfront + if (elfront != elfront_t) + // cas où on a changé de frontière + { delete elfront_t; // suppression de la frontière ancienne + elfront_t = elfront; // mise à jour + }; + noeud_t = noeud; + tabNoeud_t = tabNoeud; + nb_change_frontiere = 0; // initialisé à chaque fois }; // actualisation des ddl et des grandeurs actives de t vers tdt void ElContact::TversTdt() @@ -1575,6 +2303,16 @@ void ElContact::TversTdt() F_N_max = F_N_max_t; F_T_max=F_T_max_t; penalisation = penalisation_t; penalisation_tangentielle = penalisation_tangentielle_t; + // on regarde si on a changé de elfront + if (elfront != elfront_t) + // cas où on a changé de frontière + { delete elfront; // suppression de la nouvelle frontière + elfront = elfront_t; // retour sur l'ancienne frontière + }; + noeud = noeud_t; + tabNoeud = tabNoeud_t; + nb_change_frontiere = 0; // initialisé à chaque fois + }; //----- lecture écriture base info ----- @@ -1615,6 +2353,9 @@ void ElContact::Lec_base_info_ElContact(ifstream& ent) // puis les données frontière elfront->Lecture_base_info_front(ent); + elfront_t=elfront; + noeud_t = noeud; + tabNoeud_t = tabNoeud; }; // écriture base info @@ -1650,11 +2391,14 @@ void ElContact::Ecri_base_info_ElContact(ofstream& sort) void ElContact::Libere() { //delete (elfront->Eleme()); delete elfront; - elfront = NULL; + elfront = elfront_t = NULL; }; // construction du tableau de tous les noeuds, le premier est celui esclave // et mise à jour de ddlElement et de list_Ddl_global éventuellement +// et mise à jour des grandeurs liées à elfront: concerne le dimensionnement +// si on change d'elfront -> peut changer le nombre de noeud maître d'où +// il faut redimensionner: tabForce_cont,tabForce_cont_t; void ElContact::Construction_TabNoeud() { // def du tableau de l'element frontiere Tableau & tabnoeuddd = (elfront->Eleme())->TabNoeud(); @@ -1685,7 +2429,17 @@ void ElContact::Construction_TabNoeud() if (!noe.Existe_ici_ddlEtendu(ddl_reaction_tangentielle)) noe.AjoutUnDdl_etendu(ddl_reaction_tangentielle); }; - + + // mise à jour des grandeurs liées à elfront: concerne le dimensionnement + // si on change d'elfront -> peut changer le nombre de noeud maître d'où + // il faut redimensionner: tabForce_cont,tabForce_cont_t; + tabForce_cont.Change_taille(taile-1); + tabForce_cont_t.Change_taille(taile-1); + // on init à 0 + for (int i=1; i< taile; i++) + {tabForce_cont(i).Zero(); + tabForce_cont_t(i).Zero(); + }; // --- cas du tableau des DdlElement diff --git a/contact/ElContact.h b/contact/ElContact.h index 13ae0db..a6879a2 100644 --- a/contact/ElContact.h +++ b/contact/ElContact.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -36,8 +36,21 @@ * $ * ************************************************************************ * BUT: Element de contact. * + * - l'élément utilise une frontiere Front qui contient ses * + * donnees geometriques : l'élément de contact crée une copie * + * d'un élément de frontière qui existe par ailleurs, en fait * + * l'originale existe dans LesContacts. * + * L'aspect spécifique est: * + * . le Front de l'élément de contact est une copie * + * . le tableau de ses mitoyens pointe sur les originaux * + * du coup on peut supprimer et créer de nouvelles copies * + * de Front sans invalider le tableau de pointeur de Front * + * qui définit les mitoyens ! (un peu tordu ) * + * - il gère les aspects spécifiques du contact: efforts, * + * résidu, raideur etc. * * $ * - * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * + * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * + * * * VERIFICATION: * * * * ! date ! auteur ! but ! * @@ -85,6 +98,7 @@ class ElContact Fct_nD_contact(const Fct_nD_contact& a); ~Fct_nD_contact(); Fct_nD_contact& operator= (const Fct_nD_contact& a); + // utilisation de fct nD Fonction_nD * fct_nD_penalisationPenetration; // fct nD dans le cas d'une valeur pilotée @@ -95,6 +109,55 @@ class ElContact Fonction_nD * fct_nD_tangentielle_contact_maxi; // fct nD dans le cas d'une valeur pilotée Fonction_nD * fct_nD_tangentielle_borne_regularisation; // fct nD dans le cas d'une valeur pilotée Fonction_nD * fct_nD_force_tangentielle_noeud_maxi; // fct nD dans le cas d'une valeur pilotée + Fonction_nD * fct_niveau_commentaire; // fct nD dans le cas d'une valeur pilotée + + // initialisation des conteneurs statique des fonction nD + void Init_conteneur_statique(); + + // stockage transitoire pour les quelconques vraiment quelconque + static Tableau tqi_const_fct_nD_penalisationPenetration; + static Tableau < TypeQuelconque * > tqi_fct_nD_penalisationPenetration; + static Tableau t_num_ordre_fct_nD_penalisationPenetration; + + static Tableau tqi_const_fct_nD_penetration_contact_maxi; + static Tableau < TypeQuelconque * > tqi_fct_nD_penetration_contact_maxi; + static Tableau t_num_ordre_fct_nD_penetration_contact_maxi; + + static Tableau tqi_const_fct_nD_penetration_borne_regularisation; + static Tableau < TypeQuelconque * > tqi_fct_nD_penetration_borne_regularisation; + static Tableau t_num_ordre_fct_nD_penetration_borne_regularisation; + + static Tableau tqi_const_fct_nD_force_contact_noeud_maxi; + static Tableau < TypeQuelconque * > tqi_fct_nD_force_contact_noeud_maxi; + static Tableau t_num_ordre_fct_nD_force_contact_noeud_maxi; + + static Tableau tqi_const_fct_nD_penalisationTangentielle; + static Tableau < TypeQuelconque * > tqi_fct_nD_penalisationTangentielle; + static Tableau t_num_ordre_fct_nD_penalisationTangentielle; + + static Tableau tqi_const_fct_nD_tangentielle_contact_maxi; + static Tableau < TypeQuelconque * > tqi_fct_nD_tangentielle_contact_maxi; + static Tableau t_num_ordre_fct_nD_tangentielle_contact_maxi; + + static Tableau tqi_const_fct_nD_tangentielle_borne_regularisation; + static Tableau < TypeQuelconque * > tqi_fct_nD_tangentielle_borne_regularisation; + static Tableau t_num_ordre_fct_nD_tangentielle_borne_regularisation; + + static Tableau tqi_const_fct_nD_force_tangentielle_noeud_maxi; + static Tableau < TypeQuelconque * > tqi_fct_nD_force_tangentielle_noeud_maxi; + static Tableau t_num_ordre_fct_nD_force_tangentielle_noeud_maxi; + + static Tableau tqi_const_fct_nD_niveau_commentaire; + static Tableau < TypeQuelconque * > tqi_fct_nD_niveau_commentaire; + static Tableau t_num_ordre_fct_nD_niveau_commentaire; + protected : + // définition des conteneurs de transfert des TypeQuelconque + // pour une fonction nD particulière + void Definition_conteneurs_static_TypeQuelconque + (Fonction_nD * pt_fonct,Tableau < TypeQuelconque * >& tqi + ,Tableau < const TypeQuelconque * >& tqii,Tableau & t_num_ordre ); + + }; // CONSTRUCTEURS : @@ -113,17 +176,45 @@ class ElContact ~ElContact (); // METHODES PUBLIQUES : - + + // test d'egalite sur les éléments originaux : + // l'élément de frontière front, le noeud esclave, même zone de contact + inline bool MemeOrigine( const ElContact& a) const + { if ( (this->elfront->MemeOrigine(*a.Elfront())) + && (this->noeud->Num_noeud() == a.Const_Esclave()->Num_noeud()) + && (this->noeud->Num_Mail() == a.Const_Esclave()->Num_Mail()) + && (num_zone_contact == a.Const_Num_zone_contact()) + ) + return true; + else + return false; + }; + // init d'une fonction nD pour le pilotage du type de contact 4 static void Init_fct_pilotage_contact4(Fonction_nD * fct_pilo_contact4) {fct_pilotage_contact4 = fct_pilo_contact4;}; - + + //retourne le niveau d'affichage + int Permet_affichage() const + { return( (fct_nD_contact.fct_niveau_commentaire == NULL) ? + (niveau_commentaire == 0) ? ParaGlob::NiveauImpression() : niveau_commentaire + : Valeur_fct_nD(fct_nD_contact.fct_niveau_commentaire + ,ElContact::Fct_nD_contact::tqi_fct_nD_niveau_commentaire + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_niveau_commentaire + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_niveau_commentaire + ) + ); + }; + // méthode statique de modification éventuelle du type de contact utilisé localement // par exemple pour le type 4 en fonction des itérations static int Recup_et_mise_a_jour_type_contact() ; // affichage à l'écran des informations liées au contact - void Affiche() const ; + // cas = 0 : affichage en fonction du niveau de commentaire voulu + // cas = 1 : affichage minimal nécessaire pour repérer l'élément + // cas = 2 : affichage en fonction du niveau de commentaire pour les éléments de contact + void Affiche(int cas=0) const ; // calcul d'un contact eventuel entre le noeud esclave et la frontiere // ramene true s'il y a contact @@ -143,7 +234,8 @@ class ElContact // un stockage utilisé par les méthodes appelantes int& Num_zone_contact() {return num_zone_contact;}; - + int Const_Num_zone_contact() const {return num_zone_contact;}; + // calcul de la trajectoire a prendre en compte pour le contact // ---- a) cas ou à t il n'y avait pas de contact, ou que l'on n'a pas fait de projection sur la surface (cas du contact cinématique) // 4 cas : 1) le noeud bouge, dans ce cas la trajectoire est determinee @@ -183,6 +275,7 @@ class ElContact const DdlElement & TableauDdlCont() const {return *ddlElement_assemblage;}; // ramene le noeud esclave inline Noeud* Esclave() { return noeud;}; + inline const Noeud* Const_Esclave() const { return noeud;}; // ramene la force de contact pour consultation const Coordonnee& Force_contact() const {return force_contact;}; // ramène les maxis concernant le noeud esclave @@ -204,9 +297,10 @@ class ElContact // maitre frontiere. Lorsque le noeud change d'element fontiere, on change l'element // frontiere de l'element de contact en consequence // dans le cas ou on ne trouve pas d'intersection, cas d'un noeud qui sort d'une zone de - // contact, on retourne false, sinon retourne true - // en fonction de la méthode de contact, le noeud est ramené éventuellement sur la frontière - bool Actualisation(); + // contact, on retourne 0, sinon retourne 1 si on n'a pas changé de frontière + // retourne 2 si on a changé de frontière + // en fonction de la méthode de contact, le noeud est ramené éventuellement sur la frontière + int Actualisation(); // ramene un pointeur sur l'element frontiere inline Front * Elfront() const { return elfront;}; @@ -229,8 +323,18 @@ class ElContact // gestion de l'activité int Actif() const {return actif;}; // ramène l'activité du contact - void Met_Inactif() { actif = 0;nb_decol_tdt=0;}; // met en inactif - void Met_actif() { actif++;nb_decol_tdt=0;}; // met en actif une fois de plus + void Met_Inactif() { actif = 0;nb_decol_tdt=0; + #ifdef MISE_AU_POINT + if (Permet_affichage() > 2) + {cout << "\n inactivation du contact: ";this->Affiche(1);}; + #endif + }; // met en inactif + void Met_actif() { actif++;nb_decol_tdt=0; + #ifdef MISE_AU_POINT + if (Permet_affichage() > 2) + {cout << "\n activation du contact: ";this->Affiche(1);}; + #endif + }; // met en actif une fois de plus // ramène le nombre actuel de décolement int Nb_decol() const {return nb_decol_tdt;}; @@ -269,15 +373,21 @@ class ElContact void Change_contact_collant(bool change); // récup de l'information concernant le contact collant ou pas int Collant() const {return cas_collant;}; + + // gestion du lissage du lissage de la normale + void Change_lissage_normale(int lissage) + {normale_lisser = lissage;}; + // récup de l'information + // indique si la normale doit-être lissée sur l'élément frontière, ou non + int Lissage_normale() const {return normale_lisser;}; // récup des gaps calculés const double & Gaptdt() const {return gap_tdt;}; const double & Dep_T_tdt() const {return dep_T_tdt;} - // mise à jour du niveau de commentaire - static void Mise_a_jour_niveau_commentaire(int niveau) - {niveau_commentaire = niveau;}; + static void Mise_a_jour_niveau_commentaire() + {niveau_commentaire = ParaGlob::param->ParaAlgoControleActifs().Niveau_commentaire_contact();}; // récupération des ddl ou des grandeurs actives de tdt vers t void TdtversT(); @@ -294,11 +404,18 @@ protected : int actif; // un indicateur, disant si le contact est actif ou pas // conteneur plutôt utilisé par les classes appelantes // =1 -> premier contact, > 1 contact qui suit un contact - Front* elfront; // un element frontiere - Noeud * noeud; // un pointeur de noeud - int num_zone_contact; // un stockage uniquement utilisé par les méthodes appelantes + + // ... elfront, noeud, tabNoeud : peuvent changer d'affectation sur le pas + // pour pouvoir revenir au temps t, on définit les valeurs à t + Front* elfront, * elfront_t; // un element frontiere , qui est créé par l'élément de contact + // et qui correspond à une copie d'un élément frontière qui existe par ailleurs + // en fait, qui existe dans LesContacts + Noeud * noeud, * noeud_t; // un pointeur de noeud // pour éviter de le construire à chaque demande on définit un tableau de tous les noeuds - Tableau tabNoeud; // tableau de tous les noeud, le premier est noeud + Tableau tabNoeud, tabNoeud_t; // tableau de tous les noeud, le premier est noeud + + + int num_zone_contact; // un stockage uniquement utilisé par les méthodes appelantes // le tableau des positions successives du noeud esclave, ceci pour effectuer une moyenne glissante Tableau tab_posi_esclave; // le nombre courant de positions de noeuds esclaves actuellement stockées @@ -310,7 +427,7 @@ protected : Coordonnee M_noeud_tdt_avant_projection; // dans le cas d'une projection du noeud sur la surface maître // sauvegarde des coordonnées du noeuds esclave: utilisation avec le type de contact 4 // les fonctions d'interpolation au premier point en contact: sert pour le contact collant - Vecteur phi_theta_0 ; + Vecteur phi_theta_0 ; // *** il faut sauvegarder également la frontière correspondante EnergieMeca energie_frottement; // énergie développée par le frottement glissant ou pas double energie_penalisation; // énergie due à la pénalisation (élastique a priori) // cas_solide permet de simplifier le contact dans le cas ou le maître ou l'esclave est solide @@ -320,6 +437,11 @@ protected : // = 3 tout est solide int cas_collant; // prise en compte éventuelle d'un contact collant, si 0: contact normal // = 1 : contact collant + int normale_lisser; // indique si la normale doit-être lissée sur l'élément, ou non + + int nb_change_frontiere; // totalise sur un incrément le nb de fois de changement de front + // sert à éviter les flip flop en implicite + Vecteur * residu; // residu local Mat_pleine * raideur; // raideur locale DdlElement * ddlElement_assemblage; // le ddlElement qui correspond @@ -367,6 +489,7 @@ protected : // stockage du maximum de distance tolérée entre noeud à tdt et le projeté, sert pour éliminer les contacts aberrants static double dep_max; static int niveau_commentaire; + // stockage d'une fonction nD pour le pilotage du type de contact 4 static Fonction_nD * fct_pilotage_contact4; @@ -376,7 +499,11 @@ protected : void Libere(); // construction du tableau de tous les noeuds, le premier est celui esclave // et mise à jour de ddlElement et de list_Ddl_global éventuellement + // et mise à jour des grandeurs liées à elfront: concerne le dimensionnement + // si on change d'elfront -> peut changer le nombre de noeud maître d'où + // il faut redimensionner: tabForce_cont,tabForce_cont_t; void Construction_TabNoeud(); + // récupération d'informations des classes internes pour le calcul du résidu // N: le vecteur normal // M_impact: le point d'impact sur la surface (ou ligne) @@ -410,7 +537,8 @@ protected : void Moyenne_glissante_penalisation(double& penalisation, double& essai_penalisation); // calcul d'une fonction nD relative à des données de contact - double Valeur_fct_nD(Fonction_nD * fct_nD) const; + double Valeur_fct_nD(Fonction_nD * fct_nD,Tableau < TypeQuelconque * >& tqi + ,Tableau < const TypeQuelconque * >& tqii,Tableau & t_num_ordre ) const; }; /// @} // end of group diff --git a/contact/ElContact_2.cc b/contact/ElContact_2.cc index 345eed1..3b8daf3 100755 --- a/contact/ElContact_2.cc +++ b/contact/ElContact_2.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -44,8 +44,8 @@ // -> explicite à tdt Vecteur* ElContact::SM_charge_contact() { - if (niveau_commentaire > 5) - cout << "\n -- ElContact::SM_charge_contact: "; + if (Permet_affichage() > 5) + {cout << "\n -- ElContact::SM_charge_contact: ";this->Affiche(1);} int contactType = ElContact::Recup_et_mise_a_jour_type_contact(); //cout << "\n -- debug ElContact::SM_charge_contact: contactType= " << contactType; @@ -106,6 +106,10 @@ Vecteur* ElContact::SM_charge_contact() // le N sort de la surface maître, donc rentre dans la surface esclave double gap= N * deltaX; // gap est négatif quand il y a pénétration + if ((Permet_affichage() > 7) && (contactType==4)) + {double a = (deltaX - gap*N).Norme(); // on calcule pour vérifier + cout << " diff_projX= "<< a; // l'erreur de projection normale + }; // récupération du facteur de pénalisation adaptée au cas de calcul et à la géométrie double d_beta_gap=0.; // init de la dérivée du facteur de pénalisation / au gap // calcul du facteur de pénalisation si le contact est de type 2 @@ -133,7 +137,11 @@ Vecteur* ElContact::SM_charge_contact() int typ_cal= ParaGlob::param->ParaAlgoControleActifs().TypeCalculPenalisationPenetration(); double borne_regularisation; if (fct_nD_contact.fct_nD_penetration_borne_regularisation != NULL) - {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_borne_regularisation);} + {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penetration_borne_regularisation); + } else {borne_regularisation = ParaGlob::param->ParaAlgoControleActifs().Penetration_borne_regularisation();} @@ -163,12 +171,23 @@ Vecteur* ElContact::SM_charge_contact() { intens_force = gap * penalisation; // négatif quand on a pénétration double max_force_noeud; if (fct_nD_contact.fct_nD_force_contact_noeud_maxi != NULL) - {max_force_noeud = Valeur_fct_nD(fct_nD_contact.fct_nD_force_contact_noeud_maxi);} + {max_force_noeud = Valeur_fct_nD(fct_nD_contact.fct_nD_force_contact_noeud_maxi + ,ElContact::Fct_nD_contact::tqi_fct_nD_force_contact_noeud_maxi + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_force_contact_noeud_maxi + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_force_contact_noeud_maxi); + } else {max_force_noeud = ParaGlob::param->ParaAlgoControleActifs().Force_contact_noeud_maxi();} if (Dabs(intens_force) > max_force_noeud) {intens_force = max_force_noeud * Signe(intens_force); force_limiter = true; } + // on recalcul la pénalisation associée + if ((Dabs(gap) > ConstMath::trespetit) && force_limiter) + {penalisation = intens_force / gap; + if (Permet_affichage() > 5) + {cout << " ** limitation penalisation= " << penalisation + << " intensite force = " << intens_force << flush;}; + }; // F_N c'est la force qui appuie sur le noeud esclave d'où le - car intens_force est négatif F_N = - N * intens_force; //(-gap * penalisation); break; @@ -182,6 +201,7 @@ Vecteur* ElContact::SM_charge_contact() const Grandeur_coordonnee& cofo = *((Grandeur_coordonnee*) typquel.Const_Grandeur_pointee()); // signe - car le contact doit s'opposer exactement à l'effort interne F_N = - cofo.ConteneurCoordonnee_const(); // récup de - la réaction + if (Permet_affichage() > 6) cout << " F_N(force_interne)= " << F_N << " "; // en fait on ne va garder que la partie normale à la facette, ce qui laissera le glissement possible intens_force = - F_N * N; // 1) projection de la réaction F_N = - N * intens_force; // 2) recalcul uniquement de la partie normale @@ -189,7 +209,11 @@ Vecteur* ElContact::SM_charge_contact() // penalisation = Dabs(intens_force / (Dabs(gap)));// + ConstMath::unpeupetit)) ; double max_pene; if (fct_nD_contact.fct_nD_penetration_contact_maxi != NULL) - {max_pene = Dabs(Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_contact_maxi));} + {max_pene = Dabs(Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_contact_maxi + ,ElContact::Fct_nD_contact::tqi_fct_nD_penetration_contact_maxi + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_penetration_contact_maxi + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penetration_contact_maxi)); + } else {max_pene = Dabs(ParaGlob::param->ParaAlgoControleActifs().Penetration_contact_maxi());} @@ -199,7 +223,7 @@ Vecteur* ElContact::SM_charge_contact() // {essai_penalisation = Dabs(intens_force) / Dabs(gap);} //(Dabs(gap) + ConstMath::unpeupetit)) ;} // else // sinon la pénétration est vraiment petite, on va cibler la valeur de max_pene // {essai_penalisation = Dabs(intens_force) / max_pene; -// if (niveau_commentaire > 5) cout << "\n (penalisation limite) "; +// if (Permet_affichage() > 5) cout << "\n (penalisation limite) "; // }; // // on tient compte d'un facteur multiplicatif éventuelle @@ -214,14 +238,21 @@ Vecteur* ElContact::SM_charge_contact() // {penalisation = Dabs(intens_force) / Dabs(gap);} //(Dabs(gap) + ConstMath::unpeupetit)) ;} // else // sinon la pénétration est vraiment petite, on va cibler la valeur de max_pene // {penalisation = Dabs(intens_force) / max_pene; -// if (niveau_commentaire > 5) cout << "\n (penalisation limite) "; +// if (Permet_affichage() > 5) cout << "\n (penalisation limite) "; // }; - if (niveau_commentaire > 6) cout << " F_N(pur)= " << F_N << " "; + if (Permet_affichage() > 6) cout << " F_N(pur)= " << F_N << " "; break; } default: break; // déjà vu au dessus }; F_N_max = Dabs(intens_force); // sauvegarde + if (Permet_affichage() > 5) + {cout << " noeud: " << noeud->Num_noeud(); + cout << "\n deltaX " << deltaX + <<"\n Noe_atdt= " << Noe_atdt << " M_impact= " << M_impact + <<"\n gap= " << gap << " N= " << N << " penalisation= " << penalisation + << " intensite force = " << intens_force << flush; + }; //cout << "\n SM_charge_contact: penalisation= "<< penalisation; // -- ici on a un traitement différent suivant typ_cal --- // Dans le cas du contact 4 on ne s'occupe pas du type de calcul de pénalisation @@ -238,7 +269,7 @@ Vecteur* ElContact::SM_charge_contact() // au cas où on met à 0 les forces de réaction sur la facette int nb_n_facette = tabForce_cont.Taille(); for (int i=1; i<= nb_n_facette; i++) tabForce_cont(i).Zero(); - if (niveau_commentaire > 6) + if (Permet_affichage() > 6) { cout << "\n noeud: " << noeud->Num_noeud() << ": force collage non prise en compte " << force_contact << " gap(positif)= " << gap << ", Normale= " << N; cout << "\n deltaX " << deltaX @@ -257,7 +288,7 @@ Vecteur* ElContact::SM_charge_contact() // au cas où on met à 0 les forces de réaction sur la facette int nb_n_facette = tabForce_cont.Taille(); for (int i=1; i<= nb_n_facette; i++) tabForce_cont(i).Zero(); - if (niveau_commentaire >= 6) + if (Permet_affichage() >= 6) { cout << "\n noeud: " << noeud->Num_noeud() << ": force collage non prise en compte " << force_contact << " gap(positif et > borne regularisation)= " << gap << ", Normale= " << N; @@ -329,7 +360,11 @@ Vecteur* ElContact::SM_charge_contact() // calcul de la force tangentielle en supposant tout d'abord un contact collant double penalisation_tangentielle; if (fct_nD_contact.fct_nD_penalisationTangentielle != NULL) - {penalisation_tangentielle = Valeur_fct_nD(fct_nD_contact.fct_nD_penalisationTangentielle);} + {penalisation_tangentielle = Valeur_fct_nD(fct_nD_contact.fct_nD_penalisationTangentielle + ,ElContact::Fct_nD_contact::tqi_fct_nD_penalisationTangentielle + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_penalisationTangentielle + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penalisationTangentielle); + } else {penalisation_tangentielle = ParaGlob::param->ParaAlgoControleActifs().PenalisationTangentielleContact();} // F_T =dep_tangentiel*(-ParaGlob::param->ParaAlgoControleActifs().PenalisationTangentielleContact()); F_T =dep_tangentiel*(-penalisation_tangentielle); @@ -362,6 +397,11 @@ Vecteur* ElContact::SM_charge_contact() F_T = nevez_force_frot; // --- calcul des énergies échangées energie_frottement += energie; + if (Permet_affichage() > 6) + { cout << "\n deltaX_T: " << dep_tangentiel + <<"\n vit_T= " << vit_T << " glisse= " << glisse + << " penalisation_tangentielle= " << penalisation_tangentielle; + }; } else if ( cas_collant) { // --- cas d'un contact collant sans loi de frottement explicite @@ -384,27 +424,40 @@ Vecteur* ElContact::SM_charge_contact() // limitation éventuelle de la force double max_force_T_noeud; if (fct_nD_contact.fct_nD_force_tangentielle_noeud_maxi != NULL) - {max_force_T_noeud = Valeur_fct_nD(fct_nD_contact.fct_nD_force_tangentielle_noeud_maxi);} + {max_force_T_noeud = Valeur_fct_nD(fct_nD_contact.fct_nD_force_tangentielle_noeud_maxi + ,ElContact::Fct_nD_contact::tqi_fct_nD_force_tangentielle_noeud_maxi + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_force_tangentielle_noeud_maxi + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_force_tangentielle_noeud_maxi); + } else {max_force_T_noeud = ParaGlob::param->ParaAlgoControleActifs().Force_tangentielle_noeud_maxi();} double n_F_T = Dabs(penalisation_tangentielle * dep_T); if (n_F_T > max_force_T_noeud) {F_T *= max_force_T_noeud/n_F_T; force_T_limiter = true; }; - F_T_max = F_T.Norme(); + if (Permet_affichage() > 6) + { cout << "\n deltaX_T: " << dep_tangentiel + << " penalisation_tangentielle= " << penalisation_tangentielle; + }; // --- calcul des énergies échangées // ici il s'agit d'une énergie élastique, que l'on ajoute à la pénalisation normale // énergie élastique de pénalisation: énergie élastique = 1/2 k x^2 = 1/2 F x energie_penalisation += Dabs(0.5 * F_T * dep_tangentiel); // pour que le résultat soit > 0 energie_frottement.ChangeEnergieElastique(energie_penalisation); }; // --- calcul des puissances virtuelles - + + F_T_max = F_T.Norme(); // sauvegarde + force_contact = F_T + F_N; - if (niveau_commentaire >= 5) + if (Permet_affichage() >= 5) { cout << "\n noeud: " << noeud->Num_noeud() << ": force contact " << force_contact ; + cout << " ||F_N||= "<< F_N.Norme() << " ||F_T||= "<< F_T_max; if (force_limiter) cout << " force normale en limite " ; if (force_T_limiter) cout << " force tangentielle en limite " ; }; + if (Permet_affichage() > 6) + cout << "\n ==> force contact imposee au residu (noeud:" << noeud->Num_noeud() + << " maillage:"<< noeud->Num_Mail() << ") " << force_contact; /* ////debug // if (noeud->Num_noeud()==207) // { @@ -488,7 +541,7 @@ Vecteur* ElContact::SM_charge_contact() noe->ModifDdl_etendu(ddl_reaction_tangentielle).Valeur() += intensite_tangentielle*phii(ir); }; }; - if (niveau_commentaire >= 7) + if (Permet_affichage() >= 7) { cout << "\n =-=-=- bilan sur le calcul de l'element de contact: =-=-=- "; this->Affiche(); }; @@ -507,8 +560,8 @@ Vecteur* ElContact::SM_charge_contact() // -> implicite, Element::ResRaid ElContact::SM_K_charge_contact() - { if (niveau_commentaire > 5) - cout << "\n -- SM_K_charge_contact: "; + { if (Permet_affichage() > 5) + {cout << "\n -- SM_K_charge_contact: ";this->Affiche(1);}; // le contact 4 passe en 41 ou 42 quand on dépasse un nombre donné d'itérations par exemple int contactType = ElContact::Recup_et_mise_a_jour_type_contact(); // préparation du retour @@ -552,12 +605,19 @@ Element::ResRaid ElContact::SM_K_charge_contact() Coordonnee M_impact; // le point d'impact, la normale Vecteur phii; ////debug -// if (noeud->Num_noeud()==56) +// if (noeud->Num_noeud()== 2) // { -// cout << "\n debug : ElContact::SM_K_charge_contact(): noeud 409" +// cout << "\n debug : ElContact::SM_K_charge_contact():" +// << " noeud: " << noeud->Num_noeud() <<" mailage:"<Num_Mail() // << endl; // }; //// fin debug +// //debug +// if (Permet_affichage() > 4) +// {cout << "\n debug ElContact::SM_K_charge_contact avant RecupInfo " ; +// }; +// //fin debug + // d_T_pt: représente la variation du vecteur normale Tableau * d_T_pt = (RecupInfo(N,M_impact,phii,true)); // en fait due aux différents algos de recherche de contact, normalement la position de contact est sauvegardée // dans l'élément, donc on utilise cette info, par contre on utilise RecupInfo pour calculer les autres infos : normale et phi @@ -589,7 +649,7 @@ Element::ResRaid ElContact::SM_K_charge_contact() double gap= N * deltaX; // ce qui constitue la fonction g(ddl) à annuler voir à minimiser - if ((niveau_commentaire > 7) && (contactType==4)) + if ((Permet_affichage() > 7) && (contactType==4)) {double a = (deltaX - gap*N).Norme(); // on calcule pour vérifier cout << " diff_projX= "<< a; // l'erreur de projection normale }; @@ -615,7 +675,11 @@ Element::ResRaid ElContact::SM_K_charge_contact() // double max_pene = ParaGlob::param->ParaAlgoControleActifs().Penetration_contact_maxi(); double borne_regularisation; if (fct_nD_contact.fct_nD_penetration_borne_regularisation != NULL) - {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_borne_regularisation);} + {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penetration_borne_regularisation); + } else {borne_regularisation = ParaGlob::param->ParaAlgoControleActifs().Penetration_borne_regularisation();} int typ_cal= ParaGlob::param->ParaAlgoControleActifs().TypeCalculPenalisationPenetration(); @@ -651,7 +715,11 @@ Element::ResRaid ElContact::SM_K_charge_contact() double max_force_noeud; if (fct_nD_contact.fct_nD_force_contact_noeud_maxi != NULL) - {max_force_noeud = Valeur_fct_nD(fct_nD_contact.fct_nD_force_contact_noeud_maxi);} + {max_force_noeud = Valeur_fct_nD(fct_nD_contact.fct_nD_force_contact_noeud_maxi + ,ElContact::Fct_nD_contact::tqi_fct_nD_force_contact_noeud_maxi + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_force_contact_noeud_maxi + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_force_contact_noeud_maxi); + } else {max_force_noeud = ParaGlob::param->ParaAlgoControleActifs().Force_contact_noeud_maxi();} switch (contactType) { case 2: // cas d'une pénalisation classique @@ -664,7 +732,7 @@ Element::ResRaid ElContact::SM_K_charge_contact() // on recalcul la pénalisation associée if ((Dabs(gap) > ConstMath::trespetit) && force_limiter) {penalisation = intens_force / gap; - if (niveau_commentaire > 5) + if (Permet_affichage() > 5) {cout << " ** limitation penalisation= " << penalisation << " intensite force = " << intens_force << flush;}; }; @@ -681,14 +749,18 @@ Element::ResRaid ElContact::SM_K_charge_contact() const Grandeur_coordonnee& cofo = *((Grandeur_coordonnee*) typquel.Const_Grandeur_pointee()); // signe - car le contact doit s'opposer exactement à l'effort interne F_N = - cofo.ConteneurCoordonnee_const(); // récup de - la réaction - if (niveau_commentaire > 6) cout << " F_N(force_interne)= " << F_N << " "; + if (Permet_affichage() > 6) cout << " F_N(force_interne)= " << F_N << " "; // en fait on ne va garder que la partie normale à la facette, ce qui laissera le glissement possible intens_force = - F_N * N; // 1) projection de la réaction F_N = - N * intens_force; // 2) recalcul uniquement de la partie normale // on va également tenter un calcul d'une pénalisation équivalente double max_pene; if (fct_nD_contact.fct_nD_penetration_contact_maxi != NULL) - {max_pene = Dabs(Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_contact_maxi));} + {max_pene = Dabs(Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_contact_maxi + ,ElContact::Fct_nD_contact::tqi_fct_nD_penetration_contact_maxi + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_penetration_contact_maxi + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penetration_contact_maxi)); + } else {max_pene = Dabs(ParaGlob::param->ParaAlgoControleActifs().Penetration_contact_maxi());} // l'idée est de viser la pénétration max_pene, car en pénalisation, le fait // de conserver la pénétration et la force constatées, ne va pas diminuer la pénétration @@ -708,16 +780,16 @@ Element::ResRaid ElContact::SM_K_charge_contact() // {penalisation = Dabs(intens_force) / Dabs(gap);} //(Dabs(gap) + ConstMath::unpeupetit)) ;} // else // sinon la pénétration est vraiment petite, on va cibler la valeur de max_pene // {penalisation = Dabs(intens_force) / max_pene; -// if (niveau_commentaire > 5) cout << "\n (penalisation limite) "; +// if (Permet_affichage() > 5) cout << "\n (penalisation limite) "; // }; - if (niveau_commentaire > 6) cout << " F_N(pur)= " << F_N << " "; + if (Permet_affichage() > 6) cout << " F_N(pur)= " << F_N << " "; break; } default: break; // déjà vu au dessus }; F_N_max = Dabs(intens_force); // sauvegarde - if (niveau_commentaire > 5) + if (Permet_affichage() > 5) {cout << " noeud: " << noeud->Num_noeud(); cout << "\n deltaX " << deltaX <<"\n Noe_atdt= " << Noe_atdt << " M_impact= " << M_impact @@ -727,8 +799,10 @@ Element::ResRaid ElContact::SM_K_charge_contact() //cout << "\n SM_K_charge_contact: penalisation= "<< penalisation << " gap= " << gap << " FN= " << F_N ; -////debug -// if (F_N_max > 80.) +//debug +// if ((F_N_max > 5000000) || (noeud->Num_noeud()==2)) +// if (penalisation == 0.) +// if (noeud->Num_noeud()==2) // { // cout << "\n debug : ElContact::SM_K_charge_contact(): noeud " << noeud->Num_noeud() // << " zone: " << num_zone_contact @@ -737,6 +811,7 @@ Element::ResRaid ElContact::SM_K_charge_contact() // <<"\n gap= " << gap << " N= " << N // << " penalisation= " << penalisation << endl // ; +//// CalFactPenal(gap,d_beta_gap,contactType); // }; // fin debug @@ -752,7 +827,10 @@ Element::ResRaid ElContact::SM_K_charge_contact() { //cout << "\n *** bizarre la penetration devrait etre negative ?? , on annule les forces de contact " // << "\n ElContact::SM_charge_contact(..."; force_contact=F_N; // on sauvegarde pour le traitement du décollement éventuel - if (niveau_commentaire > 6) + // au cas où on met à 0 les forces de réaction sur la facette + int nb_n_facette = tabForce_cont.Taille(); + for (int i=1; i<= nb_n_facette; i++) tabForce_cont(i).Zero(); + if (Permet_affichage() > 6) { cout << " noeud: " << noeud->Num_noeud() << ": force collage non prise en compte " << force_contact << " gap(positif)= " << gap << ", Normale= " << N; @@ -769,7 +847,10 @@ Element::ResRaid ElContact::SM_K_charge_contact() if (gap > Dabs(borne_regularisation)) // on est sortie de la zone d'accostage donc on neutralise le contact { force_contact=F_N; // on sauvegarde pour le traitement du décollement éventuel - if (niveau_commentaire >= 7) + // au cas où on met à 0 les forces de réaction sur la facette + int nb_n_facette = tabForce_cont.Taille(); + for (int i=1; i<= nb_n_facette; i++) tabForce_cont(i).Zero(); + if (Permet_affichage() >= 6) { cout << " noeud: " << noeud->Num_noeud() << ": force collage non prise en compte " << force_contact << " gap(positif et > borne regularisation)= " << gap << ", Normale= " << N; @@ -806,18 +887,49 @@ Element::ResRaid ElContact::SM_K_charge_contact() bool force_T_limiter = false; // init if (loiFrot != NULL) { // --- cas de l'existance d'une loi de frottement - // calcul du déplacement tangentiel: là il s'agit du déplacement relatif entre l'ancien point projeté et le nouveau - - Coordonnee M_tatdt; - if (Mt.Dimension() != 0) - {M_tatdt = (Mtdt-Mt);} // déplacement total - ; // sinon Mt n'est pas encore définit donc on ne peut pas calculer le déplacement - // il est donc laissé à 0. - dep_tangentiel = M_tatdt- N * (M_tatdt*N); // on retire le deplacement normal éventuel + + // calcul du déplacement tangentiel par rapport au premier point de contact + // mis à jour en fonction du glissement éventuelle + ElFrontiere & elfro = *(elfront->Eleme()); // pour commodite + const Coordonnee & M_C0 = elfro.Metrique()->PointM_tdt // ( stockage a tdt) + (elfro.TabNoeud(),phi_theta_0); + ////---- debug ---- + //{const Coordonnee & M_a0 = elfro.Metrique()->PointM_0 // ( stockage a tdt) + // (elfro.TabNoeud(),phi_theta_0); + // cout << "\n debug smK contact: M_a0: ";M_a0.Affiche_1(cout); + // cout << " a tdt: ";M_C0.Affiche_1(cout); + //} + ////---- fin debug --- + Coordonnee M_0atdt = (Noe_atdt-M_C0); // déplacement total à partir du point d'impact mis à jour + // transportée via l'interpolation: c-a-d les phi_theta_0 qui restent constant + // ici du au frottement, le point d'impact est mis à jour en fonction du glissement éventuel + dep_tangentiel = M_0atdt- N * (M_0atdt*N); // on retire le deplacement normal éventuel + ////---- debug ---- + //{ cout << "\n dep_tangentiel: ";dep_tangentiel.Affiche_1(cout); + // cout << "\n Noe_atdt: "; Noe_atdt.Affiche_1(cout); + //} + ////---- fin debug --- + double dep_T = dep_tangentiel.Norme(); + dep_T_tdt = dep_T; // sauvegarde + + +// // calcul du déplacement tangentiel: là il s'agit du déplacement relatif entre l'ancien point projeté et le nouveau +// +// Coordonnee M_tatdt(dima); +// if (Mt.Dimension() != 0) +// {M_tatdt = (Mtdt-Mt);} // déplacement total +// ; // sinon Mt n'est pas encore définit donc on ne peut pas calculer le déplacement +// // il est donc laissé à 0. +// dep_tangentiel = M_tatdt- N * (M_tatdt*N); // on retire le deplacement normal éventuel + // calcul de la force tangentielle en supposant tout d'abord un contact collant double penalisation_tangentielle; if (fct_nD_contact.fct_nD_penalisationTangentielle != NULL) - {penalisation_tangentielle = Valeur_fct_nD(fct_nD_contact.fct_nD_penalisationTangentielle);} + {penalisation_tangentielle = Valeur_fct_nD(fct_nD_contact.fct_nD_penalisationTangentielle + ,ElContact::Fct_nD_contact::tqi_fct_nD_penalisationTangentielle + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_penalisationTangentielle + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penalisationTangentielle); + } else {penalisation_tangentielle = ParaGlob::param->ParaAlgoControleActifs().PenalisationTangentielleContact();} // F_T =dep_tangentiel*(-ParaGlob::param->ParaAlgoControleActifs().PenalisationTangentielleContact()); F_T =dep_tangentiel*(-penalisation_tangentielle); @@ -841,13 +953,24 @@ Element::ResRaid ElContact::SM_K_charge_contact() // appel de la loi de comportement: calcul de la force de frottement et des énergies échangées Coordonnee nevez_force_frot;EnergieMeca energie; bool glisse = loiFrot->Cal_explicit_contact_tdt(vit_T,N,F_N,F_T,energie,deltat,nevez_force_frot); - + + if (Permet_affichage() > 6) + { cout << "\n deltaX_T: " << dep_tangentiel + <<"\n vit_T= " << vit_T << " glisse= " << glisse + << " penalisation_tangentielle= " << penalisation_tangentielle; + }; +// *** à faire +// mise à jour du point d'impact en fct du glissement , ou d'un point de référence qui tient compte +// du glissement + + // if (vit_T * nevez_force_frot > 0) // cout << "\n bizarre puissance de frottement positive !"; if (glisse) // on remplace la force de frottement si ça glisse sinon on conserve F_T F_T = nevez_force_frot; + // --- calcul des énergies échangées energie_frottement += energie; } @@ -883,7 +1006,11 @@ Element::ResRaid ElContact::SM_K_charge_contact() // limitation éventuelle de la force double max_force_T_noeud; if (fct_nD_contact.fct_nD_force_tangentielle_noeud_maxi != NULL) - {max_force_T_noeud = Dabs(Valeur_fct_nD(fct_nD_contact.fct_nD_force_tangentielle_noeud_maxi));} + {max_force_T_noeud = Dabs(Valeur_fct_nD(fct_nD_contact.fct_nD_force_tangentielle_noeud_maxi + ,ElContact::Fct_nD_contact::tqi_fct_nD_force_tangentielle_noeud_maxi + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_force_tangentielle_noeud_maxi + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_force_tangentielle_noeud_maxi)); + } else {max_force_T_noeud = Dabs(ParaGlob::param->ParaAlgoControleActifs().Force_tangentielle_noeud_maxi());} double n_F_T = Dabs(penalisation_tangentielle * dep_T); ////---- debug ---- @@ -891,17 +1018,20 @@ Element::ResRaid ElContact::SM_K_charge_contact() // cout << " F_T: ";F_T.Affiche_1(cout); //} ////---- debug --- + if (Permet_affichage() > 6) + { cout << "\n deltaX_T: " << dep_tangentiel + << " penalisation_tangentielle= " << penalisation_tangentielle; + }; if ((n_F_T > max_force_T_noeud) && (max_force_T_noeud > ConstMath::petit)) {F_T *= max_force_T_noeud/n_F_T; force_T_limiter = true; // on recalcul la pénalisation associée if (Dabs(dep_T) > ConstMath::trespetit) {penalisation_tangentielle = max_force_T_noeud / dep_T;} - if (niveau_commentaire >= 6) + if (Permet_affichage() >= 6) {cout << " ** limitation penalisation tangentielle= " << penalisation_tangentielle << " intensite force = " << max_force_T_noeud << flush;}; }; - F_T_max = F_T.Norme(); // sauvegarde ////---- debug ---- //{ cout << "\n F_T_max= " << n_F_T ; // cout << " F_T: ";F_T.Affiche_1(cout); @@ -913,14 +1043,16 @@ Element::ResRaid ElContact::SM_K_charge_contact() energie_penalisation -= 0.5 * F_T * dep_tangentiel; // - pour que le résultat soit > 0 energie_frottement.ChangeEnergieElastique(energie_penalisation); }; + F_T_max = F_T.Norme(); // sauvegarde // --- calcul des puissances virtuelles force_contact = F_T + F_N; - if (niveau_commentaire > 5) + if (Permet_affichage() > 5) { cout << " noeud: " << noeud->Num_noeud() << ": force contact " << force_contact ; + cout << " ||F_N||= "<< F_N.Norme() << " ||F_T||= "<< F_T_max; if (force_limiter) cout << " force normale en limite " ; if (force_T_limiter) cout << " force tangentielle en limite " ; }; - if (niveau_commentaire > 6) + if (Permet_affichage() > 6) cout << "\n ==> force contact imposee au residu (noeud:" << noeud->Num_noeud() << " maillage:"<< noeud->Num_Mail() << ") " << force_contact; int posi = Id_nom_ddl("R_X1") -1; // préparation pour les réactions @@ -980,7 +1112,7 @@ Element::ResRaid ElContact::SM_K_charge_contact() if (cas_solide == 0) // cas du bi_déformable, sinon pas de terme de couplage {int iddl_facette = 1; if (d_T_pt != NULL) // car même si on l'a demandé, il peut être null s'il n'existe pas (ex cas 1D ) - {Tableau & d_T = *d_T_pt; // pour simplifier + {Tableau & d_T = *d_T_pt; // variation du vecteur normale: pour simplifier if ( cas_collant) {if (actif==1) // on doit prendre en compte que deltax n'est pas normal à la facette {for (int jr=1;jr<=tab_taille-1;jr++) // boucle sur les noeuds de la facette @@ -1069,7 +1201,7 @@ Element::ResRaid ElContact::SM_K_charge_contact() }; // fin du if (cas_solide == 0) }; // fin de la boucle ix sur le noeud esclave } // fin de la première partie de: if ((cas_solide == 0 ) || (cas_solide == 1)) - else // sinon c-a-d: cas_solide différent de 0 et 1 c-a-d le noeud est bloaqué + else // sinon c-a-d: cas_solide différent de 0 et 1 c-a-d le noeud est bloqué // on s'occupe quand même des réactions, ce qui nous permettra de les récupérer même sur un solide {for (int ix=1;ix<=dima;ix++) // pour le noeud projectile la vitesse virtuelle associé est // on abonde au niveau de la réaction au noeud @@ -1118,14 +1250,14 @@ Element::ResRaid ElContact::SM_K_charge_contact() // et sachant que d_gap_d_ddl_iy = N(iy) pour le noeud central {for (int is=1;is<=tab_taille-1;is++) { Noeud* noe = tabNoeud(is+1); // pour simplifier - if (niveau_commentaire >= 7) + if (Permet_affichage() >= 7) cout << "\n reaction facette imposee au residu (noeud:" << noe->Num_noeud() << " maillage:"<< noe->Num_Mail() << ") " ; tabForce_cont(is) = -force_contact*phii(is); for (int ix=1;ix<=nb_ddl_en_var;ix++,ism++) { double force_imp = -force_contact(ix)*phii(is); SM_res(ism) += force_imp; - if (niveau_commentaire > 6) + if (Permet_affichage() > 6) cout << force_imp << " "; // on abonde au niveau de la réaction au noeud noe->Ajout_val_tdt(Enum_ddl(ix+posi),force_imp); @@ -1282,6 +1414,18 @@ Element::ResRaid ElContact::SM_K_charge_contact() noe->ModifDdl_etendu(ddl_reaction_normale).Valeur() += -intens_force*phii(ir); noe->ModifDdl_etendu(ddl_reaction_tangentielle).Valeur() += intensite_tangentielle*phii(ir); }; +// // --- debug +//{ for (int ir=1;ir<=tab_taille-1;ir++) +// { Noeud* noe = tabNoeud(ir+1); // pour simplifier +// if ((noe->Num_noeud() == 5) && (noe->Num_Mail() == 2)) +// {cout << "\n debug : ElContact::SM_K_charge_contact() "; +// cout << " R_X= "; +// for (int ix=1;ix<=dima;ix++) +// cout << noe->Valeur_tdt(Enum_ddl(ix+posi)) << " "; +// } +// } +//} +// // --- fin debug }; // retour // return residu; // SM est nul à ce niveau du programme @@ -1300,13 +1444,75 @@ Element::ResRaid ElContact::SM_K_charge_contact() Coordonnee ElContact::Calcul_Normale(int dim, Plan & pl, Droite & dr,int indic) { Coordonnee N(dim); // le vecteur normal initialisé à 0 - if ( (dim == 3) && (indic == 2)) + // --- le cas des angles morts est particulier, on commence par le traiter + if (elfront->Angle_mort()) + { ElFrontiere & elfro = *(elfront->Eleme()); // pour commodite + if (elfro.TypeFrontiere() == "FrontPointF") + {// s'il s'agit d'un point il n'y a pas d'existance de normale +// // on remplace la notion de normale par le vecteur qui joint le noeud à la position +// // du point frontière +// N = elfro.Ref()- noeud->Coord2(); + // on utilise la normale au noeud + const TypeQuelconque& tiq = tabNoeud(2)->Grandeur_quelconque(N_FRONT_t); + const Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) (tiq.Const_Grandeur_pointee())); + N = gr.ConteneurCoordonnee_const(); + } + else + { cout << "\n *** cas element Angle_mort actuellement non implante: , " + << elfro.TypeFrontiere() + << "\n ElContact::Calcul_Normale(..."; + Sortie(1); + }; + } + // ---- maintenant on regarde si on veut une normale lissée + else if (normale_lisser) + {// dans le cas d'une normale lissée on va utiliser une interpolation des normales aux noeuds + ElFrontiere & elfro = *(elfront->Eleme()); // pour commodite + // recup et actualisation du dernier plan tangent, coordonnées locale etc. + // dimensionnement des variables de tangence +// //debug +// cout << "\n debug ElContact::Calcul_Normale: "; +// cout << "\n elfro.DernierTangent " << flush; +// // fin debug + Plan pl(dim); Droite dr(dim); int indic; // def des variables de tangence + elfro.DernierTangent(dr,pl,indic,false); + // récup des fonctions phi + const Vecteur& phii = elfro.Phi(); +// //debug +// cout << "\n debug ElContact::Calcul_Normale: "; +// cout << "\n phii= " << phii; +// // fin debug + // on parcours les noeuds de la frontière + // retourne le tableau de noeud en lecture lecture/écriture + Tableau & tNfront = elfro.TabNoeud(); + int nbNfront = tNfront.Taille(); + Coordonnee Nnoe(dim); // variable inter + for (int inoe = 1;inoe <= nbNfront;inoe++) + { const TypeQuelconque& tiq = tNfront(inoe)->Grandeur_quelconque(N_FRONT_t); + const Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) (tiq.Const_Grandeur_pointee())); + Nnoe = gr.ConteneurCoordonnee_const(); +////debug +// cout << "\n debug ElContact::Calcul_Normale: "; +// cout << "\n Nnoe= " << Nnoe; +//// fin debug +//{TypeQuelconque& tiq_t = tNfront(inoe)->ModifGrandeur_quelconque(N_FRONT_t); +// Grandeur_coordonnee& gr_t= *((Grandeur_coordonnee*) (tiq_t.Grandeur_pointee())); +// Coordonnee& normale_t = *gr.ConteneurCoordonnee(); +// +//} + N = phii(inoe)*Nnoe; +// cout << "\n Nnoe= " << Nnoe; + }; + N.Normer(); + } + // --- on continue avec les éléments qui ne sont pas d'angle mort et sans lissage + else if ( (dim == 3) && (indic == 2)) // cas 3d avec une surface { N = pl.Vecplan(); return N; } - else if ( ((dim == 2) && (indic == 1)) + else if ( ((dim == 2) && (indic == 1)) || (ParaGlob::AxiSymetrie() && (dim == 3) && (indic == 1)) ) // cas 2D avec une ligne, (ou 3D bloqué avec une ligne ??) @@ -1400,117 +1606,190 @@ Tableau * ElContact::RecupInfo(Coordonnee& N,Coordonnee& M_impact, // recup du dernier plan tangent (ou droite) // dimensionnement des variables de tangence Plan pl(dim); Droite dr(dim); int indic; // def des variables de tangence - Tableau * d_T = elfro.DernierTangent(dr,pl,indic,avec_var); + Tableau * d_T = NULL; // init par défaut = elfro.DernierTangent(dr,pl,indic,avec_var); // different cas N.Change_dim(dim); // le vecteur normal - if (ParaGlob::AxiSymetrie() && (dim == 3)) - N(3) = 0.; // init pour le cas axi - if ( (dim == 3) && (indic == 2)) - // cas 3d avec une surface - { N = pl.Vecplan(); - M_impact = pl.PointPlan(); - } - else if ( ((dim == 2) && (indic == 1)) - || (ParaGlob::AxiSymetrie() && (dim == 3) && (indic == 1)) - ) - // cas 2D avec une ligne - // ou 3D axisymétrique avec une ligne - { Coordonnee V = dr.VecDroite(); // le vecteur tangent -// N(1) = -V(2); N(2) = V(1); // un vecteur normal -// !!!! pour l'instant il y a une erreur de numérotation: on utilise en fait une numérotation -// exactement inverse de la doc !!! - N(1) = V(2); N(2) = -V(1); // un vecteur normal - // en axi N(3) est déjà initialisé à 0 - M_impact = dr.PointDroite(); - } - else if ( (dim == 3) && (indic == 1)) - // cas 3d avec une ligne, on va considérer que la normale est la normale dans la direction -// **** a revoir car c'est problématique quand le noeud esclave est très proche de la ligne -// du coup on peut avoir une normale qui oscille d'un coté à l'autre de la ligne ce qui fait que l'on va -// avoir ensuite une force de contact ou de collage !!! aléatoire !!! pas bon du tout -// sans doute trouver autre chose : peut-être que c'est ok quand le point est franchement hors de la ligne -// pas pas autrement - // du noeud esclave (si celui-ci est suffisemment externe à la ligne - { Coordonnee V = dr.VecDroite(); // On récupère le vecteur tangent à la ligne - Coordonnee A = noeud->Coord2() - tabNoeud(2)->Coord2(); // on construit un vecteur entre le premier point de ligne -> le noeud esclave - Coordonnee B = Util:: ProdVec_coor(V,A); // produit vectoriel - // on ne continue que si ce produit vectoriel n'est pas nul - if (B.Norme() > ConstMath::petit) - { N = Util:: ProdVec_coor(V,B).Normer();} - else // sinon cela veut dire que le noeud est sur la ligne, dans ce cas particulier, d'une manière arbitraire - // on prend la normale dans un des 3 plans de base, en commençant par le plan xy qui serait celui où par exemple - // on travaille en 3D, mais avec le z bloqué - { // on commence par voir si c'est possible en xy - if (DabsMaX(V(1),V(2)) > ConstMath::petit) - // là c'est ok la ligne n'est pas // à z - // ici il faut faire attention: la normale est prise de manière à être sortante de l'élément - // car normalement, le vecteur unitaire de la droite est déterminée avec deux points suivants la numérotation de l'élément - // donc la normale à ce vecteur, en suivant le sens trigo, se trouve dirigé vers l'intérieur de l'élément - { N(1) = V(2); N(2) = -V(1); - N(3)=0.; // on pose z=0 d'où une normale dans le plan xy - } - else // sinon cela veut dire que l'on est suivant l'axe de z, on choisit x par défaut - { N(1)=1; N(2)=N(3)=0.;}; - }; - M_impact = dr.PointDroite(); - } -// else if ( (dim == 2) && (indic == 1)) -// // cas 2D avec une ligne -// { Coordonnee V = dr.VecDroite(); // le vecteur tangent -//// N(1) = -V(2); N(2) = V(1); // un vecteur normal -//// !!!! pour l'instant il y a une erreur de numérotation: on utilise en fait une numérotation -//// exactement inverse de la doc !!! -// N(1) = V(2); N(2) = -V(1); // un vecteur normal -// M_impact = dr.PointDroite(); -// } - else if ( (dim == 1) && (indic == 0)) - // cas 1D avec un point - { // la normale sortante de l'élément c'est soit 1 ou -1 - // pour le déterminer on commence par trouver le coté de l'élément frontière qui va rentrer en contact - // on est obligé de considérer l'élément - // pour cela on cherche le noeud de l'élément qui correspond au noeud frontière - // qui normalement est le second noeud du global des noeuds de l'élément de contact - Noeud * no_front= tabNoeud(2); int num_no_front = no_front->Num_noeud(); - const Tableau < Noeud * > t_N_elem = elfront->PtEI()->Tab_noeud_const(); - int nbN_elem = t_N_elem.Taille(); int num_N=0; - for (int i=1;i<= nbN_elem;i++) - if (t_N_elem(i)->Num_noeud() == num_no_front) - {num_N = i;break;}; - if (num_N == 0) - { cout << "\n *** warning on n'a pas trouve de frontiere correct pour le calcul de la normale " - << "\n cas du contact entre deux points ... le contact sera mal calcule " << endl; - }; - // maintenant on prend au autre noeud de l'élément et on regarde le sens - for (int i=1;i<= nbN_elem;i++) - if (i != num_N) - {// il s'agit bien d'un autre noeud - if (t_N_elem(i)->Coord2()(1) > no_front->Coord2()(1) ) - {N(1) = -1.;} - else {N(1) = 1.;} - break; - }; -// non erreur !! M_impact = N; // sera modifié ensuite, la valeur n'a pas d'importance - // a priori le point d'impact c'est le noeud frontière - M_impact = no_front->Coord2(); - } - else if ( (dim == 1) && (indic == 1)) - // cas 1D avec une droite - { N(1) = 1.; // le vecteur normal, qui correspond au seul vecteur disponible - M_impact = dr.PointDroite();; - } + // on commence par traiter le cas des éléments particuliers qui décrivent les angles morts + if (elfront->Angle_mort()) + { if (elfro.TypeFrontiere() == "FrontPointF") + {// s'il s'agit d'un point il n'y a pas d'existance de normale +// // on remplace la notion de normale par le vecteur qui joint le noeud à la position +// // du point frontière +// N = elfro.Ref()- noeud->Coord2(); + // on utilise la normale au noeud + elfro.DernierTangent(dr,pl,indic,false); + // on ne considère pas la variation de la normale + d_T = NULL; + const TypeQuelconque& tiq = tabNoeud(2)->Grandeur_quelconque(N_FRONT_t); + const Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) (tiq.Const_Grandeur_pointee())); + N = gr.ConteneurCoordonnee_const(); + M_impact = elfro.Ref(); + } + else + { cout << "\n *** cas element Angle_mort actuellement non implante: , " + << elfro.TypeFrontiere() + << "\n ElContact::RecupInfo(.."; + Sortie(1); + }; + } + // ---- maintenant on regarde si on veut une normale lissée + else if (normale_lisser) + {// dans le cas d'une normale lissée on va utiliser une interpolation des normales aux noeuds + ElFrontiere & elfro = *(elfront->Eleme()); // pour commodite + // recup et actualisation du dernier plan tangent, coordonnées locale etc. + // dimensionnement des variables de tangence + Plan pl(dim); Droite dr(dim); int indic; // def des variables de tangence + elfro.DernierTangent(dr,pl,indic,false); + // le vecteur normal est fixe ici pendant les itérations + d_T = NULL; + // récup des fonctions phi + const Vecteur& phii = elfro.Phi(); + // on parcours les noeuds de la frontière + // retourne le tableau de noeud en lecture lecture/écriture + Tableau & tNfront = elfro.TabNoeud(); + int nbNfront = tNfront.Taille(); + Coordonnee Nnoe(dim); // variable inter + N.Zero(); + for (int inoe = 1;inoe <= nbNfront;inoe++) + { const TypeQuelconque& tiq = tNfront(inoe)->Grandeur_quelconque(N_FRONT_t); + const Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) (tiq.Const_Grandeur_pointee())); + Nnoe = gr.ConteneurCoordonnee_const(); + N += phii(inoe)*Nnoe; + }; + N.Normer(); +//debug +if (Permet_affichage() > 4) + {cout << "\n debug ElContact::RecupInfo N= "<Coord2();; break; + default: + {cout << "\n *** erreur indic =" << indic <<" c-a-d diff de 2 ou 1 ou 0 " + << " on ne peut pas continuer !"; + this->Affiche(1); + } + break; + }; + } else - // autres cas non traite pour l'instant - { cout << "\n erreur, desole mais le cas de contact en dimension = " << dim - << ", avec "; - if (indic == 1) - cout << " une droite "; - else - cout << " un plan "; - cout << " n\'est pas actuellement traite " << "ElContact::RecupInfo(.."<< endl; - Sortie(1); - }; + { + // cas d'élément de contact autres que ceux qui représentent les angles morts + // et des normales lissées + Tableau * d_T = elfro.DernierTangent(dr,pl,indic,avec_var); + if (ParaGlob::AxiSymetrie() && (dim == 3)) + N(3) = 0.; // init pour le cas axi + if ( (dim == 3) && (indic == 2)) + // cas 3d avec une surface + { N = pl.Vecplan(); + M_impact = pl.PointPlan(); + } + else if ( ((dim == 2) && (indic == 1)) + || (ParaGlob::AxiSymetrie() && (dim == 3) && (indic == 1)) + ) + // cas 2D avec une ligne + // ou 3D axisymétrique avec une ligne + { Coordonnee V = dr.VecDroite(); // le vecteur tangent + // N(1) = -V(2); N(2) = V(1); // un vecteur normal + // !!!! pour l'instant il y a une erreur de numérotation: on utilise en fait une numérotation + // exactement inverse de la doc !!! + N(1) = V(2); N(2) = -V(1); // un vecteur normal + // en axi N(3) est déjà initialisé à 0 + M_impact = dr.PointDroite(); + } + else if ( (dim == 3) && (indic == 1)) + // cas 3d avec une ligne, on va considérer que la normale est la normale dans la direction + // **** a revoir car c'est problématique quand le noeud esclave est très proche de la ligne + // du coup on peut avoir une normale qui oscille d'un coté à l'autre de la ligne ce qui fait que l'on va + // avoir ensuite une force de contact ou de collage !!! aléatoire !!! pas bon du tout + // sans doute trouver autre chose : peut-être que c'est ok quand le point est franchement hors de la ligne + // pas pas autrement + // du noeud esclave (si celui-ci est suffisemment externe à la ligne + { Coordonnee V = dr.VecDroite(); // On récupère le vecteur tangent à la ligne + Coordonnee A = noeud->Coord2() - tabNoeud(2)->Coord2(); // on construit un vecteur entre le premier point de ligne -> le noeud esclave + Coordonnee B = Util:: ProdVec_coor(V,A); // produit vectoriel + // on ne continue que si ce produit vectoriel n'est pas nul + if (B.Norme() > ConstMath::petit) + { N = Util:: ProdVec_coor(V,B).Normer();} + else // sinon cela veut dire que le noeud est sur la ligne, dans ce cas particulier, d'une manière arbitraire + // on prend la normale dans un des 3 plans de base, en commençant par le plan xy qui serait celui où par exemple + // on travaille en 3D, mais avec le z bloqué + { // on commence par voir si c'est possible en xy + if (DabsMaX(V(1),V(2)) > ConstMath::petit) + // là c'est ok la ligne n'est pas // à z + // ici il faut faire attention: la normale est prise de manière à être sortante de l'élément + // car normalement, le vecteur unitaire de la droite est déterminée avec deux points suivants la numérotation de l'élément + // donc la normale à ce vecteur, en suivant le sens trigo, se trouve dirigé vers l'intérieur de l'élément + { N(1) = V(2); N(2) = -V(1); + N(3)=0.; // on pose z=0 d'où une normale dans le plan xy + } + else // sinon cela veut dire que l'on est suivant l'axe de z, on choisit x par défaut + { N(1)=1; N(2)=N(3)=0.;}; + }; + M_impact = dr.PointDroite(); + } + // else if ( (dim == 2) && (indic == 1)) + // // cas 2D avec une ligne + // { Coordonnee V = dr.VecDroite(); // le vecteur tangent + //// N(1) = -V(2); N(2) = V(1); // un vecteur normal + //// !!!! pour l'instant il y a une erreur de numérotation: on utilise en fait une numérotation + //// exactement inverse de la doc !!! + // N(1) = V(2); N(2) = -V(1); // un vecteur normal + // M_impact = dr.PointDroite(); + // } + else if ( (dim == 1) && (indic == 0)) + // cas 1D avec un point + { // la normale sortante de l'élément c'est soit 1 ou -1 + // pour le déterminer on commence par trouver le coté de l'élément frontière qui va rentrer en contact + // on est obligé de considérer l'élément + // pour cela on cherche le noeud de l'élément qui correspond au noeud frontière + // qui normalement est le second noeud du global des noeuds de l'élément de contact + Noeud * no_front= tabNoeud(2); int num_no_front = no_front->Num_noeud(); + const Tableau < Noeud * > t_N_elem = elfront->PtEI()->Tab_noeud_const(); + int nbN_elem = t_N_elem.Taille(); int num_N=0; + for (int i=1;i<= nbN_elem;i++) + if (t_N_elem(i)->Num_noeud() == num_no_front) + {num_N = i;break;}; + if (num_N == 0) + { cout << "\n *** warning on n'a pas trouve de frontiere correct pour le calcul de la normale " + << "\n cas du contact entre deux points ... le contact sera mal calcule " << endl; + }; + // maintenant on prend au autre noeud de l'élément et on regarde le sens + for (int i=1;i<= nbN_elem;i++) + if (i != num_N) + {// il s'agit bien d'un autre noeud + if (t_N_elem(i)->Coord2()(1) > no_front->Coord2()(1) ) + {N(1) = -1.;} + else {N(1) = 1.;} + break; + }; + // non erreur !! M_impact = N; // sera modifié ensuite, la valeur n'a pas d'importance + // a priori le point d'impact c'est le noeud frontière + M_impact = no_front->Coord2(); + } + else if ( (dim == 1) && (indic == 1)) + // cas 1D avec une droite + { N(1) = 1.; // le vecteur normal, qui correspond au seul vecteur disponible + M_impact = dr.PointDroite();; + } + else + // autres cas non traite pour l'instant + { cout << "\n erreur, desole mais le cas de contact en dimension = " << dim + << ", avec "; + if (indic == 1) + cout << " une droite "; + else + cout << " un plan "; + cout << " n\'est pas actuellement traite " << "ElContact::RecupInfo(.."<< endl; + Sortie(1); + }; + }; // récup des fonctions phi - phii = elfro.Phi(); + phii = elfro.Phi(); // retour return d_T; }; @@ -1637,7 +1916,7 @@ void ElContact::RecupPlaceRaideur(int nbddl) }; // calcul du facteur de pénalisation en pénétration, en fonction de la géométrie -// du module de compressibilité et des différents possibles +// du module de compressibilité et des différents cas possibles // sauvegarde du gap // éventuellement, calcul de la dérivée: d_beta_gapdu, du facteur par rapport au gap // la sensibilité dépend du type de calcul du facteur de pénalisation @@ -1645,7 +1924,11 @@ double ElContact::CalFactPenal(const double& gap,double & d_beta_gap,int contact { // récup du facteur donné par l'utilisateur double fact_penal=0.; // init par défaut if (fct_nD_contact.fct_nD_penalisationPenetration != NULL) - {fact_penal = Valeur_fct_nD(fct_nD_contact.fct_nD_penalisationPenetration);} + {fact_penal = Valeur_fct_nD(fct_nD_contact.fct_nD_penalisationPenetration + ,ElContact::Fct_nD_contact::tqi_fct_nD_penalisationPenetration + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_penalisationPenetration + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penalisationPenetration); + } else {fact_penal = ParaGlob::param->ParaAlgoControleActifs().PenalisationPenetrationContact();} double facteur=1.; // un facteur // choix en fonction du type de calcul @@ -1669,10 +1952,10 @@ double ElContact::CalFactPenal(const double& gap,double & d_beta_gap,int contact double surf = elfrontiere->SurfaceApprox(); double volume = elem->Volume(); if (Dabs(volume) <= ConstMath::pasmalpetit) - { if (niveau_commentaire > 1) + { if (Permet_affichage() > 1) cout << "\n *** attention, le volume de l'element " << elem->Num_elt_const() << " du maillage " << elem->Num_maillage() << " est nul, on utilise le max de diagonal "; - if (niveau_commentaire > 4) + if (Permet_affichage() > 4) cout << "\n ElContact::CalFactPenal()"; facteur = elfrontiere->MaxDiagonale_tdt(); } @@ -1684,10 +1967,10 @@ double ElContact::CalFactPenal(const double& gap,double & d_beta_gap,int contact double surf = elfrontiere->SurfaceApprox(); double maxdiag = elfrontiere->MaxDiagonale_tdt(); if (maxdiag <= ConstMath::pasmalpetit) - { if (niveau_commentaire > 1) + { if (Permet_affichage() > 1) cout << "\n *** attention, la surface de l'element " << elem->Num_elt_const() << " du maillage " << elem->Num_maillage() << " est nul, on utilise le max de diagonal "; - if (niveau_commentaire > 4) + if (Permet_affichage() > 4) cout << "\n ElContact::CalFactPenal()"; facteur = maxdiag; } @@ -1718,10 +2001,10 @@ double ElContact::CalFactPenal(const double& gap,double & d_beta_gap,int contact // on récupère la surface de l'élément qui a créé la frontière double volume = elem->Volume(); if (Dabs(volume) <= ConstMath::pasmalpetit) - { if (niveau_commentaire > 1) + { if (Permet_affichage() > 1) cout << "\n *** attention, le volume de l'element " << elem->Num_elt_const() << " du maillage " << elem->Num_maillage() << " est nul, on utilise le max de diagonal "; - if (niveau_commentaire > 4) + if (Permet_affichage() > 4) cout << "\n ElContact::CalFactPenal()"; facteur = elfrontiere->MaxDiagonale_tdt(); } @@ -1749,10 +2032,10 @@ double ElContact::CalFactPenal(const double& gap,double & d_beta_gap,int contact // virtual double EpaisseurMoyenne(Enum_dure ) if (Dabs(volume) <= ConstMath::pasmalpetit) - { if (niveau_commentaire > 1) + { if (Permet_affichage() > 1) cout << "\n *** attention, le volume de l'element " << elem->Num_elt_const() << " du maillage " << elem->Num_maillage() << " est nul, on utilise le max de diagonal "; - if (niveau_commentaire > 4) + if (Permet_affichage() > 4) cout << "\n ElContact::CalFactPenal()"; facteur = elfrontiere->MaxDiagonale_tdt(); } @@ -1774,24 +2057,40 @@ double ElContact::CalFactPenal(const double& gap,double & d_beta_gap,int contact //******** fin partie en construction case POINT_G: - // on ne considère que le cas d'une dimension 1D non axi, qui est un cas d'école - // pour les autres cas, on considère que l'on ne doit pas prendre en compte des frontières - // de type point, du coup on génèrera une erreur - if (ParaGlob::Dimension() == 1 ) - {// on veut calculer Ke * Ae * Ae / vol , comme on est dans le cas d'une barre - // vol = long * section, et Ae = section , du coup: - // Ke * Ae * Ae / vol = Ke * vol / (long * long) avec long = la longueur de l'élément - double longueur = elem->LongueurGeometrique(1); + // --- on traite les cas particuliers des éléments d'angle mort + if (elfront->Angle_mort()) + { // il n'y a pas de notion de surface de contact et l'idée est de récupérer + // une grandeur du type module de compressibilité * une longueur caractéristique de l'élément + // on retient une expression simple + double longueur = elem->LongueurGeometrique_mini(1); + facteur = longueur; + //%%%% essai %%%% + longueur = elem->LongueurGeometrique_mini(1); double volume = elem->Volume(); facteur = volume / (longueur * longueur); + //%%%% fin essai %%%% } else - {cout << "\n *** erreur: cas non pris en charge pour l'instant: " - << " type de frontiere : " << Nom_type_geom(elfrontiere->Type_geom_front()) - << "\n contact en dimension " << ParaGlob::Dimension() - << " \n ElContact::CalFactPenal() "; - Sortie(1); - }; + { // --- cas d'un élément de contact autre que d'angle mort + // on ne considère que le cas d'une dimension 1D non axi, qui est un cas d'école + // pour les autres cas, on considère que l'on ne doit pas prendre en compte des frontières + // de type point, du coup on génèrera une erreur + if (ParaGlob::Dimension() == 1 ) + {// on veut calculer Ke * Ae * Ae / vol , comme on est dans le cas d'une barre + // vol = long * section, et Ae = section , du coup: + // Ke * Ae * Ae / vol = Ke * vol / (long * long) avec long = la longueur de l'élément + double longueur = elem->LongueurGeometrique_mini(1); + double volume = elem->Volume(); + facteur = volume / (longueur * longueur); + } + else + {cout << "\n *** erreur: cas non pris en charge pour l'instant: " + << " type de frontiere : " << Nom_type_geom(elfrontiere->Type_geom_front()) + << "\n contact en dimension " << ParaGlob::Dimension() + << " \n ElContact::CalFactPenal() "; + Sortie(1); + }; + } break; default: @@ -1806,7 +2105,7 @@ double ElContact::CalFactPenal(const double& gap,double & d_beta_gap,int contact else // on n'interdit pas car on pourrait avoir plusieurs maîtres, certains bien définit et // d'autres sans comportement donc sans compressibilité: - {if (niveau_commentaire >5) + {if (Permet_affichage() >5) cout << "\n contact: *** attention le module de compressibilite n'est (encore?) pas defini " << " on n'en tient pas compte (pour l'instant) pour le calcul du facteur de penalite normal ! "; }; @@ -1823,7 +2122,7 @@ double ElContact::CalFactPenal(const double& gap,double & d_beta_gap,int contact switch (typ_cal) { case 1: case 2: { fact_penal *= facteur;d_beta_gap = 0.; - if (niveau_commentaire >= 5) + if (Permet_affichage() >= 5) cout << "\n fact_penal= " << fact_penal ; break; } @@ -1841,7 +2140,7 @@ double ElContact::CalFactPenal(const double& gap,double & d_beta_gap,int contact const double a = 1.2; const double b=2.; fact_penal *= pow(a,nb_pene_tdt*b); //PUISSN(2.,nb_pene_tdt); // on modifie en conséquence le facteur d_beta_gap = 0.; // a priori on n'a pas vraiment de dérivée calculable ... - if (niveau_commentaire >= 5) + if (Permet_affichage() >= 5) cout << "\n fact_penal= " << fact_penal << " nb_pene_tdt= " << nb_pene_tdt << " pow("<ParaAlgoControleActifs().Penetration_borne_regularisation();} double max_pene; if (fct_nD_contact.fct_nD_penetration_contact_maxi != NULL) - {max_pene = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_contact_maxi);} + {max_pene = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_contact_maxi + ,ElContact::Fct_nD_contact::tqi_fct_nD_penetration_contact_maxi + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_penetration_contact_maxi + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penetration_contact_maxi); + } else {max_pene = ParaGlob::param->ParaAlgoControleActifs().Penetration_contact_maxi();} // on calcul un facteur de majoration en fonction de la pénétration du pas précédent // double mult_pene = MaX(1., -gap_t/max_pene); @@ -1865,7 +2172,7 @@ double ElContact::CalFactPenal(const double& gap,double & d_beta_gap,int contact // {cout << "\n debug ElContact::CalFactPenal() temps " << ParaGlob::Variables_de_temps().TempsCourant(); // }; ////fin debug - if (niveau_commentaire > 5) + if (Permet_affichage() > 5) cout << "\n mult_pene_tdt= " << mult_pene_tdt ; // on calcul un facteur en fonction de la distance: thèse dominique chamoret, page 94 formule (3.3) if (gap <= (-borne_regularisation)) @@ -1883,7 +2190,11 @@ double ElContact::CalFactPenal(const double& gap,double & d_beta_gap,int contact { // ON récupe la pénétration maxi double borne_regularisation; if (fct_nD_contact.fct_nD_penetration_borne_regularisation != NULL) - {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_borne_regularisation);} + {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penetration_borne_regularisation); + } else {borne_regularisation = ParaGlob::param->ParaAlgoControleActifs().Penetration_borne_regularisation();} // on calcul un facteur en fonction de la distance: thèse dominique chamoret, page 94 formule (3.3) if (gap <= (-borne_regularisation)) @@ -1901,7 +2212,11 @@ double ElContact::CalFactPenal(const double& gap,double & d_beta_gap,int contact { // on récupère la pénétration maxi double borne_regularisation; if (fct_nD_contact.fct_nD_penetration_borne_regularisation != NULL) - {borne_regularisation = Dabs(Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_borne_regularisation));} + {borne_regularisation = Dabs(Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penetration_borne_regularisation)); + } else {borne_regularisation = Dabs(ParaGlob::param->ParaAlgoControleActifs().Penetration_borne_regularisation());} // on calcul un facteur en fonction de la distance: = (0.5*(tanh(4.*gap/borne)-1.)) // 0.25*exp(-gap/(0.25*borne)) @@ -1920,7 +2235,7 @@ double ElContact::CalFactPenal(const double& gap,double & d_beta_gap,int contact { // //------ essai à virer // fact_penal *= facteur;d_beta_gap = 0.; - // if (niveau_commentaire >= 5) + // if (Permet_affichage() >= 5) // cout << "\n fact_penal= " << fact_penal ; // break; // //------ fin essai @@ -1928,11 +2243,19 @@ double ElContact::CalFactPenal(const double& gap,double & d_beta_gap,int contact // ON récupe la pénétration maxi double borne_regularisation; if (fct_nD_contact.fct_nD_penetration_borne_regularisation != NULL) - {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_borne_regularisation);} + {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penetration_borne_regularisation); + } else {borne_regularisation = ParaGlob::param->ParaAlgoControleActifs().Penetration_borne_regularisation();} double max_pene; if (fct_nD_contact.fct_nD_penetration_contact_maxi != NULL) - {max_pene = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_contact_maxi);} + {max_pene = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_contact_maxi + ,ElContact::Fct_nD_contact::tqi_fct_nD_penetration_contact_maxi + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_penetration_contact_maxi + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penetration_contact_maxi); + } else {max_pene = ParaGlob::param->ParaAlgoControleActifs().Penetration_contact_maxi();} // on calcul un facteur de majoration en fonction de la pénétration du pas précédent // double mult_pene = MaX(1., -gap_t/max_pene); @@ -1943,7 +2266,7 @@ double ElContact::CalFactPenal(const double& gap,double & d_beta_gap,int contact // {cout << "\n debug ElContact::CalFactPenal() temps " << ParaGlob::Variables_de_temps().TempsCourant(); // }; ////fin debug - if (niveau_commentaire > 5) + if (Permet_affichage() > 5) cout << "\n mult_pene_tdt= " << mult_pene_tdt ; // on calcul un facteur en fonction de la distance: thèse dominique chamoret, page 94 formule (3.3) if (Dabs(gap) > borne_regularisation) @@ -1968,15 +2291,23 @@ double ElContact::CalFactPenal(const double& gap,double & d_beta_gap,int contact // ON récupe la pénétration maxi double borne_regularisation; if (fct_nD_contact.fct_nD_penetration_borne_regularisation != NULL) - {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_borne_regularisation);} + {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_penetration_borne_regularisation + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penetration_borne_regularisation); + } else {borne_regularisation = ParaGlob::param->ParaAlgoControleActifs().Penetration_borne_regularisation();} double max_pene; if (fct_nD_contact.fct_nD_penetration_contact_maxi != NULL) - {max_pene = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_contact_maxi);} + {max_pene = Valeur_fct_nD(fct_nD_contact.fct_nD_penetration_contact_maxi + ,ElContact::Fct_nD_contact::tqi_fct_nD_penetration_contact_maxi + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_penetration_contact_maxi + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penetration_contact_maxi); + } else {max_pene = ParaGlob::param->ParaAlgoControleActifs().Penetration_contact_maxi();} // on calcul un facteur de majoration en fonction de la pénétration du pas précédent double mult_pene = MaX(1., (-gap_t/max_pene)); // il faut appliquer au facteur précédent ! - if (niveau_commentaire > 5) + if (Permet_affichage() > 5) cout << "\n mult_pene_tdt= " << mult_pene ; // on calcul un facteur en fonction de la distance: // if (gap <= (-borne_regularisation)) @@ -2009,7 +2340,11 @@ double ElContact::CalFactPenalTangentiel(const double& dep_T,double & d_beta_dep { // récup du facteur donné par l'utilisateur double fact_penal = 0.; // init par défaut if (fct_nD_contact.fct_nD_penalisationTangentielle != NULL) - {fact_penal = Valeur_fct_nD(fct_nD_contact.fct_nD_penalisationTangentielle);} + {fact_penal = Valeur_fct_nD(fct_nD_contact.fct_nD_penalisationTangentielle + ,ElContact::Fct_nD_contact::tqi_fct_nD_penalisationTangentielle + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_penalisationTangentielle + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_penalisationTangentielle); + } else {fact_penal = ParaGlob::param->ParaAlgoControleActifs().PenalisationTangentielleContact();} double facteur=1.; // un facteur // choix en fonction du type de calcul @@ -2031,10 +2366,10 @@ double ElContact::CalFactPenalTangentiel(const double& dep_T,double & d_beta_dep double surf = elfrontiere->SurfaceApprox(); double volume = elem->Volume(); if (Dabs(volume) <= ConstMath::pasmalpetit) - { if (niveau_commentaire > 1) + { if (Permet_affichage() > 1) cout << "\n *** attention, le volume de l'element " << elem->Num_elt_const() << " du maillage " << elem->Num_maillage() << " est nul, on utilise le max de diagonal "; - if (niveau_commentaire > 4) + if (Permet_affichage() > 4) cout << "\n ElContact::CalFactPenalTangentiel()"; facteur = elfrontiere->MaxDiagonale_tdt(); } @@ -2046,10 +2381,10 @@ double ElContact::CalFactPenalTangentiel(const double& dep_T,double & d_beta_dep double surf = elfrontiere->SurfaceApprox(); double maxdiag = elfrontiere->MaxDiagonale_tdt(); if (maxdiag <= ConstMath::pasmalpetit) - { if (niveau_commentaire > 1) + { if (Permet_affichage() > 1) cout << "\n *** attention, la surface de l'element " << elem->Num_elt_const() << " du maillage " << elem->Num_maillage() << " est nul, on utilise le max de diagonal "; - if (niveau_commentaire > 4) + if (Permet_affichage() > 4) cout << "\n ElContact::CalFactPenalTangentiel()"; facteur = maxdiag; } @@ -2074,10 +2409,10 @@ double ElContact::CalFactPenalTangentiel(const double& dep_T,double & d_beta_dep // on récupère la surface de l'élément qui a créé la frontière double volume = elem->Volume(); if (Dabs(volume) <= ConstMath::pasmalpetit) - { if (niveau_commentaire > 1) + { if (Permet_affichage() > 1) cout << "\n *** attention, le volume de l'element " << elem->Num_elt_const() << " du maillage " << elem->Num_maillage() << " est nul, on utilise le max de diagonal "; - if (niveau_commentaire > 4) + if (Permet_affichage() > 4) cout << "\n ElContact::CalFactPenalTangentiel()"; facteur = elfrontiere->MaxDiagonale_tdt(); } @@ -2105,10 +2440,10 @@ double ElContact::CalFactPenalTangentiel(const double& dep_T,double & d_beta_dep // virtual double EpaisseurMoyenne(Enum_dure ) if (Dabs(volume) <= ConstMath::pasmalpetit) - { if (niveau_commentaire > 1) + { if (Permet_affichage() > 1) cout << "\n *** attention, le volume de l'element " << elem->Num_elt_const() << " du maillage " << elem->Num_maillage() << " est nul, on utilise le max de diagonal "; - if (niveau_commentaire > 4) + if (Permet_affichage() > 4) cout << "\n ElContact::CalFactPenalTangentiel()"; facteur = elfrontiere->MaxDiagonale_tdt(); } @@ -2130,24 +2465,35 @@ double ElContact::CalFactPenalTangentiel(const double& dep_T,double & d_beta_dep //******** fin partie en construction case POINT_G: - // on ne considère que le cas d'une dimension 1D non axi, qui est un cas d'école - // pour les autres cas, on considère que l'on ne doit pas prendre en compte des frontières - // de type point, du coup on génèrera une erreur - if (ParaGlob::Dimension() == 1 ) - {// on veut calculer Ke * Ae * Ae / vol , comme on est dans le cas d'une barre - // vol = long * section, et Ae = section , du coup: - // Ke * Ae * Ae / vol = Ke * vol / (long * long) avec long = la longueur de l'élément - double longueur = elem->LongueurGeometrique(1); - double volume = elem->Volume(); - facteur = volume / (longueur * longueur); + // --- on traite les cas particuliers des éléments d'angle mort + if (elfront->Angle_mort()) + { // il n'y a pas de notion de surface de contact et l'idée est de récupérer + // une grandeur du type module de compressibilité * une longueur caractéristique de l'élément + // on retient une expression simple + double longueur = elem->LongueurGeometrique_mini(1); + facteur = longueur; } else - {cout << "\n *** erreur: cas non pris en charge pour l'instant: " - << " type de frontiere : " << Nom_type_geom(elfrontiere->Type_geom_front()) - << "\n contact en dimension " << ParaGlob::Dimension() - << " \n ElContact::CalFactPenalTangentiel() "; - Sortie(1); - }; + { // --- cas d'un élément de contact autre que d'angle mort + // on ne considère que le cas d'une dimension 1D non axi, qui est un cas d'école + // pour les autres cas, on considère que l'on ne doit pas prendre en compte des frontières + // de type point, du coup on génèrera une erreur + if (ParaGlob::Dimension() == 1 ) + {// on veut calculer Ke * Ae * Ae / vol , comme on est dans le cas d'une barre + // vol = long * section, et Ae = section , du coup: + // Ke * Ae * Ae / vol = Ke * vol / (long * long) avec long = la longueur de l'élément + double longueur = elem->LongueurGeometrique_mini(1); + double volume = elem->Volume(); + facteur = volume / (longueur * longueur); + } + else + {cout << "\n *** erreur: cas non pris en charge pour l'instant: " + << " type de frontiere : " << Nom_type_geom(elfrontiere->Type_geom_front()) + << "\n contact en dimension " << ParaGlob::Dimension() + << " \n ElContact::CalFactPenalTangentiel() "; + Sortie(1); + }; + }; break; default: @@ -2162,7 +2508,7 @@ double ElContact::CalFactPenalTangentiel(const double& dep_T,double & d_beta_dep else // on n'interdit pas car on pourrait avoir plusieurs maîtres, certains bien définit et // d'autres sans comportement donc sans compressibilité: - {if (niveau_commentaire >5) + {if (Permet_affichage() >5) cout << "\n contact: *** attention le module de compressibilite n'est (encore?) pas defini " << " on n'en tient pas compte (pour l'instant) pour le calcul du facteur de penalite tangentiel ! "; }; @@ -2179,7 +2525,7 @@ double ElContact::CalFactPenalTangentiel(const double& dep_T,double & d_beta_dep switch (typ_cal) { case 1: case 2: { fact_penal *= facteur;d_beta_dep_T = 0.; - if (niveau_commentaire >= 5) + if (Permet_affichage() >= 5) cout << "\n fact_penal= " << fact_penal ; break; } @@ -2187,7 +2533,11 @@ double ElContact::CalFactPenalTangentiel(const double& dep_T,double & d_beta_dep { // de régularisation double borne_regularisation; if (fct_nD_contact.fct_nD_tangentielle_borne_regularisation != NULL) - {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_tangentielle_borne_regularisation);} + {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_tangentielle_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_fct_nD_tangentielle_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_tangentielle_borne_regularisation + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_tangentielle_borne_regularisation); + } else {borne_regularisation = ParaGlob::param->ParaAlgoControleActifs().Tangentielle_borne_regularisation();} // on calcul un facteur en fonction de la distance if (Dabs(dep_T) > borne_regularisation) @@ -2202,7 +2552,11 @@ double ElContact::CalFactPenalTangentiel(const double& dep_T,double & d_beta_dep { // on récupère le déplacement maxi double borne_regularisation; if (fct_nD_contact.fct_nD_tangentielle_borne_regularisation != NULL) - {borne_regularisation = Dabs(Valeur_fct_nD(fct_nD_contact.fct_nD_tangentielle_borne_regularisation));} + {borne_regularisation = Dabs(Valeur_fct_nD(fct_nD_contact.fct_nD_tangentielle_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_fct_nD_tangentielle_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_tangentielle_borne_regularisation + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_tangentielle_borne_regularisation)); + } else {borne_regularisation = Dabs(ParaGlob::param->ParaAlgoControleActifs().Tangentielle_borne_regularisation());} // on calcul un facteur en fonction de la distance: = (0.5*(tanh(4.*dep_T/borne)-1.)) // 0.25*exp(-dep_T/(0.25*borne)) @@ -2219,17 +2573,25 @@ double ElContact::CalFactPenalTangentiel(const double& dep_T,double & d_beta_dep { ////------ essai à virer //fact_penal *= facteur;d_beta_dep_T = 0.; - // if (niveau_commentaire >= 5) + // if (Permet_affichage() >= 5) // cout << "\n fact_penal= " << fact_penal ; // break; ////------ fin essai double borne_regularisation; if (fct_nD_contact.fct_nD_tangentielle_borne_regularisation != NULL) - {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_tangentielle_borne_regularisation);} + {borne_regularisation = Valeur_fct_nD(fct_nD_contact.fct_nD_tangentielle_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_fct_nD_tangentielle_borne_regularisation + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_tangentielle_borne_regularisation + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_tangentielle_borne_regularisation); + } else {borne_regularisation = ParaGlob::param->ParaAlgoControleActifs().Tangentielle_borne_regularisation();} double max_dep_T; if (fct_nD_contact.fct_nD_tangentielle_contact_maxi != NULL) - {max_dep_T = Valeur_fct_nD(fct_nD_contact.fct_nD_tangentielle_contact_maxi);} + {max_dep_T = Valeur_fct_nD(fct_nD_contact.fct_nD_tangentielle_contact_maxi + ,ElContact::Fct_nD_contact::tqi_fct_nD_tangentielle_contact_maxi + ,ElContact::Fct_nD_contact::tqi_const_fct_nD_tangentielle_contact_maxi + ,ElContact::Fct_nD_contact::t_num_ordre_fct_nD_tangentielle_contact_maxi); + } else {max_dep_T = ParaGlob::param->ParaAlgoControleActifs().Tangentielle_contact_maxi();} // on calcul un facteur de majoration en fonction du déplacement du pas précédent // double mult_tang = MaX(1., -dep_T_t/max_pene); @@ -2240,7 +2602,7 @@ double ElContact::CalFactPenalTangentiel(const double& dep_T,double & d_beta_dep // {cout << "\n debug ElContact::CalFactPenalTangentiel() temps " << ParaGlob::Variables_de_temps().TempsCourant(); // }; ////fin debug - if (niveau_commentaire >= 5) + if (Permet_affichage() >= 5) cout << "\n mult_tang_tdt= " << mult_tang_tdt ; // on calcul un facteur en fonction de la distance: du même genre que pour la pénétration // sauf qu'ici c'est vrai quelque soit la direction du déplacement @@ -2326,7 +2688,7 @@ void ElContact::Moyenne_glissante_penalisation(double& penalisation, double& ess if (pt_dans_val_penal > nouvelle_taille) pt_dans_val_penal = 1; tai_val_penal = nouvelle_taille; }; - if (niveau_commentaire > 2) + if (Permet_affichage() > 2) cout << "\n -> Moyenne_glissante_penalisation: change taille " << tai_val_penal << " -> " << nouvelle_taille; }; @@ -2351,10 +2713,13 @@ void ElContact::Moyenne_glissante_penalisation(double& penalisation, double& ess }; // calcul d'une fonction nD relative à des données de contact -double ElContact::Valeur_fct_nD(Fonction_nD * pt_fonct) const +double ElContact::Valeur_fct_nD(Fonction_nD * pt_fonct,Tableau < TypeQuelconque * >& tqi + ,Tableau < const TypeQuelconque * >& tqii,Tableau & t_num_ordre ) const { // on commence par récupérer les conteneurs des grandeurs à fournir List_io & li_enu_scal = pt_fonct->Li_enu_etendu_scalaire(); List_io & li_quelc = pt_fonct->Li_equi_Quel_evolue(); + const Tableau & tab_queconque = pt_fonct->Tab_enu_quelconque(); + // on passe en revue les grandeurs pour les renseigner // --- on balaie maintenant la liste des grandeurs à sortir @@ -2418,7 +2783,7 @@ double ElContact::Valeur_fct_nD(Fonction_nD * pt_fonct) const << " n'existe pas pour le noeud en contact " << " la fonction nD " << pt_fonct->NomFonction() << " ne peut pas etre renseignee " << flush; - if (niveau_commentaire > 2) + if (ParaGlob::NiveauImpression() > 2) {this->Affiche(); pt_fonct->Affiche(); } @@ -2428,7 +2793,7 @@ double ElContact::Valeur_fct_nD(Fonction_nD * pt_fonct) const };// -- fin de la boucle sur la liste de Ddl_enum_etendu // 2) puis les grandeurs quelconques - List_io::iterator ipq,ipqfin=li_quelc.end(); + {List_io::iterator ipq,ipqfin=li_quelc.end(); for (ipq=li_quelc.begin();ipq!=ipqfin;ipq++) { bool trouver = false; TypeQuelconque& enuTQ = (*ipq); // pour simplifier @@ -2603,9 +2968,20 @@ double ElContact::Valeur_fct_nD(Fonction_nD * pt_fonct) const trouver = true; break; } + case NUM_ELEMENT: + { Grandeur_scalaire_entier& gr= *((Grandeur_scalaire_entier*) ((*ipq).Grandeur_pointee())); + *(gr.ConteneurEntier()) = Elfront()->PtEI()->Num_elt(); + trouver = true; + break; + } + case NUM_MAIL_ELEM: + { Grandeur_scalaire_entier& gr= *((Grandeur_scalaire_entier*) ((*ipq).Grandeur_pointee())); + *(gr.ConteneurEntier()) = Elfront()->PtEI()->Num_maillage(); + trouver = true; + break; + } //*** fin - default: trouver = false; break; @@ -2619,13 +2995,18 @@ double ElContact::Valeur_fct_nD(Fonction_nD * pt_fonct) const }; }; + + + + + // si on n'a rien trouvé if (!trouver) {cout << "\n erreur***: la grandeur " << en_ET_TQ.NomPlein() << " n'existe pas pour le noeud en contact " << " la fonction nD " << pt_fonct->NomFonction() << " ne peut pas etre renseignee " << flush; - if (niveau_commentaire > 2) + if (ParaGlob::NiveauImpression() > 2) {this->Affiche(); pt_fonct->Affiche(); } @@ -2633,15 +3014,229 @@ double ElContact::Valeur_fct_nD(Fonction_nD * pt_fonct) const }; }; + }; + // 3) et enfin les grandeurs quelconques: + // les conteneurs sont normalement déjà bien dimensionné + int tail_tab_queconque = tab_queconque.Taille(); + + // on va balayer les grandeurs quelconques + for (int i=1;i<= tail_tab_queconque;i++) + { bool trouver = false; + EnumTypeQuelconque enu = tab_queconque(i); + + // on regarde tout d'abord les grandeurs spécifiques à l'élément contact + switch (enu) + { // il y a des grandeurs vectorielles qui pour l'instant ne sont pas prises en compte + // cf. fct nD + // NORMALE_CONTACT, GLISSEMENT_CONTACT ,PENETRATION_CONTACT,FORCE_CONTACT, + case CONTACT_NB_DECOL: + { Grandeur_scalaire_entier& gr= *((Grandeur_scalaire_entier*) ((*tqi(i)).Grandeur_pointee())); + *(gr.ConteneurEntier()) = nb_decol_tdt; + trouver = true; + break; + } + case CONTACT_PENALISATION_N: + { Grandeur_scalaire_double& gr= *((Grandeur_scalaire_double*) ((*tqi(i)).Grandeur_pointee())); + *(gr.ConteneurDouble()) = penalisation; + trouver = true; + break; + } + case CONTACT_PENALISATION_T: + { Grandeur_scalaire_double& gr= *((Grandeur_scalaire_double*) ((*tqi(i)).Grandeur_pointee())); + *(gr.ConteneurDouble()) = penalisation_tangentielle; + trouver = true; + break; + } + case CONTACT_NB_PENET: + { Grandeur_scalaire_entier& gr= *((Grandeur_scalaire_entier*) ((*tqi(i)).Grandeur_pointee())); + *(gr.ConteneurEntier()) = nb_pene_tdt; + trouver = true; + break; + } + case CONTACT_CAS_SOLIDE: + { Grandeur_scalaire_entier& gr= *((Grandeur_scalaire_entier*) ((*tqi(i)).Grandeur_pointee())); + *(gr.ConteneurEntier()) = cas_solide; + trouver = true; + break; + } + case CONTACT_ENERG_GLISSE_ELAS: + { Grandeur_scalaire_double& gr= *((Grandeur_scalaire_double*) ((*tqi(i)).Grandeur_pointee())); + *(gr.ConteneurDouble()) = energie_frottement.EnergieElastique(); + trouver = true; + break; + } + case CONTACT_ENERG_GLISSE_PLAS: + { Grandeur_scalaire_double& gr= *((Grandeur_scalaire_double*) ((*tqi(i)).Grandeur_pointee())); + *(gr.ConteneurDouble()) = energie_frottement.DissipationPlastique(); + trouver = true; + break; + } + case CONTACT_ENERG_GLISSE_VISQ: + { Grandeur_scalaire_double& gr= *((Grandeur_scalaire_double*) ((*tqi(i)).Grandeur_pointee())); + *(gr.ConteneurDouble()) = energie_frottement.DissipationVisqueuse(); + trouver = true; + break; + } + case CONTACT_ENERG_PENAL: + { Grandeur_scalaire_double& gr= *((Grandeur_scalaire_double*) ((*tqi(i)).Grandeur_pointee())); + *(gr.ConteneurDouble()) = energie_penalisation; + trouver = true; + break; + } + case NOEUD_PROJECTILE_EN_CONTACT: + { Grandeur_scalaire_double& gr= *((Grandeur_scalaire_double*) ((*tqi(i)).Grandeur_pointee())); + if (actif) + {*(gr.ConteneurDouble()) = 100.;} + else + {*(gr.ConteneurDouble()) = -0.1; }; + trouver = true; + break; + } + case NOEUD_FACETTE_EN_CONTACT: + { Grandeur_scalaire_double& gr= *((Grandeur_scalaire_double*) ((*tqi(i)).Grandeur_pointee())); + int NBNF = tabNoeud.Taille(); + if (actif) + { for (int i=2;i<=NBNF;i++) + *(gr.ConteneurDouble()) += 100.; + } + else + { for (int i=2;i<=NBNF;i++) + *(gr.ConteneurDouble()) -= 0.1; + }; + trouver = true; + break; + } + case NUM_NOEUD: + { Grandeur_scalaire_entier& gr= *((Grandeur_scalaire_entier*) ((*tqi(i)).Grandeur_pointee())); + *(gr.ConteneurEntier()) = noeud->Num_noeud(); + trouver = true; + break; + } + case NUM_MAIL_NOEUD: + { Grandeur_scalaire_entier& gr= *((Grandeur_scalaire_entier*) ((*tqi(i)).Grandeur_pointee())); + *(gr.ConteneurEntier()) = noeud->Num_Mail(); + trouver = true; + break; + } + case POSITION_GEOMETRIQUE: + {Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) ((*tqi(i)).Grandeur_pointee())); + (*gr.ConteneurCoordonnee())= noeud->Coord2(); + trouver = true; + break; + } + case POSITION_GEOMETRIQUE_t: + {Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) ((*tqi(i)).Grandeur_pointee())); + (*gr.ConteneurCoordonnee())= noeud->Coord1(); + trouver = true; + break; + } + case POSITION_GEOMETRIQUE_t0: + {Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) ((*tqi(i)).Grandeur_pointee())); + (*gr.ConteneurCoordonnee())= noeud->Coord0(); + trouver = true; + break; + } + // *** pour l'instant la suite n'est pas opérationelle car il s'agit de vecteur + // dont les composantes n'ont pas d'équivalent en ddl_enum_etendu + // il faudrait les définir si on veut pouvoir s'en servir + case PENETRATION_CONTACT: + {Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) ((*tqi(i)).Grandeur_pointee())); + (*gr.ConteneurCoordonnee())= Mtdt-noeud->Coord2(); + trouver = true; + break; + } + case PENETRATION_CONTACT_T: + {Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) ((*tqi(i)).Grandeur_pointee())); + (*gr.ConteneurCoordonnee())= Mt-noeud->Coord1(); + trouver = true; + break; + } + case GLISSEMENT_CONTACT: + {Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) ((*tqi(i)).Grandeur_pointee())); + (*gr.ConteneurCoordonnee())= dep_tangentiel; + trouver = true; + break; + } + case GLISSEMENT_CONTACT_T: + {Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) ((*tqi(i)).Grandeur_pointee())); + (*gr.ConteneurCoordonnee())= dep_T_t; + trouver = true; + break; + } + case NORMALE_CONTACT: + {Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) ((*tqi(i)).Grandeur_pointee())); + (*gr.ConteneurCoordonnee())= N; + trouver = true; + break; + } + case FORCE_CONTACT: + {Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) ((*tqi(i)).Grandeur_pointee())); + (*gr.ConteneurCoordonnee())= force_contact; + trouver = true; + break; + } + case FORCE_CONTACT_T: + {Grandeur_coordonnee& gr= *((Grandeur_coordonnee*) ((*tqi(i)).Grandeur_pointee())); + (*gr.ConteneurCoordonnee())= force_contact_t; + trouver = true; + break; + } + case CONTACT_COLLANT: + { Grandeur_scalaire_entier& gr= *((Grandeur_scalaire_entier*) ((*tqi(i)).Grandeur_pointee())); + *(gr.ConteneurEntier()) = cas_collant; + trouver = true; + break; + } + case NUM_ZONE_CONTACT: + { Grandeur_scalaire_entier& gr= *((Grandeur_scalaire_entier*) ((*tqi(i)).Grandeur_pointee())); + *(gr.ConteneurEntier()) = num_zone_contact; + trouver = true; + break; + } + case NUM_ELEMENT: + { Grandeur_scalaire_entier& gr= *((Grandeur_scalaire_entier*) ((*tqi(i)).Grandeur_pointee())); + *(gr.ConteneurEntier()) = Elfront()->PtEI()->Num_elt(); + trouver = true; + break; + } + case NUM_MAIL_ELEM: + { Grandeur_scalaire_entier& gr= *((Grandeur_scalaire_entier*) ((*tqi(i)).Grandeur_pointee())); + *(gr.ConteneurEntier()) = Elfront()->PtEI()->Num_maillage(); + trouver = true; + break; + } + //*** fin + + default: + trouver = false; + break; + }; + + // si on n'a rien trouvé + if (!trouver) + {cout << "\n erreur***: la grandeur " << NomTypeQuelconque(enu) + << " n'existe pas pour le noeud en contact " + << " la fonction nD " << pt_fonct->NomFonction() + << " ne peut pas etre renseignee " << flush; + if (ParaGlob::NiveauImpression() > 2) + {this->Affiche(); + pt_fonct->Affiche(); + } + Sortie(1); + }; + + }; + // tqii pointe aux mêmes endroit que tqi mais est déclaré en const ... // calcul de la valeur et retour dans tab_ret - Tableau & tab_val = pt_fonct->Valeur_FnD_Evoluee(&val_ddl_enum,&li_enu_scal,&li_quelc,NULL,NULL); + Tableau & tab_val = pt_fonct->Valeur_FnD_Evoluee(&val_ddl_enum,&li_enu_scal,&li_quelc,&(tqii),&t_num_ordre); + #ifdef MISE_AU_POINT if (tab_val.Taille() != 1) { cout << "\nErreur : la fonction nD " << pt_fonct->NomFonction() << " doit calculer un scalaire or le tableau de retour est de taille " << tab_val.Taille() << " ce n'est pas normal !\n" << flush; - if (niveau_commentaire > 2 ) + if (Permet_affichage() > 2 ) cout << "\n ElContact::Valeur(... \n"; Sortie(1); }; diff --git a/contact/LesContacts.cc b/contact/LesContacts.cc index 01c1b81..a9c966b 100644 --- a/contact/LesContacts.cc +++ b/contact/LesContacts.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -116,7 +116,7 @@ LesContacts::LesContacts () : tabCoLin(),tabReacCont(),listContact()//,numtesN() ,sauve_lesFonctionsnD(NULL),fct_nD_contact() ,listContact_nouveau_tatdt(),listContact_efface_tatdt() - ,nom_ref_zone_contact() + ,nom_ref_zone_contact(),lissage_de_la_normale() ,t_listFront(),nb_mail_Esclave(),nbmailautocontact(0),nbmailMaitre() ,tesctotal(),tesN_encontact() ,tesN_collant() @@ -130,7 +130,7 @@ LesContacts::LesContacts (const LesContacts& a): ,sauve_lesFonctionsnD(a.sauve_lesFonctionsnD),fct_nD_contact(a.fct_nD_contact) ,listContact(a.listContact)//,numtesN(a.numtesN) ,listContact_nouveau_tatdt(a.listContact_nouveau_tatdt),listContact_efface_tatdt(a.listContact_efface_tatdt) - ,nom_ref_zone_contact(a.nom_ref_zone_contact) + ,nom_ref_zone_contact(a.nom_ref_zone_contact),lissage_de_la_normale(a.lissage_de_la_normale) ,t_listFront(a.t_listFront),nb_mail_Esclave(a.nb_mail_Esclave),nbmailautocontact(a.nbmailautocontact) ,nbmailMaitre(a.nbmailMaitre),tesctotal(a.tesctotal),tesN_encontact(a.tesN_encontact) ,tesN_collant(a.tesN_collant) @@ -159,11 +159,10 @@ void LesContacts::Init_contact(LesMaillages& lesMail ,LesFonctions_nD* lesFonctionsnD) { tempsContact.Mise_en_route_du_comptage(); // temps cpu - int niveau_commentaire_contact = ParaGlob::param->ParaAlgoControleActifs().Niveau_commentaire_contact(); - if (niveau_commentaire_contact == 0) {niveau_commentaire_contact = ParaGlob::NiveauImpression();}; + int niveau_commentaire_lescontacts = Permet_affichage(); // on met à jour le niveau de commentaire dans les éléments de contact - ElContact::Mise_a_jour_niveau_commentaire(niveau_commentaire_contact); - if (niveau_commentaire_contact >= 7) + ElContact::Mise_a_jour_niveau_commentaire(); + if (niveau_commentaire_lescontacts > 4) cout << "\n -- LesContacts::Init_contact: "; // sauvegarde de la liste des fonctions nD @@ -174,7 +173,7 @@ void LesContacts::Init_contact(LesMaillages& lesMail // tescin : a la dimension du nombre de maillage esclave // comme les maillages esclaves sont les premiers dans le .info, // tescin(i) correspond aux noeuds des frontières du maillage i - // listFrontiere (i) : tous les frontières des maillages, (peut-être vide pour certains maillages sans frontières) + // listFrontiere (i) : toutes les frontières des maillages, (peut-être vide pour certains maillages sans frontières) // correspond aux frontières du maillage i: dabord pour les esclaves puis les maîtres // nbEscla : nb de maillage esclave // ind : pour tous les maillages, la liste des éléments qui contiennent chaque noeud @@ -197,12 +196,14 @@ void LesContacts::Init_contact(LesMaillages& lesMail { cout << "\n *** erreur dans la definition de la fonction nD de pilotage " << " du type de contact 4 : " << nom_fct4 << " n'utilise pas que des variables globales !! "; + tempsContact.Arret_du_comptage(); // fin cpu Sortie(1); } else if (pt_fonct->NbComposante() > 2) { cout << "\n *** erreur dans la definition de la fonction nD de pilotage " << " du type de contact 4 : " << nom_fct4 << " ramene plus de 2 composantes !! "; + tempsContact.Arret_du_comptage(); // fin cpu Sortie(1); } else // sinon ok @@ -212,6 +213,7 @@ void LesContacts::Init_contact(LesMaillages& lesMail { cout << "\n *** erreur dans la definition de la fonction nD de pilotage " << " du type de contact 4 , le nom : " << nom_fct4 << " ne correspond pas a une fonction nD existante !! "; + tempsContact.Arret_du_comptage(); // fin cpu Sortie(1); }; }; @@ -249,7 +251,7 @@ void LesContacts::Init_contact(LesMaillages& lesMail << ", n\'est pas acceptable, il est soit negatif soit superieur au nombre de maillage esclave ( " << nb_mail_Esclave << " ) " << endl; - if (niveau_commentaire_contact >= 0) + if (niveau_commentaire_lescontacts >= 0) cout << "\n LesContacts::Init_contact(... " << endl; tempsContact.Arret_du_comptage(); // fin cpu Sortie(1); @@ -257,7 +259,7 @@ void LesContacts::Init_contact(LesMaillages& lesMail }; // on récupère le tableau indice indice = ind; - if (niveau_commentaire_contact >2 ) + if (niveau_commentaire_lescontacts >2 ) cout << "\n >>>> Information : Initialisation du contact: "; // dimensionnement du premier niveau des tableaux tesctotal.Change_taille(nb_mail_Esclave); @@ -286,7 +288,7 @@ void LesContacts::Init_contact(LesMaillages& lesMail tesctotal(ii)(1)(itai) = (*tescin(ii))(itai); tesN_collant(ii)(1)(itai) = 0; // pas de contact collant car le contact est non restreint }; - if (niveau_commentaire_contact >2 ) + if (niveau_commentaire_lescontacts >2 ) cout << "\n mail. esclave "<::iterator iMi,iMifin=(*listFrontiere(jf)).end(); for (iMi = (*listFrontiere(jf)).begin();iMi != iMifin; iMi++) lis_fronta.push_back((*iMi)); - if (niveau_commentaire_contact >2 ) + if (niveau_commentaire_lescontacts >2 ) cout << "\n mail. maitre "<::iterator il,ilfin=nom_ref_zone_contact.end(); int nb_zone = nom_ref_zone_contact.size(); - if (niveau_commentaire_contact >2 ) + if (niveau_commentaire_lescontacts >2 ) cout << "\n --> nombre de zone de contact: " << nb_zone; // --- tout d'abord on s'occupe des noeuds esclaves // on va boucler sur les zones pour être sûr de définir complètement toutes les zones @@ -331,6 +333,7 @@ void LesContacts::Init_contact(LesMaillages& lesMail << " une reference de noeud ! "; ref.Affiche(); cout << "\n LesContacts::Init_contact(..." << endl; + tempsContact.Arret_du_comptage(); // fin cpu Sortie(1); }; // on peut maintenant utiliser de manière sûre une ref NE @@ -356,7 +359,7 @@ void LesContacts::Init_contact(LesMaillages& lesMail tesctotal(intot)(izone)(no_dans_ref)= &(lesMail.Noeud_LesMaille(ref.Nbmaille(),num_noe_ref)); tesN_collant(intot)(izone)(no_dans_ref)= (*il).n; }; // -- fin de la boucle sur les noeuds de la référence - if (niveau_commentaire_contact >2 ) + if (niveau_commentaire_lescontacts >2 ) cout << "\n maillage esclave "< " << nb_noe << " noeuds esclaves pour contact "; // arrivée ici, c'est que la zone a été définie @@ -368,6 +371,7 @@ void LesContacts::Init_contact(LesMaillages& lesMail << " on ne trouve pas le maillage esclave correspondant ! "; refNE.Affiche(); cout << "\n LesContacts::Init_contact(..." << endl; + tempsContact.Arret_du_comptage(); // fin cpu Sortie(1); }; }; //-- fin de la boucle sur les zones de contact @@ -401,6 +405,7 @@ void LesContacts::Init_contact(LesMaillages& lesMail cout << " du maillage " << *nom_mail_face; cout << " n'existe pas !! "; cout << "\n LesContacts::Init_contact(..." << endl; + tempsContact.Arret_du_comptage(); // fin cpu Sortie(1); }; @@ -450,6 +455,7 @@ void LesContacts::Init_contact(LesMaillages& lesMail << " seules les ref d'aretes ou de surface sont possibles " ; ref.Affiche(); cout << "\n LesContacts::Init_contact(..." << endl; + tempsContact.Arret_du_comptage(); // fin cpu Sortie(1); break; }; @@ -458,7 +464,7 @@ void LesContacts::Init_contact(LesMaillages& lesMail }; //-- fin de la boucle sur zone de contact }; //-- fin de la boucle sur les maillages maîtres // petit message si nécessaire - if (niveau_commentaire_contact >2 ) //&& (list_fronta.size() > 0)) + if (niveau_commentaire_lescontacts >2 ) //&& (list_fronta.size() > 0)) { for (int i=1;i<= nb_zone;i++) // boucle sur les références de zone_contact { cout << "\n zone de contact: " << i << " => " << zone_frontiere(i) @@ -470,6 +476,9 @@ void LesContacts::Init_contact(LesMaillages& lesMail }; }; //-- fin du else : cas d'une zone restreinte de contact + + // on définit et on ajoute les fronts des angles morts + ElementAngleMort(lesMail); // Pour diminuer le temps de recherche, et aussi les messages on va constituer une liste des éléments // qui contiennent les frontières @@ -511,14 +520,19 @@ void LesContacts::Init_contact(LesMaillages& lesMail // verification qu'il n'y a pas de contact avant le premier increment de charge void LesContacts::Verification() -{ // on va iterer sur les noeuds esclaves pour savoir s'ils sont internes +{ + #ifdef UTILISATION_MPI + // cas d'un calcul //, seule le CPU 0 est concernée + if (ParaGlob::Monde()->rank() != 0) + return ; + #endif + // on va iterer sur les noeuds esclaves pour savoir s'ils sont internes // a un element c-a-d a l'interieur d'un element qui contiend un element // frontiere int nb_zone = MaX(1,nom_ref_zone_contact.size()); - int niveau_commentaire_contact = ParaGlob::param->ParaAlgoControleActifs().Niveau_commentaire_contact(); - if (niveau_commentaire_contact == 0) {niveau_commentaire_contact = ParaGlob::NiveauImpression();}; - if (niveau_commentaire_contact >= 7) + int niveau_commentaire_lescontacts = Permet_affichage(); + if (niveau_commentaire_lescontacts > 4) cout << "\n -- LesContacts::Verification: "; // mise à jour les boites d'encombrement des éléments frontière {LaLIST_io ::iterator iM,iMfin; @@ -562,10 +576,10 @@ void LesContacts::Verification() if (elem.In_boite_emcombrement_elem(pt_esc)) // on teste alors plus précisemment {//compteur++; - if ((elem.Interne_t(pt_esc)==1) && (niveau_commentaire_contact >= 3)) + if ((elem.Interne_t(pt_esc)==1) && (niveau_commentaire_lescontacts >= 3)) { cout << "\n attention, noeud esclave dans elem. " << "avant incre. 1 charge"; - if (niveau_commentaire_contact > 2) + if (niveau_commentaire_lescontacts > 2) cout << "\n LesContacts::Verification(..)"; int num_mail_elem = (elem.Tab_noeud())(1)->Num_Mail(); cout << "\n -> noeud " << tesc(inesc)->Num_noeud() << " du maillage " << tesc(inesc)->Num_Mail() @@ -592,12 +606,17 @@ void LesContacts::Verification() // ramène true s'il y a effectivement création d'élément de contact bool LesContacts::DefElemCont(double dep_max) { + #ifdef UTILISATION_MPI + // cas d'un calcul //, + // pour l'instant seule le CPU 0 est concernée + if (ParaGlob::Monde()->rank() != 0) + return false; + #endif + tempsContact.Mise_en_route_du_comptage(); // def deb compt bool retour = false; // init par défaut - int niveau_commentaire_contact = ParaGlob::param->ParaAlgoControleActifs().Niveau_commentaire_contact(); - if (niveau_commentaire_contact == 0) {niveau_commentaire_contact = ParaGlob::NiveauImpression();}; - if (niveau_commentaire_contact > 2) -// if (max(ParaGlob::NiveauImpression(),niveau_commentaire_contact)> 4) + int niveau_commentaire_lescontacts = Permet_affichage(); + if (niveau_commentaire_lescontacts > 4) cout << "\n ==> LesContacts::Def Elem Cont, initialement "<::iterator iM,iMfin; for (int i=1;i<=nbmailMaitre;i++) for (int j=1;j<= nb_zone;j++) @@ -635,9 +655,9 @@ bool LesContacts::DefElemCont(double dep_max) LaLIST ::iterator icont_inter; // sert pour la recherche de doublon // list ::iterator inumtesN; // " " " for (int intot = 1;intot<= nb_mail_Esclave;intot++) // boucle sur les maillages esclaves - for (int j=1;j<=nb_zone;j++) - {const Tableau & tesc= tesctotal(intot)(j); // pour simplifier la notation: - const Tableau tesN_col = tesN_collant(intot)(j); // pour simplifier + for (int j_zone=1;j_zone<=nb_zone;j_zone++) + {const Tableau & tesc= tesctotal(intot)(j_zone); // pour simplifier la notation: + const Tableau tesN_col = tesN_collant(intot)(j_zone); // pour simplifier int tesc_taille=tesc.Taille(); // tab des noeuds esclaves à considérer for (int inesc = 1;inesc<= tesc_taille;inesc++) // boucle sur les noeuds esclaves {Noeud* noee = tesc(inesc); // pour simplifier @@ -648,7 +668,7 @@ bool LesContacts::DefElemCont(double dep_max) // const Coordonnee& pt_esc = noee->Coord2(); // position du noeud esclave const Coordonnee pt_esc = noee->Coord2(); // position du noeud esclave for (int jlf=1;jlf<=nbmailMaitre;jlf++) // boucle sur les maillages maitres - {LaLIST_io & t_listFront_jlf_j = t_listFront(jlf)(j); + {LaLIST_io & t_listFront_jlf_j = t_listFront(jlf)(j_zone); iMfin= t_listFront_jlf_j.end(); for (iM = t_listFront_jlf_j.begin() ; iM != iMfin; iM++) // boucle sur les front { @@ -706,18 +726,16 @@ bool LesContacts::DefElemCont(double dep_max) // on teste alors plus précisemment {// constitution d'un element de contact intermediaire ElContact elcont(&(*iM),tesc(inesc),fct_nD_contact,tesN_col(inesc)); - elcont.Num_zone_contact()=j; // affectation du numéro de zone + elcont.Num_zone_contact()=j_zone; // affectation du numéro de zone + elcont.Change_lissage_normale(lissage_de_la_normale(j_zone)); // affectation du lissage // calcul du contact, et translation (éventuelle) du noeud sur la surface si le contact existe - // bool ret = elcont.Contact(indice); bool init_inter = true; // on est en phase d'initialisation -////----debug -//{if ((elcont.Esclave()->Num_noeud() == 12) -// && ((*iM).Num_frontiere() == 1) && (elem.Num_elt()== 3130)) -// { cout << "\n debug : frontiere 1 de l'element 3130";} -//} -////----fin debug +// //--- debug +// cout << "\n LesContacts::DefElemCont *3* "<< flush; +// elcont.Affiche(1); +// //--- fin debug bool ret = elcont.Contact(init_inter); - if (niveau_commentaire_contact > 5) + if (niveau_commentaire_lescontacts > 5) { int num_mail_elem = (elem.Tab_noeud())(1)->Num_Mail(); cout << "\n recherche du contact entre noeud " << elcont.Esclave()->Num_noeud() << " du maillage " << elcont.Esclave()->Num_Mail() @@ -726,7 +744,7 @@ bool LesContacts::DefElemCont(double dep_max) << num_mail_elem; if (ret) cout << "\n --> contact trouve "; else cout << "\n --> pas de contact "; - if ((niveau_commentaire_contact > 6) + if ((niveau_commentaire_lescontacts > 6) && ((*iM).In_boite_emcombrement_front(pt_esc)) ) {Noeud* noeud = tesc(inesc); @@ -748,15 +766,27 @@ bool LesContacts::DefElemCont(double dep_max) //sauvegarde éventuelle de l'element contact {// on regarde s'il n'y a pas un autre élément de contact avec le même noeud if (nb_contact == 0) - { // c'est le premier élément en contact, on l'enregistre + { // s'il existe déjà ce n'est pas normal + #ifdef MISE_AU_POINT + {if (Element_contact_deja_present(elcont) != NULL) + { cout << "\n*** Erreur : l'element de contact existe déjà, ce n'est pas normal " + << (elcont).Esclave()->Num_noeud() + << " du maillage " << (elcont).Esclave()->Num_Mail() + << " la suite n'est pas possible " + << " LesContacts::DefElemCont(.. \n"; + tempsContact.Arret_du_comptage(); // fin cpu + Sortie(1); + }; + } + #endif + // c'est le premier élément en contact, on l'enregistre listContact.push_front(elcont); retour = true; listContact_nouveau_tatdt.push_front(listContact.begin()); // mémorisation // et ajout dans la liste associé au noeud esclave tesN_encontact_ii[noee].push_front(listContact.begin()); - nb_contact_actif++ ; // a priori le contact est actif nb_contact++; - if (niveau_commentaire_contact > 3) + if (niveau_commentaire_lescontacts > 3) { int num_mail_elem = (elem.Tab_noeud())(1)->Num_Mail(); cout << "\ncontact entre noeud " ; if (tesN_col(inesc)) cout << " collant "; @@ -764,20 +794,12 @@ bool LesContacts::DefElemCont(double dep_max) << " du maillage " << elcont.Esclave()->Num_Mail() << " et frontiere " << (*iM).Num_frontiere() << " de l'element " << elem.Num_elt() << " du maillage " - << num_mail_elem << "(zone"< 4) + << num_mail_elem << "(zone"< 6) {cout << "\n pt intersection: " << elcont.Point_intersection() ; elcont.Elfront()->Affiche(); cout << flush; }; - // -- debug - // cout << "\n elem " << elem.Num_elt() << " maillage " << elem.Num_maillage() << " frontiere N= " ; - // for (int i=1;i<= (elcont.TabNoeud()).Taille();i++) cout << (elcont.TabNoeud())(i)->Num_noeud() << " "; - // cout << "\n boite "; elcont.Elfront()->Encom_mini_FR().Affiche(); elcont.Elfront()->Encom_maxi_FR().Affiche(); - // cout << "\n noeud esclave: " << elcont.Esclave()->Coord2(); - // cout << " LesContacts::DefElemCont( " << endl; - //-- fin débug - }; } else @@ -802,24 +824,32 @@ bool LesContacts::DefElemCont(double dep_max) listContact_nouveau_tatdt.remove(*pl); // il faut supprimer dans tesN_encontact tesN_encontact_ii[noee].erase(pl); - // puis on met le nouveau - listContact.push_front(elcont); - retour = true; - listContact_nouveau_tatdt.push_front(listContact.begin()); - tesN_encontact_ii[noee].push_front(listContact.begin()); - // NB: on ne modifie pas le nb_contact_actif car on a supprimé un et remis un autre - // on n'intervient pas sur tesN_encontact, car ça ne change pas - if (niveau_commentaire_contact >= 4) - { int num_mail_elem = (elem.Tab_noeud())(1)->Num_Mail(); - cout << "\n --- changement d'element en contact ---"; - cout << "\ncontact entre noeud " ; - if (tesN_col(inesc)) cout << " collant "; - cout << elcont.Esclave()->Num_noeud() - << " du maillage " << elcont.Esclave()->Num_Mail() - << " et frontiere " << (*iM).Num_frontiere() - << " de l'element " << elem.Num_elt() << " du maillage " - << num_mail_elem << "(zone"< 2) + { int num_mail_elem = (elem.Tab_noeud())(1)->Num_Mail(); + cout << "\n --- changement d'element en contact ---"; + cout << "\ncontact entre noeud " ; + if (tesN_col(inesc)) cout << " collant "; + cout << elcont.Esclave()->Num_noeud() + << " du maillage " << elcont.Esclave()->Num_Mail() + << " et frontiere " << (*iM).Num_frontiere() + << " de l'element " << elem.Num_elt() << " du maillage " + << num_mail_elem << "(zone"<Actif()) + // s'il existe et est inactif on le rend actif (pour remplacer celui qui devrait être créé) + {test_existance->Met_actif(); + }; + }; // sinon le nouvel élément est plus loin que l'ancien, on en tient pas compte }; @@ -834,7 +864,7 @@ bool LesContacts::DefElemCont(double dep_max) }; //-- fin de la boucle sur inesc }; //-- fin de la boucle sur les zones // retour - if (niveau_commentaire_contact > 2) // ==> LesContacts:: + if (niveau_commentaire_lescontacts > 2) // ==> LesContacts:: { cout << "\n apres Def Elem Cont: "<< listContact.size() << " elem contact "; if ( listContact_nouveau_tatdt.size()) cout <<", "<< listContact_nouveau_tatdt.size() << " nouveau(x) "; @@ -854,18 +884,16 @@ bool LesContacts::DefElemCont(double dep_max) bool LesContacts::Nouveau(double dep_max) { tempsContact.Mise_en_route_du_comptage(); // def deb compt - int niveau_commentaire_contact = ParaGlob::param->ParaAlgoControleActifs().Niveau_commentaire_contact(); - if (niveau_commentaire_contact == 0) {niveau_commentaire_contact = ParaGlob::NiveauImpression();}; + int niveau_commentaire_lescontacts = Permet_affichage(); int nb_zone = MaX(1,nom_ref_zone_contact.size()); // on sauvegarde la liste au départ int taille_list_contact_nouveau_au_debut = listContact_nouveau_tatdt.size(); - if (niveau_commentaire_contact > 3) -// if (max(ParaGlob::NiveauImpression(),niveau_commentaire_contact)> 4) + if (niveau_commentaire_lescontacts > 3) cout << "\n ==> LesContacts::Nouveau: temps= " << ParaGlob::Variables_de_temps().TempsCourant(); // on montre les noeuds actuellement en contact - if (niveau_commentaire_contact > 4) + if (niveau_commentaire_lescontacts > 5) {cout << "\n >> bilan des noeud(s) actuellement en contact: "; for (int intot = 1;intot<= nb_mail_Esclave;intot++) // boucle sur les maillages esclaves for (int j=1;j<= nb_zone;j++) @@ -873,9 +901,9 @@ bool LesContacts::Nouveau(double dep_max) const Tableau tesN_col = tesN_collant(intot)(j); // pour simplifier int tesc_taille=tesc.Taille(); for (int inesc = 1;inesc<= tesc_taille;inesc++) // boucle sur les noeuds esclaves - {if (niveau_commentaire_contact > 5) + {if (niveau_commentaire_lescontacts > 4) { Noeud* no = tesc(inesc); - int n_noee = no->Num_noeud(); +// int n_noee = no->Num_noeud(); int num_mail_noe_esclave = no->Num_Mail(); // if (no->Num_noeud()==495) cout << "\n noeud " << no->Num_noeud() << " du maillage " << no->Num_Mail(); @@ -897,7 +925,7 @@ bool LesContacts::Nouveau(double dep_max) std::map::iterator > >::iterator it_liste; if (tesN_encontact_ii.find(no) != tesN_encontact_ii.end()) {LaLIST < LaLIST::iterator > & list_tesN = tesN_encontact_ii[no]; - LaLIST < LaLIST::iterator >::iterator pl,plfin=list_tesN.end(); +// LaLIST < LaLIST::iterator >::iterator pl,plfin=list_tesN.end(); cout << "\n --> noeud actuellement en contact "; if (tesN_collant(num_mail_noe_esclave)(j)(inesc)) cout << " collant "; } @@ -907,6 +935,14 @@ bool LesContacts::Nouveau(double dep_max) }; }; }; + if (niveau_commentaire_lescontacts > 4) + // on va lister les éléments de contact + { cout << "\n liste des Elcontact au debut de LesContacts::Nouveau: (fct du niveau de commentaire des elcontact): "; + LaLIST::iterator ipp,ippfin=listContact.end(); + for (ipp=listContact.begin();ipp != ippfin; ipp++) + {(*ipp).Affiche(2);}; + }; + // on met à jour les boites des éléments qui contiennent les frontières Mise_a_jour_boite_encombrement_element_contenant_front(); // on met à jour le déplacement maxi toléré pour la classe ElContact @@ -929,19 +965,15 @@ bool LesContacts::Nouveau(double dep_max) { LaLIST ::iterator iiE = iE; if ((*iE).Contact()) { // on valide si le contact est ok - int num_mail = (*iE).Esclave()->Num_Mail(); - int num_noeud = (*iE).Esclave()->Num_noeud(); +// int num_mail = (*iE).Esclave()->Num_Mail(); +// int num_noeud = (*iE).Esclave()->Num_noeud(); // tesN_encontact(num_mail)(num_noeud) += 1; // mise à jour de l'indicateur (*iE).Met_actif(); - nb_contact_actif++; - if (niveau_commentaire_contact > 3) + if (niveau_commentaire_lescontacts > 3) { Element & elem = *(*iiE).Elfront()->PtEI(); int num_mail_elem = (elem.Tab_noeud())(1)->Num_Mail(); - cout << "\nreactivation (dans newcontact) contact entre noeud " << (*iiE).Esclave()->Num_noeud() - << " du maillage " << (*iiE).Esclave()->Num_Mail() - << " et frontiere " << (*iiE).Elfront()->Num_frontiere() - << " de l'element " << elem.Num_elt() << " du maillage " - << num_mail_elem << endl; + cout << "\nreactivation (dans newcontact) contact: "; + (*iiE).Affiche(1); cout << endl; }; } else @@ -949,14 +981,11 @@ bool LesContacts::Nouveau(double dep_max) iE--; // pointe sur le precedent element int num_mail_esclave = (*iiE).Esclave()->Num_Mail(); int num_noeud = (*iiE).Esclave()->Num_noeud(); - if (niveau_commentaire_contact > 3) + if (niveau_commentaire_lescontacts > 3) { Element & elem = *(*iiE).Elfront()->PtEI(); int num_mail_elem = (elem.Tab_noeud())(1)->Num_Mail(); - cout << "\neffacement contact (dans newcontact) entre noeud " << num_noeud - << " du maillage " << num_mail_esclave - << " et frontiere " << (*iiE).Elfront()->Num_frontiere() - << " de l'element " << elem.Num_elt() << " du maillage " - << num_mail_elem << endl; + cout << "\neffacement contact (dans newcontact): "; + (*iiE).Affiche(1);cout << endl; }; listContact_efface_tatdt.push_front(*iiE); // mémorise #ifdef MISE_AU_POINT @@ -976,7 +1005,6 @@ bool LesContacts::Nouveau(double dep_max) // tesN_encontact(num_mail_esclave)(num_noeud).remove(iiE); list_tesN.remove(iiE); listContact.erase(iiE); // efface l'element - // on ne change pas nb_contact_actif car on ne supprime que des inactifs }; }; }; // ++ fin encapsulage @@ -997,9 +1025,9 @@ bool LesContacts::Nouveau(double dep_max) (*iM).Boite_encombrement_frontiere(TEMPS_tdt,dep_max); }; for (int intot = 1;intot<= nb_mail_Esclave;intot++) // boucle sur les maillages esclaves - {for (int j=1;j<= nb_zone;j++) - {const Tableau & tesc= tesctotal(intot)(j); // pout simplifier la notation - const Tableau tesN_col = tesN_collant(intot)(j); // pour simplifier + {for (int j_zone=1;j_zone<= nb_zone;j_zone++) + {const Tableau & tesc= tesctotal(intot)(j_zone); // pout simplifier la notation + const Tableau tesN_col = tesN_collant(intot)(j_zone); // pour simplifier int tesc_taille=tesc.Taille(); for (int inesc = 1;inesc<= tesc_taille;inesc++) // boucle sur les noeuds esclaves // si le noeud est collant on ne fait rien @@ -1027,13 +1055,13 @@ bool LesContacts::Nouveau(double dep_max) int nb_contact=0; if (tesN_encontact_ii.find(no) != tesN_encontact_ii.end()) {LaLIST < LaLIST::iterator > & list_tesN = tesN_encontact_ii[no]; - LaLIST < LaLIST::iterator >::iterator pl,plfin=list_tesN.end(); +// LaLIST < LaLIST::iterator >::iterator pl,plfin=list_tesN.end(); nb_contact = list_tesN.size(); }; - if (niveau_commentaire_contact > 5) + if (niveau_commentaire_lescontacts > 5) { cout << "\n (re) examen eventuel : contact du noeud " << n_noee << " du maillage " << num_mail_noe_esclave; cout << " coord2= "; no->Coord2().Affiche_1(cout); - if (niveau_commentaire_contact > 5) + if (niveau_commentaire_lescontacts > 5) {cout << " num_mail_dans_contact = " << num_mail_noe_esclave <<" inesc(num N local)= " << inesc // << "\n tesN_encontact= " << tesN_encontact(num_mail_noe_esclave)(n_noee).size() << "\n tesN_encontact= " << nb_contact @@ -1049,7 +1077,7 @@ bool LesContacts::Nouveau(double dep_max) actif++; if (actif) {cout << "\n noeud actuellement en contact dans " << actif << " element(s) "; - if (tesN_collant(num_mail_noe_esclave)(j)(inesc)) cout << " collant "; + if (tesN_collant(num_mail_noe_esclave)(j_zone)(inesc)) cout << " collant "; } else cout << "\n noeud actuellement pas en contact "; int icont = 1; @@ -1072,7 +1100,7 @@ bool LesContacts::Nouveau(double dep_max) // maintenant on regarde les frontieres maitres int num_frontiere=1; // pour le debug for (int jlf=1;jlf<=nbmailMaitre;jlf++) // boucle sur les maillages maîtres - {LaLIST_io & t_listFront_jlf_j = t_listFront(jlf)(j); + {LaLIST_io & t_listFront_jlf_j = t_listFront(jlf)(j_zone); iMfin= t_listFront_jlf_j.end(); for (iM = t_listFront_jlf_j.begin() ; iM != iMfin; iM++,num_frontiere++) // boucle sur les front maitres // on parcours les elements maitres de la zone @@ -1088,7 +1116,11 @@ bool LesContacts::Nouveau(double dep_max) Front& elfront = (*iM); Front* eltest = elc.Elfront(); if (eltest->MemeOrigine(elfront) ) - {a_considerer=false;break;} + {a_considerer=false; + if (elc.Permet_affichage() > 5) + {cout << "\n noeud esclave deja en contact "; elc.Affiche(1); + }; + break;} }; }; // donc on ne continue que si la face n'est pas déjà en contact avec le noeud @@ -1097,7 +1129,7 @@ bool LesContacts::Nouveau(double dep_max) // qui contient l'élément frontière (car l'élément frontière à une épaisseur nulle!) Element & elem = *((*iM).PtEI()); // l'element qui contiend la frontiere Front& elfront = (*iM); - if (niveau_commentaire_contact > 5) + if (niveau_commentaire_lescontacts > 5) {// --- sortie d'info pour vérifier l'appartenance à la boite ou non cout << "\n rappel: coordonnee noeud esclave : " ; no->Coord2().Affiche_1(cout); cout << "\n boite d'encombrement de l'element maitre qui contient la frontiere:\n mini -> "; @@ -1116,7 +1148,7 @@ bool LesContacts::Nouveau(double dep_max) break; // on arrête la boucle si on trouve l'élément parmi ceux contenant le noeud }; - if (niveau_commentaire_contact > 5) + if (niveau_commentaire_lescontacts > 5) { cout << "\n frontiere: " << elfront.Num_frontiere() << " (nb loc: "<Type_geom_front()) << " de l'element " << elem.Geometrie() << " : " @@ -1130,16 +1162,22 @@ bool LesContacts::Nouveau(double dep_max) // on regarde si cela pourrait conduire à un élément de contact identique // à un élément que l'on vient juste d'effacer, si oui, on ne crée pas d'élément et // on attend un prochain incrément, si effectivement l'élément doit se créer, il sera alors créé + // *** non, ça pose pb, on commente pour l'instant {LaLIST ::iterator ila,ilafin=listContact_efface_tatdt.end(); bool vraiment_nouveau_element=true; // par défaut - for (ila = listContact_efface_tatdt.begin();ila != ilafin;ila++) - { if (((*ila).Esclave()->Num_noeud() == n_noee) - && ((*((*ila).Elfront()->Eleme())) == (*((*iM).Eleme()))) - && ((*ila).Esclave()->Num_Mail() == num_mail_noe_esclave)) - { vraiment_nouveau_element = false; break;}; - }; +// for (ila = listContact_efface_tatdt.begin();ila != ilafin;ila++) +// { if (((*ila).Esclave()->Num_noeud() == n_noee) +// && ((*((*ila).Elfront()->Eleme())) == (*((*iM).Eleme()))) +// && ((*ila).Esclave()->Num_Mail() == num_mail_noe_esclave)) +// { vraiment_nouveau_element = false; +// if ((*ila).Permet_affichage() > 5) +// {cout << "\n element de contact venant juste d'etre supprime, on arrete la creation "; +// (*ila).Affiche(1); +// }; +// break;}; +// }; - if (niveau_commentaire_contact > 5) + if (niveau_commentaire_lescontacts > 5) {//cout << "\n 2debug LesContacts::Nouveau( " ; LaLIST ::iterator ila,ilafin=listContact_efface_tatdt.end(); for (ila = listContact_efface_tatdt.begin();ila != ilafin;ila++) @@ -1158,7 +1196,7 @@ bool LesContacts::Nouveau(double dep_max) }; // on ne continue que si c'est un vrai nouvel élément if (vraiment_nouveau_element) - { // on passe en revue les éléments de contact déjà existant associé + { // on passe en revue les frontières de contact déjà existantes associées // et s'il y a déjà un élément qui correspond, on arête la création bool creation = true; // init @@ -1168,54 +1206,80 @@ bool LesContacts::Nouveau(double dep_max) for (il = list_tesN.begin();il != ilfin; il++) { ElContact& con = (*(*il)); if (con.Elfront()->MemeOrigine(elfront)) - creation = false; + {creation = false; + if (con.Permet_affichage() > 5) + { cout << "\n frontiere en contact deja existante , on arrete la creation "; + elfront.Affiche(1); + }; + } }; }; // on ne continue que s'il n'existe pas d'élément de contact du même type if (creation) { ElContact elcont(&(*iM),tesc(inesc),fct_nD_contact); - elcont.Num_zone_contact()=j; // affectation du numéro de zone - + elcont.Num_zone_contact()=j_zone; // affectation du numéro de zone + elcont.Change_lissage_normale(lissage_de_la_normale(j_zone)); // affectation du lissage + // vérification que l'on a bien les frontières bien connectées - if (niveau_commentaire_contact > 5) + if ((niveau_commentaire_lescontacts > 5) + || (elcont.Permet_affichage() > 5)) { Front* elfront = elcont.Elfront(); cout << "\n examen plus precis: frontiere: " << elfront->Num_frontiere() << ", type: " << Nom_type_geom(elfront->Eleme_const()->Type_geom_front()) << " de l'element " << elfront->PtEI()->Num_elt() << " du maillage " << elfront->PtEI()->Num_maillage() ; - if (niveau_commentaire_contact > 7) + if (niveau_commentaire_lescontacts > 7) elcont.Affiche(); }; // calcul du contact, et translation éventuelle du noeud sur la surface // si le contact existe, ceci en fonction de la méthode de contact bool ret = elcont.Contact(); + if (elcont.Permet_affichage() > 5) + {cout << "\n retour de Contact: ret= " << ret; + + } if (ret) - //sauvegarde éventuelle de l'element contact - { listContact.push_front(elcont); - //numtesN.push_front(TroisEntiers(num_mail_noe_esclave,j,n_noee)); - tesN_encontact_ii[no].push_front(listContact.begin()); - listContact_nouveau_tatdt.push_front(listContact.begin()); - nb_contact_actif++; // à ce stade le nouveau contact est actif - retour=true; // on valide le retour - if (niveau_commentaire_contact > 3) - { int num_mail_elem = (elem.Tab_noeud())(1)->Num_Mail(); - cout << "\n newcontact entre noeud " ; - if (tesN_col(inesc)) cout << " collant "; - cout << elcont.Esclave()->Num_noeud() - << " du maillage " << elcont.Esclave()->Num_Mail() - << " et frontiere " << (*iM).Num_frontiere() - << " de l'element " << elem.Num_elt() << " du maillage " - << num_mail_elem << flush; - }; + {//sauvegarde éventuelle de l'element contact + ElContact* test_existance= Element_contact_deja_present(elcont); + if (test_existance == NULL) + { listContact.push_front(elcont); + //numtesN.push_front(TroisEntiers(num_mail_noe_esclave,j,n_noee)); + tesN_encontact_ii[no].push_front(listContact.begin()); + listContact_nouveau_tatdt.push_front(listContact.begin()); + // à ce stade le nouveau contact est actif + retour=true; // on valide le retour + if ((niveau_commentaire_lescontacts > 3) + || (elcont.Permet_affichage() > 3)) + { int num_mail_elem = (elem.Tab_noeud())(1)->Num_Mail(); + cout << "\n newcontact: " ; + if (tesN_col(inesc)) cout << " collant "; + elcont.Affiche(1); + }; + } + else if (!test_existance->Actif()) + // s'il existe et est inactif on le rend actif (pour remplacer celui qui devrait être créé) + {test_existance->Met_actif(); + if ((niveau_commentaire_lescontacts > 5) + || (elcont.Permet_affichage() > 5)) + {cout << " remis en actif: "; + elcont.Affiche(2); + }; + } + else + { if ((niveau_commentaire_lescontacts > 5) + || (elcont.Permet_affichage() > 5)) + cout << " --> contact deja enregistre " ; + } ; } else - { if (niveau_commentaire_contact > 5) + { if ((niveau_commentaire_lescontacts > 5) + || (elcont.Permet_affichage() > 5)) cout << " --> pas de contact " ; } ; - // { listContact.push_back(elcont);numtesN.push_back(DeuxEntiers(intot,inesc)); - // if (niveau_commentaire_contact >= 6) + // listContact.push_back(elcont);numtesN.push_back(DeuxEntiers(intot,inesc)); + // if (niveau_commentaire_lescontacts >= 6) // { Enum_type_geom type_front; Element & elem = *elcont.Elfront()->PtEI(); // int num_mail_elem = (elem.Tab_noeud())(1)->Num_Mail(); // cout << "\nnewcontact entre noeud " << elcont.Esclave()->Num_noeud() @@ -1237,9 +1301,9 @@ bool LesContacts::Nouveau(double dep_max) }; // -- fin du test tesN_encontact(intot)(inesc) } //-- fin du test non collant: if (!tesN_col(inesc)) };// -- boucle sur inesc - };// -- boucle sur intot - }// -- fin de la boucle sur les zones for (int j=1;j<= nb_zone;j++) - if (niveau_commentaire_contact > 3) + }// -- fin de la boucle sur les zones for (int j=1;j<= nb_zone;j++) + };// -- boucle sur intot + if (niveau_commentaire_lescontacts > 3) { cout << "\nbilan: "<< listContact.size() << " elem contact "; if ( listContact_nouveau_tatdt.size()) cout <<", "<< (listContact_nouveau_tatdt.size()-taille_list_contact_nouveau_au_debut) @@ -1248,6 +1312,15 @@ bool LesContacts::Nouveau(double dep_max) cout <<", "< 4) + // on va lister les éléments de contact + { cout << "\n liste des Elcontact a la fin de LesContacts::Nouveau: (fct du niveau de commentaire des elcontact): "; + LaLIST::iterator ipp,ippfin=listContact.end(); + for (ipp=listContact.begin();ipp != ippfin; ipp++) + {(*ipp).Affiche(2);}; + }; + + tempsContact.Arret_du_comptage(); // fin cpu //cout << "\n tempsContact.Temps_CPU_User = " << tempsContact.Temps_CPU_User() << flush; return retour; @@ -1259,9 +1332,8 @@ bool LesContacts::Nouveau(double dep_max) bool LesContacts::SuppressionDefinitiveElemInactif() { tempsContact.Mise_en_route_du_comptage(); // def deb compt - int niveau_commentaire_contact = ParaGlob::param->ParaAlgoControleActifs().Niveau_commentaire_contact(); - if (niveau_commentaire_contact == 0) {niveau_commentaire_contact = ParaGlob::NiveauImpression();}; - if (niveau_commentaire_contact >= 7) + int niveau_commentaire_lescontacts = Permet_affichage(); + if (niveau_commentaire_lescontacts > 4) cout << "\n -- LesContacts::SuppressionDefinitiveElemInactif: "; bool change = false; int nb_effacement=0; @@ -1275,7 +1347,6 @@ bool LesContacts::SuppressionDefinitiveElemInactif() && ((*iE).Collant()) // et si c'est collant: ce n'est pas normal, on le remet actif ) {(*iE).Met_actif(); // on valide l'activation - nb_contact_actif++; } else if (!((*iE).Actif()) // on intervient si le contact est déclaré inactif && !((*iE).Collant()) // et si ce n'est pas collant: si collant, on ne change rien @@ -1284,14 +1355,10 @@ bool LesContacts::SuppressionDefinitiveElemInactif() // list ::iterator iiden = iden; int num_mail_esclave = (*iiE).Esclave()->Num_Mail(); int num_noeud = (*iiE).Esclave()->Num_noeud(); - if (niveau_commentaire_contact > 3) + if (niveau_commentaire_lescontacts > 3) { Element & elem = *(*iiE).Elfront()->PtEI(); int num_mail_elem = (elem.Tab_noeud())(1)->Num_Mail(); - cout << "\neffacement contact entre noeud " << num_noeud - << " du maillage " << num_mail_esclave - << " et frontiere " << (*iiE).Elfront()->Num_frontiere() - << " de l'element " << elem.Num_elt() << " du maillage " - << num_mail_elem << endl; + cout << "\neffacement contact:";(*iiE).Affiche(1); }; iE--; // pointe sur le precedent element listContact_efface_tatdt.push_front(*iiE); @@ -1308,11 +1375,24 @@ bool LesContacts::SuppressionDefinitiveElemInactif() #endif LaLIST < LaLIST::iterator > & list_tesN = tesN_encontact(num_mail_esclave)[(*iiE).Esclave()]; +////--- debug +//{cout << "\n debug LesContacts::SuppressionDefinitiveElemInactif: "; +// (*iiE).Affiche(1); +// } +// //--- fin debug + list_tesN.remove(iiE); // tesN_encontact(num_mail_esclave)(num_noeud).remove(iiE); // mise à jour de l'indicateur listContact.erase(iiE); // efface l'element +////--- debug +//{cout << "\n liste restante des elements de contact "; +// LaLIST ::iterator iE ; +// for (iE = listContact.begin(); iE != listContact.end(); iE++) +// {cout << "\n";(*iE).Affiche(1);} +//} +////--- fin debug + nb_effacement++; - // on ne change pas nb_contact_actif car on ne supprime que des inactifs change = true; // iden--; // numtesN.erase(iiden); @@ -1322,11 +1402,11 @@ bool LesContacts::SuppressionDefinitiveElemInactif() else {(*iE).Met_actif();}; // on valide l'activation }; // info - if (niveau_commentaire_contact > 2) + if (niveau_commentaire_lescontacts > 2) { if (nb_effacement) cout << "\n sup: "<< nb_effacement << " effacement(s) definitif(s) de contact "; }; - if ((niveau_commentaire_contact > 6) && (nb_effacement==0)) + if ((niveau_commentaire_lescontacts > 6) && (nb_effacement==0)) cout << " aucun effacement "; tempsContact.Arret_du_comptage(); // fin cpu @@ -1339,9 +1419,8 @@ bool LesContacts::SuppressionDefinitiveElemInactif() bool LesContacts::RelachementNoeudcolle() { tempsContact.Mise_en_route_du_comptage(); // def deb compt - int niveau_commentaire_contact = ParaGlob::param->ParaAlgoControleActifs().Niveau_commentaire_contact(); - if (niveau_commentaire_contact == 0) {niveau_commentaire_contact = ParaGlob::NiveauImpression();}; - if (niveau_commentaire_contact > 6) + int niveau_commentaire_lescontacts = Permet_affichage(); + if (niveau_commentaire_lescontacts > 4) cout << "\n -- LesContacts::RelachementNoeudcolle(): "; bool change = false; // return change; //------- pour le débug @@ -1361,15 +1440,11 @@ bool LesContacts::RelachementNoeudcolle() // list ::iterator iiden = iden; int num_mail_esclave = (*iiE).Esclave()->Num_Mail(); int num_noeud = (*iiE).Esclave()->Num_noeud(); - if (niveau_commentaire_contact >= 3) + if (niveau_commentaire_lescontacts > 2) { Element & elem = *(*iiE).Elfront()->PtEI(); int num_mail_elem = (elem.Tab_noeud())(1)->Num_Mail(); - cout << "\ninactivation (relachement) pour cause de decollement du contact" - << "\n entre noeud " << num_noeud - << " du maillage " << num_mail_esclave - << " et frontiere " << (*iiE).Elfront()->Num_frontiere() - << " de l'element " << elem.Num_elt() << " du maillage " - << num_mail_elem << endl; + cout << "\ninactivation (relachement) pour cause de decollement du contact"; + (*iiE).Affiche(1); cout << endl; ////------ debug //{cout << "\n debug: LesContacts::RelachementNoeudcolle() "; // (*iE).Decol(); @@ -1377,11 +1452,10 @@ bool LesContacts::RelachementNoeudcolle() //// ------- fin debug }; - nb_contact_actif--; change = true; (*iE).Met_Inactif(); }; - if ((!change)&& (niveau_commentaire_contact > 6)) + if ((!change)&& (niveau_commentaire_lescontacts > 6)) cout << " aucun noeud relache "; tempsContact.Arret_du_comptage(); // fin cpu @@ -1401,7 +1475,7 @@ const Tableau & LesContacts::ConditionLin(const Nb_assemb& casAs // definition du tableau // int tail = listContact.size();//(int) listContact.size(); // tabCoLin.Change_taille(tail); - {Recalcul_Nb_contact_actif(); + {Calcul_Nb_contact_actif(); tabCoLin.Change_taille(nb_contact_actif); //cout << "\n nb actif pour condlin = " << nb_contact_actif; // on boucle sur les elements de contact @@ -1541,121 +1615,187 @@ bool LesContacts::Largeur_Bande(int& demi,int& total,const Nb_assemb& casAssemb, // maitre frontiere (mais la position finale du noeud n'est pas forcément changée, cela dépend du // modèle de contact (cinématique, pénalisation etc.) // ramène true si quelque chose à changé, false sinon -// --- la suite est fausse, en particulier, on n'examine "que" les éléments actifs -/* // dans le cas où la réaction est négative, en fonction de l'algorithme l'élément de contact est -// inactivé, cependant tous les éléments de contact sont passés en revue (actif ou pas) -*/ -bool LesContacts::Actualisation() +// choix == 1 : les éléments actifs sont maintenu en contact même si l'intersection est hors frontière +// si l'intersection n'est pas calculable, l'élément de contact est laissè inchangé +// choix == 0 : les éléments actifs sont inactivés si l'intersection est hors frontière ou +// si l'intersection n'est pas calculable, +// NB: pour les deux choix, s'il y a doublon d'élément de contact, due à un changement de frontière +// en cours d'actualisation, on inactive le(s) doublon(s) +bool LesContacts::Actualisation(int choix) { tempsContact.Mise_en_route_du_comptage(); // def deb compt bool retour = false; // init par défaut // on boucle sur les elements de contact - nb_contact_actif = 0; // init int i; LaLIST ::iterator iE,iEfin=listContact.end(); - int niveau_commentaire_contact = ParaGlob::param->ParaAlgoControleActifs().Niveau_commentaire_contact(); - if (niveau_commentaire_contact == 0) {niveau_commentaire_contact = ParaGlob::NiveauImpression();}; - if (niveau_commentaire_contact >= 7) - cout << "\n -- LesContacts::Actualisation: "; + int niveau_commentaire_lescontacts = Permet_affichage(); + + if (niveau_commentaire_lescontacts > 4) + cout << "\n -- LesContacts::Actualisation: choix: "<< choix; + if (niveau_commentaire_lescontacts > 4) + // on va lister les éléments de contact + { cout << "\n liste des Elcontact avant actualisation (fct du niveau de commentaire des elcontact): "; + LaLIST::iterator ipp,ippfin=listContact.end(); + for (ipp=listContact.begin();ipp != ippfin; ipp++) + {(*ipp).Affiche(2);}; + }; for (i=1, iE = listContact.begin(); iE !=iEfin; iE++,i++)//,iden++) // appel de la fonction d'actualisation de chaque element de contact if ((*iE).Actif()) // on intervient si le contact est déclaré actif // on intervient également si c'est collant, car il faut quand même actualiser // le contact, - { bool test=false; // init -/* --- suppression de tout le bloc qui suit car on ne passe plus par là donc c'est inutile de surcharger - bool decol=false; - // comme on étudie tous les éléments de contact, actif ou non, il faut distinguer le cas d'un noeud actif - // pour lequel la réaction a été calculée précédemment, du cas inactif, pour lequel il n'y a pas eu de calcul - // de réaction, donc on peut pas savoir -// if ((*iE).Actif()) -// decol = (*iE).Decol(); // le décolement est testé sur la réaction, qui a été calculée - // au pas précédent. Donc, si cette réaction est positive, donc qu'il y a décolement on ne doit - // plus tenir compte du contact et donc on n'actualise pas la position - if (decol) - // cas ou il n'y a plus de contact due à un décollement - { LaLIST ::iterator iiE = iE; - int num_mail_esclave = (*iiE).Esclave()->Num_Mail(); - int num_noeud = (*iiE).Esclave()->Num_noeud(); - if (niveau_commentaire_contact >= 3) - { Element & elem = *(*iiE).Elfront()->PtEI(); - int num_mail_elem = (elem.Tab_noeud())(1)->Num_Mail(); - cout << "\n force de collage => inactivation du contact entre noeud " << num_noeud - << " du maillage " << num_mail_esclave - << " et frontiere " << (*iiE).Elfront()->Num_frontiere() - << " de l'element " << elem.Num_elt() << " du maillage " - << num_mail_elem << endl; - }; - (*iiE).Met_Inactif(); // inactive l'élément - retour = true; // on signale le changement - } - else// cas ou on avait une force de contact compressive ou que l'élément est inactif - // mise à jour. - -*/ + { int test=0; // init { -/* ////debug -//{Noeud* no = (*iE).Esclave(); -// if (no->Num_noeud()==394) -// {cout << "\n debug LesContacts::Actualisation( , arrivee au noeud 394 "; -// cout << " coord2= " << (*iE).Esclave()->Coord2(); -// (*iE).Point_intersection().Affiche(); -// }; -//}; -////// fin debug */ - // Si le retour est négatif et que l'élément est actif, cela signifie que l'on sort d'une surface de contact, + // Si le retour est négatif et que l'élément est actif, cela signifie que l'on ne peut pas calculer le contact + // là on on se contente d'inactiver l'élément + // si le retour == 0: on peut calculer mais on sort de l'élément et même des mitoyens + // là aussi on se contente d'inactiver l'élément + // durant l'actualisation, on peut changer d'élément frontière, du coup l'élément de contact résultant + // peut être égale à un élément déjà existant, et cela va faire double emploi + // dans ce cas précis on ne va pas valider l'actualisation, mais on se contente d'inactiver l'élément + + // actualisation de la projection du noeud esclave en fonction de la position de l'element + // maitre frontiere. Lorsque le noeud change d'element fontiere, on change l'element + // frontiere de l'element de contact en consequence + // retourne: + // 0 : dans le cas ou on ne trouve pas d'intersection, cas d'une intersection qui n'est pas calculable + // 1 : contact ok, sur l'élément + // -1 : contact ok, mais hors de l'élément (là, on a parcouru tous les mitoyens et aucun ne convient + // du coup on utilise l'élément initial pour la projection + // 2 : changement de frontière, et contact ok sur la nouvelle frontière + // NB: sauf pour le cas 0, dans tous les autres cas, les grandeurs locales sont correctement calculées + // c-a-d : la projection, la normale + // en fonction de la méthode de contact, le noeud est ramené éventuellement sur la frontière + + + test = (*iE).Actualisation(); -/* //debug -//test = (*iE).Actualisation(); -//if (!test) -//{cout << "\n debug LesContacts::Actualisation( "; -// test = (*iE).Actualisation(); // on rappelle la fonction -//}; -// fin debug */ - if ((!test) - && !((*iE).Collant()) // si c'est collant, on maintient le contact arbitrairement + ElContact* test_existance=NULL; + if (test == 2) + {// on a changé de frontière, on regarde si l'élément de contact avec la nouvelle frontière n'est pas + //identique à un élément existant + test_existance= Element_contact_deja_present(iE); + }; + if ( ((test < 0) && (choix == 0) && !((*iE).Collant())) // si c'est collant, on maintient le contact arbitrairement sauf si on + // est arrivé sur un élément existant + || (test == 0) // ou que l'on ne peut pas calculer une intersection ... ce qui fait que le + // calcul des second membre et raideur ne sera pas possible ) - // cas ou il n'y a plus de contact, on inactive l'element de contact + // on inactive l'element de contact { LaLIST ::iterator iiE = iE; int num_mail_esclave = (*iiE).Esclave()->Num_Mail(); int num_noeud = (*iiE).Esclave()->Num_noeud(); - if (niveau_commentaire_contact >= 3) + if (niveau_commentaire_lescontacts >= 3) { Element & elem = *(*iiE).Elfront()->PtEI(); int num_mail_elem = (elem.Tab_noeud())(1)->Num_Mail(); - cout << "\ninactivation contact (les_contacts) pour cause de perte de contact" - << "\n entre noeud " << num_noeud - << " du maillage " << num_mail_esclave - << " et frontiere " << (*iiE).Elfront()->Num_frontiere() - << " de l'element " << elem.Num_elt() << " du maillage " - << num_mail_elem << endl; + cout << "\ninactivation contact (les_contacts) pour cause de perte de contact:"; + #ifdef MISE_AU_POINT + if (niveau_commentaire_lescontacts > 4) + cout << " test= "<= 7) + else if (test_existance != NULL) + // cas où test est forcément == 2 (car on a calculé test_existance) il on est arrivé sur un élément existant qui est actif + // on inactive l'element de contact + {if (test_existance->Actif()) + { LaLIST ::iterator iiE = iE; + int num_mail_esclave = (*iiE).Esclave()->Num_Mail(); + int num_noeud = (*iiE).Esclave()->Num_noeud(); + if (niveau_commentaire_lescontacts >= 3) + { Element & elem = *(*iiE).Elfront()->PtEI(); + int num_mail_elem = (elem.Tab_noeud())(1)->Num_Mail(); + cout << "\ninactivation contact apres chgt de frontiere (les_contacts) pour cause de duplication:"; + (*iiE).Affiche(1); + }; + (*iiE).Met_Inactif(); // inactive l'élément + retour = true; // on signale le changement + }; + } + + else // arrivée ici cela veut dire que test > 0 ou que c'est collant et test n'est pas négatif + // ou alors que test < 0 mais on a choix == 1, c-a-d que l'on veut maintenir le contact même en dehors de l'élément actuel + // (c'est par exemple une situation transitoire pendant les itérations en implicite) + { if (niveau_commentaire_lescontacts >= 7) { Element & elem = *(*iE).Elfront()->PtEI(); int num_mail_elem = (elem.Tab_noeud())(1)->Num_Mail(); - cout << "\n contact entre noeud " - << (*iE).Esclave()->Num_noeud() - << " du maillage " << (*iE).Esclave()->Num_Mail() - << " et frontiere " << (*iE).Elfront()->Num_frontiere() - << " de l'element " << elem.Num_elt() << " du maillage " - << num_mail_elem - << "\n nb_contact_actif= " << nb_contact_actif - << endl; + cout << "\n contact maintenu: ";(*iE).Affiche(1); + }; }; + // si on a inactivé l'élément, on regarde s'il n'y a pas un autre contact, utilisant le même noeud + // que l'on pourrait activer + if (!(*iE).Actif()) + {Noeud* noe = (*iE).Esclave(); + int num_mail_noe_esclave = noe->Num_Mail(); + std::map::iterator > >& tesN_encontact_ii + = tesN_encontact(num_mail_noe_esclave); // pour simplifier + // la liste doit exister ! car au moins (*iE) y appartient +// Tableau < std::map::iterator > > > tesN_encontact; + // tesN_encontact(numMail_esclave)[*pt_noeud] -> la liste des iterators d'élément en contact + // avec le noeud + // on regarde si la liste existe, si oui on peut tester les membres sinon, on ne fait rien + // car autrement on crée automatiquement une liste avec un élément vide + std::map::iterator > >::iterator it_liste; + if (tesN_encontact_ii.find(noe) != tesN_encontact_ii.end()) + {LaLIST < LaLIST::iterator > & list_tesN = tesN_encontact_ii[noe]; + LaLIST < LaLIST::iterator >::iterator pl,plfin=list_tesN.end(); + int nb_contact = list_tesN.size(); + for (pl = list_tesN.begin();pl != plfin;pl++) + {ElContact& elc = (*(*pl)); + // là on va faire une actualisation simplifiée: le cas collant n'est pas à prendre en compte + // car on n'arrive jamais ici en collant + bool actif_transitoire = true; + elc.Met_actif(); // on doit activer l'élément pour utiliser Actualisation + // cela veut dire que systématiquement on calcule comme si le noeud esclave se déplace en contact + // (ce n'est pas une initialisation ) + test = elc.Actualisation(); + test_existance = NULL ; // init + if (test == 2) + {// on a changé de frontière, on regarde si l'élément de contact avec la nouvelle frontière n'est pas + //identique à un élément existant + test_existance= Element_contact_deja_present(iE); + }; + if ((test_existance == NULL) && (test > 0)) + // arrivée ici cela veut dire que le contact est valide + // on conserve l'élément actif + { actif_transitoire=false; // active l'élément + if (niveau_commentaire_lescontacts > 2) + { Element & elem = *(*iE).Elfront()->PtEI(); + int num_mail_elem = (elem.Tab_noeud())(1)->Num_Mail(); + cout << "\nreactivation contact :";elc.Affiche(1); + + }; + } + else // sinon on inactive l'élément ; + elc.Met_Inactif(); + }; + }; + + } }; } - else - {nb_contact_actif++; }; // on sauvegarde l'activité +// else +// {nb_contact_actif++; }; // on sauvegarde l'activité + if (niveau_commentaire_lescontacts > 4) + // on va lister les éléments de contact + { cout << "\n liste des Elcontact apres actualisation (fct du niveau de commentaire des elcontact): "; + LaLIST::iterator ipp,ippfin=listContact.end(); + for (ipp=listContact.begin();ipp != ippfin; ipp++) + {(*ipp).Affiche(2);}; + // on calcule et affiche le nombre de contact actif + Calcul_Nb_contact_actif(); + cout << "\n nb_contact_actif= " << nb_contact_actif << endl; + }; // retour - return retour; tempsContact.Arret_du_comptage(); // fin cpu + return retour; }; // ramène une liste de noeuds dont la position a été perturbé par le contact @@ -1672,9 +1812,8 @@ void LesContacts::Liste_noeuds_position_changer(list & li_noe) int i; LaLIST ::iterator iE,iEfin=listContact.end(); - int niveau_commentaire_contact = ParaGlob::param->ParaAlgoControleActifs().Niveau_commentaire_contact(); - if (niveau_commentaire_contact == 0) {niveau_commentaire_contact = ParaGlob::NiveauImpression();}; - if (niveau_commentaire_contact >= 7) + int niveau_commentaire_lescontacts = Permet_affichage(); + if (niveau_commentaire_lescontacts >= 7) cout << "\n -- LesContacts::Liste_noeuds_position_changer: "; for (i=1, iE = listContact.begin(); iE !=iEfin; iE++,i++)//,iden++) @@ -1694,9 +1833,8 @@ void LesContacts::CalculReaction(Vecteur& residu,bool& decol,const Nb_assemb& ca ,bool affiche) { tempsContact.Mise_en_route_du_comptage(); // def deb compt - int niveau_commentaire_contact = ParaGlob::param->ParaAlgoControleActifs().Niveau_commentaire_contact(); - if (niveau_commentaire_contact == 0) {niveau_commentaire_contact = ParaGlob::NiveauImpression();}; - if (niveau_commentaire_contact >= 7) + int niveau_commentaire_lescontacts = Permet_affichage(); + if (niveau_commentaire_lescontacts > 4) cout << "\n -- LesContacts::CalculReaction: "; int nb_Assemb = casAssemb.n; // récup du numéro d'assemblage // récup du type de contact @@ -1705,7 +1843,7 @@ void LesContacts::CalculReaction(Vecteur& residu,bool& decol,const Nb_assemb& ca // mise a dimension du tableau de stockage // tabReacCont.Change_taille((int)listContact.size()); // on recalcule le nombre de contact actif car c'est mal géré, je ne sais pas pourquoi et ou - Recalcul_Nb_contact_actif(); + Calcul_Nb_contact_actif(); tabReacCont.Change_taille(nb_contact_actif); int itab ; // indice du tableau decol = false; @@ -1744,7 +1882,7 @@ void LesContacts::CalculReaction(Vecteur& residu,bool& decol,const Nb_assemb& ca if ((contact_type==1)||(contact_type==3)) (*iE).Change_force(force); // mise à jour de la force dans l'élément de contact - if (niveau_commentaire_contact > 4) + if (niveau_commentaire_lescontacts > 5) {if ((contact_type==1)||(contact_type==3)) {cout << "\n LesContacts::CalculReaction >> Details: residu totale = contact + CL + F_int (noeud:" << noe->Num_noeud() << " maillage:"<< noe->Num_Mail() << ")\nR=" << force << " gapTDT= " << (*iE).Gaptdt() @@ -1757,7 +1895,7 @@ void LesContacts::CalculReaction(Vecteur& residu,bool& decol,const Nb_assemb& ca << " maillage:"<< noe->Num_Mail() << ")\nForce= " << (*iE).Force_contact() << " gapTDT= " << (*iE).Gaptdt() ; cout << "\n noeud: coor_tdt: "<Coord2() <<"\n delta: "<<(noe->Coord2()-noe->Coord1()); - if (niveau_commentaire_contact > 7) + if (niveau_commentaire_lescontacts > 7) (*iE).Affiche(); } @@ -2068,26 +2206,28 @@ void LesContacts::Info_commande_LesContacts(UtilLecture & entreePrinc) // autre zone, ainsi que la définition de l'auto-contact éventuel // ainsi que des contacts solide-deformables éventuel void LesContacts::Lecture_zone_contact(UtilLecture & entreePrinc,const LesReferences& lesRef) -{ - int niveau_commentaire_contact = ParaGlob::param->ParaAlgoControleActifs().Niveau_commentaire_contact(); - if (niveau_commentaire_contact == 0) {niveau_commentaire_contact = ParaGlob::NiveauImpression();}; +{ list li_lissage_de_la_normale; // stockage intermédiaire pour créer le tableau lissage_de_la_normale + int niveau_commentaire_lescontacts = Permet_affichage(); while ( (strstr(entreePrinc.tablcar,"auto_contact")!=NULL) || (strstr(entreePrinc.tablcar,"zone_contact")!=NULL) || (strstr(entreePrinc.tablcar,"contact_solide_deformable")!=NULL) || (strstr(entreePrinc.tablcar,"glue_contact")!=NULL) || (strstr(entreePrinc.tablcar,"glue_contact_init_gap_zero")!=NULL) ) - { + {// on regarde si la zone de contact est avec lissage de la normale + int avec_lissage_de_la_normale = 0; + if (strstr(entreePrinc.tablcar,"avec_lissage_de_la_normale")!=NULL) + avec_lissage_de_la_normale = 1; // --- on examine le cas où il y a un marquage d'auto-contact if (strstr(entreePrinc.tablcar,"auto_contact")!=NULL) // cas ou l'on a des domaines esclaves en auto-contact, lecture du nombre { entreePrinc.NouvelleDonnee(); - if (niveau_commentaire_contact >= 4) + if (niveau_commentaire_lescontacts >= 4) cout << " lecture du nombre de domaines esclaves en auto-contact " << endl; *(entreePrinc.entree) >> nbmailautocontact; // lecture du nombre - if (niveau_commentaire_contact >= 5) cout << nbmailautocontact << endl; - if (niveau_commentaire_contact >= 4) + if (niveau_commentaire_lescontacts >= 5) cout << nbmailautocontact << endl; + if (niveau_commentaire_lescontacts >= 4) cout << " fin de la lecture du nombre de domaines esclaves en auto-contact " << endl; entreePrinc.NouvelleDonnee(); // positionnement sur une nouvelle info }; @@ -2105,7 +2245,7 @@ void LesContacts::Lecture_zone_contact(UtilLecture & entreePrinc,const LesRefere // lecture tant qu'il n'y a pas de nouveau mot clé entreePrinc.NouvelleDonnee(); - if (niveau_commentaire_contact >= 4) cout << " debut de la lecture des zones de contact possibles " << endl; + if (niveau_commentaire_lescontacts >= 4) cout << " debut de la lecture des zones de contact possibles " << endl; while (!motCle.SimotCle(entreePrinc.tablcar)) { // on lit 2 par deux: une ref de noeud + une ref de frontière quatre_string_un_entier quatre_inter; // une grandeur de travail @@ -2145,9 +2285,8 @@ void LesContacts::Lecture_zone_contact(UtilLecture & entreePrinc,const LesRefere else // cas du deuxième passage on enregistre {quatre_inter.nom3=nom;quatre_inter.nom4=nom_ref; nom_ref_zone_contact.push_back(quatre_inter); + li_lissage_de_la_normale.push_back(avec_lissage_de_la_normale); }; -// obsolète if (nom_mail != NULL) nom_mail = new string(nom); -// nom_mail_ref_zone_contact.push_back(nom_mail); } #ifndef ENLINUX if ((entreePrinc.entree)->eof()) // on arrive à la fin de la ligne @@ -2169,11 +2308,11 @@ void LesContacts::Lecture_zone_contact(UtilLecture & entreePrinc,const LesRefere }; }; // -- fin for (int nr=1;nr<=2;nr++) }; //-- fin du while (!motCle.SimotCle(entreePrinc.tablcar)) - if (niveau_commentaire_contact >= 4) cout << " fin de la lecture des zones de contact " << endl; + if (niveau_commentaire_lescontacts >= 4) cout << " fin de la lecture des zones de contact " << endl; }; // --- cas des contacts solide-deformable if (strstr(entreePrinc.tablcar,"contact_solide_deformable")!=NULL) - { if (niveau_commentaire_contact >= 4) cout << " debut de la lecture des contacts solide-deformable " << endl; + { if (niveau_commentaire_lescontacts >= 4) cout << " debut de la lecture des contacts solide-deformable " << endl; string toto; // variables de travail while (strstr(entreePrinc.tablcar,"fin_liste_des_couples_de_noms_solide_deformable")==NULL) // && (!motCle.SimotCle(entreePrinc.tablcar))) @@ -2184,9 +2323,20 @@ void LesContacts::Lecture_zone_contact(UtilLecture & entreePrinc,const LesRefere }; // on passe le mot clé de fin entreePrinc.NouvelleDonnee(); - if (niveau_commentaire_contact >= 4) cout << " fin de la lecture des contacts solide-deformable " << endl; + if (niveau_commentaire_lescontacts >= 4) cout << " fin de la lecture des contacts solide-deformable " << endl; }; }; + // création du tableau lissage_de_la_normale + int nb_zone_lue = li_lissage_de_la_normale.size(); + if (nb_zone_lue != 0) + {lissage_de_la_normale.Change_taille(nb_zone_lue); // init + list ::iterator il,ilfin=li_lissage_de_la_normale.end(); + int iii=1; + for (il = li_lissage_de_la_normale.begin();il != ilfin;il++,iii++) + lissage_de_la_normale(iii) = (*il); + } + else // sinon on définie une seule zone et sans lissage + {lissage_de_la_normale.Change_taille(1); lissage_de_la_normale(1)=0;}; }; diff --git a/contact/LesContacts.h b/contact/LesContacts.h index a24f5de..f318e5e 100644 --- a/contact/LesContacts.h +++ b/contact/LesContacts.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -178,10 +178,14 @@ class LesContacts // actualise la projection du noeud esclave en fonction de la position de l'element // maitre frontiere (mais la position finale du noeud n'est pas forcément changée, cela dépend du // modèle de contact (cinématique, pénalisation etc.) - // dans le cas où la réaction est négative, en fonction de l'algorithme l'élément de contact est - // inactivé, cependant tous les éléments de contact sont passés en revue (actif ou pas) // ramène true si quelque chose à changé, false sinon - bool Actualisation(); + // choix == 1 : les éléments actifs sont maintenu en contact même si l'intersection est hors frontière + // si l'intersection n'est pas calculable, l'élément de contact est laissè inchangé + // choix == 0 : les éléments actifs sont inactivés si l'intersection est hors frontière ou + // si l'intersection n'est pas calculable + // NB: pour les deux choix, s'il y a doublon d'élément de contact, due à un changement de frontière + // en cours d'actualisation, on inactive le(s) doublon(s) + bool Actualisation(int choix); // ramène une liste de noeuds dont la position a été perturbé par le contact // (dépend du type de contact : ex cas contact = 4) @@ -285,6 +289,14 @@ class LesContacts // de contact, on définit si besoin, les conteneurs ad hoc au niveau des noeuds // ok, mais à revoir sans doute cf. pense bete 14 oct void Init_Grandeur_particuliere (bool absolue,List_io& li1); + + + //retourne le niveau d'affichage + int Permet_affichage() const + {int niveau_commentaire_lescontacts = ParaGlob::param->ParaAlgoControleActifs().Niveau_commentaire_LesContact(); + if (niveau_commentaire_lescontacts == 0) {niveau_commentaire_lescontacts = ParaGlob::NiveauImpression();}; + return niveau_commentaire_lescontacts; + }; // ne sert plus (à virer car problématique !! ) // mise à jour du stockage inter, pour prendre en @@ -353,6 +365,8 @@ class LesContacts // nom4 -> le nom de la référence de frontière // n -> l'entier = 0 : pas d'utilisation // = 1 : indique qu'il faut considérer un contact collant (glue) + Tableau lissage_de_la_normale; // même dimension que nom_ref_zone_contact + // lissage_de_la_normale(i) : indique si oui ou non, la normale sur la zone i doit être lissée // la liste des éléments frontières succeptibles d'entrer en contact @@ -438,12 +452,40 @@ class LesContacts int Recup_ref( ElContact& al) ; // récupère le nombre de contact actif et met à jour ce nombre - // normalement devrait toujours être correct mais ?? il y a quelque chose d'incorrecte quelque part - int Recalcul_Nb_contact_actif(); + int Calcul_Nb_contact_actif(); // création du conteneur Fct_nD_contact void Creation_Fct_nD_contact(); - + + // création et ajout des éléments de frontière correspondant aux angles morts + // en 2D : noeud frontière + éléments interne + // en 3D : ligne frontière + éléments interne + void ElementAngleMort(LesMaillages& lesMail); + + // test si un nouvel élément de contact possible appartient en fait déjà à la liste des contacts enregistrés + // NB: pas rusé mais il faudrait pour optimiser, ordonner la liste des éléments de contact en + // introduisant une nouvelle relation d'ordre et un nouvel operateur d'égalité ... +//il faut regarder s'il est actif aussi ??? +//mais en création on pourrait regarder les intactifs, et au lieu de créer un nouveau, passer l'inactif en actif +//du coup, il faudrait peut-être ramener l'élément trouvé pour changer son activité ?? +//donc ici il y a quelque chose à faire + ElContact* Element_contact_deja_present( const ElContact& al) + {LaLIST ::iterator ili,ilifin = listContact.end(); + for (ili = listContact.begin();ili != ilifin;ili++) + if ((*ili).MemeOrigine(al)) + return (&(*ili)); + return NULL; + } ; + // idem mais avec un iterator + // permet de comparer un iterator de la liste avec les éléments de la liste + ElContact* Element_contact_deja_present( LaLIST ::iterator& il) + {LaLIST ::iterator ili,ilifin = listContact.end(); + for (ili = listContact.begin();ili != ilifin;ili++) + if (((*ili).MemeOrigine(*il)) && (il != ili)) + return (&(*ili)); + return NULL; + } ; + }; /// @} // end of group diff --git a/contact/LesContacts_2.cc b/contact/LesContacts_2.cc index 81d6f45..e7e7f10 100755 --- a/contact/LesContacts_2.cc +++ b/contact/LesContacts_2.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -48,7 +48,7 @@ void LesContacts::Lec_base_info_LesContacts(ifstream& ent ,Noeud& (T::*RecupNoeud)(int i, int j) const ,Element& (T::*RecupElement_LesMaille)(int i, int j) const) { - int niveau_commentaire_contact = ParaGlob::param->ParaAlgoControleActifs().Niveau_commentaire_contact(); + int niveau_commentaire_lescontacts = Permet_affichage(); // tout d'abord on lit le type string type_contact,no_taille; int taille=0; // taille par défaut ent >> type_contact >> no_taille >> taille; @@ -67,23 +67,20 @@ void LesContacts::Lec_base_info_LesContacts(ifstream& ent }; #endif // on supprime tous les éléments de contact sauf... les collants qui restent collant - { - LaLIST ::iterator iE ; - // on met .end(), car cette borne peut changer au gré des suppression - for (iE = listContact.begin(); iE != listContact.end(); iE++) - if (!((*iE).Collant()) // et si ce n'est pas collant: si collant, on ne change rien - ) - { // sinon on supprime - LaLIST ::iterator iiE = iE; - iE--; // pointe sur le precedent element - LaLIST < LaLIST::iterator > & list_tesN - = tesN_encontact((*iiE).Esclave()->Num_Mail())[(*iiE).Esclave()]; - list_tesN.remove(iiE); - listContact.erase(iiE); // efface l'element - }; - Recalcul_Nb_contact_actif(); - }; -// nb_contact_actif = 0 ; // init + {LaLIST ::iterator iE ; + // on met .end(), car cette borne peut changer au gré des suppression + for (iE = listContact.begin(); iE != listContact.end(); iE++) + if (!((*iE).Collant()) // et si ce n'est pas collant: si collant, on ne change rien + ) + { // sinon on supprime + LaLIST ::iterator iiE = iE; + iE--; // pointe sur le precedent element + LaLIST < LaLIST::iterator > & list_tesN + = tesN_encontact((*iiE).Esclave()->Num_Mail())[(*iiE).Esclave()]; + list_tesN.remove(iiE); + listContact.erase(iiE); // efface l'element + }; + }; Tableau compteur_inesc(nb_mail_Esclave,1); // compteur de compteur de noeuds esclaves // on initialise la liste des éléments en contact @@ -126,31 +123,78 @@ void LesContacts::Lec_base_info_LesContacts(ifstream& ent }; // création d'un Front Front froont(*elfr,&elem,num_front_element); - // création de l'élément de contact - ElContact courant(&froont,&no,fct_nD_contact); - // lecture des données particulières - courant.Lec_base_info_ElContact(ent); - // on regarde si c'était un contact actif ou pas, si oui on incrémente le nombre - if (courant.Actif()) - nb_contact_actif++; - // sauvegarde - listContact.push_front(courant); - LaLIST::iterator ipp = listContact.begin(); - // on met à jour le tableau tesN_encontact - //*** la liste peut très bien ne pas exister ! -// #ifdef MISE_AU_POINT -// if (tesN_encontact(numMail_esclave).find((*ipp).Esclave()) -// == tesN_encontact(numMail_esclave).end() ) -// { cout << "\n*** Erreur : on ne trouve pas la liste d'element en contact avec le noeud esclave " -// << (*ipp).Esclave()->Num_noeud() << " du maillage " << numMail_esclave -// << " la suite n'est pas possible " -// << " LesContacts::Lec_base_info_LesContacts(.. \n"; -// Sortie(1); -// }; -// #endif - - // ajout dans la liste associé au noeud esclave - tesN_encontact(numMail_esclave)[(*ipp).Esclave()].push_front(listContact.begin()); + // froont ne contient pas forcément les éléments mitoyens, en particulier pour les élément d'angles morts + // par contre il doit correspondre à un des éléments enregistrés dans t_listFront + // on va donc le chercher dans t_listFront + Front* froant=NULL; // le front que l'on cherche + + // ** pour le tableaux t_listFront, le numéros dit de maillage, n'est pas le numéro + // ** intrinsèque de maillage (telle que ceux associés aux noeuds et éléments) + // ** mais uniquement un numéro locale d'ordre + // ** mais on a: les éléments de frontière de t_listFront(i) font partie du maillage + // i + (nb_mail_Esclave-nbmailautocontact) + int ii = numMail_element - (nb_mail_Esclave-nbmailautocontact); + Tableau < LaLIST_io >& t_listFront_i = t_listFront(ii); // pour simplifier + int nbzoneEt1 = 1+t_listFront_i.Taille(); + int num_zone = 0; // le numéro de zone éventuel + bool trouver = false; + for (int izone = 1; izone < nbzoneEt1;izone++) + {LaLIST_io & t_listFront_i_izone = t_listFront_i(izone); // pour simplifier + LaLIST_io ::iterator it,itfin=t_listFront_i_izone.end(); + for (it = t_listFront_i_izone.begin();it != itfin; it++) + {if ((*it).MemeOrigine(froont)) + {froant = &(*it); + trouver = true; + break; + }; + }; + if (trouver) + {num_zone=izone; break;} + }; + // on vérifie que l'on a bien trouvé un front sinon, on signale + if ((trouver == false) && (ParaGlob::NiveauImpression() > 0)) + {cout << "\n *** attention la frontiere de contact "; + froont.Affiche(1); + cout << " n'existe plus, on n'en tient plus compte "; + }; + // même si l'élément n'existe plus + // on continue la création pour ne pas corrompre la lecture + // on créer un élément de contact ad hoc + // création de l'élément de contact + ElContact courant(&froont,&no,fct_nD_contact); + // lecture des données particulières (qui ne contiennent pas les mitoyens) + courant.Lec_base_info_ElContact(ent); + if (trouver) + {// on met à jour les mitoyens + // definition des elements mitoyens à partir du front enregistré qui lui contient les mitoyens + // qui ont été créé à l'initialisation + if (froant->TabMitoyen() != NULL) + courant.Elfront()->DefMitoyen(*(froant->TabMitoyen())); + // mis à jour du numéro de zone + courant.Num_zone_contact() = num_zone; + courant.Change_lissage_normale(lissage_de_la_normale(num_zone)); // affectation du lissage + // sauvegarde si l'élément de contact n'existe pas déjà + ElContact* test_existance= Element_contact_deja_present(courant); + if (test_existance == NULL) + {listContact.push_front(courant); + LaLIST::iterator ipp = listContact.begin(); + // on met à jour le tableau tesN_encontact + //*** la liste peut très bien ne pas exister ! + // #ifdef MISE_AU_POINT + // if (tesN_encontact(numMail_esclave).find((*ipp).Esclave()) + // == tesN_encontact(numMail_esclave).end() ) + // { cout << "\n*** Erreur : on ne trouve pas la liste d'element en contact avec le noeud esclave " + // << (*ipp).Esclave()->Num_noeud() << " du maillage " << numMail_esclave + // << " la suite n'est pas possible " + // << " LesContacts::Lec_base_info_LesContacts(.. \n"; + // Sortie(1); + // }; + // #endif + + // ajout dans la liste associé au noeud esclave + tesN_encontact(numMail_esclave)[(*ipp).Esclave()].push_front(listContact.begin()); + }; + }; } // fin de l'ajout d'un élément de contact else {if (ParaGlob::NiveauImpression() > 0) @@ -161,10 +205,18 @@ void LesContacts::Lec_base_info_LesContacts(ifstream& ent << Nom_type_geom(enu) <<" "<4) + // on va lister les éléments de contact + { cout << "\n liste des Elcontact (fct du niveau de commentaire des elcontact): "; + LaLIST::iterator ipp,ippfin=listContact.end(); + for (ipp=listContact.begin();ipp != ippfin; ipp++) + {(*ipp).Affiche(2);}; + }; + Calcul_Nb_contact_actif(); if (((ParaGlob::NiveauImpression() > 2) && (nb_contact_actif != 0)) - || (niveau_commentaire_contact > 0 ) + || (niveau_commentaire_lescontacts > 0 ) ) - cout << "\n >> restart: lecture elements contact : "<< nb_contact_actif << " elements lus " << endl ; + cout << "\n >> restart: lecture elements contact : "<< nb_contact_actif << " elements lus " << endl ; string mot; ent >> mot >> tempsContact; }; diff --git a/contact/LesContacts_3.cc b/contact/LesContacts_3.cc index a946357..4c46001 100755 --- a/contact/LesContacts_3.cc +++ b/contact/LesContacts_3.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -36,6 +36,8 @@ #include "Enum_TypeQuelconque.h" #include "TypeQuelconqueParticulier.h" +#include "FrontPointF.h" + @@ -73,8 +75,6 @@ void LesContacts::TversTdt() = tesN_encontact(num_mail_noe_esclave)[no]; list_tesN.remove(*al); // tesN_encontact(num_mail_noe_esclave)(n_noee).remove(*al); - if (elc.Actif()) //a priori les nouveaux contacts étaient actif - nb_contact_actif--; // mais on ne sait jamais listContact.erase(*al); // cout << "\n debug toto "; }; @@ -86,6 +86,17 @@ void LesContacts::TversTdt() Noeud* no = elc.Esclave(); int n_noee = no->Num_noeud(); int num_mail_noe_esclave = no->Num_Mail(); + #ifdef MISE_AU_POINT + if (Element_contact_deja_present(*al)) + { cout << "\n*** Erreur : l'element de contact existe déjà, ce n'est pas normal " + << (*al).Esclave()->Num_noeud() + << " du maillage " << (*al).Esclave()->Num_Mail() + << " la suite n'est pas possible " + << " LesContacts::TversTdt(.. \n"; + tempsContact.Arret_du_comptage(); // fin cpu + Sortie(1); + }; + #endif listContact.push_front(*al); // on met à jour le tableau tesN_encontact #ifdef MISE_AU_POINT @@ -99,8 +110,6 @@ void LesContacts::TversTdt() }; #endif tesN_encontact(num_mail_noe_esclave)[no].push_front(listContact.begin()); - if ((*al).Actif()) // si l'élément supprimé était actif on remet à jour - nb_contact_actif++; }; }; // c) on nettoie les indicateurs transitoires @@ -111,6 +120,9 @@ void LesContacts::TversTdt() for (il=listContact.begin();il != ilfin; il++) (*il).TversTdt(); }; + Calcul_Nb_contact_actif(); + if ((ParaGlob::NiveauImpression() > 4) || (Permet_affichage() > 4 )) + cout << "\n >> LesContacts::TversTdt : nb contact actif = "<< nb_contact_actif << endl ; }; @@ -148,13 +160,13 @@ void LesContacts::Ecri_base_info_LesContacts(ofstream& sort) // qui permettent de construire un élément ad hoc, et ensuite les infos spécifiques internes à l'élément for (LaLIST ::iterator ic = listContact.begin();ic != listContact.end(); ic++) {// les infos permettants de contruire l'élément de contact: on considère que les numéros des noeuds, maillages, éléments - // restent identiques, par contre on peut avoir d'un échange des zones de restriction de contact d'une sauvegarde à un restart + // restent identiques, par contre on peut avoir un échange des zones de restriction de contact d'une sauvegarde à un restart sort << "\nN_es " << (*ic).Esclave()->Num_Mail() <<" " << (*ic).Esclave()->Num_noeud(); // le noeud esclave Front * elfront = (*ic).Elfront(); sort << " El " << elfront->NumMail() << " " << elfront->PtEI()->Num_elt_const() << " " << elfront->Eleme()->Type_geom_front() << " "<< elfront->Num_frontiere() ; // la frontière // les infos spécifiques éventuelles - (*ic).Ecri_base_info_ElContact(sort); + (*ic).Ecri_base_info_ElContact(sort); }; sort << "\n tps_rech_contact: "<ModifGrandeur_quelconque(enuTypeQuelconque); +// Grandeur_coordonnee& tyTQ= *((Grandeur_coordonnee*) +// tyqN.Grandeur_pointee()); +// // on récupère la normale au noeud projectile +// *(tyTQ.ConteneurCoordonnee()) = elcont.Normale_actuelle(); +// }; +// break; +// } case FORCE_CONTACT: {// ----- cas des noeuds projectiles en contact // on parcours la liste des élément en contact @@ -507,10 +533,14 @@ List_io LesContacts::ListeGrandeurs_particulieres(bool absolue) {TypeQuelconque typQ1(GLISSEMENT_CONTACT,X1,grand_coor_courant); liTQ.push_back(typQ1); }; - // $$$ cas de la visualisation du glissement des noeuds projectiles actifs + // $$$ cas de la visualisation de la normale de contact (moyenne) {TypeQuelconque typQ1(NORMALE_CONTACT,X1,grand_coor_courant); liTQ.push_back(typQ1); }; +// // $$$ cas de la visualisation de la normale aux noeuds frontières +// {TypeQuelconque typQ1(N_FRONT,X1,grand_coor_courant); +// liTQ.push_back(typQ1); +// }; // $$$ cas de la visualisation de la pénétration en contact {TypeQuelconque typQ1(PENETRATION_CONTACT,X1,grand_coor_courant); liTQ.push_back(typQ1); @@ -587,7 +617,7 @@ void LesContacts::List_reduite_aux_contact(const List_io& liTQ case CONTACT_ENERG_GLISSE_VISQ: case CONTACT_ENERG_GLISSE_PLAS: case CONTACT_NB_DECOL: case CONTACT_NB_PENET: case CONTACT_CAS_SOLIDE: case CONTACT_COLLANT: - case NUM_ZONE_CONTACT: + case NUM_ZONE_CONTACT: //case N_FRONT : {// ----- cas des noeuds projectiles en contact li_restreinte_TQ.push_front(TypeQuelconque(tipParticu)); break; @@ -623,7 +653,7 @@ void LesContacts::Init_Grandeur_particuliere (bool absolue,List_ioParaAlgoControleActifs().Niveau_commentaire_contact(); - if (niveau_commentaire_contact == 0) {niveau_commentaire_contact = ParaGlob::NiveauImpression();}; + int niveau_commentaire_lescontacts = Permet_affichage(); // on passe en revue les zones de contact et si nécessaire on supprime les gaps // sinon retour bool continuer = false; // init par défaut @@ -666,7 +695,7 @@ void LesContacts::Suppression_gap_pour_noeud_collant() return; // sinon il faut effectivement faire une suppression de gap - if (niveau_commentaire_contact > 2) + if (niveau_commentaire_lescontacts > 2) cout << "\n >>>> Suppression_gap_pour_noeud_collant : "; // on va iterer sur les noeuds esclaves collants dont on veut supprimer le gap LaLIST_io ::iterator iM,iMfin; // des itérator de travail @@ -677,7 +706,7 @@ void LesContacts::Suppression_gap_pour_noeud_collant() int boucle_maxi = 10; // 10 boucle maxi int boucle = 1; do - { if (niveau_commentaire_contact >2 ) + { if (niveau_commentaire_lescontacts >2 ) cout << "\n boucle : "<::iterator il,ilfin=list_P.end(); - if (niveau_commentaire_contact >5 ) + if (niveau_commentaire_lescontacts >5 ) {cout << "\n " << list_P.size() << " proj trouvees " << " Noe: "<Num_noeud() << " mail: " << noee->Num_Mail() << " (zone"<::iterator>::iterator iface_maxi ; for (il=list_P.begin(); il!= ilfin;il++,iface++) { double Ndis = (M-(*il)).Norme(); - if (niveau_commentaire_contact >5 ) + if (niveau_commentaire_lescontacts >5 ) cout << " dist: " << Ndis ; if (Ndis < distance) {P = (*il); distance = Ndis; @@ -774,10 +803,10 @@ void LesContacts::Suppression_gap_pour_noeud_collant() tout_projeter=false; if (distance > le_maxi_des_distances_trouve) le_maxi_des_distances_trouve = distance; - if (niveau_commentaire_contact >3 ) + if (niveau_commentaire_lescontacts >3 ) cout << "\n suppression gap=("<Num_noeud() << " du maillage " << noee->Num_Mail() << " (zone "<4 ) + if (niveau_commentaire_lescontacts >4 ) {cout << "\n ancienne coordonnee "<< pt_esc << " nouvelle " << P; // dans le cas où iface_maxi a été attribué @@ -801,12 +830,12 @@ void LesContacts::Suppression_gap_pour_noeud_collant() {compteur_noeuds_projecte++;}; }; if ((!projection_ok) && (boucle==1)) // au premier passage - { if (niveau_commentaire_contact >3 ) + { if (niveau_commentaire_lescontacts >3 ) cout << "\n pas de projection trouvee donc de suppression gap du noeud "<Num_noeud() << " du maillage" << noee->Num_Mail() << " (zone "<2 ) + if (niveau_commentaire_lescontacts >2 ) {if (compteur_noeuds_projecte) cout << "\n zone: " << j <<", " << compteur_noeuds_projecte << " suppression(s) de gap, maxi_distance= " << le_maxi_des_distances_trouve << "( passage"<& LesContacts::ConnectionCLL() // récupère le nombre de contact actif et met à jour ce nombre // normalement devrait toujours être correct mais ?? il y a quelque chose d'incorrecte quelque part -int LesContacts::Recalcul_Nb_contact_actif() +int LesContacts::Calcul_Nb_contact_actif() { LaLIST ::iterator il,ilfin = listContact.end(); - int ancien_nb_contact_actif = nb_contact_actif; nb_contact_actif = 0; // init for (il = listContact.begin();il != ilfin; il++) if ((*il).Actif()) nb_contact_actif++; - - int niveau_commentaire_contact = ParaGlob::param->ParaAlgoControleActifs().Niveau_commentaire_contact(); - if (niveau_commentaire_contact == 0) {niveau_commentaire_contact = ParaGlob::NiveauImpression();}; - if (nb_contact_actif != ancien_nb_contact_actif) - if (niveau_commentaire_contact > 4) - cout << "\n mise a jour anormale du nombre de contact actif : " - << " ancien_nb_contact_actif= " << ancien_nb_contact_actif - << " nouveau_nombre= " << nb_contact_actif << endl; return nb_contact_actif; }; @@ -1081,6 +1101,30 @@ void LesContacts::Creation_Fct_nD_contact() {fct_nD_contact.fct_nD_force_tangentielle_noeud_maxi=NULL;}; }; + {// cas fct_niveau_commentaire + string nom_fct = ParaGlob::param->ParaAlgoControleActifs().Fct_niveau_commentaire_contact(); + if (nom_fct != "_") + {// on va récupérer la fonction + if (sauve_lesFonctionsnD->Existe(nom_fct)) + { Fonction_nD * pt_fonct = sauve_lesFonctionsnD->Trouve(nom_fct); + // sauvegarde + fct_nD_contact.fct_niveau_commentaire = pt_fonct; + } + else + { cout << "\n *** erreur dans la definition de la fonction nD de pilotage du " + << " niveau de commentaire en contact, le nom : " << nom_fct + << " ne correspond pas a une fonction nD existante !! "; + Sortie(1); + }; + } + else + {fct_nD_contact.fct_niveau_commentaire=NULL;}; + }; + + // initialisation des conteneurs statique des fonction nD + fct_nD_contact.Init_conteneur_statique(); + + }; /*// mise à jour du stockage inter, pour prendre en @@ -1197,22 +1241,35 @@ Sortie(1); // un : le maxi en effort normal, deux: le maxi en effort tangentiel DeuxDoubles LesContacts::Forces_contact_maxi(bool affiche) const {DeuxDoubles retour; - LaLIST ::const_iterator il,ilfin = listContact.end(); - for (il = listContact.begin();il != ilfin; il++) + int niveau_commentaire_lescontacts = Permet_affichage(); + + LaLIST ::const_iterator iNmax,iTmax,il,ilfin = listContact.end(); + for (il = iNmax = iTmax = listContact.begin();il != ilfin; il++) + if ((*il).Actif()) { const ElContact& icont = (*il); // pour simplifier double fNmax = icont.F_N_MAX(); double fTmax = icont.F_T_MAX(); if (Dabs(fNmax) > Dabs(retour.un) ) - retour.un = fNmax; + {retour.un = fNmax;iNmax = il; + }; if (Dabs(fTmax) > Dabs(retour.deux) ) - retour.deux = fTmax; + {retour.deux = fTmax;iTmax = il; + }; }; - int niveau_commentaire_contact = ParaGlob::param->ParaAlgoControleActifs().Niveau_commentaire_contact(); - if (niveau_commentaire_contact == 0) {niveau_commentaire_contact = ParaGlob::NiveauImpression();}; if ((affiche && (ParaGlob::NiveauImpression() > 2)) - || (niveau_commentaire_contact > 5) // spécifiquement pour le contact + || (niveau_commentaire_lescontacts > 3) // spécifiquement pour le contact ) cout << "\n contact: reaction ==> F_N max " << retour.un << " F_T max " << retour.deux; + if (niveau_commentaire_lescontacts > 6) + {cout << "\n F_N max: "; (*iNmax).Affiche(0); + cout << "\n F_T max: "; (*iTmax).Affiche(0); + cout << "\n"; + } + else if (niveau_commentaire_lescontacts > 3) + {cout << "\n F_N max: "; (*iNmax).Affiche(1); + cout << "\n F_T max: "; (*iTmax).Affiche(1); + cout << "\n"; + }; return retour; }; @@ -1220,28 +1277,531 @@ DeuxDoubles LesContacts::Forces_contact_maxi(bool affiche) const // un : le maxi en gap normal, deux: le maxi en gap tangentiel DeuxDoubles LesContacts::Gap_contact_maxi(bool affiche) const {DeuxDoubles retour; - LaLIST ::const_iterator il,ilfin = listContact.end(); - for (il = listContact.begin();il != ilfin; il++) + LaLIST ::const_iterator iNmax,iTmax,il,ilfin = listContact.end(); + for (il = iNmax = iTmax = listContact.begin();il != ilfin; il++) + if ((*il).Actif()) { const ElContact& icont = (*il); // pour simplifier double fNmax = icont.Gaptdt(); double fTmax = icont.Dep_T_tdt(); if (Dabs(fNmax) > Dabs(retour.un) ) - retour.un = fNmax; + {retour.un = fNmax;iNmax = il; + }; if (Dabs(fTmax) > Dabs(retour.deux) ) - retour.deux = fTmax; + {retour.deux = fTmax;iTmax = il; + }; }; - int niveau_commentaire_contact = ParaGlob::param->ParaAlgoControleActifs().Niveau_commentaire_contact(); - if (niveau_commentaire_contact == 0) {niveau_commentaire_contact = ParaGlob::NiveauImpression();}; + int niveau_commentaire_lescontacts = Permet_affichage(); if ((affiche && (ParaGlob::NiveauImpression() > 2)) - || (niveau_commentaire_contact > 5) // spécifiquement pour le contact + || (niveau_commentaire_lescontacts > 3) // spécifiquement pour le contact ) cout << ", maxi gap_N : " << retour.un << " gap_T : " << retour.deux; + if (niveau_commentaire_lescontacts > 6) + {cout << "\n maxi gap_N : "; (*iNmax).Affiche(0); + cout << "\n maxi gap_T : "; (*iTmax).Affiche(0); + } + else if (niveau_commentaire_lescontacts > 3) + {cout << "\n maxi gap_N : "; (*iNmax).Affiche(1); + cout << "\n maxi gap_T : "; (*iTmax).Affiche(1); + }; return retour; }; +// création et ajout des éléments de frontière correspondant aux angles morts +// en 2D : noeud frontière + éléments interne +// en 3D : ligne frontière + éléments interne +void LesContacts::ElementAngleMort(LesMaillages& lesMail) + { + // la liste des éléments qui contiennent des frontières, est reconstitué au démarrage avec Init_contact(.. +//>>>>> list liste_elemens_front; + // la liste pour chaque noeud, des éléments qui contient ce noeud : construite avec Init_contact + // indice(i)(j) : = la liste des éléments qui contiennent le noeud j, pour le maillage i +//>>>>> Tableau < const Tableau > *> indice; + // la liste des éléments frontières succeptibles d'entrer en contact + // ces Front (qui contiennent que des pointeurs sauf une boite d'encombrement) + // sont différents de ceux des maillages, et sont donc stocké en interne +//>>>>> Tableau < Tableau < LaLIST_io > > t_listFront; + // t_listFront(i)(j)(k) : maillage maître (i) + // zone de contact (j) + // (K) = kième frontière (dans l'ordre de la liste) + // ** pour le tableaux t_listFront, le numéros dit de maillage, n'est pas le numéro + // ** intrinsèque de maillage (telle que ceux associés aux noeuds et éléments) + // ** mais uniquement un numéro locale d'ordre + // ** mais on a: les éléments de frontière de t_listFront(i) font partie du maillage + // i + (nb_mail_Esclave-nbmailautocontact) + int niveau_commentaire_lescontacts = Permet_affichage(); + if (niveau_commentaire_lescontacts > 4) + cout << "\n ==> LesContacts::ElementAngleMort: "; + + // --- à la fin du traitement on a besoin de mettre à jour les éléments mitoyens des Front + // --- on sauvegarde des infos + Tableau < Tableau < list > > t_listFront_initial; // les pointeurs de front initiaux sans les angles morts + + // t_liFront_noeud(i)(j)(k) : la liste des frontières initiales qui contiennent le noeud k de la zone j du maillage i + Tableau < Tableau < Tableau < list > > > t_liFront_noeud; + t_liFront_noeud.Change_taille(lesMail.NbMaillage()); + //**** à faire la même chose pour les elements segment ..... + + int tail1 = t_listFront.Taille(); // num ordre dans les maillages + t_listFront_initial.Change_taille(tail1); + for (int i =1;i<= tail1;i++) + {int i_mail = i + (nb_mail_Esclave-nbmailautocontact); // le num de maillage + int nb_noe_total = lesMail.Nombre_noeud(i_mail); // le nombre total de noeud du maillage + + int tail2=t_listFront(i).Taille(); // nombre de zones + t_listFront_initial(i).Change_taille(tail2); + t_liFront_noeud(i).Change_taille(tail2); + + for (int j=1;j<= tail2;j++) // on balaie les zones + {list & t_listFront_initial_ij = t_listFront_initial(i)(j); // pour simplifier + LaLIST_io & t_listFront_ij = t_listFront(i)(j); // pour simplifier + // on dimensionne au nombre maxi de noeud pour chaque zone ... + // ça peut faire des gros tableaux mais il faut bien que l'on sache à quelle zone on s'intéresse ... + // donc pour l'instant c'est l'idée que je retiens + t_liFront_noeud(i)(j).Change_taille(nb_noe_total); + Tableau >& t_liFront_noeud_ij = t_liFront_noeud(i)(j); + LaLIST_io ::iterator il,ilfin=t_listFront_ij.end(); + for (il = t_listFront_ij.begin();il != ilfin; il++) + {t_listFront_initial_ij.push_back(&(*il)); + // on va remplir t_liFront_noeud_ij + ElFrontiere* elfro = (*il).Eleme(); // pour simplifier + const Tableau & tabN = elfro->TabNoeud_const(); + int nbNF = tabN.Taille(); + for (int l=1;l<=nbNF;l++) + { Noeud * noe = tabN(l); + t_liFront_noeud_ij(noe->Num_noeud()).push_back(&(*il)); + }; + }; + }; + }; + + // --- constitution des front d'angle mort + // l'idée est de rechercher les éléments qui sont en relation directe avec la frontière + // via une ligne ou un point, mais qui n'ont été pris en compte du fait qu'ils n'étaient pas + // reliés à une frontière de base + // on commence par les lignes ce qui conduit éventuellement à augmenter t_listFront + // ensuite on regarde les noeuds. Ainsi, si un élément nouveau est introduit via les lignes + // les noeuds de la ligne + l'élément ne vont pas s'ajouter + + + + // 1) === cas des lignes frontières + éléments internes + // ce cas ne concerne que les espaces de travail 3D non axisymétrique + if ((ParaGlob::Dimension() == 3) && !(ParaGlob::AxiSymetrie())) + { // on crée les frontières lignes au cas où + lesMail.CreeListFrontiere_ligne_3D(); + // on récupère toutes les frontières lignes + // ramène le tableau de pointeurs de frontières ligne 3D créées par CreeListFrontiere_ligne_3D + Tableau *>& lifrLigne = lesMail.ListFront_ligne_3D(); + if (nom_ref_zone_contact.size() == 0) + { // cas d'un contact non restreint + // cela correspond finalement à une seule zone de contact (cf. Init_contact(..)) + //on boucle sur les maillages maitres de t_listFront + for (int im=1;im<=nbmailMaitre;im++) + { // ici on ne boucle pas sur les zones restreintes car il n'y en n'a pas + LaLIST_io & la_list_des_front = t_listFront(im)(1); + int nb_front_init = la_list_des_front.size(); // la taille initiale + LaLIST & lifrLigne_mail = *lifrLigne(im); // pour simplifier + + // avant de balayer les lignes, on fait une liste des éléments qui contiennent des frontières déjà référencées + list li_Elem_avec_front; + LaLIST_io ::iterator il,ilfin = la_list_des_front.end(); + for (il = la_list_des_front.begin(); il != ilfin; il++) + li_Elem_avec_front.push_back((*il).PtEI()); + // on supprime les doublons et on ordonne, c'est pour l'opti des recherches ensuites + li_Elem_avec_front.sort(); // ordonne + li_Elem_avec_front.unique(); // supprime les doublons + + // maintenant on regarde s'il faut ajouter des éléments d'angle mort + // on va boucler sur les frontières lignes 3D + LaLIST ::iterator jl,jlfin=lifrLigne_mail.end(); + for (jl = lifrLigne_mail.begin(); jl != jlfin; jl++) + { Element * el = (*jl).PtEI();// récup de l'élément + // on regarde si cet élément ne fait pas partie de la liste d'élément + // qui contient déjà une frontière + if (find(li_Elem_avec_front.begin(),li_Elem_avec_front.end(),el) == li_Elem_avec_front.end()) + // on n'a pas trouvé d'élément, on ajoute l'élément front + // on doit indiquer qu'il s'agit d'un élément d'angle mort + // on se sert d'un élément intermédiaire + {Front inter((*jl)); + inter.Change_angle_mort(1); + la_list_des_front.push_back(inter); + }; + }; + int nb_front_fin = la_list_des_front.size(); // la taille finale + if (niveau_commentaire_lescontacts >2 ) + cout << "\n mail. maitre "<& lifrLigne_mail = *lifrLigne(im); // pour simplifier + // ici on boucle sur les zones restreintes + int nb_zone_et1 = 1+t_listFront(im).Taille(); + for (int i_zone=1;i_zone < nb_zone_et1;i_zone++) + {// la liste des front de la zone + LaLIST_io & la_list_des_front = t_listFront(im)(i_zone); + int nb_front_init = la_list_des_front.size(); // la taille initiale + // avant de balayer les lignes, on fait une liste des éléments relatifs à la zone + // qui contiennent des frontières déjà référencées + list li_Elem_avec_front; + LaLIST_io ::iterator il,ilfin = la_list_des_front.end(); + for (il = la_list_des_front.begin(); il != ilfin; il++) + li_Elem_avec_front.push_back((*il).PtEI()); + // on supprime les doublons et on ordonne, c'est pour l'opti des recherches ensuites + li_Elem_avec_front.sort(); // ordonne + li_Elem_avec_front.unique(); // supprime les doublons + + // maintenant on regarde s'il faut ajouter des éléments d'angle mort + // on va boucler sur les frontières lignes 3D + LaLIST ::iterator jl,jlfin=lifrLigne_mail.end(); + for (jl = lifrLigne_mail.begin(); jl != jlfin; jl++) + { Element * el = (*jl).PtEI();// récup de l'élément + // on regarde si cet élément ne fait pas partie de la liste d'élément + // qui contient déjà une frontière + if (find(li_Elem_avec_front.begin(),li_Elem_avec_front.end(),el) == li_Elem_avec_front.end()) + // on n'a pas trouvé d'élément, on ajoute l'élément front + // on doit indiquer qu'il s'agit d'un élément d'angle mort + // on se sert d'un élément intermédiaire + {Front inter((*jl)); + inter.Change_angle_mort(1); + la_list_des_front.push_back(inter); + }; + }; + int nb_front_fin = la_list_des_front.size(); // la taille finale + if (niveau_commentaire_lescontacts >2 ) + cout << "\n mail. maitre "<*>& listFrontiere = lesMail.ListFrontiere(); + int ntmail = listFrontiere.Taille(); // nb maxi de maillages + // on regarde si la zone de contact est restreinte + if (nom_ref_zone_contact.size() == 0) + { // cas d'un contact non restreint + // cela correspond finalement à une seule zone de contact (cf. Init_contact(..)) + + int ilistfront = 1; // compteur pour le tableau t_listFront + // on parcours les elements maitres: à cause d'un auto contact + // éventuelle on peut avoir des maillages esclaves qui jouent le rôle également de + // maillages maitres + //on boucle sur les maillages maitres de t_listFront + for (int jf=ntmail-nbmailMaitre+1;jf<=ntmail;jf++,ilistfront++) + { // ici on ne boucle pas sur les zones restreintes car il n'y en n'a pas + LaLIST_io & la_list_des_front = t_listFront(ilistfront)(1); + int nb_front_init = la_list_des_front.size(); // la taille initiale + // pour continuer il faut: 1) qu'il y a des front, 2) que ces fronts appartiennent au maillage + if (nb_front_init > 0) + if ((*la_list_des_front.begin()).NumMail() == jf ) + { + // on va créer une liste de numéro des noeuds de la zone de frontière concernée + // et en même temps + // avant de balayer les noeuds, on fait une liste des éléments relatifs à la zone + // qui contiennent des frontières déjà référencées + list num_noe_front; + list li_Elem_avec_front; + LaLIST_io ::iterator il,ilfin = la_list_des_front.end(); + for (il = la_list_des_front.begin(); il != ilfin; il++) + { const Tableau & tnoe = (*il).Eleme()->TabNoeud_const(); + int nb_noe_et1 = tnoe.Taille(); + for (int m =1;mNum_noeud()); + li_Elem_avec_front.push_back((*il).PtEI()); + }; + // on ordonne et on supprime les doublons + num_noe_front.sort(); // ordonne + num_noe_front.unique(); // suppression des doublons + li_Elem_avec_front.sort(); // ordonne + li_Elem_avec_front.unique(); // supprime les doublons + + // on définit une liste temporaire des nouvelles front d'angle mort créé + // c'est utilisé pour définir les mitoyens des éléments d'angle morts + // qui sont apparus avec les angles morts (== les mitoyens angle mort des éléments angle morts !!) + list front_angle_mort; + + // maintenant on parcours les noeuds contenu dans num_noe_front + // et on regarde s'il faut ajouter des éléments point d'angle mort + list ::iterator ih,ih_fin=num_noe_front.end(); + for (ih = num_noe_front.begin();ih != ih_fin;ih++) + {int i_noe = (*ih); // le num du noeud maître que l'on va tester + Tableau ttn(1); + ttn(1)= &(lesMail.Noeud_LesMaille(jf,i_noe)); // récup du pointeur de noeud + + // récup de la liste pour le noeud i_noe, des éléments qui contient ce noeud : construite avec Init_contact + const List_io < Element* >& liel = (*indice(jf))(i_noe); + // on boucle sur chaque élément qui contient le noeud + List_io < Element* >::const_iterator il,ilfin=liel.end(); + for (il = liel.begin();il != ilfin;il++) + {const Element* el=(*il); // pour simplifier + // on regarde si cet élément ne fait pas partie de la liste d'élément + // qui contient déjà une frontière + bool trouver = false; + list ::const_iterator ikl,iklfin=li_Elem_avec_front.end(); + for (ikl = li_Elem_avec_front.begin();ikl != iklfin; ikl++) + {if (((*ikl)->Num_elt_const() == el->Num_elt_const()) && ((*ikl)->Num_maillage() == el->Num_maillage())) + {trouver= true; break;} + }; + if (!trouver) + {// on n'a pas trouvé d'élément, + // 1. on récup le num local EF du noeud + int nb_noeu_el_et_1 = 1+el->Nombre_noeud(); // le nombre de noeud de l'élément + int num_noe_local = 0; + for (int k =1;kNum_noeud(k) == ttn(1)->Num_noeud()) + {num_noe_local=k; break;}; + // 2. on récupère la frontière noeud correspondante en forçant une création éventuelle + // on passe par l'intermédiaire de lesMail pour pouvoir modifier l'élément + // car c'est l'élément qui stocke et gère la frontière + Element& elem_non_const = lesMail.Element_LesMaille(el->Num_maillage(), el->Num_elt_const()); + // 3. on crée l'élément de frontière ad hoc + ElFrontiere* const elfpoint = elem_non_const.Frontiere_points(num_noe_local,true); + // ramene le numero de la frontière passée en argument si elle existe actuellement au niveau de l'élément + // sinon ramène 0 + // ramene également type_front: qui indique le type de frontière: POINT_G, LIGNE ou SURFACE + // c'est une méthode très longue, a utiliser avec précaution + Enum_type_geom type_front; + int num_front = el->Num_frontiere(*elfpoint,type_front); + // 4. on crée l'élément front ad hoc et on l'ajoute à la liste + const DdlElement & ddlElem = el->TableauDdl(); // récup des ddl + int angle_mort = 1; + la_list_des_front.push_front(Front(*elfpoint,&elem_non_const,num_front,angle_mort)); + LaLIST_io ::iterator iik = la_list_des_front.begin(); // récup de l'iterator + // on met à jour les frontières mitoyennes + int num_noeud = ttn(1)->Num_noeud(); // le num global du noeud + // récup de la liste des frontières initiales contenant le noeud + list & t_liFront_noeud_ijk = t_liFront_noeud(ilistfront)(1)(num_noeud); + list ::iterator km,kmfin=t_liFront_noeud_ijk.end(); + for (km=t_liFront_noeud_ijk.begin();km != kmfin;km++) + {(*km)->AjoutMitoyen(&(*iik));// ajout frontière pour la frontière initiale + (*iik).AjoutMitoyen(*km); // ajout frontière pour la nouvelle frontière d'angle mort + }; + // on sauvegarde le nouvelle front dans une liste spécifique + front_angle_mort.push_front(&(*iik)); + + if (niveau_commentaire_lescontacts >4 ) + { cout << "\n ajout front point: noeud "<Num_noeud(num_noe_local) + << " mail: " << jf //<< " zone " + << " element: "<Num_elt_const() ; + }; + }; + }; + }; + int nb_front_fin = la_list_des_front.size(); // la taille finale + if (niveau_commentaire_lescontacts >2 ) + cout << "\n ajout angle mort pour contact: mail. maitre "<< jf <<" : "<<(nb_front_fin-nb_front_init) + << " frontieres point "; + + #ifdef MISE_AU_POINT + // petite vérif en passant + if ((nb_front_fin-nb_front_init) != front_angle_mort.size()) + {cout << "\n *** erreur dans la definition des elements point d'angle mort " + << " on a deux listes qui les representent mais qui n'ont pas la meme taille " + << (nb_front_fin-nb_front_init) << " et " << front_angle_mort.size() + << "\n LesContacts::ElementAngleMort(.."; + Sortie(1); + }; + #endif + + // on utilise front_angle_mort pour définir les mitoyens angle mort des éléments angle morts + list ::iterator ag,agfin=front_angle_mort.end(); + for (ag=front_angle_mort.begin();ag != agfin; ag++) + {list ::iterator bg; + bg = ag; bg++; + // on utilise deux boucles imbriquées + for ( ; bg!= agfin ; bg++) + {const Tableau & tan = (*ag)->Eleme()->TabNoeud_const(); + const Tableau & tbn = (*bg)->Eleme()->TabNoeud_const(); + // normalement c'est des FrontPoinF, donc il n'y a qu'un seul noeud frontière + if (tan(1)->Num_noeud() == tbn(1)->Num_noeud()) + // les deux éléments FrontPoinF partage le même noeud, + // on met à jour les mitoyens + { (*ag)->AjoutMitoyen((*bg)); + (*bg)->AjoutMitoyen((*ag)); + }; + }; + }; + + }; // fin du test if (nb_front_init > 0) et if ((*la_list_des_front.begin()).NumMail() == jf ) + + }; // fin de la boucle sur les maillages maitres de t_listFront + } + else + { // cas d'une zone restreinte de contact + // on va boucler sur les zones définies pour le contact + + int ilistfront = 1; // compteur pour le tableau t_listFront + // on parcours les elements maitres: à cause d'un auto contact + // éventuelle on peut avoir des maillages esclaves qui jouent le rôle également de + // maillages maitres + //on boucle sur les maillages maitres de t_listFront + for (int jf=ntmail-nbmailMaitre+1;jf<=ntmail;jf++,ilistfront++) + { // ici on boucle sur les zones restreintes + int nb_zone_et1 = 1+t_listFront(ilistfront).Taille(); + for (int i_zone=1;i_zone < nb_zone_et1;i_zone++) + {// la liste des front de la zone + LaLIST_io & la_list_des_front = t_listFront(ilistfront)(i_zone); + int nb_front_init = la_list_des_front.size(); // la taille initiale + // pour continuer il faut: 1) qu'il y a des front, 2) que ces fronts appartiennent au maillage + if (nb_front_init > 0) + if ((*la_list_des_front.begin()).NumMail() == jf ) + { + // on va créer une liste de numéro des noeuds de la zone de frontière concernée + // et en même temps + // avant de balayer les noeuds, on fait une liste des éléments relatifs à la zone + // qui contiennent des frontières déjà référencées + list num_noe_front; + list li_Elem_avec_front; + LaLIST_io ::iterator il,ilfin = la_list_des_front.end(); + for (il = la_list_des_front.begin(); il != ilfin; il++) + { const Tableau & tnoe = (*il).Eleme()->TabNoeud_const(); + int nb_noe_et1 = tnoe.Taille(); + for (int m =1;mNum_noeud()); + li_Elem_avec_front.push_back((*il).PtEI()); + }; + // on ordonne et on supprime les doublons + num_noe_front.sort(); // ordonne + num_noe_front.unique(); // suppression des doublons + li_Elem_avec_front.sort(); // ordonne + li_Elem_avec_front.unique(); // supprime les doublons + + // on définit une liste temporaire des nouvelles front d'angle mort créé + // c'est utilisé pour définir les mitoyens des éléments d'angle morts + // qui sont apparus avec les angles morts (== les mitoyens angle mort des éléments angle morts !!) + list front_angle_mort; + + // maintenant on parcours les noeuds contenu dans num_noe_front + // et on regarde s'il faut ajouter des éléments point d'angle mort + list ::iterator ih,ih_fin=num_noe_front.end(); + for (ih = num_noe_front.begin();ih != ih_fin;ih++) + {int i_noe = (*ih); // le num du noeud maître que l'on va tester + Tableau ttn(1); + ttn(1)= &(lesMail.Noeud_LesMaille(jf,i_noe)); // récup du pointeur de noeud + + // récup de la liste pour le noeud i_noe, des éléments qui contient ce noeud : construite avec Init_contact + const List_io < Element* >& liel = (*indice(jf))(i_noe); + // on boucle sur chaque élément qui contient le noeud + List_io < Element* >::const_iterator il,ilfin=liel.end(); + for (il = liel.begin();il != ilfin;il++) + {const Element* el=(*il); // pour simplifier + // on regarde si cet élément ne fait pas partie de la liste d'élément + // qui contient déjà une frontière + bool trouver = false; + list ::const_iterator ikl,iklfin=li_Elem_avec_front.end(); + for (ikl = li_Elem_avec_front.begin();ikl != iklfin; ikl++) + {if (((*ikl)->Num_elt_const() == el->Num_elt_const()) && ((*ikl)->Num_maillage() == el->Num_maillage())) + {trouver= true; break;} + }; + if (!trouver) + {// on n'a pas trouvé d'élément, + // 1. on récup le num local EF du noeud + int nb_noeu_el_et_1 = 1+el->Nombre_noeud(); // le nombre de noeud de l'élément + int num_noe_local = 0; + for (int k =1;kNum_noeud(k) == ttn(1)->Num_noeud()) + {num_noe_local=k; break;}; + // 2. on récupère la frontière noeud correspondante en forçant une création éventuelle + // on passe par l'intermédiaire de lesMail pour pouvoir modifier l'élément + // car c'est l'élément qui stocke et gère la frontière + Element& elem_non_const = lesMail.Element_LesMaille(el->Num_maillage(), el->Num_elt_const()); + // 3. on crée l'élément de frontière ad hoc + ElFrontiere* const elfpoint = elem_non_const.Frontiere_points(num_noe_local,true); + // ramene le numero de la frontière passée en argument si elle existe actuellement au niveau de l'élément + // sinon ramène 0 + // ramene également type_front: qui indique le type de frontière: POINT_G, LIGNE ou SURFACE + // c'est une méthode très longue, a utiliser avec précaution + Enum_type_geom type_front; + int num_front = el->Num_frontiere(*elfpoint,type_front); + // 4. on crée l'élément front ad hoc et on l'ajoute à la liste + const DdlElement & ddlElem = el->TableauDdl(); // récup des ddl + int angle_mort = 1; + la_list_des_front.push_front(Front(*elfpoint,&elem_non_const,num_front,angle_mort)); + LaLIST_io ::iterator iik = la_list_des_front.begin(); // récup de l'iterator + // on met à jour les frontières mitoyennes + // // t_liFront_noeud(i)(j)(k) : la liste des frontières initiales qui contiennent le noeud k de la zone j du maillage i + // Tableau < Tableau < Tableau < list > > > t_liFront_noeud; + int num_noeud = ttn(1)->Num_noeud(); // le num global du noeud + // récup de la liste des frontières initiales contenant le noeud + list & t_liFront_noeud_ijk = t_liFront_noeud(ilistfront)(i_zone)(num_noeud); + list ::iterator km,kmfin=t_liFront_noeud_ijk.end(); + for (km=t_liFront_noeud_ijk.begin();km != kmfin;km++) + {(*km)->AjoutMitoyen(&(*iik));// ajout frontière pour la frontière initiale + (*iik).AjoutMitoyen(*km); // ajout frontière pour la nouvelle frontière d'angle mort + }; + // on sauvegarde le nouvelle front dans une liste spécifique + front_angle_mort.push_front(&(*iik)); + + if (niveau_commentaire_lescontacts >4 ) + { cout << "\n ajout front point: noeud "<Num_noeud(num_noe_local) + << " mail: " << jf << " zone "<< i_zone + << " element: "<Num_elt_const() ; + }; + }; + }; + }; + int nb_front_fin = la_list_des_front.size(); // la taille finale + if (niveau_commentaire_lescontacts >2 ) + cout << "\n ajout angle mort pour contact: mail. maitre "<::iterator ag,agfin=front_angle_mort.end(); + for (ag=front_angle_mort.begin();ag != agfin; ag++) + {list ::iterator bg; + bg = ag; bg++; + // on utilise deux boucles imbriquées + for ( ; bg!= agfin ; bg++) + {const Tableau & tan = (*ag)->Eleme()->TabNoeud_const(); + const Tableau & tbn = (*bg)->Eleme()->TabNoeud_const(); + // normalement c'est des FrontPoinF, donc il n'y a qu'un seul noeud frontière + if (tan(1)->Num_noeud() == tbn(1)->Num_noeud()) + // les deux éléments FrontPoinF partage le même noeud, + // on met à jour les mitoyens + { (*ag)->AjoutMitoyen((*bg)); + (*bg)->AjoutMitoyen((*ag)); + }; + }; + }; + if (niveau_commentaire_lescontacts >7 ) + { cout << "\n liste finale des elements angle mort " + << " mail: " << jf << " zone "<< i_zone; + for (ag=front_angle_mort.begin();ag != agfin; ag++) + (*ag)->Affiche(); + }; + + }; // fin du test if (nb_front_init > 0) et if ((*la_list_des_front.begin()).NumMail() == jf ) + + };// fin de la boucle sur les zones + }; // fin de la boucle sur les maillages maitres de t_listFront + }; // fin du test avec ou sans zone de contact + + + }; + + - - diff --git a/contact/Plan.cc b/contact/Plan.cc index 4d4be6b..2bc935e 100644 --- a/contact/Plan.cc +++ b/contact/Plan.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/contact/Plan.h b/contact/Plan.h index 1bebd3a..bd61069 100644 --- a/contact/Plan.h +++ b/contact/Plan.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/contact/Sphere.cc b/contact/Sphere.cc index c47f207..9cd353f 100644 --- a/contact/Sphere.cc +++ b/contact/Sphere.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/contact/Sphere.h b/contact/Sphere.h index 04371f6..f3a785a 100644 --- a/contact/Sphere.h +++ b/contact/Sphere.h @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Coordonnees/Coordonnee.cc b/tenseurs_mai99/Coordonnees/Coordonnee.cc index c5f18df..0996c12 100644 --- a/tenseurs_mai99/Coordonnees/Coordonnee.cc +++ b/tenseurs_mai99/Coordonnees/Coordonnee.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -1009,6 +1009,7 @@ void Coordonnee::SchemaXML_Coordonnee(ofstream& sort,const Enum_IO_XML enu) { break; } + default: sort << "\n SchemaXML: cas non pris en compte " ; }; }; diff --git a/tenseurs_mai99/Coordonnees/Coordonnee.h b/tenseurs_mai99/Coordonnees/Coordonnee.h index 9b0fb79..2b18387 100644 --- a/tenseurs_mai99/Coordonnees/Coordonnee.h +++ b/tenseurs_mai99/Coordonnees/Coordonnee.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // - // Copyright (C) 1997-2021 Université Bretagne Sud (France) + // Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Coordonnees/Coordonnee1.cc b/tenseurs_mai99/Coordonnees/Coordonnee1.cc index aeca26c..5d5b4f4 100644 --- a/tenseurs_mai99/Coordonnees/Coordonnee1.cc +++ b/tenseurs_mai99/Coordonnees/Coordonnee1.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -362,7 +362,8 @@ void Coordonnee1::SchemaXML_Coordonnee(ofstream& sort,const Enum_IO_XML enu) { break; } - }; + default: sort << "\n SchemaXML: cas non pris en compte " ; + }; }; #endif diff --git a/tenseurs_mai99/Coordonnees/Coordonnee1.h b/tenseurs_mai99/Coordonnees/Coordonnee1.h index 8dd5478..3c1b104 100644 --- a/tenseurs_mai99/Coordonnees/Coordonnee1.h +++ b/tenseurs_mai99/Coordonnees/Coordonnee1.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Coordonnees/Coordonnee1B.cc b/tenseurs_mai99/Coordonnees/Coordonnee1B.cc index 896a2e7..6aa1439 100644 --- a/tenseurs_mai99/Coordonnees/Coordonnee1B.cc +++ b/tenseurs_mai99/Coordonnees/Coordonnee1B.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -372,6 +372,7 @@ void Coordonnee1B::SchemaXML_Coordonnee(ofstream& sort,const Enum_IO_XML enu) { break; } + default: sort << "\n SchemaXML: cas non pris en compte " ; }; }; diff --git a/tenseurs_mai99/Coordonnees/Coordonnee1B_2.cc b/tenseurs_mai99/Coordonnees/Coordonnee1B_2.cc index a5c61b3..4bbf2fa 100644 --- a/tenseurs_mai99/Coordonnees/Coordonnee1B_2.cc +++ b/tenseurs_mai99/Coordonnees/Coordonnee1B_2.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Coordonnees/Coordonnee1H.cc b/tenseurs_mai99/Coordonnees/Coordonnee1H.cc index ff6ab95..42ba6c8 100644 --- a/tenseurs_mai99/Coordonnees/Coordonnee1H.cc +++ b/tenseurs_mai99/Coordonnees/Coordonnee1H.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -371,6 +371,11 @@ void Coordonnee1H::SchemaXML_Coordonnee(ofstream& sort,const Enum_IO_XML enu) { break; } + default: cout << "\n *** attention cas non pris en compte pour le moment " + << " XML_TYPE_GLOBAUX= "<> (istream & ent, BaseH_0_t_tdt &) - { - + { cout << "\n *** operateur non implante !! " + << " friend istream & operator ecriture "; + Sortie(1); + return ent; }; /// surcharge de l'operator d'ecriture friend ostream & operator << (ostream & sort, const BaseH_0_t_tdt &); diff --git a/tenseurs_mai99/Reperes_bases/Base3D3.cc b/tenseurs_mai99/Reperes_bases/Base3D3.cc index 45ba2a3..d09f2c4 100644 --- a/tenseurs_mai99/Reperes_bases/Base3D3.cc +++ b/tenseurs_mai99/Reperes_bases/Base3D3.cc @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Reperes_bases/Base3D3.h b/tenseurs_mai99/Reperes_bases/Base3D3.h index 7b719ae..58e6ddc 100644 --- a/tenseurs_mai99/Reperes_bases/Base3D3.h +++ b/tenseurs_mai99/Reperes_bases/Base3D3.h @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Reperes_bases/Base_1.cc b/tenseurs_mai99/Reperes_bases/Base_1.cc index c6b5c1e..27eb5d2 100755 --- a/tenseurs_mai99/Reperes_bases/Base_1.cc +++ b/tenseurs_mai99/Reperes_bases/Base_1.cc @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/DefValConsTens.cc b/tenseurs_mai99/Tenseur/DefValConsTens.cc index c971920..0d54292 100644 --- a/tenseurs_mai99/Tenseur/DefValConsTens.cc +++ b/tenseurs_mai99/Tenseur/DefValConsTens.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/DefValConsTens.h b/tenseurs_mai99/Tenseur/DefValConsTens.h index 14e300f..375e6c9 100644 --- a/tenseurs_mai99/Tenseur/DefValConsTens.h +++ b/tenseurs_mai99/Tenseur/DefValConsTens.h @@ -13,7 +13,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // - // Copyright (C) 1997-2021 Université Bretagne Sud (France) + // Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/EnteteTenseur.h b/tenseurs_mai99/Tenseur/EnteteTenseur.h index 934d5a1..e4df330 100644 --- a/tenseurs_mai99/Tenseur/EnteteTenseur.h +++ b/tenseurs_mai99/Tenseur/EnteteTenseur.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/NevezTenseur.cc b/tenseurs_mai99/Tenseur/NevezTenseur.cc index 8379e3c..a8bb05e 100644 --- a/tenseurs_mai99/Tenseur/NevezTenseur.cc +++ b/tenseurs_mai99/Tenseur/NevezTenseur.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/NevezTenseur.h b/tenseurs_mai99/Tenseur/NevezTenseur.h index 0426876..59361fb 100644 --- a/tenseurs_mai99/Tenseur/NevezTenseur.h +++ b/tenseurs_mai99/Tenseur/NevezTenseur.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/NevezTenseurQ.cc b/tenseurs_mai99/Tenseur/NevezTenseurQ.cc index 8acdcd9..869e3dc 100644 --- a/tenseurs_mai99/Tenseur/NevezTenseurQ.cc +++ b/tenseurs_mai99/Tenseur/NevezTenseurQ.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/NevezTenseurQ.h b/tenseurs_mai99/Tenseur/NevezTenseurQ.h index 47af1a5..f35de30 100644 --- a/tenseurs_mai99/Tenseur/NevezTenseurQ.h +++ b/tenseurs_mai99/Tenseur/NevezTenseurQ.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/Tenseur.cc b/tenseurs_mai99/Tenseur/Tenseur.cc index 00c5242..dbd55a6 100644 --- a/tenseurs_mai99/Tenseur/Tenseur.cc +++ b/tenseurs_mai99/Tenseur/Tenseur.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -869,104 +869,104 @@ Coordonnee TenseurBH::ValPropre(int& cas) const return vec; }; */ -// idem met en retour la matrice mat contiend par colonne les vecteurs propre -// elle doit avoir la dimension du tenseur -// les vecteurs propre sont exprime dans le repere dual (contrairement au HB) - // valeurs propre dans le vecteur de retour, classée par ordres "décroissants" - // cas indique le cas de valeur propre: - // quelque soit la dimension: cas = -1, si l'extraction des valeurs propres n'a pas pu se faire - // dans ce cas les valeurs propres de retour sont nulles par défaut - // dim = 1, cas=1 pour une valeur propre; - // dim = 2 , cas = 1 si deux valeurs propres distinctes, cas = 0 si deux val propres identiques - // dim = 3 , cas = 1 si 3 val propres différentes (= 3 composantes du vecteur de retour) - // , cas = 0 si les 3 sont identiques (= la première composantes du vecteur de retour), - // , cas = 2 si val(1)=val(2) ( val(1), et val(3) dans les 2 premières composantes du retour) - // , cas = 3 si val(2)=val(3) ( val(1), et val(2) dans les 2 premières composantes du retour) - // les vecteurs propre sont exprime dans le repere dual (contrairement au HB) pour les tenseurs dim 3 - // pour dim=2:le premier vecteur propre est exprime dans le repere dual - // le second vecteur propre est exprimé dans le repère naturel - // pour dim=1 le vecteur est dans la base naturelle (mais ça importe pas) - -#ifndef MISE_AU_POINT - inline -#endif -Coordonnee TenseurBH::ValPropre_int(int& cas, Mat_pleine& mat) const - { int dim = this->dimension; - -//---- a priori c'est méthode n'est plus utilisée par les tenseurs donc à virer par la suite ------ - - #ifdef MISE_AU_POINT - if ((mat.Nb_ligne() != dim) || (mat.Nb_colonne() != dim)) - { cout << "\nErreur : la matrice en parametre doit etre de dimension " - << dim << " !\n"; - cout << "TenseurBH::ValPropre(Mat_pleine& mat) \n"; - Sortie(1); - }; - #endif - for (int i=1;i<=dim;i++) - for (int j=1;j<=dim;j++) - mat(i,j) = (*this)(i,j); - int cass; - Vecteur vec(MathUtil2::VectValPropre(mat,cass)); // calcul des vecteurs et valeurs propres - // classement des valeurs propres - // cas ou dim == 1 on ne fait rien - Tableau ii(dim); // indicateur de l'ordre final - switch (dim) - { case 1: ii(1)=1; break; - case 2: - { if (vec(2) > vec(1)) { ii(1)=2;ii(2)=1;} - else { ii(1)=1;ii(2)=2;}; - break; - } - case 3: - { if (vec(1) >= vec(2)) // d'abord le plus grand - { if (vec(1) >= vec(3)) { ii(1)=1; ii(2)=2; ii(3)=3;} - else { ii(1)=3; ii(2)=1; ii(3)=2;}; - } - else - { if (vec(2) >= vec(3)) { ii(1)=2; ii(2)=1; ii(3)=3;} - else { ii(1)=3; ii(2)=1; ii(3)=2;}; - } - // puis les deux derniers - if (vec(ii(2)) < vec(ii(3))) {int ix=ii(2); ii(2)=ii(3);ii(3)=ix;}; - break; - } - }; - // maintenant on met dans l'ordre - Mat_pleine mat_bis(mat); - Coordonnee coor(vec.Taille()); - for (int i=1;i<=dim;i++) - {coor(i)=vec(ii(i)); mat.RemplaceColonneSpe(i,mat_bis.Colonne (ii(i)));}; - - // définition du cas de valeurs propres - switch (dim) - { case 1: break; // il n'y a rien à faire - case 2: - { if (coor(2) > coor(1)) - { double x = coor(1); coor(1) = coor(2); coor(2)=x;}; - // def du cas - if ( difftrespetit(coor(1),coor(2))) { cas = 1;} else {cas = 0;}; - break; - } - case 3: - { if ( difftrespetit(coor(1),coor(2)) && difftrespetit(coor(2),coor(3))) {cas = 1;} - else if ( !(difftrespetit(coor(1),coor(2))) && !difftrespetit(coor(2),coor(3))) {cas = 0;} - else if ( (difftrespetit(coor(1),coor(2))) && !difftrespetit(coor(2),coor(3))) {cas = 2;} - else if ( !(difftrespetit(coor(1),coor(2))) && difftrespetit(coor(2),coor(3))) {cas = 3;} - {cout << "\n classement des valeurs propres : non realise !! " - << "\n valeurs propres: coor(1)= "<dimension; +// +////---- a priori c'est méthode n'est plus utilisée par les tenseurs donc à virer par la suite ------ +// +// #ifdef MISE_AU_POINT +// if ((mat.Nb_ligne() != dim) || (mat.Nb_colonne() != dim)) +// { cout << "\nErreur : la matrice en parametre doit etre de dimension " +// << dim << " !\n"; +// cout << "TenseurBH::ValPropre(Mat_pleine& mat) \n"; +// Sortie(1); +// }; +// #endif +// for (int i=1;i<=dim;i++) +// for (int j=1;j<=dim;j++) +// mat(i,j) = (*this)(i,j); +// int cass; +// Vecteur vec(MathUtil2::VectValPropre(mat,cass)); // calcul des vecteurs et valeurs propres +// // classement des valeurs propres +// // cas ou dim == 1 on ne fait rien +// Tableau ii(dim); // indicateur de l'ordre final +// switch (dim) +// { case 1: ii(1)=1; break; +// case 2: +// { if (vec(2) > vec(1)) { ii(1)=2;ii(2)=1;} +// else { ii(1)=1;ii(2)=2;}; +// break; +// } +// case 3: +// { if (vec(1) >= vec(2)) // d'abord le plus grand +// { if (vec(1) >= vec(3)) { ii(1)=1; ii(2)=2; ii(3)=3;} +// else { ii(1)=3; ii(2)=1; ii(3)=2;}; +// } +// else +// { if (vec(2) >= vec(3)) { ii(1)=2; ii(2)=1; ii(3)=3;} +// else { ii(1)=3; ii(2)=1; ii(3)=2;}; +// } +// // puis les deux derniers +// if (vec(ii(2)) < vec(ii(3))) {int ix=ii(2); ii(2)=ii(3);ii(3)=ix;}; +// break; +// } +// }; +// // maintenant on met dans l'ordre +// Mat_pleine mat_bis(mat); +// Coordonnee coor(vec.Taille()); +// for (int i=1;i<=dim;i++) +// {coor(i)=vec(ii(i)); mat.RemplaceColonneSpe(i,mat_bis.Colonne (ii(i)));}; +// +// // définition du cas de valeurs propres +// switch (dim) +// { case 1: break; // il n'y a rien à faire +// case 2: +// { if (coor(2) > coor(1)) +// { double x = coor(1); coor(1) = coor(2); coor(2)=x;}; +// // def du cas +// if ( difftrespetit(coor(1),coor(2))) { cas = 1;} else {cas = 0;}; +// break; +// } +// case 3: +// { if ( difftrespetit(coor(1),coor(2)) && difftrespetit(coor(2),coor(3))) {cas = 1;} +// else if ( !(difftrespetit(coor(1),coor(2))) && !difftrespetit(coor(2),coor(3))) {cas = 0;} +// else if ( (difftrespetit(coor(1),coor(2))) && !difftrespetit(coor(2),coor(3))) {cas = 2;} +// else if ( !(difftrespetit(coor(1),coor(2))) && difftrespetit(coor(2),coor(3))) {cas = 3;} +// {cout << "\n classement des valeurs propres : non realise !! " +// << "\n valeurs propres: coor(1)= "<dimension; - -//---- a priori c'est méthode n'est plus utilisée par les tenseurs donc à virer par la suite ------ - - #ifdef MISE_AU_POINT - if ((mat.Nb_ligne() != dim) || (mat.Nb_colonne() != dim)) - { cout << "\nErreur : la matrice en parametre doit etre de dimension " - << dim << " !\n"; - cout << "TenseurBH::ValPropre(Mat_pleine& mat) \n"; - Sortie(1); - }; - #endif - for (int i=1;i<=dim;i++) - for (int j=1;j<=dim;j++) - mat(i,j) = (*this)(i,j); - int caas; - Vecteur vec(MathUtil2::VectValPropre(mat,caas)); // calcul des vecteurs et valeurs propres - // classement des valeurs propres - // cas ou dim == 1 on ne fait rien - Tableau ii(dim); // indicateur de l'ordre final - switch (dim) - { case 1: ii(1)=1; break; - case 2: - { if (vec(2) > vec(1)) { ii(1)=2;ii(2)=1;} - else { ii(1)=1;ii(2)=2;}; - break; - } - case 3: - { if (vec(1) >= vec(2)) // d'abord le plus grand - { if (vec(1) >= vec(3)) { ii(1)=1; ii(2)=2; ii(3)=3;} - else { ii(1)=3; ii(2)=1; ii(3)=2;}; - } - else - { if (vec(2) >= vec(3)) { ii(1)=2; ii(2)=1; ii(3)=3;} - else { ii(1)=3; ii(2)=1; ii(3)=2;}; - } - // puis les deux derniers - if (vec(ii(2)) < vec(ii(3))) {int ix=ii(2); ii(2)=ii(3);ii(3)=ix;}; - break; - } - }; - // maintenant on met dans l'ordre - Mat_pleine mat_bis(mat); - Coordonnee coor(vec.Taille()); - for (int i=1;i<=dim;i++) - {coor(i)=vec(ii(i)); mat.RemplaceColonneSpe(i,mat_bis.Colonne (ii(i)));}; - // définition du cas de valeurs propres - - // définition du cas de valeurs propres - switch (dim) - { case 1: break; // il n'y a rien à faire - case 2: - { if (coor(2) > coor(1)) - { double x = coor(1); coor(1) = coor(2); coor(2)=x;}; - // def du cas - if ( difftrespetit(coor(1),coor(2))) { cas = 1;} else {cas = 0;}; - break; - } - case 3: - { if ( difftrespetit(coor(1),coor(2)) && difftrespetit(coor(2),coor(3))) {cas = 1;} - else if ( !(difftrespetit(coor(1),coor(2))) && !difftrespetit(coor(2),coor(3))) {cas = 0;} - else if ( (difftrespetit(coor(1),coor(2))) && !difftrespetit(coor(2),coor(3))) {cas = 2;} - else if ( !(difftrespetit(coor(1),coor(2))) && difftrespetit(coor(2),coor(3))) {cas = 3;} - else - {cout << "\n classement des valeurs propres : non realise !! " - << "\n valeurs propres: coor(1)= "<dimension; +// +////---- a priori c'est méthode n'est plus utilisée par les tenseurs donc à virer par la suite ------ +// +// #ifdef MISE_AU_POINT +// if ((mat.Nb_ligne() != dim) || (mat.Nb_colonne() != dim)) +// { cout << "\nErreur : la matrice en parametre doit etre de dimension " +// << dim << " !\n"; +// cout << "TenseurBH::ValPropre(Mat_pleine& mat) \n"; +// Sortie(1); +// }; +// #endif +// for (int i=1;i<=dim;i++) +// for (int j=1;j<=dim;j++) +// mat(i,j) = (*this)(i,j); +// int caas; +// Vecteur vec(MathUtil2::VectValPropre(mat,caas)); // calcul des vecteurs et valeurs propres +// // classement des valeurs propres +// // cas ou dim == 1 on ne fait rien +// Tableau ii(dim); // indicateur de l'ordre final +// switch (dim) +// { case 1: ii(1)=1; break; +// case 2: +// { if (vec(2) > vec(1)) { ii(1)=2;ii(2)=1;} +// else { ii(1)=1;ii(2)=2;}; +// break; +// } +// case 3: +// { if (vec(1) >= vec(2)) // d'abord le plus grand +// { if (vec(1) >= vec(3)) { ii(1)=1; ii(2)=2; ii(3)=3;} +// else { ii(1)=3; ii(2)=1; ii(3)=2;}; +// } +// else +// { if (vec(2) >= vec(3)) { ii(1)=2; ii(2)=1; ii(3)=3;} +// else { ii(1)=3; ii(2)=1; ii(3)=2;}; +// } +// // puis les deux derniers +// if (vec(ii(2)) < vec(ii(3))) {int ix=ii(2); ii(2)=ii(3);ii(3)=ix;}; +// break; +// } +// }; +// // maintenant on met dans l'ordre +// Mat_pleine mat_bis(mat); +// Coordonnee coor(vec.Taille()); +// for (int i=1;i<=dim;i++) +// {coor(i)=vec(ii(i)); mat.RemplaceColonneSpe(i,mat_bis.Colonne (ii(i)));}; +// // définition du cas de valeurs propres +// +// // définition du cas de valeurs propres +// switch (dim) +// { case 1: break; // il n'y a rien à faire +// case 2: +// { if (coor(2) > coor(1)) +// { double x = coor(1); coor(1) = coor(2); coor(2)=x;}; +// // def du cas +// if ( difftrespetit(coor(1),coor(2))) { cas = 1;} else {cas = 0;}; +// break; +// } +// case 3: +// { if ( difftrespetit(coor(1),coor(2)) && difftrespetit(coor(2),coor(3))) {cas = 1;} +// else if ( !(difftrespetit(coor(1),coor(2))) && !difftrespetit(coor(2),coor(3))) {cas = 0;} +// else if ( (difftrespetit(coor(1),coor(2))) && !difftrespetit(coor(2),coor(3))) {cas = 2;} +// else if ( !(difftrespetit(coor(1),coor(2))) && difftrespetit(coor(2),coor(3))) {cas = 3;} +// else +// {cout << "\n classement des valeurs propres : non realise !! " +// << "\n valeurs propres: coor(1)= "< gp_i = beta_i^j * g_j diff --git a/tenseurs_mai99/Tenseur/Tenseur.h b/tenseurs_mai99/Tenseur/Tenseur.h index ba15be3..a6d019b 100644 --- a/tenseurs_mai99/Tenseur/Tenseur.h +++ b/tenseurs_mai99/Tenseur/Tenseur.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -776,8 +776,8 @@ class TenseurBH /// dim = dimension du tenseur argument void Message(int dim, string mes) const ; - /// méthode interne pour le calcul de vecteurs propres - Coordonnee ValPropre_int(int& cas, Mat_pleine& mat) const; +// /// méthode interne pour le calcul de vecteurs propres +// Coordonnee ValPropre_int(int& cas, Mat_pleine& mat) const; }; /// @} // end of group @@ -1030,8 +1030,8 @@ class TenseurHB /// dim = dimension du tenseur argument void Message(int dim, string mes) const ; - /// méthode interne pour le calcul de vecteurs propres - Coordonnee ValPropre_int(int& cas, Mat_pleine& mat) const; +// /// méthode interne pour le calcul de vecteurs propres +// Coordonnee ValPropre_int(int& cas, Mat_pleine& mat) const; }; /// @} // end of group diff --git a/tenseurs_mai99/Tenseur/Tenseur1-1.cc b/tenseurs_mai99/Tenseur/Tenseur1-1.cc index 9ad039d..b00d344 100644 --- a/tenseurs_mai99/Tenseur/Tenseur1-1.cc +++ b/tenseurs_mai99/Tenseur/Tenseur1-1.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/Tenseur1-2.cc b/tenseurs_mai99/Tenseur/Tenseur1-2.cc index 62e1b29..3f13499 100644 --- a/tenseurs_mai99/Tenseur/Tenseur1-2.cc +++ b/tenseurs_mai99/Tenseur/Tenseur1-2.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/Tenseur1.h b/tenseurs_mai99/Tenseur/Tenseur1.h index 746525a..cb542b8 100644 --- a/tenseurs_mai99/Tenseur/Tenseur1.h +++ b/tenseurs_mai99/Tenseur/Tenseur1.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/Tenseur1_TroisSym.cc b/tenseurs_mai99/Tenseur/Tenseur1_TroisSym.cc index c90fde3..3e388b0 100644 --- a/tenseurs_mai99/Tenseur/Tenseur1_TroisSym.cc +++ b/tenseurs_mai99/Tenseur/Tenseur1_TroisSym.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -403,7 +403,7 @@ istream & operator >> (istream & entree, TenseurQ1_troisSym_HHHH & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const TenseurQ1_troisSym_HHHH & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "TenseurQ1_troisSym_HHHH "; // puis les datas @@ -774,7 +774,7 @@ istream & operator >> (istream & entree, TenseurQ1_troisSym_BBBB & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const TenseurQ1_troisSym_BBBB & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "TenseurQ1_troisSym_BBBB "; // puis les datas diff --git a/tenseurs_mai99/Tenseur/Tenseur1_TroisSym.h b/tenseurs_mai99/Tenseur/Tenseur1_TroisSym.h index a6016dd..c13aab7 100644 --- a/tenseurs_mai99/Tenseur/Tenseur1_TroisSym.h +++ b/tenseurs_mai99/Tenseur/Tenseur1_TroisSym.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/Tenseur2-1.cc b/tenseurs_mai99/Tenseur/Tenseur2-1.cc index 2d6fefd..3a4dcc1 100644 --- a/tenseurs_mai99/Tenseur/Tenseur2-1.cc +++ b/tenseurs_mai99/Tenseur/Tenseur2-1.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -91,14 +91,17 @@ Tenseur2HH::Tenseur2HH ipointe = listdouble3.begin(); // recup de la position de la maille dans la liste t = (ipointe)->donnees; // recup de la position des datas dans la maille t[0] =val1; t[1] =val2; t[2] =val3; - }; + }; + // DESTRUCTEUR : #ifndef MISE_AU_POINT inline #endif Tenseur2HH::~Tenseur2HH() -{//if(listdouble3.end() != listdouble3.begin()) // si la liste n'est pas vide - listdouble3.erase(ipointe);} ; // suppression de l'élément de la liste + {//if(listdouble3.end() != listdouble3.begin()) // si la liste n'est pas vide + listdouble3.erase(ipointe); // suppression de l'élément de la liste + }; + // constructeur a partir d'une instance non differenciee #ifndef MISE_AU_POINT inline @@ -107,13 +110,51 @@ Tenseur2HH::Tenseur2HH (const TenseurHH & B) : ipointe() { dimension = 2; #ifdef MISE_AU_POINT - if (B.Dimension() != 2) Message(2,"Tenseur2HH::Tenseur2HH( etc.."); + if (Dabs(B.Dimension()) != 2) + {cout << "\n erreur constructeur de copie: Tenseur2HH (const TenseurHH & B)" + << " B= "; B.Ecriture(cout); + Message(2,"Tenseur2HH::Tenseur2HH( etc.."); + Sortie(1); + } #endif + listdouble3.push_front(Reels3()); // allocation ipointe = listdouble3.begin(); // recup de la position de la maille dans la liste t = (ipointe)->donnees; // recup de la position des datas dans la maille - this->t[0] = B.t[0]; this->t[1] = B.t[1]; - this->t[2] = B.t[2]; + + if (B.Dimension() == 2) // cas symetrique + { this->t[0] = B.t[0]; this->t[1] = B.t[1]; + this->t[2] = B.t[2]; + } + else // cas non symetrique de stockage + // pour les 2D cela ne signifie pas : non symetrique absolument car pendant les calculs il peut y avoir + // génération de terme non symétrique de manière systématique + //, la verif est donc a faire ici + { + #ifdef MISE_AU_POINT + double Z = B.MaxiComposante(); + if (!diffpourcent(B(2,1),B(1,2),Z,ConstMath::unpeupetit) + || (Abs(Z) < ConstMath::petit) ) + #endif + // on a retrouve un tenseur symetrique + { this->t[0] = B.t[0]; + this->t[1] = B.t[1]; + this->t[2] = 0.5*(B.t[2] + B.t[3]) ; + } + #ifdef MISE_AU_POINT + else // erreur d'affectation + { if (ParaGlob::NiveauImpression() > 5) + cout << "\n constructeur de copie tenseurHH " << ((Tenseur_ns2HH&) B); + if (ParaGlob::NiveauImpression() > 5) + cout << " erreur, tenseur non symetrique, on symetrise, " + << "\n Tenseur2HH::Tenseur2HH( etc.."; + this->t[0] = B.t[0]; + this->t[1] = B.t[1]; + this->t[2] = 0.5*(B.t[2] + B.t[3]) ; + } + #endif + } + }; // constructeur de copie #ifndef MISE_AU_POINT @@ -548,7 +589,7 @@ double& Tenseur2HH::Coor( const int i, const int j) #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)) || ((j!=1)&&(j!=2)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << " j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "TenseurHH::Coor(int,int ) \n"; Sortie(1); }; @@ -577,7 +618,7 @@ double Tenseur2HH::operator () ( const int i, const int j) const #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)) || ((j!=1)&&(j!=2)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "TenseurHH::OPERATOR() ( const int, const int ) const \n"; Sortie(1); }; @@ -757,14 +798,50 @@ Tenseur2BB::~Tenseur2BB() Tenseur2BB::Tenseur2BB (const TenseurBB & B): ipointe() { dimension = 2; - #ifdef MISE_AU_POINT - if (B.Dimension() != 2) Message(2,"Tenseur2BB::Tenseur2BB ( etc.."); - #endif + #ifdef MISE_AU_POINT + if (Dabs(B.Dimension()) != 2) + {cout << "\n erreur constructeur de copie: Tenseur2BB (const TenseurBB & B)" + << " B= "; B.Ecriture(cout); + Message(2,"Tenseur2BB::Tenseur2BB( etc.."); + Sortie(1); + } + #endif listdouble3.push_front(Reels3()); // allocation ipointe = listdouble3.begin(); // recup de la position de la maille dans la liste t = (ipointe)->donnees; // recup de la position des datas dans la maille - this->t[0] = B.t[0]; this->t[1] = B.t[1]; - this->t[2] = B.t[2]; + + if (B.Dimension() == 2) // cas symetrique + { this->t[0] = B.t[0]; this->t[1] = B.t[1]; + this->t[2] = B.t[2]; + } + else // cas non symetrique de stockage + // pour les 2D cela ne signifie pas : non symetrique absolument car pendant les calculs il peut y avoir + // génération de terme non symétrique de manière systématique + //, la verif est donc a faire ici + { + #ifdef MISE_AU_POINT + double Z = B.MaxiComposante(); + if (!diffpourcent(B(2,1),B(1,2),Z,ConstMath::unpeupetit) + || (Abs(Z) < ConstMath::petit) ) + #endif + // on a retrouve un tenseur symetrique + { this->t[0] = B.t[0]; + this->t[1] = B.t[1]; + this->t[2] = 0.5*(B.t[2] + B.t[3]) ; + } + #ifdef MISE_AU_POINT + else // erreur d'affectation + { if (ParaGlob::NiveauImpression() > 5) + cout << "\n constructeur de copie tenseurBB " << ((Tenseur_ns2HH&) B); + if (ParaGlob::NiveauImpression() > 5) + cout << " erreur, tenseur non symetrique, on symetrise, " + << "\n Tenseur2BB::Tenseur2BB( etc.."; + this->t[0] = B.t[0]; + this->t[1] = B.t[1]; + this->t[2] = 0.5*(B.t[2] + B.t[3]) ; + } + #endif + } }; // constructeur de copie #ifndef MISE_AU_POINT @@ -1111,7 +1188,7 @@ TenseurHH & Tenseur2BB::Inverse() const case CRAMER : // méthode historique { // calcul du determinant double det = this->t[0] * this->t[1] - this->t[2] * this->t[2] ; - #ifdef MISE_AU_POINT + #ifdef MISE_AU_POINT if (Dabs(det) <= ConstMath::trespetit) { cout << "\nErreur : le determinant du tenseur est nul !\n"; cout << "Tenseur2BB::Inverse() \n"; @@ -1203,7 +1280,7 @@ double& Tenseur2BB::Coor( const int i, const int j) #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)) || ((j!=1)&&(j!=2)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "TenseurBB::Coor(int,int ) \n"; Sortie(1); }; @@ -1232,7 +1309,7 @@ double Tenseur2BB::operator () ( const int i, const int j) const #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)) || ((j!=1)&&(j!=2)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "TenseurBB::OPERATOR() ( const int, const int ) const\n"; Sortie(1); }; diff --git a/tenseurs_mai99/Tenseur/Tenseur2-2.cc b/tenseurs_mai99/Tenseur/Tenseur2-2.cc index 9a7ff8a..579638a 100644 --- a/tenseurs_mai99/Tenseur/Tenseur2-2.cc +++ b/tenseurs_mai99/Tenseur/Tenseur2-2.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -799,7 +799,7 @@ double Tenseur2BH::MaxiComposante() const #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)) || ((j!=1)&&(j!=2)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "TenseurBH::Coor(int,int ) \n"; Sortie(1); }; @@ -828,7 +828,7 @@ double Tenseur2BH::MaxiComposante() const #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)) || ((j!=1)&&(j!=2)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "TenseurBH::OPERATOR() (int,int ) \n"; Sortie(1); }; @@ -1693,7 +1693,7 @@ double Tenseur2HB::MaxiComposante() const #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)) || ((j!=1)&&(j!=2)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "TenseurHH::Coor(int,int ) \n"; Sortie(1); }; @@ -1722,7 +1722,7 @@ double Tenseur2HB::MaxiComposante() const #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)) || ((j!=1)&&(j!=2)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "TenseurHH::OPERATOR() (int,int ) \n"; Sortie(1); }; diff --git a/tenseurs_mai99/Tenseur/Tenseur2.h b/tenseurs_mai99/Tenseur/Tenseur2.h index 36d4a4c..d473aa5 100644 --- a/tenseurs_mai99/Tenseur/Tenseur2.h +++ b/tenseurs_mai99/Tenseur/Tenseur2.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/Tenseur2_TroisSym.cc b/tenseurs_mai99/Tenseur/Tenseur2_TroisSym.cc index 8956e42..e9a16af 100644 --- a/tenseurs_mai99/Tenseur/Tenseur2_TroisSym.cc +++ b/tenseurs_mai99/Tenseur/Tenseur2_TroisSym.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -548,7 +548,7 @@ istream & operator >> (istream & entree, TenseurQ2_troisSym_HHHH & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const TenseurQ2_troisSym_HHHH & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "TenseurQ2_troisSym_HHHH "; // puis les datas @@ -1063,7 +1063,7 @@ istream & operator >> (istream & entree, TenseurQ2_troisSym_BBBB & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const TenseurQ2_troisSym_BBBB & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "TenseurQ2_troisSym_BBBB "; // puis les datas diff --git a/tenseurs_mai99/Tenseur/Tenseur2_TroisSym.h b/tenseurs_mai99/Tenseur/Tenseur2_TroisSym.h index c26871e..cbac0fc 100644 --- a/tenseurs_mai99/Tenseur/Tenseur2_TroisSym.h +++ b/tenseurs_mai99/Tenseur/Tenseur2_TroisSym.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/Tenseur2_ns.cc b/tenseurs_mai99/Tenseur/Tenseur2_ns.cc index 62755ec..677aa5f 100644 --- a/tenseurs_mai99/Tenseur/Tenseur2_ns.cc +++ b/tenseurs_mai99/Tenseur/Tenseur2_ns.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/Tenseur3-1.cc b/tenseurs_mai99/Tenseur/Tenseur3-1.cc index 9ff14f2..d26f3b5 100644 --- a/tenseurs_mai99/Tenseur/Tenseur3-1.cc +++ b/tenseurs_mai99/Tenseur/Tenseur3-1.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -690,7 +690,7 @@ double& Tenseur3HH::Coor( const int i, const int j) #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)&&(i!=3)) || ((j!=1)&&(j!=2)&&(j!=3)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "Tenseur3HH::Coor(int,int ) \n"; Sortie(1); }; @@ -726,7 +726,7 @@ double Tenseur3HH::operator () ( const int i, const int j) const #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)&&(i!=3)) || ((j!=1)&&(j!=2)&&(j!=3)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "Tenseur3HH::OPERATOR() (int,int ) \n"; Sortie(1); }; @@ -1507,7 +1507,7 @@ double& Tenseur3BB::Coor( const int i, const int j) #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)&&(i!=3)) || ((j!=1)&&(j!=2)&&(j!=3)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "Tenseur3BB::Coor(int,int ) \n"; Sortie(1); }; @@ -1545,7 +1545,7 @@ double Tenseur3BB::operator () ( const int i, const int j) const #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)&&(i!=3)) || ((j!=1)&&(j!=2)&&(j!=3)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "Tenseur3BB::OPERATOR() (int,int ) \n"; Sortie(1); }; diff --git a/tenseurs_mai99/Tenseur/Tenseur3-2.cc b/tenseurs_mai99/Tenseur/Tenseur3-2.cc index ef8940f..d3dca1d 100644 --- a/tenseurs_mai99/Tenseur/Tenseur3-2.cc +++ b/tenseurs_mai99/Tenseur/Tenseur3-2.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -778,7 +778,7 @@ double Tenseur3BH::MaxiComposante() const #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)&&(i!=3)) || ((j!=1)&&(j!=2)&&(j!=3)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "Tenseur3BH::OPERATOR() (int,int ) \n"; Sortie(1); }; @@ -814,7 +814,7 @@ double Tenseur3BH::MaxiComposante() const #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)&&(i!=3)) || ((j!=1)&&(j!=2)&&(j!=3)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "Tenseur3BH::OPERATOR() (int,int ) \n"; Sortie(1); }; @@ -1488,7 +1488,7 @@ Coordonnee Tenseur3HB::ValPropre(int& cas, Mat_pleine& mat) const for (int i=1;i<=3;i++) for (int j=1;j<=3;j++) mat(i,j) = (*this)(i,j); - int cass; +// int cass; Tableau V_P = MathUtil2::V_Propres3x3(mat,valPropre,cas); // --- gestion des erreurs éventuelles if (cas == -1) // cas d'une erreur @@ -1546,7 +1546,7 @@ void Tenseur3HB::VecteursPropres(const Coordonnee& valPropre,int& cas, Tableau < for (int i=1;i<=3;i++) for (int j=1;j<=3;j++) mat(i,j) = (*this)(i,j); - int cass; +// int cass; V_P = MathUtil2::V_Propres3x3(mat,valPropre,cas); }; @@ -1692,7 +1692,7 @@ double& Tenseur3HB::Coor( const int i, const int j) #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)&&(i!=3)) || ((j!=1)&&(j!=2)&&(j!=3)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "TenseurHH::Coor(int,int ) \n"; Sortie(1); }; @@ -1728,7 +1728,7 @@ double Tenseur3HB::operator () ( const int i, const int j) const #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)&&(i!=3)) || ((j!=1)&&(j!=2)&&(j!=3)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "TenseurHH::OPERATOR() (int,int ) \n"; Sortie(1); }; diff --git a/tenseurs_mai99/Tenseur/Tenseur3.h b/tenseurs_mai99/Tenseur/Tenseur3.h index 66d9446..2abd1aa 100644 --- a/tenseurs_mai99/Tenseur/Tenseur3.h +++ b/tenseurs_mai99/Tenseur/Tenseur3.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/Tenseur3_TroisSym.cc b/tenseurs_mai99/Tenseur/Tenseur3_TroisSym.cc index b322131..bd54501 100644 --- a/tenseurs_mai99/Tenseur/Tenseur3_TroisSym.cc +++ b/tenseurs_mai99/Tenseur/Tenseur3_TroisSym.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -504,7 +504,7 @@ istream & operator >> (istream & entree, TenseurQ3_troisSym_HHHH & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const TenseurQ3_troisSym_HHHH & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "TenseurQ3_troisSym_HHHH "; // puis les datas @@ -975,7 +975,7 @@ istream & operator >> (istream & entree, TenseurQ3_troisSym_BBBB & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const TenseurQ3_troisSym_BBBB & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "TenseurQ3_troisSym_BBBB "; // puis les datas diff --git a/tenseurs_mai99/Tenseur/Tenseur3_TroisSym.h b/tenseurs_mai99/Tenseur/Tenseur3_TroisSym.h index 0bba641..4eada2c 100644 --- a/tenseurs_mai99/Tenseur/Tenseur3_TroisSym.h +++ b/tenseurs_mai99/Tenseur/Tenseur3_TroisSym.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/Tenseur3_ns.cc b/tenseurs_mai99/Tenseur/Tenseur3_ns.cc index b738aed..a112d4d 100644 --- a/tenseurs_mai99/Tenseur/Tenseur3_ns.cc +++ b/tenseurs_mai99/Tenseur/Tenseur3_ns.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -626,7 +626,7 @@ double& Tenseur_ns3HH::Coor( const int i, const int j) #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)&&(i!=3)) || ((j!=1)&&(j!=2)&&(j!=3)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "Tenseur_ns3HH::Coor(int,int ) \n"; Sortie(1); }; @@ -663,7 +663,7 @@ double Tenseur_ns3HH::operator () ( const int i, const int j) const #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)&&(i!=3)) || ((j!=1)&&(j!=2)&&(j!=3)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "Tenseur_ns3HH::OPERATOR() (int,int ) \n"; Sortie(1); }; @@ -1342,7 +1342,7 @@ double& Tenseur_ns3BB::Coor( const int i, const int j) #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)&&(i!=3)) || ((j!=1)&&(j!=2)&&(j!=3)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "Tenseur_ns3BB::Coor(int,int ) \n"; Sortie(1); }; @@ -1379,7 +1379,7 @@ double Tenseur_ns3BB::operator () ( const int i, const int j) const #ifdef MISE_AU_POINT if ( ((i!=1)&&(i!=2)&&(i!=3)) || ((j!=1)&&(j!=2)&&(j!=3)) ) { cout << "\nErreur : composante inexistante !\n"; - cout << " i = " << i << "j = " << j << '\n'; + cout << " i = " << i << ", j = " << j << '\n'; cout << "Tenseur_ns3BB::OPERATOR() (int,int ) \n"; Sortie(1); }; diff --git a/tenseurs_mai99/Tenseur/TenseurQ-1.h b/tenseurs_mai99/Tenseur/TenseurQ-1.h index 2a0d42c..1bc7016 100755 --- a/tenseurs_mai99/Tenseur/TenseurQ-1.h +++ b/tenseurs_mai99/Tenseur/TenseurQ-1.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/TenseurQ-2.h b/tenseurs_mai99/Tenseur/TenseurQ-2.h index 7b4d1e4..afaed80 100755 --- a/tenseurs_mai99/Tenseur/TenseurQ-2.h +++ b/tenseurs_mai99/Tenseur/TenseurQ-2.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/TenseurQ-3.h b/tenseurs_mai99/Tenseur/TenseurQ-3.h index 480f300..7863e6a 100644 --- a/tenseurs_mai99/Tenseur/TenseurQ-3.h +++ b/tenseurs_mai99/Tenseur/TenseurQ-3.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/TenseurQ.cc b/tenseurs_mai99/Tenseur/TenseurQ.cc index 6a27c1e..3eb55cc 100644 --- a/tenseurs_mai99/Tenseur/TenseurQ.cc +++ b/tenseurs_mai99/Tenseur/TenseurQ.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/TenseurQ.h b/tenseurs_mai99/Tenseur/TenseurQ.h index 17d4c6d..30b0298 100644 --- a/tenseurs_mai99/Tenseur/TenseurQ.h +++ b/tenseurs_mai99/Tenseur/TenseurQ.h @@ -12,7 +12,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/TenseurQ1-1.cc b/tenseurs_mai99/Tenseur/TenseurQ1-1.cc index 19993cf..cd4f3a9 100755 --- a/tenseurs_mai99/Tenseur/TenseurQ1-1.cc +++ b/tenseurs_mai99/Tenseur/TenseurQ1-1.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -43,7 +43,7 @@ // pour des tenseurs T1 et T2 symétriques HHHH ou BBBB template T1& produit44_1(T1& A,T2& Nous, const Base & gi) - { int dim = 1; + { //int dim = 1; if ((A.Dimension()!=11)|(Nous.Dimension()!=11)) {cout << "\n erreur la methode n'est valide que pour la dimension 1" << "\n ici pour des tenseurs Tenseur1HHHH ou Tenseur1BBBB" @@ -682,7 +682,7 @@ istream & operator >> (istream & entree, Tenseur1HHHH & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const Tenseur1HHHH & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "Tenseur1HHHH "; // puis les datas @@ -1268,7 +1268,7 @@ istream & operator >> (istream & entree, Tenseur1BBBB & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const Tenseur1BBBB & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "Tenseur1BBBB "; // puis les datas diff --git a/tenseurs_mai99/Tenseur/TenseurQ1-2.cc b/tenseurs_mai99/Tenseur/TenseurQ1-2.cc index d8e10af..bddf15b 100755 --- a/tenseurs_mai99/Tenseur/TenseurQ1-2.cc +++ b/tenseurs_mai99/Tenseur/TenseurQ1-2.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -490,7 +490,7 @@ istream & operator >> (istream & entree, Tenseur1BBHH & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const Tenseur1BBHH & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "Tenseur1BBHH "; // puis les datas @@ -964,7 +964,7 @@ istream & operator >> (istream & entree, Tenseur1HHBB & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const Tenseur1HHBB & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "Tenseur1HHBB "; // puis les datas diff --git a/tenseurs_mai99/Tenseur/TenseurQ1gene.cc b/tenseurs_mai99/Tenseur/TenseurQ1gene.cc index 80a4552..101f2eb 100644 --- a/tenseurs_mai99/Tenseur/TenseurQ1gene.cc +++ b/tenseurs_mai99/Tenseur/TenseurQ1gene.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -422,7 +422,7 @@ istream & operator >> (istream & entree, TenseurQ1geneBHBH & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const TenseurQ1geneBHBH & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "TenseurQ1geneBHBH "; // puis les datas @@ -809,7 +809,7 @@ istream & operator >> (istream & entree, TenseurQ1geneHBHB & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const TenseurQ1geneHBHB & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "TenseurQ1geneHBHB "; // puis les datas @@ -1196,7 +1196,7 @@ istream & operator >> (istream & entree, TenseurQ1geneHBBH & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const TenseurQ1geneHBBH & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "TenseurQ1geneHBBH "; // puis les datas @@ -1586,7 +1586,7 @@ istream & operator >> (istream & entree, TenseurQ1geneBHHB & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const TenseurQ1geneBHHB & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "TenseurQ1geneBHHB "; // puis les datas diff --git a/tenseurs_mai99/Tenseur/TenseurQ1gene.h b/tenseurs_mai99/Tenseur/TenseurQ1gene.h index 97f4f46..61f7ebe 100644 --- a/tenseurs_mai99/Tenseur/TenseurQ1gene.h +++ b/tenseurs_mai99/Tenseur/TenseurQ1gene.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/TenseurQ2-1.cc b/tenseurs_mai99/Tenseur/TenseurQ2-1.cc index 09a46d0..d1a65e3 100755 --- a/tenseurs_mai99/Tenseur/TenseurQ2-1.cc +++ b/tenseurs_mai99/Tenseur/TenseurQ2-1.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -88,7 +88,7 @@ template T1& produit55_2(T1& A,T2& Nous, const Base & gi) { //cout << "\n debug: T1& produit55_2(T1& A,T2& Nous, const Base & gi) " // << " debut1 " << flush; - int dim = 2; + //int dim = 2; //cout << "\n debug: T1& produit55_2(T1& A,T2& Nous, const Base & gi) " // << " debut2 " << flush; int dim_gi = gi(1).Dimension(); // dim de l'espace d'arrivé @@ -888,7 +888,7 @@ istream & operator >> (istream & entree, Tenseur2HHHH & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const Tenseur2HHHH & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "Tenseur2HHHH "; // puis les datas @@ -1578,7 +1578,7 @@ istream & operator >> (istream & entree, Tenseur2BBBB & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const Tenseur2BBBB & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "Tenseur2BBBB "; // puis les datas diff --git a/tenseurs_mai99/Tenseur/TenseurQ2-2.cc b/tenseurs_mai99/Tenseur/TenseurQ2-2.cc index 1175b9d..f135cdb 100755 --- a/tenseurs_mai99/Tenseur/TenseurQ2-2.cc +++ b/tenseurs_mai99/Tenseur/TenseurQ2-2.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -591,7 +591,7 @@ istream & operator >> (istream & entree, Tenseur2BBHH & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const Tenseur2BBHH & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "Tenseur2BBHH "; // puis les datas @@ -1121,7 +1121,7 @@ istream & operator >> (istream & entree, Tenseur2HHBB & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const Tenseur2HHBB & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "Tenseur2HHBB "; // puis les datas diff --git a/tenseurs_mai99/Tenseur/TenseurQ2gene-1.cc b/tenseurs_mai99/Tenseur/TenseurQ2gene-1.cc index 81786b9..330d864 100755 --- a/tenseurs_mai99/Tenseur/TenseurQ2gene-1.cc +++ b/tenseurs_mai99/Tenseur/TenseurQ2gene-1.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -108,13 +108,13 @@ TenseurQ2geneHHHH::TenseurQ2geneHHHH(int cas, const TenseurHH & aHH, const Tense const Tenseur2HH & b2HH = *((Tenseur2HH*) &bHH); // passage en dim 2 #ifdef MISE_AU_POINT if (Dabs(a2HH.Dimension()) != 2) - Message(2,strcat(strcat("produit tensoriel a partir d'un premier tenseur non symétriques \n", - "TenseurQ2geneHHHH::TenseurQ2geneHHHH(bool normal, const"), - " TenseurHH & aHH, const TenseurHH & bHH);")); + Message(2, std::string("produit tensoriel a partir d'un premier tenseur non symétriques \n") + + std::string("TenseurQ2geneHHHH::TenseurQ2geneHHHH(bool normal, const") + + std::string(" TenseurHH & aHH, const TenseurHH & bHH);")); if (Dabs(b2HH.Dimension()) != 2) - Message(2,strcat(strcat("produit tensoriel a partir d'un second tenseur non symétriques \n", - "TenseurQ2geneHHHH::TenseurQ2geneHHHH(bool normal, const"), - " TenseurHH & aHH, const TenseurHH & bHH);")); + Message(2, std::string("produit tensoriel a partir d'un second tenseur non symétriques \n") + + std::string("TenseurQ2geneHHHH::TenseurQ2geneHHHH(bool normal, const") + + std::string(" TenseurHH & aHH, const TenseurHH & bHH);")); #endif switch (cas) { case 1 : @@ -734,7 +734,7 @@ istream & operator >> (istream & entree, TenseurQ2geneHHHH & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const TenseurQ2geneHHHH & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "TenseurQ2geneHHHH "; // puis les datas @@ -794,13 +794,17 @@ TenseurQ2geneBBBB::TenseurQ2geneBBBB(int cas, const TenseurBB & aBB, const Tense const Tenseur2BB & b2BB = *((Tenseur2BB*) &bBB); // passage en dim 2 #ifdef MISE_AU_POINT if (Dabs(a2BB.Dimension()) != 2) - Message(2,strcat(strcat("produit tensoriel a partir d'un premier tenseur non symétriques \n", - "TenseurQ2geneBBBB::TenseurQ2geneBBBB(bool normal, const"), - " TenseurBB & aBB, const TenseurBB & bBB);")); + Message(2, std::string("produit tensoriel a partir d'un premier tenseur non symétriques \n") + + std::string("TenseurQ2geneBBBB::TenseurQ2geneBBBB(bool normal, const") + + std::string( " TenseurBB & aBB, const TenseurBB & bBB);")); if (Dabs(b2BB.Dimension()) != 2) - Message(2,strcat(strcat("produit tensoriel a partir d'un second tenseur non symétriques \n", - "TenseurQ2geneBBBB::TenseurQ2geneBBBB(bool normal, const"), - " TenseurBB & aBB, const TenseurBB & bBB);")); + {Message(2, std::string("produit tensoriel a partir d un second tenseur non symétriques \n") + + std::string("TenseurQ2geneBBBB::TenseurQ2geneBBBB(bool normal, const") + + std::string(" TenseurBB & aBB, const TenseurBB & bBB);")); + } +// Message(2,strcat(strcat("produit tensoriel a partir d'un second tenseur non symétriques \n", +// "TenseurQ2geneBBBB::TenseurQ2geneBBBB(bool normal, const"), +// " TenseurBB & aBB, const TenseurBB & bBB);")); #endif switch (cas) { case 1 : @@ -1420,7 +1424,7 @@ istream & operator >> (istream & entree, TenseurQ2geneBBBB & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const TenseurQ2geneBBBB & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "TenseurQ2geneBBBB "; // puis les datas diff --git a/tenseurs_mai99/Tenseur/TenseurQ2gene-2.cc b/tenseurs_mai99/Tenseur/TenseurQ2gene-2.cc index c07dd4b..057a213 100755 --- a/tenseurs_mai99/Tenseur/TenseurQ2gene-2.cc +++ b/tenseurs_mai99/Tenseur/TenseurQ2gene-2.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -85,13 +85,13 @@ TenseurQ2geneBBHH::TenseurQ2geneBBHH(const TenseurBB & aBB, const TenseurHH & bH const Tenseur2HH & b2HH = *((Tenseur2HH*) &bHH); // passage en dim 2 #ifdef MISE_AU_POINT if (Dabs(a2BB.Dimension()) != 2) - Message(2,strcat(strcat("produit tensoriel a partir d'un premier tenseur non symétriques \n", - "TenseurQ2geneBBHH::TenseurQ2geneBBHH(bool normal, const"), - " TenseurBB & aBB, const TenseurHH & bHH);")); + Message(2, std::string("produit tensoriel a partir d'un premier tenseur non symétriques \n") + + std::string("TenseurQ2geneBBHH::TenseurQ2geneBBHH(bool normal, const") + + std::string(" TenseurBB & aBB, const TenseurHH & bHH);")); if (Dabs(b2HH.Dimension()) != 2) - Message(2,strcat(strcat("produit tensoriel a partir d'un second tenseur non symétriques \n", - "TenseurQ2geneBBHH::TenseurQ2geneBBHH(bool normal, const"), - " TenseurBB & aBB, const TenseurHH & bHH);")); + Message(2, std::string("produit tensoriel a partir d'un second tenseur non symétriques \n") + + std::string("TenseurQ2geneBBHH::TenseurQ2geneBBHH(bool normal, const") + + std::string(" TenseurBB & aBB, const TenseurHH & bHH);")); #endif for (int i=1;i<3;i++) for (int j=1;j<3;j++) for (int k=1;k<3;k++) for (int l=1;l<3;l++) // (((i-1)2+(j-1))2+(k-1))2+l-1 @@ -593,7 +593,7 @@ istream & operator >> (istream & entree, TenseurQ2geneBBHH & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const TenseurQ2geneBBHH & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "TenseurQ2geneBBHH "; // puis les datas @@ -646,13 +646,13 @@ TenseurQ2geneHHBB::TenseurQ2geneHHBB(const TenseurHH & aHH, const TenseurBB & bB const Tenseur2BB & b2BB = *((Tenseur2BB*) &bBB); // passage en dim 2 #ifdef MISE_AU_POINT if (Dabs(a2HH.Dimension()) != 2) - Message(2,strcat(strcat("produit tensoriel a partir d'un premier tenseur non symétriques \n", - "TenseurQ2geneHHBB::TenseurQ2geneHHBB(bool normal, const"), - " TenseurHH & aHH, const TenseurBB & bBB);")); + Message(2, std::string("produit tensoriel a partir d'un premier tenseur non symétriques \n") + + std::string("TenseurQ2geneHHBB::TenseurQ2geneHHBB(bool normal, const") + + std::string(" TenseurHH & aHH, const TenseurBB & bBB);")); if (Dabs(b2BB.Dimension()) != 2) - Message(2,strcat(strcat("produit tensoriel a partir d'un second tenseur non symétriques \n", - "TenseurQ2geneHHBB::TenseurQ2geneHHBB(bool normal, const"), - " TenseurHH & aHH, const TenseurBB & bBB);")); + Message(2, std::string("produit tensoriel a partir d'un second tenseur non symétriques \n") + + std::string("TenseurQ2geneHHBB::TenseurQ2geneHHBB(bool normal, const") + + std::string(" TenseurHH & aHH, const TenseurBB & bBB);")); #endif for (int i=1;i<3;i++) for (int j=1;j<3;j++) for (int k=1;k<3;k++) for (int l=1;l<3;l++) // (((i-1)2+(j-1))2+(k-1))2+l-1 @@ -1154,7 +1154,7 @@ istream & operator >> (istream & entree, TenseurQ2geneHHBB & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const TenseurQ2geneHHBB & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "TenseurQ2geneHHBB "; // puis les datas diff --git a/tenseurs_mai99/Tenseur/TenseurQ2gene.h b/tenseurs_mai99/Tenseur/TenseurQ2gene.h index 427d556..1f043b9 100755 --- a/tenseurs_mai99/Tenseur/TenseurQ2gene.h +++ b/tenseurs_mai99/Tenseur/TenseurQ2gene.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/TenseurQ3-1.cc b/tenseurs_mai99/Tenseur/TenseurQ3-1.cc index 708e987..555f0ff 100644 --- a/tenseurs_mai99/Tenseur/TenseurQ3-1.cc +++ b/tenseurs_mai99/Tenseur/TenseurQ3-1.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -963,7 +963,7 @@ istream & operator >> (istream & entree, Tenseur3HHHH & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const Tenseur3HHHH & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "Tenseur3HHHH "; // puis les datas @@ -1740,7 +1740,7 @@ istream & operator >> (istream & entree, Tenseur3BBBB & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const Tenseur3BBBB & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "Tenseur3BBBB "; // puis les datas diff --git a/tenseurs_mai99/Tenseur/TenseurQ3-2.cc b/tenseurs_mai99/Tenseur/TenseurQ3-2.cc index 6791505..0462d06 100644 --- a/tenseurs_mai99/Tenseur/TenseurQ3-2.cc +++ b/tenseurs_mai99/Tenseur/TenseurQ3-2.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -741,7 +741,7 @@ istream & operator >> (istream & entree, Tenseur3BBHH & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const Tenseur3BBHH & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "Tenseur3BBHH "; // puis les datas @@ -1426,7 +1426,7 @@ istream & operator >> (istream & entree, Tenseur3HHBB & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const Tenseur3HHBB & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "Tenseur3HHBB "; // puis les datas diff --git a/tenseurs_mai99/Tenseur/TenseurQ3gene-1.cc b/tenseurs_mai99/Tenseur/TenseurQ3gene-1.cc index 7791c87..cb030ae 100644 --- a/tenseurs_mai99/Tenseur/TenseurQ3gene-1.cc +++ b/tenseurs_mai99/Tenseur/TenseurQ3gene-1.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -108,13 +108,13 @@ TenseurQ3geneHHHH::TenseurQ3geneHHHH(int cas, const TenseurHH & aHH, const Tense const Tenseur3HH & b3HH = *((Tenseur3HH*) &bHH); // passage en dim 3 #ifdef MISE_AU_POINT if (Dabs(a3HH.Dimension()) != 3) - Message(3,strcat(strcat("produit tensoriel a partir d'un premier tenseur non symétriques \n", - "TenseurQ3geneHHHH::TenseurQ3geneHHHH(bool normal, const"), - " TenseurHH & aHH, const TenseurHH & bHH);")); + Message(3, std::string("produit tensoriel a partir d'un premier tenseur non symétriques \n") + + std::string("TenseurQ3geneHHHH::TenseurQ3geneHHHH(bool normal, const") + + std::string(" TenseurHH & aHH, const TenseurHH & bHH);")); if (Dabs(b3HH.Dimension()) != 3) - Message(3,strcat(strcat("produit tensoriel a partir d'un second tenseur non symétriques \n", - "TenseurQ3geneHHHH::TenseurQ3geneHHHH(bool normal, const"), - " TenseurHH & aHH, const TenseurHH & bHH);")); + Message(3,std::string("produit tensoriel a partir d'un second tenseur non symétriques \n") + + std::string("TenseurQ3geneHHHH::TenseurQ3geneHHHH(bool normal, const") + + std::string(" TenseurHH & aHH, const TenseurHH & bHH);")); #endif switch (cas) { case 1 : @@ -744,7 +744,7 @@ istream & operator >> (istream & entree, TenseurQ3geneHHHH & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const TenseurQ3geneHHHH & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "TenseurQ3geneHHHH "; // puis les datas @@ -804,13 +804,13 @@ TenseurQ3geneBBBB::TenseurQ3geneBBBB(int cas, const TenseurBB & aBB, const Tense const Tenseur3BB & b3BB = *((Tenseur3BB*) &bBB); // passage en dim 3 #ifdef MISE_AU_POINT if (Dabs(a3BB.Dimension()) != 3) - Message(3,strcat(strcat("produit tensoriel a partir d'un premier tenseur non symétriques \n", - "TenseurQ3geneBBBB::TenseurQ3geneBBBB(bool normal, const"), - " TenseurBB & aBB, const TenseurBB & bBB);")); + Message(3, std::string("produit tensoriel a partir d'un premier tenseur non symétriques \n") + + std::string("TenseurQ3geneBBBB::TenseurQ3geneBBBB(bool normal, const") + + std::string(" TenseurBB & aBB, const TenseurBB & bBB);")); if (Dabs(b3BB.Dimension()) != 3) - Message(3,strcat(strcat("produit tensoriel a partir d'un second tenseur non symétriques \n", - "TenseurQ3geneBBBB::TenseurQ3geneBBBB(bool normal, const"), - " TenseurBB & aBB, const TenseurBB & bBB);")); + Message(3, std::string("produit tensoriel a partir d'un second tenseur non symétriques \n") + + std::string("TenseurQ3geneBBBB::TenseurQ3geneBBBB(bool normal, const") + + std::string(" TenseurBB & aBB, const TenseurBB & bBB);")); #endif switch (cas) { case 1 : diff --git a/tenseurs_mai99/Tenseur/TenseurQ3gene-2.cc b/tenseurs_mai99/Tenseur/TenseurQ3gene-2.cc index 3e56dab..bf04eb4 100644 --- a/tenseurs_mai99/Tenseur/TenseurQ3gene-2.cc +++ b/tenseurs_mai99/Tenseur/TenseurQ3gene-2.cc @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -85,13 +85,13 @@ TenseurQ3geneBBHH::TenseurQ3geneBBHH(const TenseurBB & aBB, const TenseurHH & bH const Tenseur3HH & b3HH = *((Tenseur3HH*) &bHH); // passage en dim 3 #ifdef MISE_AU_POINT if (Dabs(a3BB.Dimension()) != 3) - Message(3,strcat(strcat("produit tensoriel a partir d'un premier tenseur non symétriques \n", - "TenseurQ3geneBBHH::TenseurQ3geneBBHH(bool normal, const"), - " TenseurBB & aBB, const TenseurHH & bHH);")); + Message(3, std::string("produit tensoriel a partir d'un premier tenseur non symétriques \n") + + std::string("TenseurQ3geneBBHH::TenseurQ3geneBBHH(bool normal, const") + + std::string(" TenseurBB & aBB, const TenseurHH & bHH);")); if (Dabs(b3HH.Dimension()) != 3) - Message(3,strcat(strcat("produit tensoriel a partir d'un second tenseur non symétriques \n", - "TenseurQ3geneBBHH::TenseurQ3geneBBHH(bool normal, const"), - " TenseurBB & aBB, const TenseurHH & bHH);")); + Message(3, std::string("produit tensoriel a partir d'un second tenseur non symétriques \n") + + std::string("TenseurQ3geneBBHH::TenseurQ3geneBBHH(bool normal, const") + + std::string(" TenseurBB & aBB, const TenseurHH & bHH);")); #endif for (int i=1;i<=3;i++) for (int j=1;j<=3;j++) for (int k=1;k<=3;k++) for (int l=1;l<=3;l++) // (((i-1)3+(j-1))3+(k-1))3+l-1 @@ -602,7 +602,7 @@ istream & operator >> (istream & entree, TenseurQ3geneBBHH & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const TenseurQ3geneBBHH & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "TenseurQ3geneBBHH "; // puis les datas @@ -655,13 +655,13 @@ TenseurQ3geneHHBB::TenseurQ3geneHHBB(const TenseurHH & aHH, const TenseurBB & bB const Tenseur3BB & b3BB = *((Tenseur3BB*) &bBB); // passage en dim 3 #ifdef MISE_AU_POINT if (Dabs(a3HH.Dimension()) != 3) - Message(3,strcat(strcat("produit tensoriel a partir d'un premier tenseur non symétriques \n", - "TenseurQ3geneHHBB::TenseurQ3geneHHBB(bool normal, const"), - " TenseurHH & aHH, const TenseurBB & bBB);")); + Message(3, std::string("produit tensoriel a partir d'un premier tenseur non symétriques \n") + + std::string("TenseurQ3geneHHBB::TenseurQ3geneHHBB(bool normal, const") + + std::string(" TenseurHH & aHH, const TenseurBB & bBB);")); if (Dabs(b3BB.Dimension()) != 3) - Message(3,strcat(strcat("produit tensoriel a partir d'un second tenseur non symétriques \n", - "TenseurQ3geneHHBB::TenseurQ3geneHHBB(bool normal, const"), - " TenseurHH & aHH, const TenseurBB & bBB);")); + Message(3, std::string("produit tensoriel a partir d'un second tenseur non symétriques \n") + + std::string("TenseurQ3geneHHBB::TenseurQ3geneHHBB(bool normal, const") + + std::string(" TenseurHH & aHH, const TenseurBB & bBB);")); #endif for (int i=1;i<=3;i++) for (int j=1;j<=3;j++) for (int k=1;k<=3;k++) for (int l=1;l<=3;l++) // (((i-1)3+(j-1))3+(k-1))3+l-1 @@ -1172,7 +1172,7 @@ istream & operator >> (istream & entree, TenseurQ3geneHHBB & A) #endif // surcharge de l'operator d'ecriture ostream & operator << (ostream & sort , const TenseurQ3geneHHBB & A) - { int dim = A.Dimension(); + { //int dim = A.Dimension(); // écriture du type sort << "TenseurQ3geneHHBB "; // puis les datas diff --git a/tenseurs_mai99/Tenseur/TenseurQ3gene.h b/tenseurs_mai99/Tenseur/TenseurQ3gene.h index 7625dfe..cf582db 100644 --- a/tenseurs_mai99/Tenseur/TenseurQ3gene.h +++ b/tenseurs_mai99/Tenseur/TenseurQ3gene.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/TypeConsTens.h b/tenseurs_mai99/Tenseur/TypeConsTens.h index a3a6a48..a577d53 100644 --- a/tenseurs_mai99/Tenseur/TypeConsTens.h +++ b/tenseurs_mai99/Tenseur/TypeConsTens.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // - // Copyright (C) 1997-2021 Université Bretagne Sud (France) + // Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Tenseur/TypeConsTensPrinc.h b/tenseurs_mai99/Tenseur/TypeConsTensPrinc.h index 8671fc3..185b12c 100644 --- a/tenseurs_mai99/Tenseur/TypeConsTensPrinc.h +++ b/tenseurs_mai99/Tenseur/TypeConsTensPrinc.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Vecteurs/Vecteur.cc b/tenseurs_mai99/Vecteurs/Vecteur.cc index c9c72cb..c364696 100644 --- a/tenseurs_mai99/Vecteurs/Vecteur.cc +++ b/tenseurs_mai99/Vecteurs/Vecteur.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -51,7 +51,8 @@ using namespace std; //introduces namespace std inline #endif // Constructeur permettant de definir un vecteur de taille n initialise a 0 -Vecteur::Vecteur (int n) +Vecteur::Vecteur (int n): + memoire(true) { #ifdef MISE_AU_POINT if ( n<0 ) @@ -79,7 +80,8 @@ Vecteur::Vecteur (int n) inline #endif // Constructeur permettant de definir un vecteur de taille n initialise a val -Vecteur::Vecteur (int n,double val) +Vecteur::Vecteur (int n,double val) : + memoire(true) { #ifdef MISE_AU_POINT if ( n<0 ) @@ -109,7 +111,8 @@ Vecteur::Vecteur (int n,double val) // Constructeur permettant de definir un vecteur de taille n dont les premieres valeurs // sont celles de vec // aucun test n'est fait concernant la taille disponible de vec -Vecteur::Vecteur (int n,double* vec) // routine dangereuse !!!!! +Vecteur::Vecteur (int n,double* vec) : // routine dangereuse !!!!! + memoire(true) { #ifdef MISE_AU_POINT if ( n < 0) @@ -133,14 +136,45 @@ Vecteur::Vecteur (int n,double* vec) // routine dangereuse !!!!! v[i]=vec[i]; }; }; - + +/// --------- cas très particulier d'un vecteur lié +/// --------- utilisé uniquement par des classes friend +#ifndef MISE_AU_POINT + inline +#endif +/// c-a-d qui ne gère pas sa mémoire -> memoire = false par défaut +/// le booléen sert pour différencier le constructeur avec +/// Vecteur::Vecteur (int n,double* vec) +/// Constructeur fonction d'un tableau de composantes déjà existant +/// il s'agit d'un tuillage, le vecteur ne gère pas sa mémoire +/// aucun test n'est fait concernant la taille disponible de vec +/// routine dangereuse !!!!! +/// il n'y a pas d'initialisation des composantes !! +Vecteur::Vecteur (int n,double* vec,bool memoi) : + memoire(false) + { + #ifdef MISE_AU_POINT + if ( n < 0) + { + cout << "\nErreur : taille invalide ! n= " << n << '\n'; + cout << "VECTEUR::VECTEUR (int n,double* vec,bool memoi) \n"; + Sortie(1); + }; + #endif + v = vec; + taille = n; + }; + #ifndef MISE_AU_POINT inline #endif // Destructeur Vecteur::~Vecteur () -{ Libere(); }; +{ // on libère la mémoire que s'il s'agit d'un vecteur libre + if (memoire) + Libere(); +}; // Retourne la taille du vecteur #ifndef MISE_AU_POINT @@ -224,6 +258,14 @@ void Vecteur::Change_taille (int n) { // si la taille est identique, on ne fait rien if (n == taille) return; + // sinon, s'il s'agit d'un vecteur lié -> pas possible + if (!memoire) + { cout << "\n*** Erreur de changement de taille \n" + << " il s'agit d'un vecteur particulier qui ne gere pas sa propre memoire " + << " on ne peut pas modifier la place memoire !! "; + cout << "Vecteur::Change_taille (... \n"; + Sortie(1); + }; // la suite concerne le cas où il faut vraiment faire quelque chose if ( n<0 ) // cas ou la taille selectionnee est negative @@ -271,6 +313,14 @@ void Vecteur::Change_taille (int n,const double& val_init) v[i] = val_init; // affectation des composantes du vecteur return; }; + // sinon, s'il s'agit d'un vecteur lié -> pas possible + if (!memoire) + { cout << "\n*** Erreur de changement de taille \n" + << " il s'agit d'un vecteur particulier qui ne gere pas sa propre memoire " + << " on ne peut pas modifier la place memoire !! "; + cout << "Vecteur::Change_taille (... \n"; + Sortie(1); + }; // la suite concerne le cas où il faut vraiment faire quelque chose if ( n<0 ) // cas ou la taille selectionnee est negative @@ -300,8 +350,18 @@ void Vecteur::Change_taille (int n,const double& val_init) #endif // Apres l'appel de cette methode, le vecteur est identique a ce qu'il aurait // ete a la suite de l'appel du contructeur par defaut +// Dans le cas très particulier où le vecteur ne gère pas sa propre mémoire +// l'opération n'est pas possible -> message d'erreur et arrêt void Vecteur::Libere () -{if ( taille>0 ) +{if (!memoire) + { cout << "\n*** Erreur de liberation de la place memoire\n" + << " il s'agit d'un vecteur particulier qui ne gere pas sa propre memoire " + << " on ne peut pas modifier la place memoire !! "; + cout << "VECTEUR::LIBERE () \n"; + Sortie(1); + }; + // sinon c'est ok + if ( taille>0 ) {delete [] v;} // desallocation du vecteur pointe par v else { if ( v!=NULL ) @@ -795,6 +855,20 @@ void Vecteur::Zero() // affectation des composantes du vecteur a 0 v[i] = 0.0; }; + +// méthode explicite d'écriture dans un flux: identique à la surcharge de << +#ifndef MISE_AU_POINT + inline +#endif +void Vecteur::Ecrit(ostream & ostr) const + {ostr << *this; }; +// méthode explicite de lecture dans un flux: identique à la surcharge de >> +#ifndef MISE_AU_POINT + inline +#endif +void Vecteur::Lecture(istream & istr) + {istr >> *this; }; + #ifndef MISE_AU_POINT inline @@ -909,7 +983,7 @@ istream & operator >> (istream & entree, Vecteur & vec) entree >> vec.v[i]; return entree; }; - + // surcharge de l'operateur d'ecriture non formatée // les informations sont le type puis la taille puis les datas séparées par // un espace @@ -925,6 +999,7 @@ ostream & operator << ( ostream & sort,const Vecteur & vec) return sort; }; + // spécifiquement à la classe MV_Vector #ifndef MISE_AU_POINT inline diff --git a/tenseurs_mai99/Vecteurs/Vecteur.h b/tenseurs_mai99/Vecteurs/Vecteur.h index df8af8d..83d90f5 100644 --- a/tenseurs_mai99/Vecteurs/Vecteur.h +++ b/tenseurs_mai99/Vecteurs/Vecteur.h @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -63,6 +63,18 @@ #include #include +#ifdef UTILISATION_MPI + #include + #include + #include "mpi.h" + #include + #include + #include + #include + namespace mpi = boost::mpi; +#endif +# include "ParaGlob.h" + #include "Sortie.h" #include "mvvtp_GR.h" // classe template MV++ @@ -93,6 +105,8 @@ class Coordonnee; // declare a la fin du fichier, car coordonnees utilise aussi class CoordonneeH; // declare a la fin du fichier, car coordonnees utilise aussi vecteur class CoordonneeB; // declare a la fin du fichier, car coordonnees utilise aussi vecteur +class Mat_pleine; // acces direct au pointeur interne de tableau + /// La classe Vecteur permet de declarer des vecteurs d'une longueur predefinie par /// une allocation dynamique de memoire. Les composantes d'un vecteur de cette classe /// sont de type double. @@ -104,6 +118,8 @@ class Vecteur /// utilisation directe du pointeur de double par la classe MatLapack friend class MatLapack; + friend class Mat_pleine; + friend class ResRaid_MPI; public : @@ -116,6 +132,10 @@ class Vecteur /// les informations sont le type puis la taille puis les datas séparées par /// un espace friend ostream & operator << (ostream &, const Vecteur &); + // NB: voir également les méthodes Ecrit, Lecture, qui permettent d'écrire et lire + // dans un flux de manière explicite sans utiliser les opérateurs << et >> surchargés + // certaines fois il y a utilisation automatique de surcharge non contrôlés + // cf. l'utilisation de boost/serialization // spécifiquement à la classe MV_Vector // friend MV_Vector * Nouveau_MV_Vector_double(Vecteur & b); @@ -244,6 +264,11 @@ class Vecteur double& operator() (int i); /// Surcharge de l'operateur ! : renvoie la norme d'un vecteur double operator! () const ; + // méthode explicite d'écriture dans un fluc: identique à la surcharge de << + void Ecrit(ostream & ostr) const; + // méthode explicite de lecture dans un flux: identique à la surcharge de >> + void Lecture(istream & istr); + /// mise a zero d'un vecteur void Zero(); /// initialise toutes les composantes à val @@ -278,17 +303,94 @@ class Vecteur MV_Vector * Nouveau_MV_Vector_double(); /// idem en const const MV_Vector * Nouveau_MV_Vector_double_const() const; - + +#ifdef UTILISATION_MPI // spécifique au calcul parallèle + // envoi et récup brut du tableau: nécessite pour la réception d'avoir + // un tableau de même dimension + void Envoi_MPI(int dest, int tag) const + {ParaGlob::Monde()->send(dest,tag,v,taille);}; + void Recup_MPI(int source, int tag) const + {ParaGlob::Monde()->recv(source,tag,v,taille);}; + mpi::request Ienvoi_MPI(int dest, int tag) const + {return ParaGlob::Monde()->isend(dest,tag,v,taille);}; + mpi::request Irecup_MPI(int source, int tag) const + {return ParaGlob::Monde()->irecv(source,tag,v,taille);}; + // cas d'un envoi à tous les process + void Broadcast(int source) + {broadcast(*ParaGlob::Monde(),v,taille,source); }; + +#endif protected : - int taille; // taille du vecteur double* v; // pointeur sur les composantes du vecteur - + bool memoire = true; // indique s'il y a allocation ou pas + + /// --------- cas très particulier d'un vecteur lié + /// --------- utilisé uniquement par des classes friend + // c-a-d qui ne gère pas sa mémoire -> memoire = false + /// Constructeur fonction d'un tableau de composantes déjà existant + /// il s'agit d'un tuillage, le vecteur ne gère pas sa mémoire + /// aucun test n'est fait concernant la taille disponible de vec + /// routine dangereuse !!!!! + /// il n'y a pas d'initialisation des composantes !! + Vecteur (int n,double* vec,bool memoire); + // fonction protégé pour l'accès directe au pointeur, utilisé // par MV_Vector pour créer un vecteur à la même place + // idem utilisé par Mat_pleine double * Pointeur_vect() {return v;} + // indique si le vecteur gère ou pas son allocation + bool Memoire() const {return memoire;}; + + + // ---------- fin du cas très particulier d'un vecteur lié + + // METHODES PROTEGEES : +#ifdef UTILISATION_MPI + // -- serialisation --- + // déclaration en friend pour l'acces direct de boost + friend class boost::serialization::access; + // on spécialise la sauvegarde et la restitution + // version == 0 pour la première sauvegarde et ensuite > 0 + // NB: c'est toujours la version en cours au moment de la sauvegarde + // ==> dans notre cas, on ne sent sert pas pour l'instant: supposé tjs == 0 + template + void save(Archive & ar, const unsigned int version) const + { // tout d'abord un indicateur donnant le type + ar << std::string("Vecteur") << taille ; + for (int i = 0; i< taille; i++) + ar << v[i] ; + }; + + // en lecture, le num de version permet de ce positionner sur une version particulière + template + void load(Archive & ar, const unsigned int version) + { // vérification du type + std::string type; + ar >> type; + if (type != "Vecteur") + {Sortie (1); + }; + // passage de la chaine donnant la taille puis lecture de la taille + int taille; + ar >> taille; + // vérification de la taille sinon changement + if (Taille() != taille) Change_taille(taille); + // lecture des données + for (int i = 0; i< taille; i++) + ar >> v[i]; + }; + // la macro suivante va définir automatiquement la méthode : "serialize" + BOOST_SERIALIZATION_SPLIT_MEMBER() + // pour mémoire on indique l'entête de la méthode "serialize" + // // la méthode serialize fonctionne dans les deux sens: lecture et écriture dans ar + // // << et >> est remplacé par & + // // le choix dépend du fait que ar est un flux entrant ou sortant + // template + // void serialize(Archive & ar, const unsigned int version); +#endif }; diff --git a/tenseurs_mai99/Vecteurs/Vecteur2.cc b/tenseurs_mai99/Vecteurs/Vecteur2.cc index 611250b..90a77c2 100644 --- a/tenseurs_mai99/Vecteurs/Vecteur2.cc +++ b/tenseurs_mai99/Vecteurs/Vecteur2.cc @@ -11,7 +11,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // @@ -47,117 +47,6 @@ using namespace std; //introduces namespace std #include "ConstMath.h" - -//// Constructeur fonction d'un Point -//Vecteur::Vecteur ( const Coordonnee& a) -//{ int n = a.Dimension(); -// #ifdef MISE_AU_POINT -// if ( n < 0) -// { -// cout << "\nErreur : taille invalide ! n= " << n << '\n'; -// cout << "Vecteur::Vecteur ( const Coordonnee& a) \n"; -// Sortie(1); -// }; -// #endif -// if ( n==0 ) -// // cas ou la taille selectionnee est nulle : initialisation identique a l'appel -// // du constructeur par defaut -// { taille=0; -// v=NULL; -// } -// else -// { v=new double [n]; // allocation de la place memoire -// taille=n; -// for (int i=0;i& a): }; // Constructeur de copie -Vecteur::Vecteur (const Vecteur& vec) -{ if ( vec.taille==0 ) - // cas ou le vecteur copie est vide : initialisation identique a l'appel - // du constructeur par defaut +Vecteur::Vecteur (const Vecteur& vec) : + memoire(vec.memoire) +{ + // --- cas d'un vecteur lié + if(!memoire) // cas où le vecteur ne gère pas sa mémoire + // on décide que le nouveau vecteur sera du même type + // donc positionné au même endroit, les grandeurs sont donc + // déjà identiques + {taille = vec.taille; + v = vec.v; + } + // --- fin cas d'un vecteur lié + else if ( vec.taille==0 ) + // cas ou le vecteur copie est vide : initialisation identique a l'appel + // du constructeur par defaut { v=NULL; taille=0; } - else - // cas ou le vecteur resultat est non affecte + else // cas normale + // cas ou le vecteur resultat est non affecte { v=new double [vec.taille]; taille=vec.taille; for (int i=0;i< taille;i++) diff --git a/tenseurs_mai99/Vecteurs/VeurPropre.cc b/tenseurs_mai99/Vecteurs/VeurPropre.cc index 877104f..9238df5 100644 --- a/tenseurs_mai99/Vecteurs/VeurPropre.cc +++ b/tenseurs_mai99/Vecteurs/VeurPropre.cc @@ -10,7 +10,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/tenseurs_mai99/Vecteurs/VeurPropre.h b/tenseurs_mai99/Vecteurs/VeurPropre.h index d66cc4c..ea3bbd4 100644 --- a/tenseurs_mai99/Vecteurs/VeurPropre.h +++ b/tenseurs_mai99/Vecteurs/VeurPropre.h @@ -9,7 +9,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultérieure. // -// Copyright (C) 1997-2021 Université Bretagne Sud (France) +// Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // diff --git a/unix/LaLIST.H b/unix/LaLIST.H index db922c1..d14a464 100755 --- a/unix/LaLIST.H +++ b/unix/LaLIST.H @@ -8,7 +8,7 @@ // // Herezh++ is distributed under GPL 3 license ou ultrieure. // -// Copyright (C) 1997-2021 Universit Bretagne Sud (France) +// Copyright (C) 1997-2022 Universit Bretagne Sud (France) // AUTHOR : Grard Rio // E-MAIL : gerardrio56@free.fr //