Table of Contents

Commit 2009-02-26

Modifs

EAS

J'ai travaillé sur l'EAS pour essayer de comprendre pourquoi mes tests ALE merdouillent quand on mixe des éléments de tailles différentes les uns à côté des autres. C'est ennuyeux puisque un gain CPU en ALE ne peut se faire qu'en raffinant et déraffinant le maillage. On doit faire ainsi cohabiter des grandes mailles avec des très petites au sein du même maillage. Ce problème, qui n'a rien à voir avec l'ALE, me force à utiliser des maillages inutilement fin en ALE + EAS et au final, l'ALE perd un peu son intérêt.

J'ai essayé de comprendre pourquoi ça plante en traçant l'évolution du résidu (norme des forces internes EAS) dans la direction donnée par le N-R à chaque itération lors du calcul des forces internes d'un élément qui explose.

Clairement, on arrivera jamais à atteindre un minimum du résidu à partir de cette config avec un N-R. J'ai donc ajouté un line-search pour converger malgré tout.

Modifs:

EasLSFunction<DIM> fct(*this, easModesFactors1,
                       easModesElement->getDeltaAlpha(),
                       GPM0, GPM1, GPM0_v, GPM1_v,
                       easModesElement->getForceEnh(),
                       volumElementShcut);

cette fonction sera appellée par l'algo via un appel virtuel fct.eval(x). Reste à executer le line-serach de Fleury (en 2 lignes!):

LineSearch linesearch(fct, 0.1);
double alpha = linesearch.execute();

Figure #1 - Solution Line-search Figure #2 - Solution OFFI

Pour éviter ce genre de problème, Luc a eu l'idée de ne plus permettre des valeurs de mode EAS trop importantes. Les modes étant des incréments sur un pas de temps, on peut sans problème faire une division de pas de temps si la valeur d'un mode devient trop importante. Pour pouvoir jouer avec ça, j'ai ajouté un paramètre à l'élément EAS (MAXFEAS).

En résumé: 2 nouveaux paramètres:

Nom type défaut
MAXFEAS double 1.0 division du pas si un mode dépasse cette valeur
LSEAS bool true active/désactive le line-search

ALE

region.ignore(IF_SIG_XZ)
region.ignore(IF_SIG_YZ)
region.ignore(IF_DEV_SIG_ZZ) 

A ce moment, il faut alors recalculer la compo ZZ qui est tout de même utile pour calculer le J2.

ale.getPostStep().getConfig().setSigZZ(SIGZEQ_COMPUTE)

En 3D, on peut s'amuser à supprimer la trace du déviateur convecté (dans ce cas, il faut bien sûr convecter toutes les composantes):

ale.getPostStep().getConfig().setSigZZ(SIGZEQ_TRUNCATE)

Visu

Autres

Projet

N'oubliez pas de re-swigifier vos wraps.

Fichiers ajoutés/supprimés

Source:

File	Text status
mtElements/volumes/methods/EasInfo.h	added
mtElements/volumes/methods/EasInfo.cpp	added
mtElements/volumes/methods/EasLSFunction.h	added
mtElements/volumes/methods/EasLSFunction.cpp	added
mtElements/volumes/methods/EasCauchyMechVolIntegMeth.inl	deleted
mtElements/volumes/methods/EasCauchyMechVolIntegMeth.cpp	added (+)
mtFEMBase/EndALEConfig.cpp	added
mtFEMBase/EndALEConfig.h	added
mtMath/LineSearch.h	added
mtMath/LineSearch.cpp	added

Un test EAS sur maillage non uniforme:

apps/ale/testConv2Dmesh.py	added

Romain BOMAN 2009/02/26 08:36