V 7.021 - 7.023

- modification des sorties post pour loi hypo 2D_C et 1D_C
- corr bug lecture fct_nD avec toutes les lois hypo isotropes
- corr bug sur le calcul de la compressibilité pour les loi hypo 2D_C
- première mise en place du calcul parallèle sur le contact
- ajout d'une fct nD pour gérer le niveau de commentaire sur LesContacts (indépendante de celle qui gère le niveau de commentaire concernant les éléments de contact)
- amélioration de la méthode d'initialisation du contact, utilisée en début d'incrément
This commit is contained in:
Gérard Rio 2024-01-30 20:55:48 +01:00
parent b670e8f9b8
commit a317216f06
29 changed files with 1850 additions and 499 deletions

View file

@ -1749,6 +1749,7 @@ bool Algori::RaidSmEner(LesMaillages * lesMail,Assemblage& Ass,Vecteur & vglobin
tempsRaidSmEner.Arret_du_comptage(); // fin comptage cpu
#ifdef UTILISATION_MPI
// récupération des grandeurs locales par le proc 0
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
@ -1794,7 +1795,26 @@ bool Algori::RaidSmEner(LesMaillages * lesMail,Assemblage& Ass,Vecteur & vglobin
nb_elem_deja_calcule++;
};
tempsRaidSmEner.Arret_du_comptage(); // fin comptage cpu
//
};
// maintenannt chaque proc i va transmettre au proc 0 les bilans
if (ParaGlob::Monde()->rank() != 0)
{
/* pour info, de plus il faut regarder plus haut le cas des intégralles...
on part de l'idée que c'est mieux de transmettre petit à petit les grandeurs globales pour quelles suivent le même processus de mise en global
pour chaqu proc i comme pour le proc 0, car l'utilisation de ces grandeurs peut éventuellement être nécessaire tout de suite après ...
energTotal.Inita(0.); // initialisation des énergies à 0
energHourglass=0.;energStabiliMembBiel=0.;
volume_total_matiere = 0.; // init
E_bulk = 0.; // init
P_bulk=0.; // init
if (pa.CalVolTotalEntreSurfaceEtPlansRef())
vol_total2D_avec_plan_ref.Inita(Coordonnee(ParaGlob::Dimension()));
*/
}
#endif
#ifdef UTILISATION_MPI
@ -2161,6 +2181,14 @@ bool Algori::RaidSmEnerContact(LesContacts * lesCont,Assemblage& Ass,Vecteur & v
}
// -- on transfert en global les énergies
Transfert_ParaGlob_energies_contact();
// affichage éventuelle de la force maxi de contact
// pas nécessaire ici car c'est fait dans le calcul des réactions de contact
// lesCont->Forces_contact_maxi(true);
// idem pour les gap N et tangentiel
// lesCont->Gap_contact_maxi(true);
if (permet_affichage >3) cout << "\n -- fin calcul second mmembre pour le contact " << flush;
if (permet_affichage >3) cout << "\n -- fin calcul second membre et raideur pour le contact " << flush;
tempsRaidSmEnerContact.Arret_du_comptage(); // temps cpu
@ -2222,8 +2250,11 @@ bool Algori::SecondMembreEnergContact(LesContacts * lesCont,Assemblage& Ass,Vect
if (ParaGlob::NiveauImpression() >= 10)
{ string entete = " affichage du second membre uniquement du au contact ";
vglobin.Affichage_ecran(entete);
};
//cout << vglobin << endl;
};
// -- on transfert en global les énergies
Transfert_ParaGlob_energies_contact();
// affichage éventuelle de la force maxi de contact
lesCont->Forces_contact_maxi(aff_iteration);
// idem pour les gap N et tangentiel

View file

@ -714,14 +714,16 @@ void AlgoriDynaExpli::Calcul_Equilibre(ParaGlob * paraGlob,LesMaillages * lesMai
if (pa.ContactType()) // réexamen du contact pour voir
// il faut mettre le contact ici, car il utilise le déplacement de t à tdt
{lesMail->Mise_a_jour_boite_encombrement_elem_front(TEMPS_tdt); //s'il n'y a pas
if (premier_calcul) {//double diam_mini = lesMail->Min_dist2Noeud_des_elements(TEMPS_t);
if (premier_calcul)
{//double diam_mini = lesMail->Min_dist2Noeud_des_elements(TEMPS_t);
//lesContacts->DefElemCont(2. * diam_mini); //0.1);
lesContacts->DefElemCont(delta_X.Max_val_abs());
premier_calcul=false;} // au début il n'y a pas de déplacement à priori, on prend 2. * le delta noeud mini
else
{ lesContacts->SuppressionDefinitiveElemInactif(); // on supprime les éléments inactifs testés à l'incr prec dans Actualisation()
lesContacts->Nouveau(delta_X.Max_val_abs()); // idem mais je pense plus rapide
};
lesContacts->DefElemCont(delta_X.Max_val_abs());
premier_calcul=false;
} // au début il n'y a pas de déplacement à priori, on prend 2. * le delta noeud mini
else
{ lesContacts->SuppressionDefinitiveElemInactif(); // on supprime les éléments inactifs testés à l'incr prec dans Actualisation()
lesContacts->Nouveau(delta_X.Max_val_abs()); // idem mais je pense plus rapide
};
};
// calcul des reactions de contact éventuelles (contact et frottement) et les puissances associées

View file

@ -258,9 +258,6 @@ void AlgoriNonDyna::InitAlgorithme(ParaGlob * paraGlob,LesMaillages * lesMail,
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
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
@ -817,6 +814,13 @@ void AlgoriNonDyna::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail
};
};
#ifdef UTILISATION_MPI
if (pa.ContactType())
{ temps_transfert_long_algo.Mise_en_route_du_comptage(); // comptage cpu
vglobin.Broadcast(0); // transfert à tous les proc
temps_transfert_long_algo.Arret_du_comptage(); // fin comptage cpu
};
#endif
// calcul des maxi des puissances internes
maxPuissInt = vglobin.Max_val_abs();
@ -832,8 +836,8 @@ void AlgoriNonDyna::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail
F_int_tdt = vglobin; // sauvegarde des forces généralisées intérieures
if (pa.ContactType() == 4) // si contact on passe les efforts aux noeuds
// on transfert les forces internes aux noeuds
lesMail->Quelconque_glob_vers_local(X1,F_int_tdt,typQ_gene_int);
// on transfert les forces internes aux noeuds
lesMail->Quelconque_glob_vers_local(X1,F_int_tdt,typQ_gene_int);
// mise en place du chargement impose sur le second membre
// et éventuellement sur la raideur en fonction de sur_raideur
@ -849,10 +853,22 @@ void AlgoriNonDyna::CalEquilibre(ParaGlob * paraGlob,LesMaillages * lesMail
// cas des efforts de contact, contribution second membre et matrice,
// suivant le type de contact on utilise ou on recalcule les reactions de contact éventuelles (contact et frottement)
if (pa.ContactType()) // et des énergies développées pendant le contact
// dans le cas où le calcul est inexploitable (pb dans le calcul) arrêt de la boucle
{
#ifdef UTILISATION_MPI
temps_transfert_long_algo.Mise_en_route_du_comptage(); // comptage cpu
vglobex.Broadcast(0);
temps_transfert_long_algo.Arret_du_comptage(); // fin comptage cpu
#endif
// dans le cas où le calcul est inexploitable (pb dans le calcul) arrêt de la boucle
if (!RaidSmEnerContact(lescontacts,Ass,vcontact,(*matglob))) break;
//cout << "\n debug AlgoNonDyna::CalEquilibre: vcontact => "; vcontact.Affiche();
// on globalise tout pour les forces externes généralisées
#ifdef UTILISATION_MPI
temps_transfert_long_algo.Mise_en_route_du_comptage(); // comptage cpu
vcontact.Broadcast(0);
temps_transfert_long_algo.Arret_du_comptage(); // fin comptage cpu
#endif
};
F_ext_tdt_prec = F_ext_tdt; // sauvegarde des valeurs de l'itération précédente
if (pa.ContactType())

View file

@ -491,7 +491,7 @@ bool Charge::ChargeSecondMembre_Ex_mecaSolid
#else // cas non //
{
// appel du calcul du second membre correspondant à la charge surfacique
Vecteur& SM = elem.SM_charge_surfacique_E_tdt(vforce,pt_fonct,ref.NumeroFA(ns),pa);
Vecteur SM = elem.SM_charge_surfacique_E_tdt(vforce,pt_fonct,ref.NumeroFA(ns),pa);
// assemblage du second membre
// il faut utiliser les noeuds et les ddlelement correspondant à la face chargée
const ElFrontiere* elfront = NULL; // init
@ -619,7 +619,7 @@ bool Charge::ChargeSecondMembre_Ex_mecaSolid
#else // cas non //
{ // appel du calcul du second membre correspondant à la charge de type pression
// ici on récupère une adresse car il n'y a pas de crainte d'écraser un vecteur déjà en cours
Vecteur& SM = elem.SM_charge_pression_E_tdt(press_ac,pt_fonct,ref.NumeroFA(ns),pa);
Vecteur SM = elem.SM_charge_pression_E_tdt(press_ac,pt_fonct,ref.NumeroFA(ns),pa);
// assemblage du second membre
// il faut utiliser les noeuds et les ddlelement correspondant à la face chargée
const ElFrontiere* elfront = NULL; // init
@ -770,7 +770,7 @@ bool Charge::ChargeSecondMembre_Ex_mecaSolid
#else // cas non //
{ // appel du calcul du second membre correspondant à la charge de type pression
// ici on récupère une adresse car il n'y a pas de crainte d'écraser un vecteur déjà en cours
Vecteur& SM = elem.SM_charge_presUniDir_E_tdt(press_uni,pt_fonct,ref.NumeroFA(ns),pa);
Vecteur SM = elem.SM_charge_presUniDir_E_tdt(press_uni,pt_fonct,ref.NumeroFA(ns),pa);
// assemblage du second membre
// il faut utiliser les noeuds et les ddlelement correspondant à la face chargée
const ElFrontiere* elfront = NULL; // init
@ -911,7 +911,7 @@ bool Charge::ChargeSecondMembre_Ex_mecaSolid
};
#else // cas non //
{ // appel du calcul du second membre correspondant à la charge lineique
Vecteur& SM = elem.SM_charge_lineique_E_tdt(f_lin,pt_fonct,ref.NumeroFA(ns),pa);
Vecteur SM = elem.SM_charge_lineique_E_tdt(f_lin,pt_fonct,ref.NumeroFA(ns),pa);
// assemblage du second membre
// il faut utiliser les noeuds et les ddlelement correspondant à la ligne chargée
const ElFrontiere* elfront = elem.Frontiere_lineique(ref.NumeroFA(ns)); // l'arete frontière
@ -1048,7 +1048,7 @@ bool Charge::ChargeSecondMembre_Ex_mecaSolid
{ // appel du calcul du second membre correspondant à la charge lineique
// appel du calcul du second membre correspondant à la charge lineique
// Vecteur f_lin = (tabFlineiqueSuiv_i.Coord()) * coeff ;
Vecteur SM& = elem.SM_charge_lineique_Suiv_E_tdt(f_lin,pt_fonct,ref.NumeroFA(ns),pa);
Vecteur SM = elem.SM_charge_lineique_Suiv_E_tdt(f_lin,pt_fonct,ref.NumeroFA(ns),pa);
// assemblage du second membre
// il faut utiliser les noeuds et les ddlelement correspondant à la ligne chargée
const ElFrontiere* elfront = elem.Frontiere_lineique(ref.NumeroFA(ns)); // l'arete frontière
@ -1184,7 +1184,7 @@ bool Charge::ChargeSecondMembre_Ex_mecaSolid
};
#else // cas non //
{// appel du calcul du second membre correspondant à la charge volumique
Vecteur SM& = elem.SM_charge_volumique_E_tdt(f_vol,pt_fonct,pa,volume_finale);
Vecteur SM = elem.SM_charge_volumique_E_tdt(f_vol,pt_fonct,pa,volume_finale);
// assemblage du second membre
// il faut utiliser les noeuds et les ddlelement correspondant à l'élément
assemb.AssemSM (vecglob,SM,elem.TableauDdl(),elem.Tab_noeud()); // assemblage
@ -1271,7 +1271,7 @@ bool Charge::ChargeSecondMembre_Ex_mecaSolid
}
};
#else // cas non //
{Vecteur SM& = elem.SM_charge_hydrostatique_E_tdt
{Vecteur SM = elem.SM_charge_hydrostatique_E_tdt
(N,p_hydro,ref.NumeroFA(ns),A,pa,sans_limitation) ;
// assemblage du second membre
// il faut utiliser les noeuds et les ddlelement correspondant à la face chargée
@ -1360,7 +1360,7 @@ bool Charge::ChargeSecondMembre_Ex_mecaSolid
};
#else // cas non //
{// appel du calcul du second membre correspondant aux efforts hydrodynamique
Vecteur SM& = elem.SM_charge_hydrodynamique_E_tdt(coefHydroDyna_i.Frot_fluid(),poidvol
Vecteur SM = elem.SM_charge_hydrodynamique_E_tdt(coefHydroDyna_i.Frot_fluid(),poidvol
,coefHydroDyna_i.Coef_aero_n(),ref.NumeroFA(ns),coeff_charge
,coefHydroDyna_i.Coef_aero_t(),pa) ;
// assemblage du second membre

View file

@ -90,7 +90,7 @@ void Distribution_CPU::Calcul_Equilibrage_initiale(const LesMaillages * lesMai
tab_indic.Change_taille(nb_proc_calcul,inter);
tab_indic_noeud.Change_taille(nb_proc_calcul,inter_noeud);
// il faut que le nombre d'élément soit au moins >= au nb de proc de calcul
// pour que l'on puisse distribuer au moin un elem par proc de calcul
// pour que l'on puisse distribuer au moins un elem par proc de calcul
if (total_elem < nb_proc_calcul)
{cout << "\n *** erreur en calcul d'equilibrage initial: le nombre de cpu "
<< " disponible pour le calcul \n est inferieur au nb d'element total ! on ne peut pas continuer "

View file

@ -56,6 +56,9 @@ LesMaillages::LesMaillages():
,pour_statistique_de_ddl()
,statistique_t_typeQuel(),statistique_t_typeQuel_t(),ref_statistique_t()
,pour_statistique_t_de_ddl()
#ifdef UTILISATION_MPI
,temps_transfert_long(),v_integ(),temps_serialisation()
#endif
{ cout << "\n erreur: ce constructeur ne doit pas etre utilise !!"
<< "\n LesMaillages::LesMaillages()";
@ -76,6 +79,9 @@ LesMaillages::LesMaillages(UtilLecture * ent,ParaGlob * para,LesReferences* Ref)
,pour_statistique_de_ddl()
,statistique_t_typeQuel(),statistique_t_typeQuel_t(),ref_statistique_t()
,pour_statistique_t_de_ddl()
#ifdef UTILISATION_MPI
,temps_transfert_long(),v_integ(),temps_serialisation()
#endif
{ lesRef = Ref;
// mise à jour de la map qui fait la liaison nom de maillage <=> numéro de maillage
lesRef->MiseAJourMap(mapNomMail);

View file

@ -922,7 +922,13 @@ class LesMaillages
Tableau <const Reference*> ref_statistique; // les références associées
// si la référence est nulle, cela signifie que la statistique
// est figée: sa valeur ne change pas
#ifdef UTILISATION_MPI
// cas d'un calcul parallèle: // passage des infos entre process
Temps_CPU_HZpp temps_transfert_long ;
Temps_CPU_HZpp temps_serialisation ;
Vecteur v_integ; // conteneur intermédiaire de transfert
#endif
//pour_statistique_de_ddl a la même dimension que ref_statistique
// 1) Dans le cas où ref_statistique(i) est une statistique de Ddl_enum_etendu
// pour_statistique_de_ddl(i) == le Ddl_enum_etendu

View file

@ -2126,147 +2126,356 @@ void LesMaillages::Integration()
{ // on passe en revue les références de volumes a intégrer
// Tableau <const Reference*> ref_integ_vol; // les références associées
#ifdef UTILISATION_MPI
int taill_v = 0; // pour le dimensionnement du transfert
#endif
// les références sont ordonnées par apparition dans le fichier .info
// des intégrales, ceci permet de repérer les bonnes grandeurs à cummuler
int taill = ref_integ_vol.Taille();
for (int rang_integ =1;rang_integ<= taill;rang_integ++)
if (ref_integ_vol(rang_integ) != NULL) // si null cela veut que l'on n'intègre pas
// l'intégrale stockée reste fixe pendant le calcul
{ const ReferenceNE * ref = ((ReferenceNE *) ref_integ_vol(rang_integ));
{const ReferenceNE * ref = ((ReferenceNE *) ref_integ_vol(rang_integ));
// initialisation du conteneur relatif à chaque ref
TypeQuelconque& TQ = integ_vol_typeQuel(rang_integ); // pour simplifier
// le conteneur qui contient le résultat globalisé
TypeQuelconque::Grandeur* g_TG = TQ.Grandeur_pointee();
g_TG->InitParDefaut(); // on initialise le conteneur
// cumule des valeurs: on récupère les infos à partir des éléments concernés
int ref_Taille=ref->Taille();
for (int jj= 1; jj<= ref_Taille; jj++)
{int nbb = ref->Numero(jj) ; // le numero de l'element dans le maillage
int nnn = ref->Nbmaille(); // le numero du maillage
// recup de l'element
Element * poi = & Element_LesMaille(nnn,nbb);
// demande a l'element des infos
const Tableau <TypeQuelconque>* tab_Q = poi->Integ_vol_typeQuel();
const Tableau <int>& index_integ = *(poi->Index_Integ_vol_typeQuel());
// la grandeur à cumuler c'est celle qui a le bon indexe
int indice = index_integ.Contient(rang_integ);
*(g_TG) += *((*tab_Q)(indice).Grandeur_pointee());
// -- les deux lignes d'avant sont a priori équivalentes aux lignes qui suivent
// int nb_integ = tab_Q->Taille(); // le nombre d'intégrale à considérer
// for (int iteg = 1;iteg <= nb_integ;iteg++)
// {if ((index_integ)(iteg)==rang_integ) // si l'index est négatif, on ne cumule pas
// // cela veut aussi dire que l'intégrale est figée
// // sinon si on a le bon index: on cumule l'intégrale
// {*(g_TG) += *((*tab_Q)(iteg).Grandeur_pointee());
// break;
// };
// };
#ifdef UTILISATION_MPI
taill_v += g_TG->NbMaxiNumeroOrdre(); // récup du nb maxi de numéros d'ordres
// en calcul parallèle, seule les proc i calculent les intégrales
if (ParaGlob::Monde()->rank() != 0)
{
#endif
// cumule des valeurs: on récupère les infos à partir des éléments concernés
int ref_Taille=ref->Taille();
for (int jj= 1; jj<= ref_Taille; jj++)
{int num_elem = ref->Numero(jj) ; // le numero de l'element dans le maillage
int num_mail = ref->Nbmaille(); // le numero du maillage
#ifdef UTILISATION_MPI
// on regarde si le proc i est concerné
if (ParaGlob::param->Element_concerner(num_mail,num_elem) )
#endif
{// recup de l'element
Element * poi = & Element_LesMaille(num_mail,num_elem);
// demande a l'element des infos
const Tableau <TypeQuelconque>* tab_Q = poi->Integ_vol_typeQuel();
const Tableau <int>& index_integ = *(poi->Index_Integ_vol_typeQuel());
// la grandeur à cumuler c'est celle qui a le bon indexe
int indice = index_integ.Contient(rang_integ);
*(g_TG) += *((*tab_Q)(indice).Grandeur_pointee());
};
// -- les deux lignes d'avant sont a priori équivalentes aux lignes qui suivent
// int nb_integ = tab_Q->Taille(); // le nombre d'intégrale à considérer
// for (int iteg = 1;iteg <= nb_integ;iteg++)
// {if ((index_integ)(iteg)==rang_integ) // si l'index est négatif, on ne cumule pas
// // cela veut aussi dire que l'intégrale est figée
// // sinon si on a le bon index: on cumule l'intégrale
// {*(g_TG) += *((*tab_Q)(iteg).Grandeur_pointee());
// break;
// };
// };
};
// maintenant il s'agit d'alimenter les grandeurs globales
// on récupère le pointeur correspondant à la grandeur correspondant au nom
// de référence
const string* nom_de_ref = g_TG->Nom_ref();
#ifdef MISE_AU_POINT
if (nom_de_ref == NULL)
{ cout << "\n *** pb dans l'integration !! "
<< " nom_de_ref est nul, on ne peut pas continuer "
<< "\n LesMaillages::Integration()"<<flush;
Sortie(1);
};
#endif
// récup du pointeur de conteneur
const void* pointe = (ParaGlob::param->GrandeurGlobal(*nom_de_ref));
#ifdef MISE_AU_POINT
if (pointe == NULL)
{ cout << "\n *** pb dans l'integration !! "
<< " la variable globale "<< (*nom_de_ref)
<< ", n'est pas disponible, on ne peut pas continuer "
<< "\n LesMaillages::Integration()"<<flush;
Sortie(1);
};
// maintenant il s'agit d'alimenter les grandeurs globales
// on récupère le pointeur correspondant à la grandeur correspondant au nom
// de référence
const string* nom_de_ref = g_TG->Nom_ref();
#ifdef MISE_AU_POINT
if (nom_de_ref == NULL)
{ cout << "\n *** pb dans l'integration !! "
<< " nom_de_ref est nul, on ne peut pas continuer "
<< "\n LesMaillages::Integration()"<<flush;
Sortie(1);
};
#endif
TypeQuelconque* gr_quelc = (TypeQuelconque*) (pointe);
*(gr_quelc->Grandeur_pointee()) = *(g_TG);
#ifdef UTILISATION_MPI
};
#endif
};
// même chose pour les intégrales en volume et en temps
int taill1 = ref_integ_vol_t.Taille();
for (int rang_integ =1;rang_integ<= taill1;rang_integ++)
if (ref_integ_vol_t(rang_integ) != NULL) // si null cela veut que l'on n'intègre pas
// l'intégrale stockée reste fixe pendant le calcul
{ const ReferenceNE * ref = ((ReferenceNE *) ref_integ_vol_t(rang_integ));
// initialisation du conteneur relatif à chaque ref
TypeQuelconque& TQ = integ_vol_t_typeQuel(rang_integ); // pour simplifier
// le conteneur qui contient le résultat globalisé
TypeQuelconque::Grandeur* g_TG = TQ.Grandeur_pointee();
g_TG->InitParDefaut(); // on initialise le conteneur
#ifdef UTILISATION_MPI
taill_v += g_TG->NbMaxiNumeroOrdre(); // récup du nb maxi de numéros d'ordres
// en calcul parallèle, seule les proc i calculent les intégrales
if (ParaGlob::Monde()->rank() != 0)
{
#endif
// récup du pointeur de conteneur
const void* pointe = (ParaGlob::param->GrandeurGlobal(*nom_de_ref));
#ifdef MISE_AU_POINT
if (pointe == NULL)
{ cout << "\n *** pb dans l'integration !! "
<< " la variable globale "<< (*nom_de_ref)
<< ", n'est pas disponible, on ne peut pas continuer "
<< "\n LesMaillages::Integration()"<<flush;
Sortie(1);
};
#endif
// on l'affecte
//// --- debug
//cout << "\n debug LesMaillages::Integration() "
// << " \n valeur de l'integral: " << g_TG->Nom_ref()
// << " :: " << *(g_TG) << flush;
//
//// -- fin debug
TypeQuelconque* gr_quelc = (TypeQuelconque*) (pointe);
*(gr_quelc->Grandeur_pointee()) = *(g_TG);
};
// même chose pour les intégrales en volume et en temps
int taill1 = ref_integ_vol_t.Taille();
for (int rang_integ =1;rang_integ<= taill1;rang_integ++)
if (ref_integ_vol_t(rang_integ) != NULL) // si null cela veut que l'on n'intègre pas
// l'intégrale stockée reste fixe pendant le calcul
{ const ReferenceNE * ref = ((ReferenceNE *) ref_integ_vol_t(rang_integ));
// initialisation du conteneur relatif à chaque ref
TypeQuelconque& TQ = integ_vol_t_typeQuel(rang_integ); // pour simplifier
// le conteneur qui contient le résultat globalisé
TypeQuelconque::Grandeur* g_TG = TQ.Grandeur_pointee();
g_TG->InitParDefaut(); // on initialise le conteneur
// cumule des valeurs: on récupère les infos à partir des éléments concernés
int ref_Taille=ref->Taille();
for (int jj= 1; jj<= ref_Taille; jj++)
{int nbb = ref->Numero(jj) ; // le numero de l'element dans le maillage
int nnn = ref->Nbmaille(); // le numero du maillage
// recup de l'element
Element * poi = & Element_LesMaille(nnn,nbb);
// demande a l'element des infos
const Tableau <TypeQuelconque>* tab_Q = poi->Integ_vol_t_typeQuel();
const Tableau <int>& index_integ = *(poi->Index_Integ_vol_t_typeQuel());
// la grandeur à cumuler c'est celle qui a le bon indexe
int indice = index_integ.Contient(rang_integ);
*(g_TG) += *((*tab_Q)(indice).Grandeur_pointee());
// cumule des valeurs: on récupère les infos à partir des éléments concernés
int ref_Taille=ref->Taille();
for (int jj= 1; jj<= ref_Taille; jj++)
{int num_elem = ref->Numero(jj) ; // le numero de l'element dans le maillage
int num_mail = ref->Nbmaille(); // le numero du maillage
#ifdef UTILISATION_MPI
// on regarde si le proc i est concerné
if (ParaGlob::param->Element_concerner(num_mail,num_elem) )
#endif
{// recup de l'element
Element * poi = & Element_LesMaille(num_mail,num_elem);
// demande a l'element des infos
const Tableau <TypeQuelconque>* tab_Q = poi->Integ_vol_t_typeQuel();
const Tableau <int>& index_integ = *(poi->Index_Integ_vol_t_typeQuel());
// la grandeur à cumuler c'est celle qui a le bon indexe
int indice = index_integ.Contient(rang_integ);
*(g_TG) += *((*tab_Q)(indice).Grandeur_pointee());
};
// -- les deux lignes d'avant sont a priori équivalentes aux lignes qui suivent
// int nb_integ = tab_Q->Taille(); // le nombre d'intégrale à considérer
// for (int iteg = 1;iteg <= nb_integ;iteg++)
// {if ((index_integ)(iteg)==rang_integ)
// // sinon si on a le bon index: on cumule l'intégrale
// {*(g_TG) += *((*tab_Q)(iteg).Grandeur_pointee());
// break;
// };
// };
// -- les deux lignes d'avant sont a priori équivalentes aux lignes qui suivent
// int nb_integ = tab_Q->Taille(); // le nombre d'intégrale à considérer
// for (int iteg = 1;iteg <= nb_integ;iteg++)
// {if ((index_integ)(iteg)==rang_integ)
// // sinon si on a le bon index: on cumule l'intégrale
// {*(g_TG) += *((*tab_Q)(iteg).Grandeur_pointee());
// break;
// };
// };
};
// maintenant il s'agit d'alimenter les grandeurs globales
// on récupère le pointeur correspondant à la grandeur correspondant au nom
// de référence
const string* nom_de_ref = g_TG->Nom_ref();
#ifdef MISE_AU_POINT
if (nom_de_ref == NULL)
{ cout << "\n *** pb dans l'integration !! "
<< " nom_de_ref est nul, on ne peut pas continuer "
<< "\n LesMaillages::Integration()"<<flush;
Sortie(1);
};
#endif
// récup du pointeur de conteneur
const void* pointe = (ParaGlob::param->GrandeurGlobal(*nom_de_ref));
#ifdef MISE_AU_POINT
if (pointe == NULL)
{ cout << "\n *** pb dans l'integration !! "
<< " la variable globale "<< (*nom_de_ref)
<< ", n'est pas disponible, on ne peut pas continuer "
<< "\n LesMaillages::Integration()"<<flush;
Sortie(1);
};
#endif
// on l'affecte
TypeQuelconque* gr_quelc = (TypeQuelconque*) (pointe);
*(gr_quelc->Grandeur_pointee()) = *(g_TG);
#ifdef UTILISATION_MPI
};
#endif
};
#ifdef UTILISATION_MPI
if (ParaGlob::Monde()->rank() != 0)
{temps_serialisation.Mise_en_route_du_comptage(); // comptage cpu
// on va transmettre au proc 0 les résultats pour que celui-ci globalise les informations
// on va utiliser un conteneur intermédiaire pour un unique transfert:
// 1) on commence par le re dimensionnner
v_integ.Change_taille(taill_v);
// on rempli le conteneur : c-a-d sérialisation uniquement des valeurs
int indice_v=1; // init
// 2) récup résultats intégrales de volumes
for (int rang_integ =1;rang_integ<= taill;rang_integ++)
if (ref_integ_vol(rang_integ) != NULL) // si null cela veut que l'on n'intègre pas
// l'intégrale stockée reste fixe pendant le calcul
{ // initialisation du conteneur relatif à chaque ref
TypeQuelconque& TQ = integ_vol_typeQuel(rang_integ); // pour simplifier
// le conteneur qui contient le résultat globalisé
TypeQuelconque::Grandeur* g_TG = TQ.Grandeur_pointee();
int nb_ordre = g_TG->NbMaxiNumeroOrdre(); // récup du nb maxi de numéros d'ordres
for (int i=1;i<= nb_ordre;i++,indice_v++)
v_integ(indice_v) = g_TG->GrandeurNumOrdre(i);
};
// maintenant il s'agit d'alimenter les grandeurs globales
// 3) récup résultats intégrales en volume et en temps
for (int rang_integ =1;rang_integ<= taill1;rang_integ++)
if (ref_integ_vol_t(rang_integ) != NULL) // si null cela veut que l'on n'intègre pas
// l'intégrale stockée reste fixe pendant le calcul
{ // initialisation du conteneur relatif à chaque ref
TypeQuelconque& TQ = integ_vol_t_typeQuel(rang_integ); // pour simplifier
// le conteneur qui contient le résultat globalisé
TypeQuelconque::Grandeur* g_TG = TQ.Grandeur_pointee();
int nb_ordre = g_TG->NbMaxiNumeroOrdre(); // récup du nb maxi de numéros d'ordres
for (int i=1;i<= nb_ordre;i++,indice_v++)
v_integ(indice_v) = g_TG->GrandeurNumOrdre(i);
};
temps_serialisation.Arret_du_comptage(); // fin comptage cpu
temps_transfert_long.Mise_en_route_du_comptage(); // comptage cpu
// 4) transfert sans attente au proc 0
mpi::request reqs1 = ParaGlob::Monde()->isend(0, 50, v_integ);
temps_transfert_long.Arret_du_comptage(); // comptage cpu
}
else // cas du proc 0
{// on récupère les infos
// les conteneurs ont déjà été initialisé pendant le calcul de taill_v
// on récupère le pointeur correspondant à la grandeur correspondant au nom
// de référence
const string* nom_de_ref = g_TG->Nom_ref();
#ifdef MISE_AU_POINT
if (nom_de_ref == NULL)
{ cout << "\n *** pb dans l'integration !! "
<< " nom_de_ref est nul, on ne peut pas continuer "
<< "\n LesMaillages::Integration()"<<flush;
Sortie(1);
};
#endif
// récup du pointeur de conteneur
const void* pointe = (ParaGlob::param->GrandeurGlobal(*nom_de_ref));
#ifdef MISE_AU_POINT
if (pointe == NULL)
{ cout << "\n *** pb dans l'integration !! "
<< " la variable globale "<< (*nom_de_ref)
<< ", n'est pas disponible, on ne peut pas continuer "
<< "\n LesMaillages::Integration()"<<flush;
Sortie(1);
// on commence par le re dimensionnner le conteneur de transfert
v_integ.Change_taille(taill_v);
int nb_proc_terminer = 0; // permettra de terminer
while (nb_proc_terminer < (ParaGlob::Monde()->size()-1)) // gérer par les valeurs de tyfront
{ // on récupère un résultat de cpu i
temps_transfert_long.Mise_en_route_du_comptage(); // comptage cpu
mpi::request reqs2 = v_integ.Irecup_MPI(mpi::any_source, 50);
reqs2.wait(); // on attend que le conteneur soit rempli
temps_transfert_long.Arret_du_comptage(); // fin comptage cpu
temps_serialisation.Mise_en_route_du_comptage(); // comptage cpu
// désérialisation et ajout pour globaliser
int indice_v=1; // init
// 1) cas des intégrales de volumes
for (int rang_integ =1;rang_integ<= taill;rang_integ++)
if (ref_integ_vol(rang_integ) != NULL) // si null cela veut que l'on n'intègre pas
// l'intégrale stockée reste fixe pendant le calcul
{ // désérialisation du conteneur relatif à chaque ref
TypeQuelconque& TQ = integ_vol_typeQuel(rang_integ); // pour simplifier
// le conteneur qui contient le résultat globalisé
TypeQuelconque::Grandeur* g_TG = TQ.Grandeur_pointee();
int nb_ordre = g_TG->NbMaxiNumeroOrdre(); // récup du nb maxi de numéros d'ordres
for (int i=1;i<= nb_ordre;i++,indice_v++)
{double val_modifier = g_TG->GrandeurNumOrdre(i)+v_integ(indice_v);
g_TG->Change_GrandeurNumOrdre(i,val_modifier); // modification
};
};
// 2) cas des intégrales en volume et temps
for (int rang_integ =1;rang_integ<= taill1;rang_integ++)
if (ref_integ_vol_t(rang_integ) != NULL) // si null cela veut que l'on n'intègre pas
// l'intégrale stockée reste fixe pendant le calcul
{ // désérialisation du conteneur relatif à chaque ref
TypeQuelconque& TQ = integ_vol_t_typeQuel(rang_integ); // pour simplifier
// le conteneur qui contient le résultat globalisé
TypeQuelconque::Grandeur* g_TG = TQ.Grandeur_pointee();
int nb_ordre = g_TG->NbMaxiNumeroOrdre(); // récup du nb maxi de numéros d'ordres
for (int i=1;i<= nb_ordre;i++,indice_v++)
{double val_modifier = g_TG->GrandeurNumOrdre(i)+v_integ(indice_v);
g_TG->Change_GrandeurNumOrdre(i,val_modifier); // modification
};
};
nb_proc_terminer++;
temps_serialisation.Arret_du_comptage(); // fin comptage cpu
};
#endif
// on l'affecte
TypeQuelconque* gr_quelc = (TypeQuelconque*) (pointe);
*(gr_quelc->Grandeur_pointee()) = *(g_TG);
};
// maintenant on alimente les grandeurs globales, et on rempli le conteneur de transfert
// pour passer les infos aux proc i
// on rempli le conteneur : c-a-d sérialisation uniquement des valeurs
int indice_v=1; // init
// 1) cas des intégrales de volumes
for (int rang_integ =1;rang_integ<= taill;rang_integ++)
if (ref_integ_vol(rang_integ) != NULL) // si null cela veut que l'on n'intègre pas
// l'intégrale stockée reste fixe pendant le calcul
{ TypeQuelconque& TQ = integ_vol_typeQuel(rang_integ); // pour simplifier
// le conteneur qui contient le résultat globalisé
TypeQuelconque::Grandeur* g_TG = TQ.Grandeur_pointee();
int nb_ordre = g_TG->NbMaxiNumeroOrdre(); // récup du nb maxi de numéros d'ordres
for (int i=1;i<= nb_ordre;i++,indice_v++)
v_integ(indice_v) = g_TG->GrandeurNumOrdre(i);
// on récupère le pointeur correspondant à la grandeur correspondant au nom
// de référence
const string* nom_de_ref = g_TG->Nom_ref();
// récup du pointeur de conteneur
const void* pointe = (ParaGlob::param->GrandeurGlobal(*nom_de_ref));
TypeQuelconque* gr_quelc = (TypeQuelconque*) (pointe);
*(gr_quelc->Grandeur_pointee()) = *(g_TG);
};
// 2) cas des intégrales en volume et temps
for (int rang_integ =1;rang_integ<= taill1;rang_integ++)
if (ref_integ_vol_t(rang_integ) != NULL) // si null cela veut que l'on n'intègre pas
// l'intégrale stockée reste fixe pendant le calcul
{ // désérialisation du conteneur relatif à chaque ref
TypeQuelconque& TQ = integ_vol_t_typeQuel(rang_integ); // pour simplifier
// le conteneur qui contient le résultat globalisé
TypeQuelconque::Grandeur* g_TG = TQ.Grandeur_pointee();
int nb_ordre = g_TG->NbMaxiNumeroOrdre(); // récup du nb maxi de numéros d'ordres
for (int i=1;i<= nb_ordre;i++,indice_v++)
v_integ(indice_v) = g_TG->GrandeurNumOrdre(i);
// on récupère le pointeur correspondant à la grandeur correspondant au nom
// de référence
const string* nom_de_ref = g_TG->Nom_ref();
// récup du pointeur de conteneur
const void* pointe = (ParaGlob::param->GrandeurGlobal(*nom_de_ref));
TypeQuelconque* gr_quelc = (TypeQuelconque*) (pointe);
*(gr_quelc->Grandeur_pointee()) = *(g_TG);
};
};
// le proc 0 transmet aux proc i
temps_transfert_long.Mise_en_route_du_comptage(); // comptage cpu
v_integ.Broadcast(0);
temps_transfert_long.Arret_du_comptage(); // fin comptage cpu
// pour les proc i, il faut mettre à jour les variables globales
if (ParaGlob::Monde()->rank() != 0)
{temps_serialisation.Mise_en_route_du_comptage(); // comptage cpu
// on désérialise uniquement les valeurs
// désérialisation
int indice_v=1; // init
// 1) cas des intégrales de volumes
for (int rang_integ =1;rang_integ<= taill;rang_integ++)
if (ref_integ_vol(rang_integ) != NULL) // si null cela veut que l'on n'intègre pas
// l'intégrale stockée reste fixe pendant le calcul
{ // désérialisation du conteneur relatif à chaque ref
TypeQuelconque& TQ = integ_vol_typeQuel(rang_integ); // pour simplifier
// le conteneur qui contient le résultat globalisé
TypeQuelconque::Grandeur* g_TG = TQ.Grandeur_pointee();
int nb_ordre = g_TG->NbMaxiNumeroOrdre(); // récup du nb maxi de numéros d'ordres
for (int i=1;i<= nb_ordre;i++,indice_v++)
g_TG->Change_GrandeurNumOrdre(i,v_integ(indice_v)); // modification
// on récupère le pointeur correspondant à la grandeur correspondant au nom
// de référence
const string* nom_de_ref = g_TG->Nom_ref();
// récup du pointeur de conteneur
const void* pointe = (ParaGlob::param->GrandeurGlobal(*nom_de_ref));
TypeQuelconque* gr_quelc = (TypeQuelconque*) (pointe);
*(gr_quelc->Grandeur_pointee()) = *(g_TG);
};
// 2) cas des intégrales en volume et temps
for (int rang_integ =1;rang_integ<= taill1;rang_integ++)
if (ref_integ_vol_t(rang_integ) != NULL) // si null cela veut que l'on n'intègre pas
// l'intégrale stockée reste fixe pendant le calcul
{ // désérialisation du conteneur relatif à chaque ref
TypeQuelconque& TQ = integ_vol_t_typeQuel(rang_integ); // pour simplifier
// le conteneur qui contient le résultat globalisé
TypeQuelconque::Grandeur* g_TG = TQ.Grandeur_pointee();
int nb_ordre = g_TG->NbMaxiNumeroOrdre(); // récup du nb maxi de numéros d'ordres
for (int i=1;i<= nb_ordre;i++,indice_v++)
g_TG->Change_GrandeurNumOrdre(i,v_integ(indice_v)); // modification
// on récupère le pointeur correspondant à la grandeur correspondant au nom
// de référence
const string* nom_de_ref = g_TG->Nom_ref();
// récup du pointeur de conteneur
const void* pointe = (ParaGlob::param->GrandeurGlobal(*nom_de_ref));
TypeQuelconque* gr_quelc = (TypeQuelconque*) (pointe);
*(gr_quelc->Grandeur_pointee()) = *(g_TG);
};
temps_serialisation.Arret_du_comptage(); // fin comptage cpu
}
#endif
};

View file

@ -1504,8 +1504,11 @@ void Noeud::Met_en_service_ddl()
// changement du statut de variable à donnée pour un tableau d'enum de ddl
void Noeud::ChangeVariable_a_Donnee(const Tableau<Enum_ddl>& taben)
{ int tabenTaille = taben.Taille();
for (int i = 1; i<=tabenTaille; i++)
tab_ddl(Existe(taben(i))).ChangeVariable_a_Donnee();
for (int i = 1; i<=tabenTaille; i++)
{int exist = Existe(taben(i));
if (exist)
tab_ddl(exist).ChangeVariable_a_Donnee();
};
MiseAjourActif();
};
@ -1513,7 +1516,10 @@ void Noeud::ChangeVariable_a_Donnee(const Tableau<Enum_ddl>& taben)
void Noeud::ChangeDonnee_a_Variable(const Tableau<Enum_ddl>& taben)
{ int tabenTaille = taben.Taille();
for (int i = 1; i<=tabenTaille; i++)
tab_ddl(Existe(taben(i))).ChangeVariable_a_Donnee();
{int exist = Existe(taben(i));
if (exist)
tab_ddl(exist).ChangeVariable_a_Donnee();
};
MiseAjourActif();
};
@ -1523,7 +1529,10 @@ void Noeud::ChangeDonnee_a_Variable(const Tableau<Enum_ddl>& taben)
void Noeud::ChangeToutesLesConditions(const Tableau<Ddl>& ta)
{ int taTaille = ta.Taille();
for (int i = 1; i<=taTaille; i++)
{ tab_ddl(Existe(ta(i).Id_nom())).CopieToutesLesConditions(ta(i).Retour_Fixe());};
{int exist = Existe(ta(i).Id_nom());
if (exist)
tab_ddl(exist).CopieToutesLesConditions(ta(i).Retour_Fixe());
};
MiseAjourActif();
};
@ -1537,7 +1546,10 @@ void Noeud::ChangeStatut(int cas,Enum_ddl enuta)
int tenuTaille = tenu.Taille();
Enum_boolddl enubold=tab_ddl(Existe(enuta)).Retour_Fixe();
for (int i = 1; i<=tenuTaille; i++)
{ tab_ddl(Existe(tenu(i))).CopieToutesLesConditions(enubold);};
{int exist = Existe(tenu(i));
if (exist)
tab_ddl(exist).CopieToutesLesConditions(enubold);
};
MiseAjourActif();
};
@ -1549,7 +1561,10 @@ void Noeud::ChangeStatut(int cas,Enum_boolddl enubold)
Tableau <Enum_ddl> tenu= Combinaison(cas);
int tenuTaille = tenu.Taille();
for (int i = 1; i<=tenuTaille; i++)
{ tab_ddl(Existe(tenu(i))).CopieToutesLesConditions(enubold);};
{int exist = Existe(tenu(i));
if (exist)
tab_ddl(exist).CopieToutesLesConditions(enubold);
};
MiseAjourActif();
};

View file

@ -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 = "7.020" ; // numéro de version du logiciel
string ParaGlob::nbVersion = "7.023" ; // 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

View file

@ -203,6 +203,7 @@ ParaAlgoControle::ParaAlgoControle() :
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
fct_niveau_commentaire_lescontacts = "_";// pas de fonction par défaut
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
@ -317,6 +318,7 @@ ParaAlgoControle::ParaAlgoControle(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),
fct_niveau_commentaire_lescontacts(p.fct_niveau_commentaire_lescontacts),
niveau_commentaire_contact(p.niveau_commentaire_contact),
fct_niveau_commentaire_contact(p.fct_niveau_commentaire_contact),
optimisation_numerotation(p.optimisation_numerotation),
@ -430,6 +432,7 @@ ParaAlgoControle& ParaAlgoControle::operator= (const ParaAlgoControle& p)
nbDecolAutorise = p.nbDecolAutorise; typeDeDecolement = p.typeDeDecolement; nb_glissant = p.nb_glissant;
niveau_commentaire_lescontacts = p.niveau_commentaire_lescontacts;
fct_niveau_commentaire_lescontacts = p.fct_niveau_commentaire_lescontacts;
niveau_commentaire_contact = p.niveau_commentaire_contact;
fct_niveau_commentaire_contact = p.fct_niveau_commentaire_contact;
@ -1108,8 +1111,15 @@ void ParaAlgoControle::Lecture_paraAlgoControle(UtilLecture & entreePrinc)
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 ");
}
{if (strstr(entreePrinc.tablcar,"FCT_ND_NIVEAU_COMMENTAIRE_LESCONTACTS")!=NULL)
{*(entreePrinc.entree) >> nom_inter >> fct_niveau_commentaire_lescontacts;
niveau_commentaire_lescontacts = -1; // valeur négative arbitraire
}
else
{niveau_commentaire_lescontacts= (int) entreePrinc.lect_avec_const_double_utilisateur("NIVEAU_COMMENTAIRE_LESCONTACTS ");
fct_niveau_commentaire_lescontacts = "_";
};
}
else if (nom == "NIVEAU_COMMENTAIRE_CONTACT")
{if (strstr(entreePrinc.tablcar,"FCT_ND_NIVEAU_COMMENTAIRE_CONTACT")!=NULL)
{*(entreePrinc.entree) >> nom_inter >> fct_niveau_commentaire_contact;
@ -1460,7 +1470,8 @@ 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_LESCONTACTS "<< niveau_commentaire_lescontacts << "\n";
sort << "NIVEAU_COMMENTAIRE_LESCONTACTS "<< niveau_commentaire_lescontacts
<< "FCT_ND_NIVEAU_COMMENTAIRE_LESCONTACT"<< fct_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";
@ -1671,7 +1682,7 @@ 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_lescontacts >> toto >> fct_niveau_commentaire_lescontacts;
ent >> toto >> niveau_commentaire_contact >> toto >> fct_niveau_commentaire_contact;
ent >> toto >> optimisation_numerotation;
// 7) paramètres liès aux énergies
@ -1879,7 +1890,8 @@ 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_LESCONTACTS " << niveau_commentaire_lescontacts << "\n";
cout << "NIVEAU_COMMENTAIRE_LESCONTACTS " << niveau_commentaire_lescontacts
<< "FCT_ND_NIVEAU_COMMENTAIRE_LESCONTACTS"<< fct_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";
@ -2528,7 +2540,7 @@ void ParaAlgoControle::Info_commande_ParaAlgoControle(UtilLecture& entreePrinc)
<< "\n#--------------------------- "
<< "\n# PARAMETRE | VALEUR | "
<< "\n#--------------------------- ";
Tableau<bool> tab_modif(36,false); // indique qu'est-ce qui a été modifié
Tableau<bool> tab_modif(37,false); // indique qu'est-ce qui a été modifié
//On va proposer un menu
string repa=" ";
cout << "\n --- controle generaux ------ ";
@ -2572,16 +2584,17 @@ void ParaAlgoControle::Info_commande_ParaAlgoControle(UtilLecture& entreePrinc)
<< "\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 (36) FCT_ND_NIVEAU_COMMENTAIRE_LESCONTACTS "
<< "\n (37 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 = 36;
if (repa == "?") numa = 37;
if (!((numa >= 0)&&(numa<=36)))
{ cout << "\n Erreur on attendait un entier entre 0 et 36 !!, "
if (!((numa >= 0)&&(numa<=37)))
{ cout << "\n Erreur on attendait un entier entre 0 et 37 !!, "
<< "\n redonnez une bonne valeur"
<< "\n ou taper f ou 0 pour arreter le programme";
};
@ -2614,13 +2627,13 @@ void ParaAlgoControle::Info_commande_ParaAlgoControle(UtilLecture& entreePrinc)
{ cout << " *** erreur: valeur non numerique !! ";};
break;
}
case 26:case 27:case 28:case 29:case 30:case 31:case 32:case 33:case 34:case 35:
case 26:case 27:case 28:case 29:case 30:case 31:case 32:case 33:case 34:case 35:case 36:
{ cout << "\n donner le nom de la fonction nD (un string ) ? ";
val_string= lect_chaine();cout << " nom lue ="<<val_string;
break;
}
case 36:
case 37:
{ cout << "\n PRECISION_POINT_INTERNE_DEBUT: precision du test: point interieur ?, "
<< " avant le debut des calculs "
<< "\n FACT_POUR_RAYON_ACCOSTAGE: facteur multiplicatif du deplacement maxi entre t et tdt"
@ -2698,6 +2711,8 @@ void ParaAlgoControle::Info_commande_ParaAlgoControle(UtilLecture& entreePrinc)
case 33: { fct_nD_tangentielle_borne_regularisation = val_string;tab_modif(numa)=true;break;}
case 34: { fct_nD_force_tangentielle_noeud_maxi = val_string;tab_modif(numa)=true;break;}
case 35: { fct_niveau_commentaire_contact = val_string;tab_modif(numa)=true;break;}
case 36: { fct_niveau_commentaire_lescontacts = val_string;tab_modif(numa)=true;break;}
default: break;
};
// écriture
@ -2716,7 +2731,7 @@ void ParaAlgoControle::Info_commande_ParaAlgoControle(UtilLecture& entreePrinc)
};
}; //-- fin du while interne
// écriture des paramètres de contrôle
for (int i=1;i<=35;i++)
for (int i=1;i<=36;i++)
if (tab_modif(i))
{switch (i)
{ case 1: { sort << "\n PRECISION_POINT_INTERNE_DEBUT "<< prec_pt_int_deb;break;}
@ -2754,6 +2769,8 @@ void ParaAlgoControle::Info_commande_ParaAlgoControle(UtilLecture& entreePrinc)
case 33: { sort << "\n TANGENTIELLE_BORNE_REGULARISATION FCT_ND_TANGENTIELLE_BORNE_REGULARISATION "<< fct_nD_tangentielle_borne_regularisation ;break;}
case 34: { sort << "\n FORCE_TANGENTIELLE_NOEUD_MAXI FCT_ND_FORCE_TANGENTIELLE_NOEUD_MAXI "<< fct_nD_force_tangentielle_noeud_maxi ;break;}
case 35: { sort << "\n NIVEAU_COMMENTAIRE_CONTACT FCT_ND_NIVEAU_COMMENTAIRE_CONTACT "<< fct_niveau_commentaire_contact ;break;}
case 36: { sort << "\n NIVEAU_COMMENTAIRE_LESCONTACTS FCT_ND_NIVEAU_COMMENTAIRE_LESCONTACTS "
<< fct_niveau_commentaire_lescontacts ;break;}
default: break;
};
};

View file

@ -390,9 +390,13 @@ class ParaAlgoControle
int Nb_moy_glissant() const {return nb_glissant;};
// retourne le niveau de commentaire entre 0 et 10, pour la gestion globale
// du contact
// du contact (class LesContacts)
// le niveau utilisé est a priori le max du niveau général et de celui-ci
int Niveau_commentaire_LesContact() const {return niveau_commentaire_lescontacts;};
// ramène un string décrivant une fonction nD de pilotage équivalente
// = "_" si aucune fonction n'est définit
string Fct_niveau_commentaire_LesContact() const {return fct_niveau_commentaire_lescontacts;};
// retourne le niveau de commentaire entre 0 et 10, pour les algo de contact
// : concerne les éléments de contact
// le niveau utilisé est a priori le max du niveau général et de celui-ci
@ -656,6 +660,7 @@ class ParaAlgoControle
int nb_glissant; // le nombre de positions successives du noeud esclave, utilisé pour faire une moyenne glissante
int niveau_commentaire_lescontacts; // de 0 à 10: niveau des commentaires pour la gestion globale du contact: i.e. LesContacts
string fct_niveau_commentaire_lescontacts; // fct nD dans le cas d'une valeur pilotée
int niveau_commentaire_contact; // de 0 à 10: niveau des commentaires dans les algo de contact: niveau élément de contact
string fct_niveau_commentaire_contact; // fct nD dans le cas d'une valeur pilotée

View file

@ -142,6 +142,7 @@ class TypeQuelconque
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
virtual double GrandeurNumOrdre(int num) const =0;
virtual void Change_GrandeurNumOrdre(int num, const double& val) =0; // modification
virtual int NbMaxiNumeroOrdre() const = 0; // récup du nb maxi de numéros d'ordres
virtual void Grandeur_brut(ostream & sort,int nbcar) const =0; // sortie de la grandeur brut sur sort
// ramène le type de grandeur associée de la grandeur de base, car

View file

@ -167,6 +167,11 @@ double Grandeur_defaut::GrandeurNumOrdre(int ) const
<< "\n GrandeurNumOrdre(..";
return 0.;
};
// modification
void Grandeur_defaut::Change_GrandeurNumOrdre(int num, const double& val)
{ cout << "\n erreur! grandeur par defaut: TypeQuelconque::Grandeur::Change_GrandeurNumOrdre"
<< "\n GrandeurNumOrdre(..";
};
// récup du nb maxi de numéros d'ordres
int Grandeur_defaut::NbMaxiNumeroOrdre() const
{ cout << "\n erreur! grandeur par defaut: TypeQuelconque::Grandeur::Grandeur_defaut"
@ -333,11 +338,29 @@ double Grandeur_TenseurHH::GrandeurNumOrdre(int n) const
return tens(tens.idx_i(n),tens.idx_j(n));break;}
default:
cout << "\n erreur dimension du tenseur non defini !"
<< "\n Grandeur_TenseurHH::NbMaxiNumeroOrdre()";
<< "\n Grandeur_TenseurHH::GrandeurNumOrdre()";
Sortie(1);
};
return 0.; // pour taire le warning
};
// modification
void Grandeur_TenseurHH::Change_GrandeurNumOrdre(int n, const double& val)
{ switch (ptTens->Dimension())
{case -1: case 1: (*ptTens).Coor(1,1)=val;break;
case -2:{Tenseur_ns2HH& tens = *((Tenseur_ns2HH*) ptTens);
tens.Coor(tens.idx_i(n),tens.idx_j(n))=val;break;}
case 2: {Tenseur2HH& tens = *((Tenseur2HH*) ptTens);
tens.Coor(tens.idx_i(n),tens.idx_j(n))=val;break;}
case -3:{Tenseur_ns3HH& tens = *((Tenseur_ns3HH*) ptTens);
tens.Coor(tens.idx_i(n),tens.idx_j(n))=val;break;}
case 3: {Tenseur3HH& tens = *((Tenseur3HH*) ptTens);
tens.Coor(tens.idx_i(n),tens.idx_j(n))=val;break;}
default:
cout << "\n erreur dimension du tenseur non defini !"
<< "\n Grandeur_TenseurHH::Change_GrandeurNumOrdre()";
Sortie(1);
};
};
// récup du nb maxi de numéros d'ordres
int Grandeur_TenseurHH::NbMaxiNumeroOrdre() const
{ switch (ptTens->Dimension())
@ -527,6 +550,24 @@ double Grandeur_TenseurBB::GrandeurNumOrdre(int n) const
};
return 0.; // pour taire le warning
};
// modification
void Grandeur_TenseurBB::Change_GrandeurNumOrdre(int n, const double& val)
{ switch (ptTens->Dimension())
{case -1: case 1: (*ptTens).Coor(1,1)=val;break;
case -2:{Tenseur_ns2BB& tens = *((Tenseur_ns2BB*) ptTens);
tens.Coor(tens.idx_i(n),tens.idx_j(n))=val;break;}
case 2: {Tenseur2BB& tens = *((Tenseur2BB*) ptTens);
tens.Coor(tens.idx_i(n),tens.idx_j(n))=val;break;}
case -3:{Tenseur_ns3BB& tens = *((Tenseur_ns3BB*) ptTens);
tens.Coor(tens.idx_i(n),tens.idx_j(n))=val;break;}
case 3: {Tenseur3BB& tens = *((Tenseur3BB*) ptTens);
tens.Coor(tens.idx_i(n),tens.idx_j(n))=val;break;}
default:
cout << "\n erreur dimension du tenseur non defini !"
<< "\n Grandeur_TenseurBB::Change_GrandeurNumOrdre()";
Sortie(1);
};
};
// récup du nb maxi de numéros d'ordres
int Grandeur_TenseurBB::NbMaxiNumeroOrdre() const
{ switch (ptTens->Dimension())
@ -710,6 +751,20 @@ double Grandeur_TenseurBH::GrandeurNumOrdre(int n) const
};
return 0.; // pour taire le warning
};
// modification
void Grandeur_TenseurBH::Change_GrandeurNumOrdre(int n, const double& val)
{ switch (ptTens->Dimension())
{case 1: (*ptTens).Coor(1,1)=val;break;
case 2: {Tenseur2BH& tens = *((Tenseur2BH*) ptTens);
tens.Coor(tens.idx_i(n),tens.idx_j(n))=val;break;}
case 3: {Tenseur3BH& tens = *((Tenseur3BH*) ptTens);
tens.Coor(tens.idx_i(n),tens.idx_j(n))=val;break;}
default:
cout << "\n erreur dimension du tenseur non defini !"
<< "\n Grandeur_TenseurBH::Change_GrandeurNumOrdre()";
Sortie(1);
};
};
// récup du nb maxi de numéros d'ordres
int Grandeur_TenseurBH::NbMaxiNumeroOrdre() const
{ switch (ptTens->Dimension())
@ -987,6 +1042,16 @@ double Tab_Grandeur_TenseurHH::GrandeurNumOrdre(int n) const
int r_div = (n-1)%nbpartenseur+1;
return tabTens(indice_tableau)->GrandeurNumOrdre(r_div);
};
// modification
void Tab_Grandeur_TenseurHH::Change_GrandeurNumOrdre(int n, const double& val)
{ int taille = tabTens.Taille();
if (taille != 0) // si tableau vide on ne fait rien
{int nbpartenseur=tabTens(1)->NbMaxiNumeroOrdre();
int indice_tableau = (n-1)/nbpartenseur + 1;
int r_div = (n-1)%nbpartenseur+1;
tabTens(indice_tableau)->Change_GrandeurNumOrdre(r_div,val);
};
};
// récup du nb maxi de numéros d'ordres
int Tab_Grandeur_TenseurHH::NbMaxiNumeroOrdre() const
{ if (tabTens.Taille() == 0) return 0; // cas d'un tableau vide
@ -1275,6 +1340,17 @@ double Tab2_Grandeur_TenseurHH::GrandeurNumOrdre(int n) const
int r_div = (r_i-1)%nbpartenseur+1;
return tabTens(in_i,in_j)->GrandeurNumOrdre(r_div);
};
// modification
void Tab2_Grandeur_TenseurHH::Change_GrandeurNumOrdre(int n, const double& val)
{ int taille1 = tabTens.Taille1();int taille2 = tabTens.Taille2();
if ((taille1 == 0) || (taille2==0)) return ; // cas d'un tableau vide, on ne fait rien
int nbpartenseur=tabTens(1,1)->NbMaxiNumeroOrdre();
int in_i = (n-1)/(nbpartenseur*taille2) + 1;
int r_i = (n-1)%(nbpartenseur*taille2)+1; // reste de la première division
int in_j = (r_i-1)/nbpartenseur + 1;
int r_div = (r_i-1)%nbpartenseur+1;
tabTens(in_i,in_j)->Change_GrandeurNumOrdre(r_div,val);
};
// récup du nb maxi de numéros d'ordres
int Tab2_Grandeur_TenseurHH::NbMaxiNumeroOrdre() const
{ if ((tabTens.Taille1() == 0)||(tabTens.Taille2() == 0)) return 0; // cas d'un tableau vide
@ -1620,6 +1696,12 @@ double Tab_Grandeur_scalaire_double::GrandeurNumOrdre(int num) const
if ((num <=0) || (num > taille)) {return 0.;}
else return tab_val(num).val;
};
// modification
void Tab_Grandeur_scalaire_double::Change_GrandeurNumOrdre(int num, const double& val)
{int taille = tab_val.Taille();
if ((num <=0) || (num > taille)) {return ;} // on ne fait rien
else tab_val(num).val=val;
};
void Tab_Grandeur_scalaire_double::Grandeur_brut(ostream & sort,int nbcar) const
{int taille = tab_val.Taille();
@ -1768,6 +1850,13 @@ void Grandeur_coordonnee::operator-= (const Grandeur& a)
double Grandeur_coordonnee::GrandeurNumOrdre(int num) const
{if((num>0)&&(num<=co.Dimension())) return co(num); else return 0.;};
// modification
void Grandeur_coordonnee::Change_GrandeurNumOrdre(int num, const double& val)
{if((num>0)&&(num<=co.Dimension()))
co(num)=val;
// sinon on ne fait rien
};
// change de repère de la grandeur
void Grandeur_coordonnee::Change_repere(const Mat_pleine& beta,const Mat_pleine& gamma )
{cout << "\n **** non implante !!! "
@ -2021,6 +2110,15 @@ double Tab_Grandeur_Coordonnee::GrandeurNumOrdre(int n) const
int r_div = (n-1)%nbparcoor+1;
return tabCoor(indice_tableau)->GrandeurNumOrdre(r_div);
};
// modification
void Tab_Grandeur_Coordonnee::Change_GrandeurNumOrdre(int n, const double& val)
{ int taille = tabCoor.Taille();
if (taille == 0) return ; // cas d'un tableau vide
int nbparcoor=tabCoor(1)->NbMaxiNumeroOrdre();
int indice_tableau = (n-1)/nbparcoor + 1;
int r_div = (n-1)%nbparcoor+1;
tabCoor(indice_tableau)->Change_GrandeurNumOrdre(r_div,val);
};
// récup du nb maxi de numéros d'ordres
int Tab_Grandeur_Coordonnee::NbMaxiNumeroOrdre() const
{ if (tabCoor.Taille() == 0) return 0; // cas d'un tableau vide
@ -2416,6 +2514,13 @@ double Tab_Grandeur_Ddl_etendu::GrandeurNumOrdre(int n) const
if (n > taille) {return 0.;} // cas où c'est impossible
else {return tabDdlEte(n)->GrandeurNumOrdre(1);};
};
// modification
void Tab_Grandeur_Ddl_etendu::Change_GrandeurNumOrdre(int n, const double& val)
{ int taille = tabDdlEte.Taille();
if (taille == 0) return ; // cas d'un tableau vide
if (n > taille) {return ;} // cas où c'est impossible
else {tabDdlEte(n)->Change_GrandeurNumOrdre(1,val);};
};
// récup du nb maxi de numéros d'ordres
int Tab_Grandeur_Ddl_etendu::NbMaxiNumeroOrdre() const

View file

@ -119,6 +119,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const ;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const; // sortie de la grandeur brut sur sort
// ramène le type de grandeur associée de la grandeur de base, car
@ -191,6 +192,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const ;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const ;
// ramène le type de grandeur associée de la grandeur de base, car
@ -271,6 +273,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const ;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const ;
// ramène le type de grandeur associée de la grandeur de base, car
@ -351,6 +354,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const ;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const ;
// ramène le type de grandeur associée de la grandeur de base, car
@ -432,6 +436,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const ;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const ;
// ramène le type de grandeur associée de la grandeur de base, car
@ -512,6 +517,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const ;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const;
// ramène le type de grandeur associée de la grandeur de base, car
@ -598,6 +604,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const ;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const;
// ramène le type de grandeur associée de la grandeur de base, car
@ -684,6 +691,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const ;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const;
// ramène le type de grandeur associée de la grandeur de base, car
@ -770,6 +778,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const ;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const;
// ramène le type de grandeur associée de la grandeur de base, car
@ -855,6 +864,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const ;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const;
// ramène le type de grandeur associée de la grandeur de base, car
@ -939,6 +949,8 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const {if(num==1) return val; else return 0.;};
void Change_GrandeurNumOrdre(int num, const double& val_) // modification
{if(num==1) val = val_; else val = 0.;};
int NbMaxiNumeroOrdre() const {return 1;}; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const
{sort <<" "<< setw(nbcar)<< setprecision(nbcar) << val << " ";};
@ -1013,6 +1025,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const {return tab_val.Taille();}; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const ;
// ramène le type de grandeur associée de la grandeur de base, car
@ -1099,6 +1112,8 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const {if(num==1) return val; else return 0.;};
void Change_GrandeurNumOrdre(int num, const double& val_) // modification
{if(num==1) val=val_; else val = 0.;};
int NbMaxiNumeroOrdre() const {return 1;}; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const
{sort <<" "<< setw(nbcar)<< setprecision(nbcar) << val << " ";};
@ -1175,6 +1190,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const {return tab_val.Taille();}; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const ;
// ramène le type de grandeur associée de la grandeur de base, car
@ -1260,6 +1276,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const {return ve.Taille();}; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const
{int tailp1 = ve.Taille()+1; for (int i=1;i<tailp1;i++) sort <<" "<< setprecision(nbcar) << ve(i); };
@ -1338,6 +1355,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const ;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const;
// ramène le type de grandeur associée de la grandeur de base, car
@ -1422,6 +1440,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const {return co.Dimension();}; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const
{sort <<" "<< setprecision(nbcar) ; co.Affiche(sort,nbcar) ;};
@ -1501,6 +1520,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const ;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const;
// ramène le type de grandeur associée de la grandeur de base, car
@ -1589,6 +1609,8 @@
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const
{if (num == 1) {return co.ConstValeur();} else {return 0.;}};
void Change_GrandeurNumOrdre(int num, const double& val) // modification
{if (num == 1) { co.Valeur()=val;} else {co.Valeur()= 0.;}};
int NbMaxiNumeroOrdre() const {return 1;}; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const
{sort <<" "<< setprecision(nbcar) << co.ConstValeur()<<" " ;};
@ -1669,6 +1691,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const;
// ramène le type de grandeur associée de la grandeur de base, car
@ -1758,6 +1781,8 @@
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const
{if ((num <= v.Taille())&&(num>0)) {return v(num);} else {return 0.;}};
void Change_GrandeurNumOrdre(int num, const double& val) // modification
{if ((num <= v.Taille())&&(num>0)) {v(num)=val;} else {v(num)= 0.;}};
// récup du nom de référence
virtual const string* Nom_ref() const {return &nom_ref;};
int NbMaxiNumeroOrdre() const {return v.Taille();}; // récup du nb maxi de numéros d'ordres
@ -1843,9 +1868,14 @@
void operator/= (double val) ;
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const {return 0;};
// ici c'est le maxi des vecteurs nommés * le nombre
int NbMaxiNumeroOrdre() const {return 0;}; // récup du nb maxi de numéros d'ordres
// **** attention ici la procédure est très laborieuse : pas du tout optimale !!!
double GrandeurNumOrdre(int num) const ;
// idem procédure longue pour le changement
void Change_GrandeurNumOrdre(int num, const double& val); // modification
// récup du nb maxi de numéros d'ordres
// ici c'est la somme des maxi des vecteurs nommés
int NbMaxiNumeroOrdre() const ;
void Grandeur_brut(ostream & sort,int nbcar) const;
// ramène le type de grandeur associée de la grandeur de base, car
// la grandeur peut être une grandeur complexe comme un tableau ou un liste de grandeur de base
@ -1936,6 +1966,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const ;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const ;
// ramène le type de grandeur associée de la grandeur de base, car
@ -2015,6 +2046,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const ;
void Change_GrandeurNumOrdre(int num, const double& val); // modification
int NbMaxiNumeroOrdre() const; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const;
// ramène le type de grandeur associée de la grandeur de base, car
@ -2107,6 +2139,8 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const {if(num==1) return val; else return 0.;};
void Change_GrandeurNumOrdre(int num, const double& val_) // modification
{if(num==1) val=val_; else val = 0.;};
// récup du nom de référence
virtual const string* Nom_ref() const {return &nom_ref;};
int NbMaxiNumeroOrdre() const {return 1;}; // récup du nb maxi de numéros d'ordres
@ -2198,6 +2232,7 @@
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
double GrandeurNumOrdre(int num) const {return 0;};
void Change_GrandeurNumOrdre(int num, const double& val) {;};// modification, ici on ne fait rien
int NbMaxiNumeroOrdre() const {return 0;}; // récup du nb maxi de numéros d'ordres
void Grandeur_brut(ostream & sort,int nbcar) const;
// ramène le type de grandeur associée de la grandeur de base, car

View file

@ -178,11 +178,25 @@ double Grandeur_TenseurHB::GrandeurNumOrdre(int n) const
return tens(tens.idx_i(n),tens.idx_j(n));break;}
default:
cout << "\n erreur dimension du tenseur non defini !"
<< "\n Grandeur_TenseurHB::NbMaxiNumeroOrdre()";
<< "\n Grandeur_TenseurHB::GrandeurNumOrdre(..";
Sortie(1);
};
return 0.; // pour taire le warning
};
// modification
void Grandeur_TenseurHB::Change_GrandeurNumOrdre(int n, const double& val)
{ switch (ptTens->Dimension())
{case 1: (*ptTens).Coor(1,1)=val; break;
case 2: {Tenseur2HB& tens = *((Tenseur2HB*) ptTens);
tens.Coor(tens.idx_i(n),tens.idx_j(n))=val;break;}
case 3: {Tenseur3HB& tens = *((Tenseur3HB*) ptTens);
tens.Coor(tens.idx_i(n),tens.idx_j(n))=val;break;}
default:
cout << "\n erreur dimension du tenseur non defini !"
<< "\n Grandeur_TenseurHB::Change_GrandeurNumOrdre(..";
Sortie(1);
};
};
// récup du nb maxi de numéros d'ordres
int Grandeur_TenseurHB::NbMaxiNumeroOrdre() const
{ switch (ptTens->Dimension())
@ -460,6 +474,15 @@ double Tab_Grandeur_TenseurBH::GrandeurNumOrdre(int n) const
int r_div = (n-1)%nbpartenseur+1;
return tabTens(indice_tableau)->GrandeurNumOrdre(r_div);
};
// modification
void Tab_Grandeur_TenseurBH::Change_GrandeurNumOrdre(int n, const double& val)
{ int taille = tabTens.Taille();
if (taille == 0) return ; // cas d'un tableau vide
int nbpartenseur=tabTens(1)->NbMaxiNumeroOrdre();
int indice_tableau = (n-1)/nbpartenseur + 1;
int r_div = (n-1)%nbpartenseur+1;
tabTens(indice_tableau)->Change_GrandeurNumOrdre(r_div,val);
};
// récup du nb maxi de numéros d'ordres
int Tab_Grandeur_TenseurBH::NbMaxiNumeroOrdre() const
{ if (tabTens.Taille() == 0) return 0; // cas d'un tableau vide
@ -745,6 +768,15 @@ double Tab_Grandeur_TenseurBB::GrandeurNumOrdre(int n) const
int r_div = (n-1)%nbpartenseur+1;
return tabTens(indice_tableau)->GrandeurNumOrdre(r_div);
};
// modification
void Tab_Grandeur_TenseurBB::Change_GrandeurNumOrdre(int n, const double& val)
{ int taille = tabTens.Taille();
if (taille == 0) return ; // cas d'un tableau vide
int nbpartenseur=tabTens(1)->NbMaxiNumeroOrdre();
int indice_tableau = (n-1)/nbpartenseur + 1;
int r_div = (n-1)%nbpartenseur+1;
tabTens(indice_tableau)->Change_GrandeurNumOrdre(r_div,val);
};
// récup du nb maxi de numéros d'ordres
int Tab_Grandeur_TenseurBB::NbMaxiNumeroOrdre() const
{ if (tabTens.Taille() == 0) return 0; // cas d'un tableau vide
@ -1030,6 +1062,15 @@ double Tab_Grandeur_TenseurHB::GrandeurNumOrdre(int n) const
int r_div = (n-1)%nbpartenseur+1;
return tabTens(indice_tableau)->GrandeurNumOrdre(r_div);
};
// modification
void Tab_Grandeur_TenseurHB::Change_GrandeurNumOrdre(int n, const double& val)
{ int taille = tabTens.Taille();
if (taille == 0) return ; // cas d'un tableau vide
int nbpartenseur=tabTens(1)->NbMaxiNumeroOrdre();
int indice_tableau = (n-1)/nbpartenseur + 1;
int r_div = (n-1)%nbpartenseur+1;
tabTens(indice_tableau)->Change_GrandeurNumOrdre(r_div,val);
};
// récup du nb maxi de numéros d'ordres
int Tab_Grandeur_TenseurHB::NbMaxiNumeroOrdre() const
{ if (tabTens.Taille() == 0) return 0; // cas d'un tableau vide
@ -1357,6 +1398,12 @@ double Tab_Grandeur_scalaire_entier::GrandeurNumOrdre(int num) const
if ((num <=0) || (num > taille)) {return 0.;}
else return tab_val(num).val;
};
// modification
void Tab_Grandeur_scalaire_entier::Change_GrandeurNumOrdre(int num, const double& val)
{int taille = tab_val.Taille();
if ((num <=0) || (num > taille)) {return ;}
else tab_val(num).val = (int) val;
};
void Tab_Grandeur_scalaire_entier::Grandeur_brut(ostream & sort,int nbcar) const
{int taille = tab_val.Taille();
@ -1738,7 +1785,56 @@ void Tab_Grandeur_Vecteur_Nommer::operator/= (double val)
*(tabVN(i)) /=val;
};
void Tab_Grandeur_Vecteur_Nommer::Grandeur_brut(ostream & sort,int nbcar) const
// récupération de la valeur numérique d'une grandeur correspondant à un numéro d'ordre
// si pas possible, ramène 0
// **** attention ici la procédure est très laborieuse : pas du tout optimale !!!
double Tab_Grandeur_Vecteur_Nommer::GrandeurNumOrdre(int num) const
{// la procédure est longue car on doit balayer tous les vecteurs internes
int nbMaxi= 0; // init
int nbMin = 0;
double retour=0.;
int taille = tabVN.Taille();
for (int i=1;i<=taille;i++) //(*tabVN(i))/=val;
{nbMaxi += (tabVN(i))->NbMaxiNumeroOrdre();
if (num <= nbMaxi)
{retour = (tabVN(i))->GrandeurNumOrdre(num-nbMin);
break;
}
else
{nbMin=nbMaxi;};
};
return retour;
};
// modification
// la procédure est longue car on doit balayer tous les vecteurs internes
void Tab_Grandeur_Vecteur_Nommer::Change_GrandeurNumOrdre(int num, const double& val)
{int nbMaxi= 0; // init
int nbMin = 0;
double retour=0.;
int taille = tabVN.Taille();
for (int i=1;i<=taille;i++) //(*tabVN(i))/=val;
{nbMaxi += (tabVN(i))->NbMaxiNumeroOrdre();
if (num <= nbMaxi)
{(tabVN(i))->Change_GrandeurNumOrdre(num-nbMin,val);
break;
}
else
{nbMin=nbMaxi;};
};
};
// récup du nb maxi de numéros d'ordres
// ici c'est la somme des maxi des vecteurs nommés
int Tab_Grandeur_Vecteur_Nommer::NbMaxiNumeroOrdre() const
{ int nbMaxi= 0; // init
int taille = tabVN.Taille();
for (int i=1;i<=taille;i++) //(*tabVN(i))/=val;
nbMaxi += (tabVN(i))->NbMaxiNumeroOrdre();
return nbMaxi;
};
void Tab_Grandeur_Vecteur_Nommer::Grandeur_brut(ostream & sort,int nbcar) const
{ int taille = tabVN.Taille();
for (int k=1;k<=taille;k++)
tabVN(k)->Grandeur_brut(sort,nbcar);
@ -1916,11 +2012,11 @@ int Grandeur_BaseH::NbMaxiNumeroOrdre() const // récup du nb maxi de numéros d
// si pas possible, ramène 0
double Grandeur_BaseH::GrandeurNumOrdre(int num) const
{// on va suivre les coordonnées de chaque vecteur
int nb_vec = baseH.NbVecteur();
int dim = baseH.Dimension();
int a = (num-1) / dim ; // le numéro du vecteur
int i = num - a * dim; // l'indice de la coordonnée
#ifdef MISE_AU_POINT
int nb_vec = baseH.NbVecteur();
int max = nb_vec * dim;
if ((num > max) || (num < 1))
{ cout << "\n erreur d'acces a la grandeur de numero d'ordre " << num
@ -1931,7 +2027,24 @@ double Grandeur_BaseH::GrandeurNumOrdre(int num) const
#endif
return baseH(a)(i);
};
// modification
void Grandeur_BaseH::Change_GrandeurNumOrdre(int num, const double& val)
{// on va suivre les coordonnées de chaque vecteur
int dim = baseH.Dimension();
int a = (num-1) / dim ; // le numéro du vecteur
int i = num - a * dim; // l'indice de la coordonnée
#ifdef MISE_AU_POINT
int nb_vec = baseH.NbVecteur();
int max = nb_vec * dim;
if ((num > max) || (num < 1))
{ cout << "\n erreur d'acces a la grandeur de numero d'ordre " << num
<< " seules sont accessibles les grandeurs de numeros entre 1 et "<< max
<< "\n Grandeur_BaseH::Change_GrandeurNumOrdre(...";
Sortie(1);
}
#endif
baseH.CoordoH(a)(i) = val;
};
void Grandeur_BaseH::Grandeur_brut(ostream & sort,int nbcar) const
{ int nb_vec = baseH.NbVecteur();
for (int i=1;i<=nb_vec;i++)
@ -2078,6 +2191,19 @@ double Tab_Grandeur_BaseH::GrandeurNumOrdre(int num) const
};
return tabBaseH(i).GrandeurNumOrdre(num-num_dans_tableau);
};
// modification
void Tab_Grandeur_BaseH::Change_GrandeurNumOrdre(int num, const double& val)
{ int num_dans_tableau = 0;
int taille_et_1 = tabBaseH.Taille() + 1;
int indic = 0;int i=0;
for (i=1;i<taille_et_1;i++)
{num_dans_tableau = indic; // on garde le précédent
indic += tabBaseH(i).NbMaxiNumeroOrdre();
if (indic > num)
break;
};
tabBaseH(i).Change_GrandeurNumOrdre(num-num_dans_tableau,val);
};
int Tab_Grandeur_BaseH::NbMaxiNumeroOrdre() const // récup du nb maxi de numéros d'ordres
{ int retour = 0;
int taille_et_1 = tabBaseH.Taille() + 1;

View file

@ -151,6 +151,11 @@ void Grandeur_Vecteur::operator-= (const Grandeur& a)
// si pas possible, ramène 0
double Grandeur_Vecteur::GrandeurNumOrdre(int num) const
{if((num>0)&&(num<=ve.Taille())) return ve(num); else return 0.;};
// modification
void Grandeur_Vecteur::Change_GrandeurNumOrdre(int num, const double& val)
{if((num>0)&&(num<=ve.Taille())) ve(num)=val;
// sinon rien
};
// change de repère de la grandeur
void Grandeur_Vecteur::Change_repere(const Mat_pleine& beta,const Mat_pleine& gamma )
@ -403,7 +408,16 @@ double Tab_Grandeur_Vecteur::GrandeurNumOrdre(int n) const
int indice_tableau = (n-1)/nbparcoor + 1;
int r_div = (n-1)%nbparcoor+1;
return tabVe(indice_tableau)->GrandeurNumOrdre(r_div);
};
};
// modification
void Tab_Grandeur_Vecteur::Change_GrandeurNumOrdre(int n, const double& val)
{ int taille = tabVe.Taille();
if (taille == 0) return ; // cas d'un tableau vide
int nbparcoor=tabVe(1)->NbMaxiNumeroOrdre();
int indice_tableau = (n-1)/nbparcoor + 1;
int r_div = (n-1)%nbparcoor+1;
tabVe(indice_tableau)->Change_GrandeurNumOrdre(r_div,val);
};
// récup du nb maxi de numéros d'ordres
int Tab_Grandeur_Vecteur::NbMaxiNumeroOrdre() const
{ if (tabVe.Taille() == 0) return 0; // cas d'un tableau vide

View file

@ -266,14 +266,11 @@ void Hypo_hooke1D::LectureDonneesParticulieres (UtilLecture * entreePrinc,LesCou
// sinon on regarde si le module dépend d'une fonction nD
else if(strstr(entreePrinc->tablcar,"Kc_fonction_nD:")!=0)
{ string nom;
string mot_cle1="Kc=";
string mot_cle2="Kc_fonction_nD:";
// on passe le mot clé générique
bool lec = entreePrinc->Lecture_et_verif_mot_cle(nom_class_methode,mot_cle1);
// on lit le nom de la fonction
string nom_fonct;
lec = lec && entreePrinc->Lecture_mot_cle_et_string(nom_class_methode,mot_cle2,nom_fonct);
bool lec = entreePrinc->Lecture_mot_cle_et_string(nom_class_methode,mot_cle2,nom_fonct);
if (!lec )
{ entreePrinc->MessageBuffer("**erreur02 en lecture** "+mot_cle2);
throw (UtilLecture::ErrNouvelleDonnee(-1));
@ -305,6 +302,8 @@ void Hypo_hooke1D::LectureDonneesParticulieres (UtilLecture * entreePrinc,LesCou
const Tableau <Ddl_enum_etendu>& tab_enu = Kc_nD->Tab_enu_etendu();
if (tab_enu.Contient(TEMP))
thermo_dependant=true;
// prepa du flot de lecture
entreePrinc->NouvelleDonnee();
}
// sinon c'est directement le module que l'on lit
else
@ -390,14 +389,11 @@ void Hypo_hooke1D::LectureDonneesParticulieres (UtilLecture * entreePrinc,LesCou
// sinon on regarde si la fonction dépend d'une fonction nD
else if(strstr(entreePrinc->tablcar,"f_fonction_nD:")!=0)
{ string nom;
string mot_cle1="f=";
string mot_cle2="f_fonction_nD:";
// on passe le mot clé générique
bool lec = entreePrinc->Lecture_et_verif_mot_cle(nom_class_methode,mot_cle1);
// on lit le nom de la fonction
string nom_fonct;
lec = lec && entreePrinc->Lecture_mot_cle_et_string(nom_class_methode,mot_cle2,nom_fonct);
bool lec = entreePrinc->Lecture_mot_cle_et_string(nom_class_methode,mot_cle2,nom_fonct);
if (!lec )
{ entreePrinc->MessageBuffer("**erreur02 en lecture** "+mot_cle2);
throw (UtilLecture::ErrNouvelleDonnee(-1));
@ -429,6 +425,8 @@ void Hypo_hooke1D::LectureDonneesParticulieres (UtilLecture * entreePrinc,LesCou
const Tableau <Ddl_enum_etendu>& tab_enu = f_nD->Tab_enu_etendu();
if (tab_enu.Contient(TEMP))
thermo_dependant=true;
// prepa du flot de lecture
entreePrinc->NouvelleDonnee();
}
else
{ // lecture de f
@ -898,7 +896,13 @@ void Hypo_hooke1D::Grandeur_particuliere
}
case DEF_ASSO_LOI:
{ Tab_Grandeur_TenseurBB& tyTQ= *((Tab_Grandeur_TenseurBB*) (*itq).Grandeur_pointee()); // pour simplifier
tyTQ(1+(*idecal))=save_resul.eps_cumulBB;(*idecal)++;
if (ParaGlob::Dimension() != 1) // il faut alors affecter en le 1D à la bonne dim
{tyTQ(1+(*idecal)).Affectation_trans_dimension(save_resul.eps_cumulBB,true);
}
else // cas même dimension
{tyTQ(1+(*idecal)) = save_resul.eps_cumulBB;
};
(*idecal)++;
break;
}
default: break; // sinon rien à faire
@ -984,7 +988,8 @@ void Hypo_hooke1D::ListeGrandeurs_particulieres(bool absolue,List_io<TypeQuelcon
tyTQ.Change_taille(taille); nexistePas = false;
};
if (nexistePas)
{TenseurBB* tens = NevezTenseurBB(1); // un tenseur typique
{int dim_espace = ParaGlob::Dimension();
TenseurBB* tens = NevezTenseurBB(dim_espace); // un tenseur typique
Tab_Grandeur_TenseurBB epsassoBB(*tens,1);
// def d'un type quelconque représentatif
TypeQuelconque typQ(DEF_ASSO_LOI,EPS11,epsassoBB);

View file

@ -279,14 +279,11 @@ void Hypo_hooke2D_C::LectureDonneesParticulieres (UtilLecture * entreePrinc,LesC
// sinon on regarde si le module dépend d'une fonction nD
else if(strstr(entreePrinc->tablcar,"Kc_fonction_nD:")!=0)
{ string nom;
string mot_cle1="Kc=";
string mot_cle2="Kc_fonction_nD:";
// on passe le mot clé générique
bool lec = entreePrinc->Lecture_et_verif_mot_cle(nom_class_methode,mot_cle1);
// on lit le nom de la fonction
string nom_fonct;
lec = lec && entreePrinc->Lecture_mot_cle_et_string(nom_class_methode,mot_cle2,nom_fonct);
bool lec = entreePrinc->Lecture_mot_cle_et_string(nom_class_methode,mot_cle2,nom_fonct);
if (!lec )
{ entreePrinc->MessageBuffer("**erreur02 en lecture** "+mot_cle2);
throw (UtilLecture::ErrNouvelleDonnee(-1));
@ -318,6 +315,8 @@ void Hypo_hooke2D_C::LectureDonneesParticulieres (UtilLecture * entreePrinc,LesC
const Tableau <Ddl_enum_etendu>& tab_enu = Kc_nD->Tab_enu_etendu();
if (tab_enu.Contient(TEMP))
thermo_dependant=true;
// prepa du flot de lecture
entreePrinc->NouvelleDonnee();
}
// sinon c'est directement le module que l'on lit
else
@ -406,10 +405,10 @@ void Hypo_hooke2D_C::LectureDonneesParticulieres (UtilLecture * entreePrinc,LesC
string mot_cle2="mu_fonction_nD:";
// on passe le mot clé générique
bool lec = entreePrinc->Lecture_et_verif_mot_cle(nom_class_methode,mot_cle1);
// bool lec = entreePrinc->Lecture_et_verif_mot_cle(nom_class_methode,mot_cle1);
// on lit le nom de la fonction
string nom_fonct;
lec = lec && entreePrinc->Lecture_mot_cle_et_string(nom_class_methode,mot_cle2,nom_fonct);
bool lec = entreePrinc->Lecture_mot_cle_et_string(nom_class_methode,mot_cle2,nom_fonct);
if (!lec )
{ entreePrinc->MessageBuffer("**erreur02 en lecture** "+mot_cle2);
throw (UtilLecture::ErrNouvelleDonnee(-1));
@ -441,6 +440,8 @@ void Hypo_hooke2D_C::LectureDonneesParticulieres (UtilLecture * entreePrinc,LesC
const Tableau <Ddl_enum_etendu>& tab_enu = mu_nD->Tab_enu_etendu();
if (tab_enu.Contient(TEMP))
thermo_dependant=true;
// prepa du flot de lecture
entreePrinc->NouvelleDonnee();
}
else
{ // sinon lecture de mu
@ -933,7 +934,13 @@ void Hypo_hooke2D_C::Grandeur_particuliere
};
case DEF_ASSO_LOI:
{ Tab_Grandeur_TenseurBB& tyTQ= *((Tab_Grandeur_TenseurBB*) (*itq).Grandeur_pointee()); // pour simplifier
tyTQ(1+(*idecal))=save_resul.eps_cumulBB;(*idecal)++;
if (ParaGlob::Dimension() == 3) // il faut alors affecter en le 2D au 3D
{tyTQ(1+(*idecal)).Affectation_trans_dimension(save_resul.eps_cumulBB,true);
}
else // cas même dimension
{tyTQ(1+(*idecal)) = save_resul.eps_cumulBB;
};
(*idecal)++;
break;
}
@ -945,7 +952,7 @@ void Hypo_hooke2D_C::Grandeur_particuliere
// 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
void Hypo_hooke2D_C::ListeGrandeurs_particulieres(List_io<TypeQuelconque>& liTQ) const
void Hypo_hooke2D_C::ListeGrandeurs_particulieres(bool absolue,List_io<TypeQuelconque>& liTQ) const
{ //on commence par définir une grandeur_scalaire_double
Tableau <double> tab_1(1);
Tab_Grandeur_scalaire_double grand_courant(tab_1);
@ -1002,7 +1009,8 @@ void Hypo_hooke2D_C::ListeGrandeurs_particulieres(List_io<TypeQuelconque>& liTQ)
tyTQ.Change_taille(taille); nexistePas = false;
};
if (nexistePas)
{TenseurBB* tens = NevezTenseurBB(2); // un tenseur typique
{int dim_espace = ParaGlob::Dimension();
TenseurBB* tens = NevezTenseurBB(dim_espace); // un tenseur typique
Tab_Grandeur_TenseurBB epsassoBB(*tens,1);
// def d'un type quelconque représentatif
TypeQuelconque typQ(DEF_ASSO_LOI,EPS11,epsassoBB);

View file

@ -189,7 +189,7 @@ class Hypo_hooke2D_C : public Loi_comp_abstraite
(bool absolue,List_io<TypeQuelconque>& ,Loi_comp_abstraite::SaveResul * ,list<int>& 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
void ListeGrandeurs_particulieres(List_io<TypeQuelconque>& ) const;
void ListeGrandeurs_particulieres(bool absolue,List_io<TypeQuelconque>& ) const;
// calcul d'un module d'young équivalent à la loi, ceci pour un
// chargement nul

View file

@ -248,14 +248,11 @@ void Hypo_hooke3D::LectureDonneesParticulieres (UtilLecture * entreePrinc,LesCou
// sinon on regarde si le module dépend d'une fonction nD
else if(strstr(entreePrinc->tablcar,"Kc_fonction_nD:")!=0)
{ string nom;
string mot_cle1="Kc=";
string mot_cle2="Kc_fonction_nD:";
// on passe le mot clé générique
bool lec = entreePrinc->Lecture_et_verif_mot_cle(nom_class_methode,mot_cle1);
// on lit le nom de la fonction
string nom_fonct;
lec = lec && entreePrinc->Lecture_mot_cle_et_string(nom_class_methode,mot_cle2,nom_fonct);
bool lec = entreePrinc->Lecture_mot_cle_et_string(nom_class_methode,mot_cle2,nom_fonct);
if (!lec )
{ entreePrinc->MessageBuffer("**erreur02 en lecture** "+mot_cle2);
throw (UtilLecture::ErrNouvelleDonnee(-1));
@ -287,6 +284,8 @@ void Hypo_hooke3D::LectureDonneesParticulieres (UtilLecture * entreePrinc,LesCou
const Tableau <Ddl_enum_etendu>& tab_enu = Kc_nD->Tab_enu_etendu();
if (tab_enu.Contient(TEMP))
thermo_dependant=true;
// prepa du flot de lecture
entreePrinc->NouvelleDonnee();
}
// sinon c'est directement le module que l'on lit
else
@ -371,7 +370,6 @@ void Hypo_hooke3D::LectureDonneesParticulieres (UtilLecture * entreePrinc,LesCou
// sinon on regarde si mu dépend d'une fonction nD
else if(strstr(entreePrinc->tablcar,"mu_fonction_nD:")!=0)
{ string nom;
string mot_cle1="mu=";
string mot_cle2="mu_fonction_nD:";
// on lit le nom de la fonction
@ -408,6 +406,8 @@ void Hypo_hooke3D::LectureDonneesParticulieres (UtilLecture * entreePrinc,LesCou
const Tableau <Ddl_enum_etendu>& tab_enu = mu_nD->Tab_enu_etendu();
if (tab_enu.Contient(TEMP))
thermo_dependant=true;
// prepa du flot de lecture
if(strstr(entreePrinc->tablcar,"fin_loi_HYPO_ELAS3D")==0) entreePrinc->NouvelleDonnee();
}
else
{ // sinon lecture de mu

View file

@ -1288,7 +1288,7 @@ double Hypo_ortho3D_entrainee::Module_compressibilite_equivalent(Enum_dure temps
{double unsurKs1 = 1./E1 - nu12/E1 -nu13/E1;
double unsurKs2 = -nu12/E1+1./E2-nu23/E2;
double unsurKs3 = -nu13/E1-nu23/E2+1./E3;
double module_compressibilite = 1./3.*(1./unsurKs1+1./unsurKs2+1./unsurKs3);
double module_compressibilite = 1./9.*(1./unsurKs1+1./unsurKs2+1./unsurKs3);
return module_compressibilite;
}
else
@ -1635,7 +1635,7 @@ void Hypo_ortho3D_entrainee::Calcul_SigmaHH (TenseurHH& sigHH_t,TenseurBB& ,DdlE
{double unsurKs1 = 1./E1 - nu12/E1 -nu13/E1;
double unsurKs2 = -nu12/E1+1./E2-nu23/E2;
double unsurKs3 = -nu13/E1-nu23/E2+1./E3;
module_compressibilite = untiers*(1./unsurKs1+1./unsurKs2+1./unsurKs3);
module_compressibilite = untiers*untiers*(1./unsurKs1+1./unsurKs2+1./unsurKs3);
};
}
else
@ -2021,7 +2021,7 @@ void Hypo_ortho3D_entrainee::Calcul_DsigmaHH_tdt (TenseurHH& sigHH_t,TenseurBB&
{double unsurKs1 = 1./E1 - nu12/E1 -nu13/E1;
double unsurKs2 = -nu12/E1+1./E2-nu23/E2;
double unsurKs3 = -nu13/E1-nu23/E2+1./E3;
module_compressibilite = untiers*(1./unsurKs1+1./unsurKs2+1./unsurKs3);
module_compressibilite = untiers *untiers*(1./unsurKs1+1./unsurKs2+1./unsurKs3);
};
}
else
@ -2676,7 +2676,7 @@ void Hypo_ortho3D_entrainee::Calcul_dsigma_deps (bool en_base_orthonormee, Tense
{double unsurKs1 = 1./E1 - nu12/E1 -nu13/E1;
double unsurKs2 = -nu12/E1+1./E2-nu23/E2;
double unsurKs3 = -nu13/E1-nu23/E2+1./E3;
module_compressibilite = untiers*(1./unsurKs1+1./unsurKs2+1./unsurKs3);
module_compressibilite = untiers * untiers*(1./unsurKs1+1./unsurKs2+1./unsurKs3);
};
#ifdef MISE_AU_POINT
if (Permet_affichage() > 4)

View file

@ -1794,6 +1794,11 @@ int ElContact::Actualisation()
};
#endif
if (Permet_affichage() > 4)
{cout << "\n -- ElContact::Actualisation ";
this->Affiche(1);
};
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;
@ -1822,19 +1827,30 @@ int ElContact::Actualisation()
// 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);
{cout << " Frontiere: FrontPointF -> test Interne_tdt ? cas= " << cas;
// retour : =0 le point est externe, =1 le point est interne ,
// = 2 le point est sur la frontière à la précision près
switch (cas)
{case 0 : cout << " (le point est externe a l'element) "; break;
case 1 : cout << " (le point est interne a l'element) "; break;
case 2 : cout << " (le point est sur la frontiere a la prec pres) "; break;
default:
cout << "\n **** erreur le retour cas = "<< cas
<< " de la methode elfront->PtEI()->Interne_tdt(... "
<< " n'est pas normal on ne peut pas continuer ! ";
Sortie(1);
break;
};
};
// 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 " ;
{cout << "\n >> nb_change_frontiere: " << nb_change_frontiere
<< " > nb_change_frontiere_max ("<<nb_change_frontiere_max << ") "
<< " on impose cas = 1 (c-a-d le point est interne a l'element)" ;
};
};
if (!cas)
@ -1844,17 +1860,29 @@ int ElContact::Actualisation()
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 >> test de l'element voisin "<<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);
{cout << " Interne_tdt sur mitoyen d'angle mort ? cas= " << cas ;
switch (cas)
{case 0 : cout << " (le point est externe a l'element) "; break;
case 1 : cout << " (le point est interne a l'element) "; break;
case 2 : cout << " (le point est sur la frontiere a la prec pres) "; break;
default:
cout << "\n **** erreur le retour cas = "<< cas
<< " de la methode elfront->PtEI()->Interne_tdt(... "
<< " n'est pas normal on ne peut pas continuer ! ";
Sortie(1);
break;
};
};
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()
{cout << "\n >> change front. du noeud "<< noeud->Num_noeud() <<" mail= " << noeud->Num_Mail()
<< " ==> ";
elfront->Affiche(1);
if (Permet_affichage() > 4)
@ -1876,8 +1904,8 @@ int ElContact::Actualisation()
intersec = 2;
passage_par_angle_mort=2;
};
if (intersec)
break;
if (intersec == 2)
break;
};
};
}
@ -1933,6 +1961,8 @@ int ElContact::Actualisation()
if (ta != NULL) // cas où il y a des éléments voisins !
{for (int i=1; i<= ta->Taille(); i++)
{ bool mitoyen_valider = false;
if (Permet_affichage() > 5)
cout << "\n >> test de l'element voisin "<<i <<" : " ;
// le cas des angles morts est particulier, on commence par le traiter
if ((*ta)(i)->Angle_mort())
{ ElFrontiere & elfroto = *((*ta)(i)->Eleme()); // pour commodite
@ -1947,9 +1977,18 @@ int ElContact::Actualisation()
// 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);
{cout << " Interne_tdt sur mitoyen d'angle mort ? cas= " << cas ;
switch (cas)
{case 0 : cout << " (le point est externe a l'element) "; break;
case 1 : cout << " (le point est interne a l'element) "; break;
case 2 : cout << " (le point est sur la frontiere a la prec pres) "; break;
default:
cout << "\n **** erreur le retour cas = "<< cas
<< " de la methode elfront->PtEI()->Interne_tdt(... "
<< " n'est pas normal on ne peut pas continuer ! ";
Sortie(1);
break;
};
};
if (cas) // si true, le point est interne
@ -1978,7 +2017,10 @@ int ElContact::Actualisation()
|| (nb_change_frontiere > nb_change_frontiere_max) // pour éviter les flip-flop
)
// on a trouve une bonne intersection
{ mitoyen_valider = true;M1 = M1_new;};
{ mitoyen_valider = true;M1 = M1_new;
if (Permet_affichage() > 5)
cout << " intersection ok ";
};
};
};
@ -1986,7 +2028,7 @@ int ElContact::Actualisation()
if (mitoyen_valider)
{ // --- changement d'element frontiere
if (Permet_affichage() > 2)
{cout << "\n change front. du noeud "<< noeud->Num_noeud() <<" mail= " << noeud->Num_Mail()
{cout << "\n change front. du noeud "<< noeud->Num_noeud() <<" mail= " << noeud->Num_Mail()
<< " == ";
elfront->Affiche(1);
if (Permet_affichage() > 4)
@ -2012,7 +2054,7 @@ int ElContact::Actualisation()
};
};
};
};
};
};
}; // fin du test sur les front d'angle mort
@ -2032,7 +2074,7 @@ int ElContact::Actualisation()
break;
};
if (Permet_affichage() > 6)
{cout << "\n actualisation du noeud esclave "
{cout << "\n actualisation du noeud esclave "
<< noeud->Num_noeud() <<" mail= " << noeud->Num_Mail()
<< " ancienne position " << M_noeud_tdt_avant_projection
<< " nouvelle position " << noeud->Coord2();
@ -2046,8 +2088,13 @@ int ElContact::Actualisation()
}
#ifdef MISE_AU_POINT
if (Permet_affichage() > 2)
{cout << "\n ElContact::Actualisation(., intersec= "<< intersec;
if (Permet_affichage() > 4)
{cout << ": noeud "<< noeud->Num_noeud() <<" mail= " << noeud->Num_Mail()
<< ", intersec= "<< intersec;
if (intersec == 0) {cout << " (pas d'intersection trouvé)";}
else if (intersec == 1) {cout << " (contact ok sur l'élément)";}
else if (intersec == -1){cout << " (contact ok mais hors de l'élément)";}
else if (intersec == 2){cout << " (changement de frontière, et contact ok sur la nouvelle frontière)";};
};
#endif
@ -2173,7 +2220,7 @@ void ElContact::Change_force(const Coordonnee& force)
// calcul de la normale en fonction de differente conditions
Coordonnee N( Calcul_Normale(dim,pl,dr,indic));
F_N_max = Dabs(force_contact*N); // sauvegarde
F_N_max = (force_contact*N); // sauvegarde
F_T_max = sqrt(force_contact.Norme()-F_N_max*F_N_max);

View file

@ -326,13 +326,13 @@ class ElContact
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);};
{cout << "\n -- ElContact::Met_Inactif() -> 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);};
{cout << "\n -- ElContact::Met_actif() -> activation du contact: ";this->Affiche(1);};
#endif
}; // met en actif une fois de plus

View file

@ -245,7 +245,7 @@ Vecteur* ElContact::SM_charge_contact()
}
default: break; // déjà vu au dessus
};
F_N_max = Dabs(intens_force); // sauvegarde
F_N_max = (intens_force); // sauvegarde
if (Permet_affichage() > 5)
{cout << " noeud: " << noeud->Num_noeud();
cout << "\n deltaX " << deltaX
@ -787,7 +787,7 @@ Element::ResRaid ElContact::SM_K_charge_contact()
}
default: break; // déjà vu au dessus
};
F_N_max = Dabs(intens_force); // sauvegarde
F_N_max = (intens_force); // sauvegarde
if (Permet_affichage() > 5)
{cout << " noeud: " << noeud->Num_noeud();
@ -831,7 +831,7 @@ Element::ResRaid ElContact::SM_K_charge_contact()
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()
{ cout << "\n noeud: " << noeud->Num_noeud()
<< ": force collage non prise en compte " << force_contact
<< " gap(positif)= " << gap << ", Normale= " << N;
cout << "\n deltaX " << deltaX
@ -851,7 +851,7 @@ Element::ResRaid ElContact::SM_K_charge_contact()
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()
{ cout << "\n noeud: " << noeud->Num_noeud()
<< ": force collage non prise en compte " << force_contact
<< " gap(positif et > borne regularisation)= " << gap << ", Normale= " << N;
cout << "\n deltaX " << deltaX

View file

@ -40,6 +40,10 @@
// --------------- variables statiques ---------
MotCle LesContacts::motCle; // liste des mots clés
Tableau <const TypeQuelconque * > LesContacts::tqi_const_fct_nD_niveau_commentaire;
Tableau < TypeQuelconque * > LesContacts::tqi_fct_nD_niveau_commentaire;
Tableau <int> LesContacts::t_num_ordre_fct_nD_niveau_commentaire;
//------------------------- la classe ReactCont -------------
// surcharge de l'operator de lecture
@ -168,6 +172,10 @@ void LesContacts::Init_contact(LesMaillages& lesMail
,LesFonctions_nD* lesFonctionsnD)
{
tempsContact.Mise_en_route_du_comptage(); // temps cpu
// sauvegarde de la liste des fonctions nD
sauve_lesFonctionsnD = lesFonctionsnD;
// init éventuel du pilotage par fct nD du niveau de commentaire
LesContacts::Init_fct_niveau_commentaire();
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();
@ -180,8 +188,6 @@ void LesContacts::Init_contact(LesMaillages& lesMail
#endif
cout << "\n -- LesContacts::Init_contact: ";
// sauvegarde de la liste des fonctions nD
sauve_lesFonctionsnD = lesFonctionsnD;
Creation_Fct_nD_contact(); // récupération des fonctions de pilotage éventuelles
// --- récup info maillage
@ -683,9 +689,9 @@ bool LesContacts::DefElemCont(double dep_max)
{
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours
<< " ==> LesContacts::Def Elem Cont, initialement "<<listContact.size() << " elem contact ";
<< " -- LesContacts::Def Elem Cont, initialement "<<listContact.size() << " elem contact ";
#else
cout << "\n ==> LesContacts::Def Elem Cont, initialement "<<listContact.size() << " elem contact ";
cout << "\n -- LesContacts::Def Elem Cont, initialement "<<listContact.size() << " elem contact ";
#endif
};
// on initialise les listes transitoires
@ -987,6 +993,14 @@ bool LesContacts::Nouveau(double dep_max)
{
tempsContact.Mise_en_route_du_comptage(); // def deb compt
int niveau_commentaire_lescontacts = Permet_affichage();
list <TypeQuelconque> li_pour_noeuds; // pour une sortie spécifique noeud
Grandeur_scalaire_entier grand_courant_entier(0); // par défaut pour la création des conteneurs quelconques
li_pour_noeuds.push_front(TypeQuelconque(NUM_NOEUD,X1,grand_courant_entier));
Grandeur_scalaire_entier& gr_pour_noeud
= *((Grandeur_scalaire_entier*) (*li_pour_noeuds.begin()).Grandeur_pointee());
list <TypeQuelconque> li_pour_elcont; // pour une sortie spécifique élément finis
li_pour_elcont.push_front(TypeQuelconque(NUM_ELEMENT,EPS11,grand_courant_entier));
#ifdef UTILISATION_MPI
int proc_en_cours = ParaGlob::Monde()->rank();
#endif
@ -1002,28 +1016,31 @@ bool LesContacts::Nouveau(double dep_max)
#else
cout << "\n"
#endif
<< " ==> LesContacts::Nouveau: temps= " << ParaGlob::Variables_de_temps().TempsCourant();
<< " -- LesContacts::Nouveau: temps= " << ParaGlob::Variables_de_temps().TempsCourant();
// on montre les noeuds actuellement en contact
if (niveau_commentaire_lescontacts > 5)
if (Permet_affichage() > 4)
{
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours
#else
cout << "\n"
#endif
<< " >> bilan des noeud(s) actuellement en contact: ";
<< " >> bilan des noeud(s) actuellement en contact: ";
int nb_noe_en_contact = 0;
for (int intot = 1;intot<= nb_mail_Esclave;intot++) // boucle sur les maillages esclaves
for (int j=1;j<= nb_zone;j++)
{const Tableau <Noeud*>& tesc= tesctotal(intot)(j); // pout simplifier la notation
const Tableau <int> 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_lescontacts > 4)
{ Noeud* no = tesc(inesc);
// int n_noee = no->Num_noeud();
{Noeud* no = tesc(inesc);
int n_noee = no->Num_noeud();
(*gr_pour_noeud.ConteneurEntier()) = n_noee; // pour l'affichage
if (Permet_affichage(&li_pour_noeuds) > 5)
{
int num_mail_noe_esclave = no->Num_Mail();
// if (no->Num_noeud()==495)
cout << "\n noeud " << no->Num_noeud() << " du maillage " << no->Num_Mail();
cout << "\n noeud " << no->Num_noeud() << " du maillage " << no->Num_Mail();
cout << " coord2= "; no->Coord2().Affiche_1(cout);
// #ifdef MISE_AU_POINT
// if (tesN_encontact(num_mail_noe_esclave).find(no)
@ -1043,14 +1060,22 @@ bool LesContacts::Nouveau(double dep_max)
if (tesN_encontact_ii.find(no) != tesN_encontact_ii.end())
{//LaLIST < LaLIST<ElContact>::iterator > & list_tesN = tesN_encontact_ii[no];
// LaLIST < LaLIST<ElContact>::iterator >::iterator pl,plfin=list_tesN.end();
cout << "\n --> noeud actuellement en contact ";
cout << "\n --> noeud actuellement en contact ";
nb_noe_en_contact++;
if (tesN_collant(num_mail_noe_esclave)(j)(inesc)) cout << " collant ";
}
else {cout << "\n --> noeud actuellement pas en contact ";};
else {cout << "\n --> noeud actuellement pas en contact ";};
cout << flush;
};
};
};
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours
#else
cout << "\n"
#endif
<< " ->> bilan : " << nb_noe_en_contact << " noeud(s) actuellement en contact: ";
};
if (niveau_commentaire_lescontacts > 4)
// on va lister les éléments de contact
@ -1060,10 +1085,17 @@ bool LesContacts::Nouveau(double dep_max)
#else
cout << "\n"
#endif
<< " liste des Elcontact au debut de LesContacts::Nouveau: (fct du niveau de commentaire des elcontact): ";
<< " >> liste des Elcontact au debut de LesContacts::Nouveau: (fct du niveau de commentaire des elcontact): ";
LaLIST<ElContact>::iterator ipp,ippfin=listContact.end();
for (ipp=listContact.begin();ipp != ippfin; ipp++)
{(*ipp).Affiche(2);};
cout << " fin liste ";
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours
#else
cout << "\n"
#endif
<< " ->> bilan : " << listContact.size() << " element(s) de contact: ";
};
// on met à jour les boites des éléments qui contiennent les frontières
@ -1092,8 +1124,9 @@ bool LesContacts::Nouveau(double dep_max)
if ((*iE).Contact())
{ // on valide si le contact est ok
(*iE).Met_actif();
if (niveau_commentaire_lescontacts > 3)
{ cout << "\nreactivation (dans newcontact) contact: ";
(*gr_pour_noeud.ConteneurEntier()) = (*iE).Esclave()->Num_noeud();
if (Permet_affichage(&li_pour_noeuds) > 3)
{ cout << "\n reactivation (dans LesContacts::Nouveau) contact: ";
(*iiE).Affiche(1); cout << endl;
};
}
@ -1103,8 +1136,9 @@ bool LesContacts::Nouveau(double dep_max)
Noeud* noe_esclave = (*iiE).Esclave();
int num_mail_esclave = noe_esclave->Num_Mail();
int num_noeud = noe_esclave->Num_noeud();
if (niveau_commentaire_lescontacts > 3)
{ cout << "\neffacement contact (dans newcontact): ";
(*gr_pour_noeud.ConteneurEntier()) = num_noeud;
if (Permet_affichage(&li_pour_noeuds) > 3)
{ cout << "\n effacement contact (dans LesContacts::Nouveau): ";
(*iiE).Affiche(1);cout << endl;
};
listContact_efface_tatdt.push_front(*iiE); // mémorise
@ -1134,13 +1168,14 @@ bool LesContacts::Nouveau(double dep_max)
LaLIST_io <Front>::iterator iM,iMfin;
LaLIST <ElContact>::iterator icont_inter; // sert pour la recherche de doublon
list <TroisEntiers>::iterator inumtesN; // " " "
// tout d'abord on met à jour les boites d'encombrement des éléments frontière
for (int jjf=1;jjf<=nbmailMaitre;jjf++)
for (int j=1;j<= nb_zone;j++)
{ iMfin=(t_listFront(jjf)(j)).end();
// tout d'abord on met à jour les boites d'encombrement des éléments frontière
for (iM = (t_listFront(jjf)(j)).begin() ; iM != iMfin; iM++)
(*iM).Boite_encombrement_frontiere(TEMPS_tdt,dep_max);
};
};
// parcours des noeuds esclaves
for (int intot = 1;intot<= nb_mail_Esclave;intot++) // boucle sur les maillages esclaves
{for (int j_zone=1;j_zone<= nb_zone;j_zone++)
{const Tableau <Noeud*>& tesc= tesctotal(intot)(j_zone); // pout simplifier la notation
@ -1174,18 +1209,20 @@ bool LesContacts::Nouveau(double dep_max)
{LaLIST < LaLIST<ElContact>::iterator > & list_tesN = tesN_encontact_ii[no];
nb_contact = list_tesN.size();
};
if (niveau_commentaire_lescontacts > 5)
(*gr_pour_noeud.ConteneurEntier()) = n_noee;
if (Permet_affichage(&li_pour_noeuds) > 6)
{
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours
cout << "\n proc " << proc_en_cours
#else
cout << "\n"
cout << "\n "
#endif
<< " (re) examen eventuel : contact du noeud " << n_noee << " du maillage " << num_mail_noe_esclave;
cout << " coord2= "; no->Coord2().Affiche_1(cout);
if (niveau_commentaire_lescontacts > 5)
if (Permet_affichage(&li_pour_noeuds) > 7)
{cout << " num_mail_dans_contact = " << num_mail_noe_esclave <<" inesc(num N local)= " << inesc
<< "\n tesN_encontact= " << nb_contact
<< "\n tesN_encontact= " << nb_contact
<< " contacts enregistres";
};
// on dit si un des contacts est actif
@ -1197,15 +1234,15 @@ bool LesContacts::Nouveau(double dep_max)
if ( (*(*il)).Actif() )
actif++;
if (actif)
{cout << "\n noeud actuellement en contact dans " << actif << " element(s) ";
{cout << "\n noeud actuellement en contact dans " << actif << " element(s) ";
if (tesN_collant(num_mail_noe_esclave)(j_zone)(inesc)) cout << " collant ";
}
else cout << "\n noeud actuellement pas en contact ";
else cout << "\n noeud actuellement pas en contact ";
int icont = 1;
for (il = list_tesN.begin();il != ilfin; il++,icont++)
{Front* elfront = (*(*il)).Elfront();
Element * elem = elfront->PtEI(); // l'element qui contiend la frontiere
cout << "\n elem_contact: "<<icont<<" avec frontiere: " << elfront->Num_frontiere()
cout << "\n elem_contact: "<<icont<<" avec frontiere: " << elfront->Num_frontiere()
<< " de l'element " << elem->Geometrie() << " : " << elfront->PtEI()->Num_elt()
<< ", type: " << Nom_type_geom(elfront->Eleme_const()->Type_geom_front())
<< " du maillage :" << elfront->PtEI()->Num_maillage();
@ -1238,8 +1275,8 @@ bool LesContacts::Nouveau(double dep_max)
Front* eltest = elc.Elfront();
if (eltest->MemeOrigine(elfront) )
{a_considerer=false;
if (elc.Permet_affichage() > 5)
{cout << "\n noeud esclave deja en contact "; elc.Affiche(1);
if (elc.Permet_affichage() > 6)
{cout << "\n noeud esclave deja en contact "; elc.Affiche(1);
};
break;}
};
@ -1259,7 +1296,9 @@ 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_lescontacts > 5)
(*gr_pour_noeud.ConteneurEntier()) = no->Num_noeud();
if (Permet_affichage(&li_pour_noeuds) > 7)
{// --- sortie d'info pour vérifier l'appartenance à la boite ou non
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours
@ -1283,14 +1322,14 @@ 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_lescontacts > 5)
if (Permet_affichage(&li_pour_noeuds) > 6)
{
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours
cout << "\n proc " << proc_en_cours
#else
cout << "\n"
cout << "\n "
#endif
<< "\n frontiere: " << elfront.Num_frontiere() << " (nb loc: "<<num_frontiere<<") "
<< " frontiere: " << elfront.Num_frontiere() << " (nb loc: "<<num_frontiere<<") "
<< ", type: " << Nom_type_geom(elfront.Eleme_const()->Type_geom_front())
<< " de l'element " << elem.Geometrie() << " : "
<< elfront.PtEI()->Num_elt()
@ -1318,21 +1357,23 @@ bool LesContacts::Nouveau(double dep_max)
// break;};
// };
*/
if (niveau_commentaire_lescontacts > 5)
{//cout << "\n 2debug LesContacts::Nouveau( " ;
(*gr_pour_noeud.ConteneurEntier()) = n_noee;
if (Permet_affichage(&li_pour_noeuds) > 7)
{cout << "\n liste des contacts sur le noeud " << n_noee
<< " qui est prevu en effacement sur l'increment " ;
LaLIST <ElContact>::iterator ila,ilafin=listContact_efface_tatdt.end();
for (ila = listContact_efface_tatdt.begin();ila != ilafin;ila++)
{ cout << "\n " << n_noee << " " << (*ila).Esclave()->Num_noeud()
{ cout << "\n " << n_noee << " " << (*ila).Esclave()->Num_noeud()
<< " " ;
(*ila).Elfront()->Affiche();
(*iM).Affiche();
cout << "\n ((*ila).Esclave()->Num_noeud() == noee->Num_noeud()) "
cout << "\n ((*ila).Esclave()->Num_noeud() == noee->Num_noeud()) "
<< ((*ila).Esclave()->Num_noeud() == n_noee);
cout << "\n ((*((*ila).Elfront()->Eleme())) == (*((*iM)->Eleme()))) "
cout << "\n ((*((*ila).Elfront()->Eleme())) == (*((*iM)->Eleme()))) "
<< ((*((*ila).Elfront()->Eleme())) == (*((*iM).Eleme())));
cout << "\n ((*ila).Esclave()->Num_Mail() == noee->Num_Mail()) "
cout << "\n ((*ila).Esclave()->Num_Mail() == noee->Num_Mail()) "
<< ((*ila).Esclave()->Num_Mail() == n_noee);
cout << "\n vraiment_nouveau_element= " << vraiment_nouveau_element << endl;
cout << "\n vraiment_nouveau_element= " << vraiment_nouveau_element << endl;
};
};
// on ne continue que si c'est un vrai nouvel élément
@ -1351,9 +1392,9 @@ bool LesContacts::Nouveau(double dep_max)
if (con.Permet_affichage() > 5)
{
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours
cout << "\n proc " << proc_en_cours
#else
cout << "\n"
cout << "\n "
#endif
<< " frontiere en contact deja existante , on arrete la creation ";
elfront.Affiche(1);
@ -1372,15 +1413,15 @@ bool LesContacts::Nouveau(double dep_max)
|| (elcont.Permet_affichage() > 5))
{ Front* elfront = elcont.Elfront();
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours
cout << "\n proc " << proc_en_cours
#else
cout << "\n"
cout << "\n "
#endif
<< " examen plus precis: frontiere: " << elfront->Num_frontiere()
<< " test nouveau contact: 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_lescontacts > 7)
if (Permet_affichage(&li_pour_noeuds) > 7)
elcont.Affiche();
};
@ -1388,8 +1429,7 @@ bool LesContacts::Nouveau(double dep_max)
// 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;
{cout << "\n retour de Contact: ret= " << ret;
}
if (ret)
{//sauvegarde éventuelle de l'element contact
@ -1405,14 +1445,14 @@ bool LesContacts::Nouveau(double dep_max)
|| (elcont.Permet_affichage() > 3))
{
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours
cout << "\n proc " << proc_en_cours
#else
cout << "\n"
cout << "\n "
#endif
<< "\n newcontact: " ;
<< " 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éé)
@ -1426,13 +1466,13 @@ bool LesContacts::Nouveau(double dep_max)
else
{ if ((niveau_commentaire_lescontacts > 5)
|| (elcont.Permet_affichage() > 5))
cout << " --> contact deja enregistre " ;
cout << " --> contact deja enregistre " ;
} ;
}
else
{ if ((niveau_commentaire_lescontacts > 5)
|| (elcont.Permet_affichage() > 5))
cout << " --> pas de contact " ;
cout << " --> pas de contact " ;
} ;
// listContact.push_back(elcont);numtesN.push_back(DeuxEntiers(intot,inesc));
@ -1463,37 +1503,41 @@ bool LesContacts::Nouveau(double dep_max)
if (niveau_commentaire_lescontacts > 3)
{
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours
cout << "\n proc " << proc_en_cours
#else
cout << "\n"
cout << "\n "
#endif
<< " bilan: "<< listContact.size() << " elem contact ";
<< " en fin de au debut de LesContacts::Nouveau: bilan: "<< listContact.size() << " elem(s) contact ";
if ( listContact_nouveau_tatdt.size())
cout <<", "<< (listContact_nouveau_tatdt.size()-taille_list_contact_nouveau_au_debut)
<< " nouveau(x) ";
if (listContact_efface_tatdt.size())
cout <<", "<<listContact_efface_tatdt.size() << " effactement(s) ";
};
if (niveau_commentaire_lescontacts > 4)
// on va lister les éléments de contact
{
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours
#else
cout << "\n"
#endif
<< " liste des Elcontact a la fin de LesContacts::Nouveau: (fct du niveau de commentaire des elcontact): ";
LaLIST<ElContact>::iterator ipp,ippfin=listContact.end();
for (ipp=listContact.begin();ipp != ippfin; ipp++)
{(*ipp).Affiche(2);};
cout << " fin liste ";
};
if (niveau_commentaire_lescontacts > 3)
{
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours
#else
cout << "\n "
#endif
<< " <== fin LesContacts::Nouveau " ;
};
if (niveau_commentaire_lescontacts > 4)
// on va lister les éléments de contact
{
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours
#else
cout << "\n"
#endif
<< " liste des Elcontact a la fin de LesContacts::Nouveau: (fct du niveau de commentaire des elcontact): ";
LaLIST<ElContact>::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;
@ -1582,7 +1626,7 @@ bool LesContacts::SuppressionDefinitiveElemInactif()
}
//**** j'ai l'impression que la ligne qui suit ne sert à rien, car le if précédent était uniquement pour les inactifs, donc si on va à la ligne qui suit
// c'est que l'élément est actif, donc cela ne sert à rien de le réactiver ???? ceci dit cela ne génère pas une erreur a priori
else {(*iE).Met_actif();}; // on valide l'activation
else {/*(*iE).Met_actif();*/}; // on valide l'activation
};
// info
if (niveau_commentaire_lescontacts > 2)
@ -1954,6 +1998,7 @@ bool LesContacts::Actualisation(int choix)
LaLIST<ElContact>::iterator ipp,ippfin=listContact.end();
for (ipp=listContact.begin();ipp != ippfin; ipp++)
{(*ipp).Affiche(2);};
cout << " fin liste ";
};
for (i=1, iE = listContact.begin(); iE !=iEfin; iE++,i++)//,iden++)
@ -2018,7 +2063,7 @@ bool LesContacts::Actualisation(int choix)
retour = true; // on signale le changement
}
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
// cas où test est forcément == 2 (car on a calculé test_existance) et on est arrivé sur un élément existant qui est actif
// on inactive l'element de contact
{if (test_existance->Actif())
{ LaLIST <ElContact>::iterator iiE = iE;
@ -2041,12 +2086,14 @@ bool LesContacts::Actualisation(int choix)
// 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)
{
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours<<": "
#else
cout << "\n"
#endif
<< " 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
@ -2066,34 +2113,42 @@ bool LesContacts::Actualisation(int choix)
{LaLIST < LaLIST<ElContact>::iterator > & list_tesN = tesN_encontact_ii[noe];
LaLIST < LaLIST<ElContact>::iterator >::iterator pl,plfin=list_tesN.end();
for (pl = list_tesN.begin();pl != plfin;pl++)
if ((*pl) != iE) // on évite celui qu'on vient d'inactiver !!
{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);
// on ne continue que si l'élément est inactif, sinon il est étudié dans la boucle globale
if (!(elc.Actif()))
{// 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
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
{ if (niveau_commentaire_lescontacts > 2)
{
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours<<": "
#else
cout << "\n"
#endif
<< "reactivation contact :";elc.Affiche(1);
};
}
else // sinon on inactive l'élément pour le ramener à l'état initial
{elc.Met_Inactif();
if (elc.Permet_affichage() > 2)
cout << " ===>> inactivation car element doublon ";
};
};
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)
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours<<": "
#else
cout << "\n"
#endif
<< "reactivation contact :";elc.Affiche(1);
}
else // sinon on inactive l'élément ;
elc.Met_Inactif();
};
};
@ -2114,6 +2169,7 @@ bool LesContacts::Actualisation(int choix)
LaLIST<ElContact>::iterator ipp,ippfin=listContact.end();
for (ipp=listContact.begin();ipp != ippfin; ipp++)
{(*ipp).Affiche(2);};
cout << " fin liste ";
// on calcule et affiche le nombre de contact actif
Calcul_Nb_contact_actif();
#ifdef UTILISATION_MPI
@ -2190,6 +2246,7 @@ void LesContacts::Liste_noeuds_position_changer(list <Noeud * >& li_noe)
li_noe.push_back(noe);
};
};
tempsContact.Arret_du_comptage(); // fin cpu
}
#ifdef UTILISATION_MPI
temps_transfert_court.Mise_en_route_du_comptage(); // comptage cpu
@ -2220,7 +2277,6 @@ void LesContacts::Liste_noeuds_position_changer(list <Noeud * >& li_noe)
}
else // cas du cpu 0
{// l'objectif ici est de récupérer les infos
tempsContact.Arret_du_comptage(); // fin cpu
union double_int
{ double x;
int n[2];
@ -2249,11 +2305,8 @@ void LesContacts::Liste_noeuds_position_changer(list <Noeud * >& li_noe)
nb_proc_terminer++; // on prend en compte que l'on a récupéré un conteneur
tempsContact.Arret_du_comptage();
};
#ifdef UTILISATION_MPI
if (niveau_commentaire_lescontacts >= 7)
cout << "\n proc 0: -- LesContacts::Liste_noeuds_position_changer: ";
#endif
};
#endif
@ -2263,13 +2316,28 @@ void LesContacts::Liste_noeuds_position_changer(list <Noeud * >& li_noe)
// calcul des reactions de contact et stockage des valeurs
// solution : le vecteur residu
// test d'un decollement eventuelle, pour un noeud en contact
// Dans le cas d'un calcul parallèle, tous les cpu calculent, mais seule le cpu 0
// affiche les messages normaux, mais tous les cpu affichent les messages d'erreur éventuels
// et les messages pour les niveaux de commentaires > 4
void LesContacts::CalculReaction(Vecteur& residu,bool& decol,const Nb_assemb& casAssemb
,bool affiche)
{
tempsContact.Mise_en_route_du_comptage(); // def deb compt
#ifdef UTILISATION_MPI
int proc_en_cours = ParaGlob::Monde()->rank();
#endif
int niveau_commentaire_lescontacts = Permet_affichage();
if (niveau_commentaire_lescontacts > 4)
cout << "\n -- LesContacts::CalculReaction: ";
#ifdef UTILISATION_MPI
if (proc_en_cours == 0)
#endif
if (niveau_commentaire_lescontacts > 4)
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours
#else
cout << "\n"
#endif
<< " -- LesContacts::CalculReaction: \n";
int nb_Assemb = casAssemb.n; // récup du numéro d'assemblage
// récup du type de contact
int contact_type = ElContact::Recup_et_mise_a_jour_type_contact();
@ -2295,7 +2363,13 @@ void LesContacts::CalculReaction(Vecteur& residu,bool& decol,const Nb_assemb& ca
int posi = noe->Pointeur_assemblage(X1,nb_Assemb); // position du ddl X1
#ifdef MISE_AU_POINT
if ( posi == -1 )
{ cout << "\nErreur : ddl X1 "
{
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours
#else
cout << "\n"
#endif
<< "Erreur : ddl X1 "
<< " inexistant pour le cas de charge " << nb_Assemb << '\n'
<< " LesContacts::CalculReaction( (1)\n";
tempsContact.Arret_du_comptage(); // fin cpu
@ -2356,7 +2430,13 @@ void LesContacts::CalculReaction(Vecteur& residu,bool& decol,const Nb_assemb& ca
{ posi = tabNoeud(it)->Pointeur_assemblage(X1,nb_Assemb) ; // position du ddl X1
#ifdef MISE_AU_POINT
if ( posi == -1 )
{ cout << "\nErreur : ddl X1 "
{
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours
#else
cout << "\n"
#endif
<< "Erreur : ddl X1 "
<< " inexistant pour le cas de charge " << nb_Assemb << '\n'
<< " LesContacts::CalculReaction( (2)\n";
tempsContact.Arret_du_comptage(); // fin cpu
@ -2375,16 +2455,26 @@ void LesContacts::CalculReaction(Vecteur& residu,bool& decol,const Nb_assemb& ca
};
};
// affichage éventuelle de la force maxi de contact
Forces_contact_maxi(affiche);
// idem pour les gap N et T
Gap_contact_maxi(affiche);
#ifdef UTILISATION_MPI
if (proc_en_cours == 0)
#endif
{Forces_contact_maxi(affiche);
// idem pour les gap N et T
Gap_contact_maxi(affiche);
};
tempsContact.Arret_du_comptage(); // fin cpu
};
// affichage des reactions de contact sur la sortie
// il s'agit ici d'une sortie sur fichier : seule le cpu 0 l'effectue
void LesContacts::Affiche(ofstream& sort) const
{ // on balaie le tableau de reaction
{
#ifdef UTILISATION_MPI
int proc_en_cours = ParaGlob::Monde()->rank();
if (proc_en_cours == 0)
#endif
// on balaie le tableau de reaction
for (int i= 1; i<= tabReacCont.Taille();i++)
{ ReactCont & R = tabReacCont(i);
sort << "\n================= noeud esclave ==================";
@ -2404,16 +2494,16 @@ void LesContacts::Affiche(ofstream& sort) const
};
// affichage à l'écran des informations liées au contact
// cas d'un calcul parallèle, on considère qu'il s'agit d'un affichage volontaire
// donc tous les cpu peuvent l'utiliser: on affiche en + le num du cpu
void LesContacts::Affiche() const
{
#ifdef UTILISATION_MPI
int proc_en_cours = ParaGlob::Monde()->rank();
cout << "\n proc " << proc_en_cours
#else
cout << "\n"
#endif
#ifdef UTILISATION_MPI
cout << "\n proc " << proc_en_cours
#else
cout << "\n"
#endif
<< "\n ---- affichage des informations liees au contact --------";
cout << "\n 1) liste des elements en contact";
LaLIST <ElContact>::const_iterator il,ilfin=listContact.end();
@ -2690,7 +2780,7 @@ void LesContacts::Lecture_zone_contact(UtilLecture & entreePrinc,const LesRefere
#ifdef UTILISATION_MPI
if (proc_en_cours == 0)
#endif
cout << " fin de la lecture du nombre de domaines esclaves en auto-contact " << endl;
cout << " fin de la lecture du nombre de domaines esclaves en auto-contact " << endl;
entreePrinc.NouvelleDonnee(); // positionnement sur une nouvelle info
};
// --- cas des zones particulières de contact
@ -2738,12 +2828,12 @@ void LesContacts::Lecture_zone_contact(UtilLecture & entreePrinc,const LesRefere
};*/
// lecture normale, vérification que la référence existe bien
{
#ifdef UTILISATION_MPI
if (proc_en_cours == 0)
#endif
if (!(lesRef.Existe(nom_ref,nom_mail)))
{ cout << "\n erreur le nom de reference de zone de contact : " << nom_ref
{
#ifdef UTILISATION_MPI
if (proc_en_cours == 0)
#endif
cout << "\n erreur le nom de reference de zone de contact : " << nom_ref
<< " , n'existe pas !!"
<< "\n LesContacts::Lecture_zone_contact(..";
throw (UtilLecture::ErrNouvelleDonnee(-1));
@ -2788,7 +2878,7 @@ void LesContacts::Lecture_zone_contact(UtilLecture & entreePrinc,const LesRefere
#ifdef UTILISATION_MPI
if (proc_en_cours == 0)
#endif
cout << " fin de la lecture des zones de contact " << endl;
cout << " fin de la lecture des zones de contact " << endl;
};
// --- cas des contacts solide-deformable
if (strstr(entreePrinc.tablcar,"contact_solide_deformable")!=NULL)
@ -2796,7 +2886,7 @@ void LesContacts::Lecture_zone_contact(UtilLecture & entreePrinc,const LesRefere
#ifdef UTILISATION_MPI
if (proc_en_cours == 0)
#endif
cout << " debut de la lecture des contacts solide-deformable " << endl;
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)))

View file

@ -226,18 +226,18 @@ class LesContacts
// récupération via les éléments de contact des forces maxis
// un : le maxi en effort normal, deux: le maxi en effort tangentiel
DeuxDoubles Forces_contact_maxi(bool affiche) const;
DeuxDoubles Forces_contact_maxi(bool affiche) ;
// récupération via les éléments de contact des gaps maxis
// récupération via les éléments de contact des gaps maxi en négatif, donc les mini
// un : le maxi en gap normal, deux: le maxi en gap tangentiel
DeuxDoubles Gap_contact_maxi(bool affiche) const;
DeuxDoubles Gap_contact_maxi(bool affiche) ;
// cas d'une méthode avec pénalisation: calcul éventuel d'un pas de temps idéal,
// si oui retour de la valeur delta_t proposé
// sinon dans tous les autres cas retour de 0.
// le calcul se fait en fonction du pas de temps courant, des forces de réaction et de la pénétration
// donc nécessite que le contact ait déjà été étudié et que les efforts de contact ait été calculé
double Pas_de_temps_ideal()const;
double Pas_de_temps_ideal();
// calcul d'une estimation du pas de temps critique du aux éléments de contact
@ -323,14 +323,18 @@ class LesContacts
//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;
// li si non nulle permet d'indiquer spécifiquement quelle grandeur on veut
// sortir
int Permet_affichage(list <TypeQuelconque> * li = NULL ) const
{ int niveau_commentaire_lescontacts;
return( (fct_niveau_commentaire == NULL) ?
(niveau_commentaire_lescontacts == 0) ? ParaGlob::NiveauImpression() : niveau_commentaire_lescontacts
: Valeur_fct_nD_LesContacts(fct_niveau_commentaire, li
,LesContacts::tqi_fct_nD_niveau_commentaire
,LesContacts::tqi_const_fct_nD_niveau_commentaire
,LesContacts::t_num_ordre_fct_nD_niveau_commentaire)
);
};
// initialisation de la liste de grandeurs qui sont effectivement gérées par le contact
// ok, mais à revoir sans doute cf. pense bete 14 oct
@ -366,7 +370,14 @@ class LesContacts
// VARIABLES PROTEGEES de la classe LesContacts:
LesFonctions_nD* sauve_lesFonctionsnD ; // sauvegarde à l'initialisation (méthode Init_contact)
ElContact::Fct_nD_contact fct_nD_contact; // fonctions nD de pilotage: peuvent ne pas exister
// -- partie affichage éventuellement piloté
Fonction_nD * fct_niveau_commentaire; // fct nD dans le cas d'une valeur pilotée
static Tableau <const TypeQuelconque * > tqi_const_fct_nD_niveau_commentaire;
static Tableau < TypeQuelconque * > tqi_fct_nD_niveau_commentaire;
static Tableau <int> t_num_ordre_fct_nD_niveau_commentaire;
// -- fin partie affichage éventuellement piloté
LaLIST <ElContact> listContact; // la liste des elements en contact
LaLIST <LaLIST <ElContact>::iterator> listContact_nouveau_tatdt; // la liste des nouveaux contacts qui sont apparus sur l'incrément
LaLIST <ElContact> listContact_efface_tatdt; // la liste des contacts effacés sur l'incrément
@ -440,7 +451,7 @@ class LesContacts
// sans changer la map
Tableau < std::map<Noeud*,LaLIST < LaLIST<ElContact>::iterator > > > tesN_encontact;
// tesN_encontact(numMail_esclave)[*pt_noeud] -> la liste des iterators d'élément en contact
// tesN_encontact(numMail_esclave)[*pt_noeud] -> la liste des iterators d'élément de contact
// avec le noeud
//--------- fin tableaux de gestions pour la recherche de contact ----------------
@ -524,6 +535,19 @@ class LesContacts
return (&(*ili));
return NULL;
} ;
// init éventuel du pilotage par fct nD du niveau de commentaire
void Init_fct_niveau_commentaire();
// définition des conteneurs des TypeQuelconque pour fct nD de LesContacts
void Definition_conteneurs_fctnD_TypeQuelconque
(Fonction_nD * pt_fonct,Tableau < TypeQuelconque * >& tqi,Tableau < const TypeQuelconque * >& tqii
,Tableau <int>& t_num_ordre );
// calcul d'une fonction nD relative à aux données de LesContacts
double Valeur_fct_nD_LesContacts(Fonction_nD * fct_nD,list <TypeQuelconque> * li
,Tableau < TypeQuelconque * >& tqi
,Tableau < const TypeQuelconque * >& tqii
,Tableau <int>& t_num_ordre) const;
};
/// @} // end of group

View file

@ -49,6 +49,9 @@ void LesContacts::Lec_base_info_LesContacts(ifstream& ent
,Element& (T::*RecupElement_LesMaille)(int i, int j) const)
{
int niveau_commentaire_lescontacts = Permet_affichage();
if (Permet_affichage()>4)
cout << "\n -- LesContacts::Lec_base_info_LesContacts ";
// 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;

File diff suppressed because it is too large Load diff