Metafor

ULiege - Aerospace & Mechanical Engineering

User Tools

Site Tools


commit:2017:11_21

Commit 2017-11-21

Ce commit est pour ajouter l'algorithme de décision des projections multiples en 3D.

Avec cette nouvelle méthode, nous n'aurons plus jamais cette situation là : WARNING_MESSAGE(“decideProjectionState failed - using first proj”); debug only le raisonnement de denis a merde, on choisit une target - RoBo

mtGeoSkinProjectionSelector

Dans le cadre d'un entité maître du type mtGeoMultiProjSkin, la normale n'est pas tout continue si on passe d'une side à l'autre sur cette entité. Il faut dès lors parmi toutes les projections admissibles, retenir les projections pertinentes et si besoin appliquer un correctif de la normale, si nous avons une projection sur un coin, sur un bord ou une double projection. Je vous fais grâce du raisonnement que j'ai suivi pour obtenir une projection finale car l’entièreté du code source est documenté sur ce sujet là et nous fonctionnons sous forme de filtre, c'est à dire que l'on élimine au fur et à mesure les projections admissibles que l'on avance dans l'algorithme pour au final avoir qu'une seule projection ou deux projections admissibles à partir desquelles on traite les cas particuliers. Je tiens à ajouter que ceci n'est pas encore parfait car il manque des types de projection en 3D, qui sont des projections dites triples pour capter la courbure locale de la surface correctement, sinon on oscille entre deux paires de projection possible à travers les itérations de NR …

Par défaut, l’entièreté des cas tests tourne avec les nouvelles versions des sélecteur de projection en 2D/3D. On peut si besoin activer l'ancienne version par la procédure définie ci-dessus.
ci = Rd|Dd|ScContactInteraction(1)
ci.setUseClassicalProjectionSelector(True|False)

Traitement des projection double en 3D

J'ai fait une modification sur le calcul de la position du nœud esclave sur le segment de droite commun aux deux sides adjacentes lors d'une projection double en 3D. Ce calcul est plus robuste que la méthodologie proposée précédente (La fonction giveCornerEdgeProjection() au lieu de la fonction giveEdgeProjectionOnPlane()). Par la même occasion, j'ai adapté le calcul de la matrice de raideur tangente analytique de contact pour ces cas de figure.

mtGeoProjectionOperator

J'ai activé le test des triangles dans le cas ou la side contient une surface est plane et un wire quelconque pour déterminer l'appartenance d'un point lors de l'opération de projection.

apps.biomec.longBone.boneRepairWithRod

Après inspection du cas test biomec, j'ai constaté que les surfaces de contact étaient très mal définies pour l'interaction de contact entre l'os et la barre : il y a des sides à l'intérieur de l'os (qui partage deux éléments finis volumiques). Pour palier au problème, il faudrait ajouter une filtre au sélecteur de noeuds lors de l'ajout dans un groupe, pour conserver par exemple que les nœuds sur une peau extérieure.

Verbose pour le contact

J'ai ajouté deux types de verbose pour le contact afin de débugger en version release :

    prpCont = ElementProperties (Contact2D|3DElement)
    prpCont.put(VERBOSESTIFFNESSCONTACT, True|False)
    prpCont.put(VERBOSEDECIDECONTACT, True|False)

Le premier verbose permet d'afficher la matrice de raideur tangente de contact (numérique ou analytique). Le second verbose permet d'afficher le statut et le type de la projection de contact.

Visualisation pour le contact

La profondeur maximale (Tree level dans la fenêtre ContactTool de BWin) est calculée de manière globale pour toutes les hiérarchies de volume frontière pour la détection globale de contact.

L'affichage d'un outil de contact maillé pour une interaction de contact rigide-déformable a été implémentée et on peut le visualiser sans problème.

Information sur une interaction de contact

J'ai enrichi l'affichage d'information sur le nombre de nœuds en contact, en contact collant ou glissant sur une interaction de contact, ainsi que le nombre de nœuds dans chaque type de configuration de contact. Ceci peut être utile pour comprendre la raison pour laquelle la procédure de Newton Raphson ne converge pas.

ci = Rd|Dd|ScContactInteraction(1)
ci.setShowInformation(True|False)

Si besoin, de plus d'informations sur le contact, il suffit d'enrichir la classe ContactInteractionInfo.

Fichiers ajoutés/supprimés

[a]:mtGeo/mtGeoSkinProjectionSelector.inl
[a]:mtGeo/mtGeoSkinProjectionSelector.cpp
[a]:mtGeo/mtGeoSkinProjectionSelector.h
[a]:mtContact/ContactInteractionInfo.h
[a]:mtContact/ContactInteractionInfo.cpp
[r]:

Cas tests ajoutés/supprimés

[a]:
[r]:

gaëtan 2017/11/20 14:00

commit/2017/11_21.txt · Last modified: 2017/11/26 18:33 by wautelet