Anomalie #401
ouvertproblème de convergence en relaxation dynamique avec contact
Ajouté par Julien Troufflard il y a 13 jours. Mis à jour il y a 6 jours.
Description
(Herezh v7.067)
reprise du calcul ticket 400 ( https://herezh.irdl.fr/issues/400 ) pour essayer de faire converger le calcul.
avec les modifs suivantes :
- ajout de VECT_REAC_N, RESIDU_GLOBAL et FORCE_GENE_EXT en sortie Gmsh
- ajout des fichiers pour générer les maillages bande.her et structure.her (possibilité de faire varier nombre d'éléments et degré d'interpolation => utiliser les fichiers src_mail_bande et structure.geo + src_mail_structure)
NB : mode debug avec une sortie tous les 20 itérations
ci-joint une archive qui crée le répertoire pb_convergence/ et divers résultats gnuplot/gmsh
Actuellement, la bande souple trouve une position d'équilibre par contact avec la structure. Mais le calcul ne converge pas à la précision demandée (5.e-4). Par exemple, si on calcule 1500 itérations, la norme E_cinetique/E_statique_ET_ResSurReact reste élevée (0.741) alors que plus rien ne bouge réellement depuis au moins l'itération 1300
voici un premier graphique pour voir l'évolution du calcul au cours des itérations :
Concernant le critère de convergence, la partie cinétique n'est pas en cause avec une énergie cinétique très faible devant l'énergie interne dans les dernières itérations (une E_c de l'ordre de 1.e-3 devant une E_int de 35. Je me pose la question des grandeurs de force pour la partie residu/reaction.
D'après Gmsh, si on regarde les grandeurs à l'itération 1500 :
voici un premier aperçu de la situation finale en essayant de comparer RESIDU_GLOBAL (vecteurs sur l'image) à la réaction R_X3 (isovaleurs) :
Dans le contexte d'une norme infinie, le max de R_X1 et R_X2 est plus petit que le max de R_X3 (égal à 2). Donc a priori c'est R_X3 qui gouverne la Norme obtenue. Et d'après le graphe on aurait des vecteurs RESIDU_GLOBAL de norme 1.44 au maximum (on ne voit ce vecteur max pas sur l'image, il est dans la zone contact au milieu vers X=500, le vecteur rentre dans la matière et est masqué par les isovaleurs vertes de la structure).
un calcul à la louche residu/reaction donne : 1.44 / 2 = 0.71.
c'est proche de la norme affichée dans le terminal :
**** Norme E_cinetique/E_statique_ET_ResSurReact --> 0.74148570
mais je ne suis pas sûr de ce qu'a réellement utilisé Herezh pour faire son calcul de critère d'arrêt.
J'ai regardé les diverses forces mises en jeu :
chargement de pression :
force de contact :
vecteur réaction :
et le résidu obtenu aux noeuds :
Je n'ai pas compris la logique de classement des forces. Des noeuds non bloqués par des conditions limites se retrouvent classés dans la catégorie "noeuds ayant une force de réaction". Le fait qu'il y ait du contact conduit donc à générer des forces de réaction. Conceptuellement, je ne sais pas si c'est juste. Le concept de force de réaction est pour moi la manière de "simuler" la présence d'une pièce non représentée par un maillage. Maillage qui aurait produit une force de contact et que l'on a remplacé par un blocage de noeud.
En fait, pour des maillages qui sont en équilibre par contact, si le maillage 1 exerce une force sur le maillage 2, on devrait avoir une force similaire de sens opposé du maillage 2 sur le maillage 1. C'est pour moi une force analogue à un chargement extérieur de l'un sur l'autre, et non une force de réaction. puisque les 2 pièces sont modélisées dans le calcul.
Mon avis est qu'il y a soit une force qui se retrouve dans le RESIDU_GLOBAL et qui n'y a pas sa place, soit au contraire il en manque une. Ce qui produit une non convergence factice alors qu'en vrai, tout est en équilibre. Le calcul mécanique serait bon, mais pas les sorties et pas non plus ce qui est utilisé pour le critère d'arrêt.
Je vais attendre ton avis. On verra s'il y a besoin d'être plus précis. Par exemple, en faisant un calcul moins compliqué pour bien cerner ce qui se passe (un exemple avec un unique noeud qui vient au contact d'une unique facette)
Fichiers
| pb_convergence.tar (100 ko) pb_convergence.tar | Julien Troufflard, 17/09/2026 10:57 | ||
| FORCE_CONTACT.png (28,4 ko) FORCE_CONTACT.png | Julien Troufflard, 17/09/2026 10:57 | ||
| FORCE_GENE_EXT.png (29,2 ko) FORCE_GENE_EXT.png | Julien Troufflard, 17/09/2026 10:57 | ||
| evolution_calcul.png (49,6 ko) evolution_calcul.png | Julien Troufflard, 17/09/2026 10:57 | ||
| RESIDU_GLOBAL.png (28,6 ko) RESIDU_GLOBAL.png | Julien Troufflard, 17/09/2026 10:57 | ||
| R_X3_RESIDU_GLOBAL.png (37 ko) R_X3_RESIDU_GLOBAL.png | Julien Troufflard, 17/09/2026 10:57 | ||
| VECT_REAC_N.png (28,5 ko) VECT_REAC_N.png | Julien Troufflard, 17/09/2026 10:57 | ||
| test.info (2,94 ko) test.info | le fichier pour première convergence | Gérard Rio, 17/09/2026 12:02 | |
| forces_et_residu.png (20,5 ko) forces_et_residu.png | Julien Troufflard, 17/09/2026 16:24 | ||
| montageEmilie_equilibre.png (14,4 ko) montageEmilie_equilibre.png | Julien Troufflard, 17/09/2026 18:54 | ||
| montageEmilie_forces_et_contact.png (20,9 ko) montageEmilie_forces_et_contact.png | Julien Troufflard, 17/09/2026 19:09 | ||
| exemple_non_dynamique.tar (110 ko) exemple_non_dynamique.tar | Julien Troufflard, 17/09/2026 19:29 | ||
| montageEmilie_force_gene_ext.png (4,79 ko) montageEmilie_force_gene_ext.png | Julien Troufflard, 17/09/2026 19:33 | ||
| test.CVisu (28,7 ko) test.CVisu | Julien Troufflard, 18/09/2026 12:47 | ||
| test.info (1,72 ko) test.info | Julien Troufflard, 18/09/2026 12:49 | ||
| step1_avec_collage.png (6 ko) step1_avec_collage.png | Julien Troufflard, 23/09/2026 09:21 | ||
| step2_sans_collage.png (5,71 ko) step2_sans_collage.png | Julien Troufflard, 23/09/2026 09:22 |
Mis à jour par Gérard Rio il y a 13 jours
J'ai modifié le fichier .info pour obtenir la convergence, mais mes modifs sont peut-être surabondantes (sans doute même) mais elles résultent de plusieurs essais.
typeCalRelaxation= 1 lambda= 15.
ITERATIONS 999999999
PROP_VALPROPRE_RAIDEUR 0.00001
FORCE_CONTACT_NOEUD_MAXI 1.e2
PENETRATION_BORNE_REGULARISATION_PLUS 1.01
d'où
... convergence en 3483 iterations
On peut surement faire mieux mais c'est un début.
Mis à jour par Gérard Rio il y a 13 jours
Au niveau du critère de convergence, je vais essayer de donner quelques infos. Il faut noter qu'il y a en fait beaucoup de choix de norme de convergence, et effectivement il est préférable de bien comprendre comment ça fonctionne.
ici on demande:
NORME E_cinetique/E_statique_ET_ResSurReact
c'est géré par:
bool Algori::Convergence
(bool affiche,double last_var_ddl_max,Vecteur& residu,double maxPuissExt,double maxPuissInt,double maxReaction
,int itera,bool& arret)
dans lequel on peut utiliser en particulier:
maxPuissExt : le maxi des puissances virtuelles externes qui pour une vitesse virtuelle == 1, comprennent toutes les forces qui s'appliquent sur les différents solides donc y compris les forces de contact, qui sont des forces externes à chaque solide
maxPuissInt : le maxi des forces généralisées internes, développées par chaque solide
maxReaction : le maxi des forces externes due aux ddl bloqués (CL ou CLL)
maxresidu : le maxi du déséquilibre d'effort à chaque noeud calculé via le vecteur residu
pour la norme demandée on va faire:
laNorme = MaX(E_cin_tdt/max_abs_eners,maxresidu/maxReaction);
avec : max_abs_eners = MaX(Dabs(E_int_tdt),Dabs(E_ext_tdt));
les énergies sont calculées par différences finies sur un incrément, dans:
void Algori::CalEnergieAffichage(const Vecteur & delta_X,int icharge,bool brestart,const Vecteur & forces_vis_num
,int aff_iteration)
en particulier on a:
E_int_tdt = E_int_t - 0.5 * (delta_X * F_int_t)
E_ext_tdt = E_ext_t + 0.5 * (delta_X * F_ext_t) avec
F_ext_t sont les forces externes généralisées qui comprennent toutes les forces qui s'appliquent sur les solides, donc y compris les forces de contact
F_int_t sont les forces généralisées internes
les énergies sont calculées en début d'itération, avant la résolution de l'équation d'équilibre, au moment où on test la convergence
Mis à jour par Gérard Rio il y a 13 jours
avec
typeCalRelaxation= 1 lambda= 5.
... convergence en 1941 iterations
Mis à jour par Julien Troufflard il y a 12 jours
- Fichier forces_et_residu.png forces_et_residu.png ajouté
ok. Pour la force de contact, j'avais choisi une limite par borne de 1 N et pas assez joué avec le facteur de pénalisation.
C'est surtout PENETRATION_BORNE_REGULARISATION_PLUS qui permet la convergence. La zone centrale de la bande se retrouve attirée dès le début. La force de contact maxi permet de gérer le moment où le reste de la membrane "percute" la structure (c'est le seul moment où la force de contact atteint ce max).
J'ai tendance à ne pas mettre le paramètre PENETRATION_BORNE_REGULARISATION_PLUS car il rend le contact collant. Mais là on dirait que c'est indispensable. Je vais tenter avec une fonction nD pour faire tendre ce paramètre vers 0 quand on atteint la convergence.
Pour ce qui est de ma remarque sur le bilan des forces. Tu n'as pas répondu, donc ça doit être hors sujet ou naze... Et tu as démontré qu'on peut faire converger le calcul. Mais ça me titille quand même. Parce que ce n'est pas le cas sur d'autres codes EF (le contact ne crée pas des forces de réaction en sortie de résultat; les réactions étant exclusivement obtenues aux noeuds ayant des CL).
Je tente une dernière fois :)
J'ai repris tes paramètres, sauf la pénalisation que j'ai remis à 0.1. La force de contact est donc en permanence à faire du flip/flop avec une force à la borne max (100 N) alternant entre +Z et -Z. J'ai fait tourner sur 3000 itérations. pas de convergence. Et voici ci-dessous la situation à l'itération 3000 en affichant les 4 types de vecteurs force dispo dans Gmsh.
C'est l'illustration de ce que je ne comprends pas :
1) Il y a un noeud dans le maillage qui a à la fois : une force de contact de 100N, une force extérieure de 100N, une réaction de 100N. Tout est orienté dans la même direction. Et ça donne un résidu global de presque 100N. Tout est concentré sur ce noeud de la bande. Il n'y a aucune force comparable ailleurs.
2) Les forces de réaction sur la structure sont carrément égales à 0. Quand on regarde dans le dernier nodedata du fichier Gmsh, la trentaine de derniers noeuds correspond aux noeuds du maillage 2 structure.her. Toutes leurs valeurs sont 0 que ce soit R_X1, R_X2, R_X3, VECT_REAC_N. Tout se passe comme si ce maillage ne subissait aucune force alors qu'il est entièrement bloqué par des CL. Même observation sans mode debug quand on a la convergence en 1941 itérations.
3) A noter que ma remarque 2) n'est pas vraie dans le cas sur un calcul non_dynamique (par exemple un calcul de type "montage Emilie"). On récupère bien des réactions sur des maillages maitre, entièrement bloqué ou pas. On dirait qu'il y a un pb de sortie de grandeur dans le cas de la relaxation dynamique ?
Mis à jour par Gérard Rio il y a 12 jours
ok. Pour la force de contact, j'avais choisi une limite par borne de 1 N et pas assez joué avec le facteur de pénalisation.
- oui, compte tenu de la différence de raideur entre la toile et les barres d'aciers, j'ai vraiment diminué le facteur. Là je me dis qu'il faudrait peut-être calculer un facteur lié à la toile par exemple en prenant en compte le maxi de la raideur locale des éléments qui contiennent le noeud esclave. Ce serait un peu une variante.
J'ai tendance à ne pas mettre le paramètre PENETRATION_BORNE_REGULARISATION_PLUS car il rend le contact collant.
oui et non, en fait j'ai mis 1.01 mais on pourrait sans doute mettre beaucoup plus faible. Le vrai intérêt est que cela évite des détachements intenpestifs due à des oscillations, qui sont particulièrement présents avec de la RD cinématique. Quand on est en traction, la force est très faible !
Je vais te répondre pour le reste ... à suivre
Mis à jour par Gérard Rio il y a 12 jours
dans la visualisation que tu montres, mon interprétation est la suivante:
on n'est pas en équilibre et on est en limitation de la force de contact. Les forces de réaction ne sont pas équilibrées et donc on a ici:
- le résidu (le déséquilibre) approximativement la force maxi de contact (il faudrait mettre plus de décimales pour être plus précis)
- force de contact == la réaction
En implicite, je pense que le résultat que tu observes est à l'équilibre du coup:
- le résidu doit être petit (cf. la norme utilisée) et la force de contact doit être identique à la réaction.
Mais il y a encore un point différent entre le cas du joint et ici:
- dans le cas du joint, on a les deux solides qui sont déformables: il y a donc des résultats sur les deux solides
- ici toutes la structure est bloquée, et dans ce cas je considère qu'il s'agit d'un solide non déformable, c-a-d les ddl de l'élément de contact ne comprennent que les ddl du noeud esclave. Par contre normalement je reporte les efforts de contact sur les noeuds de la facette ???
il y a peut-être un boulette, il faudra que je regarde !
Mis à jour par Julien Troufflard il y a 12 jours
- Fichier montageEmilie_equilibre.png montageEmilie_equilibre.png ajouté
- Fichier montageEmilie_forces_et_contact.png montageEmilie_forces_et_contact.png ajouté
- Fichier exemple_non_dynamique.tar exemple_non_dynamique.tar ajouté
- Fichier montageEmilie_force_gene_ext.png montageEmilie_force_gene_ext.png ajouté
ok. précision concernant le calcul non_dynamique type montage Emilie (que j'ai mis en pièce jointe si besoin => exemple_non_dynamique.tar)
c'est un cas où le maillage du joint à des CL selon Y en haut et en bas, et des contacts à gauche et à droite.
j'obtiens une réaction sur un maillage maitre qui est entièrement bloqué. Dans le calcul ci-dessous, le maillage de gauche est entièrement bloqué et subit la plus grande réaction. Le maillage de droite peut se déformer (encastré en haut et en bas). Cette visu permet de comparer les valeurs RESIDU_GLOBAL et VECT_REAC_N :
L'affichage terminal annonce une Norme (Residu/Reaction) de 0.00013293 (donc ok car le critère est 5.e-4). D'après les valeurs Gmsh, on aurait plutôt 151 / 83149.8 = 0.001816. Le critère est en norme infini, mais comme les vecteurs sont alignés sur Y, j'aurais supposé ce calcul fiable. Et pourtant il y a une différence nette. D'après les valeurs Gmsh, le calcul n'aurait pas dû converger. Je ne sais donc toujours pas exactement déterminer quelles valeurs Herezh utilise pour calculer son critère.
Si on zoome plus en détail sur le joint en contact, ça donne ça (j'ai limité l'échelle de VECT_REAC_N) :
je comprends bien la force de réaction sur la chemise vu précédemment. Le joint pousse sur la chemise vers la gauche et donc la chemise applique une force de contact vers la droite. En réaction, on récupère une réaction sur la chemise orienté vers la gauche (opposé à la force de contact).
la force de contact est donc une force exercée par le maitre sur l'esclave. Du coté de la chemise, les noeuds du maillage joint ont une force de contact vers la gauche (chemise sur le joint).
C'est surtout la réaction sur les noeuds du maillage esclave (joint) que je ne comprends pas. Elle est égale à la force de contact, même norme, même direction. C'est la réaction de quoi par rapport à quoi sachant qu'il n'y a aucune de force de contact sur les noeuds des maillages maitre (en tout cas pas dans les sorties Gmsh) ? est-ce que cette force de réaction intervient dans le bilan des forces ?
je ne comprends pas non plus la présence de forces de réaction sur les maillages maitre aux zones de contact.
autre point : questionnement aussi sur FORCE_GENE_EXT. Elle donne presque la même visu que VECT_REAC_N (il manque les 2 lignes de noeuds du joint bloqués par une CL selon y). FORCE_GENE_EXT est le vecteur chargement extérieur. Sur la visu ci-dessous, on voit que la force FORCE_GENE_EXT max est identique à la force VECT_REAC_N vue précédemment (en norme et en direction) :
donc le fait d'introduire du contact implique d'obtenir sur les divers maillages : des réactions et du chargement extérieur, en parallèle de la force de contact. Quelles sont les forces prises en compte pour déterminer RESIDU_GLOBAL ?
Mis à jour par Gérard Rio il y a 12 jours · Edité
- % réalisé changé de 10 à 20
L'affichage terminal annonce une Norme (Residu/Reaction) de 0.00013293 (donc ok car le critère est 5.e-4). D'après les valeurs Gmsh, on aurait plutôt 151 / 83149.8 = 0.001816. Le critère est en norme infini, mais comme les vecteurs sont alignés sur Y, j'aurais supposé ce calcul fiable. Et pourtant il y a une différence nette. D'après les valeurs Gmsh, le calcul n'aurait pas dû converger. Je ne sais donc toujours pas exactement déterminer quelles valeurs Herezh utilise pour calculer son critère.
la bonne valeur du résidu à convergence est celle indiquée pendant le déroulement du calcul c-a-d ici 11... si tu sors maxresiduglobal dans gmsh, tu as aussi la bonne valeur. Par contre dans gmsh le vecteur résidu qui est indiqué est celui de l'itération précédente. J'utilise un vecteur intermédiaire pour la sortie et ce vecteur est rempli juste avant la résolution mais lorsqu'il y a convergence, le programme ne passe pas par le remplissage du vecteur intermédiaire car il n'y a pas de résolution.
Du coup j'ai modifié la chose et maintenant (version 7.068) on a bien le résidu à la convergence dans gmsh
je comprends bien la force de réaction sur la chemise vu précédemment. Le joint pousse sur la chemise vers la gauche
c'est plutôt vers la droite
et donc la chemise applique une force de contact vers la droite.
vers la gauche
En réaction, on récupère une réaction sur la chemise orienté vers la gauche (opposé à la force de contact).
vers la droite
la force de contact est donc une force exercée par le maitre sur l'esclave.
oui
Du coté de la chemise, les noeuds du maillage joint ont une force de contact vers la gauche (chemise sur le joint).
oui
C'est surtout la réaction sur les noeuds du maillage esclave (joint) que je ne comprends pas. Elle est égale à la force de contact, même norme, même direction. C'est la réaction de quoi par rapport à quoi sachant qu'il n'y a aucune de force de contact sur les noeuds des maillages maitre (en tout cas pas dans les sorties Gmsh) ?
C'est due à un choix arbitraire que j'ai fait. Les forces dites de contact en gmsh sont celles qui sont sur les noeuds esclaves. Les forces de réaction, dans le cas des éléments de contact sont celles qui sont en réaction de celles exercés sur les noeuds esclaves et aussi ... celles celles du maître vers l'esclave. Donc il y a redondance entre forces de contact et force de réaction, concernant les noeuds esclaves.
est-ce que cette force de réaction intervient dans le bilan des forces ?
oui, bien sûr : au niveau du calcul d'équilibre il faut considérer les 2 solides indépendamment:
- chacun avec toutes les forces qui s'exercent sur sa frontière: donc les forces imposées (dans le .inof) et les forces de contact. Seules les forces qui agissent sur les noeuds bloqués ne font pas partie du lot. En fait on considère toutes les forces gene ext (cf. plus bas)
je ne comprends pas non plus la présence de forces de réaction sur les maillages maitre aux zones de contact.
cf. ma précédente explication
autre point : questionnement aussi sur FORCE_GENE_EXT. Elle donne presque la même visu que VECT_REAC_N (il manque les 2 lignes de noeuds du joint bloqués par une CL selon y). FORCE_GENE_EXT est le vecteur chargement extérieur. Sur la visu ci-dessous,
FORCE_GENE_EXT ne contient pas les forces induites par les ddl bloqués (dans le .info). FORCE_GENE_EXT contient que les forces qui sont prises en compte pour calculer l'équilibre
on voit que la force FORCE_GENE_EXT max est identique à la force VECT_REAC_N vue précédemment (en norme et en direction) :
oui, les forces générales extérieures correspondent aux forces imposées: soit directement via les conditions de forces imposes, soit via le contact avec les forces de contact.
S'il n'y a pas autres choses que du contact alors FORCE_GENE_EXT == VECT_REAC
donc le fait d'introduire du contact implique d'obtenir sur les divers maillages : des réactions et du chargement extérieur, en parallèle de la force de contact. Quelles sont les forces prises en compte pour déterminer RESIDU_GLOBAL ?
toutes les forces généralisées qui agissent sur les noeuds: forces internes, forces externes : fixes due au CL et CLL et de contact
Mis à jour par Julien Troufflard il y a 12 jours
- Fichier test.CVisu test.CVisu ajouté
- Fichier test.info test.info ajouté
ok. bon, l'idée de départ était de voir s'il ne manquait pas une force dans le bilan. Et c'est une fausse piste.
Mais ça m'intéresse. Je regarde tout ça de mon côté sur un cas très simple. Notamment FORCE_GENE_INT que je n'avais pas pensé à sortir. etc...
Pour en revenir à l'amélioration de la convergence. J'ai tenté une fonction nD sur PENETRATION_BORNE_REGULARISATION_PLUS. Sans grand résultat. Je ne peux pas empêcher le fait d'avoir des noeuds qui ont envie de se coller alors qu'ils ne sont pas au contact. Diminuer globalement ce paramètre empêche de converger. Sur un premier test de fonction nD linéaire avec une borne min 0.1 et une borne max 1.01, le faire tendre vers 0.1 ne change pas le résultat final. Car lorsque la structure arrive à un état d'équilibre, les noeuds qui ont été collés du fait de PENETRATION_BORNE_REGULARISATION_PLUS sont très proches de la structure, et donc reste dans un rayon de 0.1. Si je mets 0.01, ça ne converge plus.
A voir s'il faut creuser plus.
En tout cas, ça m'a permis de voir que par défaut, PENETRATION_BORNE_REGULARISATION_PLUS est égal à PENETRATION_BORNE_REGULARISATION. ce que j'avais oublié. Quelque soit la valeur de PENETRATION_BORNE_REGULARISATION_PLUS, c'est mieux de le faire apparaitre explicitement dans le .info pour maitriser ce paramètre.
J'ai voulu tenter une autre stratégie :
1) mettre PENETRATION_BORNE_REGULARISATION_PLUS assez faible (par exemple 0.05)
2) atténuer le flip/flop de réaction à l'aide de NORME_MAXI_INCREMENT (par exemple 0.1)
on en a déjà discuté. En RD, Herezh est sensé tenir compte de ce paramètre. Mais avec ma mise en données, on dirait que non. J'ai tenté 1e-9, ce qui normalement devrait être limitant, même dans un calcul dynamique DFC.
je n'ai jamais de message de type "intervention de la reduction du vecteur increment".
ci-joint mon .info actuel (et le .CVisu dans lequel j'ai ajouté une sortie FORCE_GENE_INT)
les changements sont :
- fonction nD utilisant des constantes pour PENETRATION_BORNE_REGULARISATION_PLUS (mais non utilisé, le calcul proposé ici fixe ce param à 0.05)
- NORME_MAXI_INCREMENT à 1e-9
Mis à jour par Gérard Rio il y a 11 jours
- % réalisé changé de 20 à 30
J'ai remarqué un dysfonctionnement au niveau de l'affichage dans le terminal:
On a quelque chose après chaque présentation d'itération, comme :
contact: reaction ==> F_N => [-0.92759015 : 0.41573111], F_T max = 0.00000000, [-0.00358494 <= gap_N <= 0.00317499], [0.00000000 <= gap_T <= 0.00000000]
avec la version 7.067,
-0.92759015 : représente la force du maxi de la pénétration de tous les éléments de contact actif
0.41573111 : le maxi de la force de collage de tous les éléments de contact actif
idem pour le gap_N et gap_T
Le pb est que certains éléments de contact bien qu'étant actif, ne conduisent pas à un résidu pris en compte, car par exemple, gap_N est en dehors du cadre acceptable pour le type de contact retenu.
L'élément est toujours considéré actif, car on a bien des conditions de contact recevables au titre général de contact: c-a-d la projection est bien située sur une facette maître et le noeud esclave est bien interne à l'élément maître qui contient la facette.
Mais quand au moment du calcul du résidu (et la raideur) suivant le type de contact retenu, la contribution du résidu peut être annulée du coup cela veut dire que l'élément d'un point de vue de l'équilibre mécanique ne contribue pas aux efforts externes appliqués sur les solides et au niveau de la présentation des résultats, il ne faut pas prendre en compte ses infos (F_N, gap_N, F_T max, gap_T).
Du coup j'ai introduit un nouveau drapeau dans les éléments de contact, qui me permet, pour la sortie à l'écran, de filtrer uniquement les éléments actifs qui ont contribué au dernier calcul de résidu (et de raideur)
NB: gap_T n'est calculé que si on considère du frottement ou du contact collant
Mis à jour par Gérard Rio il y a 11 jours
j'ai fait qq calculs avec modifications de paramètres.
une autre modif dans Herezh: je calcule et j'affiche la somme de tous les forces de contact (en négatif) et de tous les forces de collage (en positif)
je pense que ça permet de relativiser les forces ponctuelles de contact
Du coup j'obtiens les résultats suivants:
-----------------------------------------
PROP_VALPROPRE_RAIDEUR 1.e-6
PENETRATION_CONTACT_MAXI 1. # 1.e-1 #
PENETRATION_BORNE_REGULARISATION 1.e-2 # 1e-3 #
DISTANCE_MAXI_AU_PT_PROJETE 20.
PENETRATION_BORNE_REGULARISATION_PLUS 0.1#1.01
... convergence en 1644 iterations
contact: reaction ==> F_N => [-0.90204197 : 0.36469523], F_T max = 0.00000000
F_contact_total = -9.18970890 F_collage_total = 2.67266958, [-0.00349946 <= gap_N <= 0.00303373], [0.00000000 <= gap_T <= 0.00000000]
temps_user:0/00:01:08.17 system:0/00:00:00.46 reel:0/00:01:09.03
Le collage est vraiment important !
------------------------------------
idem mais avec
PROP_VALPROPRE_RAIDEUR 1.e-7
... convergence en 1510 iterations
contact: reaction ==> F_N => [-0.75576602 : 0.03999057], F_T max = 0.00000000
F_contact_total = -7.27016060 F_collage_total = 0.35542069, [-0.02763844 <= gap_N <= 0.00337881], [0.00000000 <= gap_T <= 0.00000000]
temps_user:0/00:00:59.55 system:0/00:00:00.31 reel:0/00:01:00.17
moins de collage mais une pénétration 10 fois plus grande et une force de contact 20% plus faible
----------------------------------
PROP_VALPROPRE_RAIDEUR 1.e-6
PENETRATION_BORNE_REGULARISATION_PLUS 0.05
... convergence en 1524 iterations
contact: reaction ==> F_N => [-0.85231341 : 0.28592738], F_T max = 0.00000000
F_contact_total = -8.74890025 F_collage_total = 2.19268969, [-0.00333347 <= gap_N <= 0.00264119], [0.00000000 <= gap_T <= 0.00000000]
temps_user:0/00:01:01.70 system:0/00:00:00.35 reel:0/00:01:02.39
toujours un collage important !
----------------------------------
PROP_VALPROPRE_RAIDEUR 1.e-6
PENETRATION_BORNE_REGULARISATION_PLUS 0.01
... convergence en 1838 iterations
contact: reaction ==> F_N => [-0.77172284 : 0.05907943], F_T max = 0.00000000
F_contact_total = -7.33211746 F_collage_total = 0.45548728, [-0.00306521 <= gap_N <= 0.00055208], [0.00000000 <= gap_T <= 0.00000000]
temps_user:0/00:01:18.45 system:0/00:00:00.49 reel:0/00:01:19.40
convergence plus difficile, mais résultats nettements meilleurs
---------------------------------
PROP_VALPROPRE_RAIDEUR 1.e-6
PENETRATION_BORNE_REGULARISATION 1.e-2
PENETRATION_BORNE_REGULARISATION_PLUS 0.001
... convergence en 1938 iterations
contact: reaction ==> F_N => [-0.76247970 : 0.00000000], F_T max = 0.00000000
F_contact_total = -6.94808515 F_collage_total = 0.00000000, [-0.00303447 <= gap_N <= 0.00000000], [0.00000000 <= gap_T <= 0.00000000]
temps_user:0/00:01:21.72 system:0/00:00:00.44 reel:0/00:01:22.61
convergence encore un peu plus difficile mais le résultat est pas mal: pas de collage et une pénétration de 3 microns
Mis à jour par Julien Troufflard il y a 10 jours
merci pour les tests et le nouvel affichage. Il faut vraiment se méfier de la partie collage. Pas évident. Sans la borne plus, c'est difficile de converger.
Je pense que parmi les stratégies, il y a :
- NORME_MAXI_INCREMENT
- enchaine avec un autre algo : RD visqueux, voire même stabilisation membrane
Mis à jour par Gérard Rio il y a 8 jours
- % réalisé changé de 30 à 40
Dans le cas de la relaxation dynamique, concernant le pilotage (cf. doc) NORME_MAXI_INCREMENT est remplacé par 2 indicateurs:
NORME_MAXI_X_INCREMENT pour une limitation sur les variations de déplacements
NORME_MAXI_V_INCREMENT pour une limitation sur les variations de vitesses
et NORME_MAXI_INCREMENT n'est pas utilisé. En fait NORME_MAXI_INCREMENT intervient sur la variation des ddl qui sont les inconnues du problème global d'équilibre. Et dans le cas de la relaxation dynamique, le ddl en question est l'accélération. Et c'est seulement après avoir déterminé l'accélération, que les vitesses puis les déplacements sont mis à jour avec intervention éventuelle de : NORME_MAXI_X_INCREMENT et NORME_MAXI_V_INCREMENT
j'ai fait un test avec :
para_pilotage_equi_global
NORME_MAXI_X_INCREMENT 1.e-9
et j'obtiens bien en affichage:
- Norme E_cinetique/E_statique_ET_ResSurReact --> 11250125.83892630
===>>>>> intervention de la reduction du vecteur delta X 0.00000004( maxDeltaX= 0.02265000)
===>>>>> intervention de la reduction du vecteur delta X 0.00000004( maxDeltaX= 0.02280000)
Mis à jour par Julien Troufflard il y a 7 jours
- Fichier step1_avec_collage.png step1_avec_collage.png ajouté
- Fichier step2_sans_collage.png step2_sans_collage.png ajouté
ok pour NORME_MAXI_X_INCREMENT. J'ai essayé, en mettant une petite borne plus et une norme maxi un peu plus grande. Par exemple :
PENETRATION_BORNE_REGULARISATION_PLUS 0.05
NORME_MAXI_X_INCREMENT 0.1
cette stratégie ne fonctionne pas. Les noeuds sont repoussés assez violemment, malgré la restriction de déplacement. Au global, je trouve que les forces de contact sont moins chahutées, mais comme il y a un flip/flop des noeuds, le calcul passe son temps à faire des amortissements cinétiques. Le reste de la structure n'avance pas.
Mais j'ai tenté une deuxième méthode et elle a payé. J'ai décomposé en 2 steps avec un suite point info.
step 1 : PENETRATION_BORNE_REGULARISATION_PLUS 1.01
j'obtiens :
avec le bilan de force de contact :
F_contact_total = -10.32315056 F_collage_total = 4.59091195, [-0.00061418 <= gap_N <= 0.00043330], [0.00000000 <= gap_T <= 0.00000000]
step 2 : PENETRATION_BORNE_REGULARISATION_PLUS 0.
ce qui donne :
avec le bilan de force de contact :
F_contact_total = -6.95586225 F_collage_total = 0.00000000, [-0.00047164 <= gap_N <= 0.00000000], [0.00000000 <= gap_T <= 0.00000000]
en fait, il faut vraiment mettre à 0 le paramètre PENETRATION_BORNE_REGULARISATION_PLUS pour annuler le collage. Sinon, en enchainant un second step avec par exemple 0.05, le collage demeure. Car suite à l'équilibre du step 1, les noeuds qui doivent se décoller démarrent très proche du maitre. Et se retrouvent toujours attirés. On obtient alors un second équilibre quasi équivalent au step 1. ça ne change pas grand chose.
la déformée au step 2 est vraiment différente du step 1. Je n'ai pas l'impression qu'on puisse se permettre le moindre collage pour obtenir un calcul méca correct. Là sur ce cas test, c'est flagrant parce que la part du collage est très importante sur une grande partie de la membrane. Mais que ce soit généralisé ou non, le collage va créer des pb locaux. Même un noeud collé parmi 1000 peut être gênant pour exploiter le champ de contrainte par exemple.
Je pense que la stratégie par fonction nD pourrait marcher en un seul step. Mais contrairement à mon essai passé, il faudrait une fonction qui aboutisse carrément à 0 dans PENETRATION_BORNE_REGULARISATION_PLUS et pas juste une petite valeur.
J'ai tenté plusieurs essais (pour rappel : une fonction linéaire qui dépend de norme_de_convergence). Mais ça ne peut pas fonctionner en l'état. Comme la norme de convergence évolue parfois brutalement d'une itération à l'autre, il doit y avoir un flip/flop du collage.
En fait, il faudrait que toute diminution de PENETRATION_BORNE_REGULARISATION_PLUS soit définitive. Pour ne pas que le collage reprenne à chaque variation de norme_de_convergence. Une sorte de fonction "clapet anti-retour" :)
Le plus simple pour ça serait de mettre à disposition une nouvelle grandeur globale pour les fonctions nD => norme_de_convergence_mini. Qui serait la norme de convergence minimum atteinte dans l'incrément en cours.
Je dis pas que j'en ai besoin maintenant. Je vais pour l'instant appliquer la stratégie à 2 steps.
Mis à jour par Gérard Rio il y a 7 jours
oui, c'est intéressant comme stratégie, et dans le cas incre 2, on obtient environ: force totale contact 2 = force totale contact 1 - force collage 1
NB: dans le cas où tu définis 2 incréments, gmsh considère que le résultat est un nombre complexe: partie réelle = incre 1 et partie immaginaire = incre 2
Mis à jour par Julien Troufflard il y a 6 jours
NB: dans le cas où tu définis 2 incréments, gmsh considère que le résultat est un nombre complexe: partie réelle = incre 1 et partie immaginaire = incre 2
j'ai modifié hz_visuGmsh.pl. Nouvelle version sur redmine. .