Metafor

ULiege - Aerospace & Mechanical Engineering

User Tools

Site Tools


commit:2017:04_22

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
commit:2017:04_22 [2017/04/25 18:26] – [Modified Newton Raphson] wauteletcommit:2017:04_22 [2017/04/26 14:50] (current) wautelet
Line 1: Line 1:
  
  
-===== Commit 2017-04-22 ======+===== Commit 2017-04-26 ======
  
 Ce commit est pour améliorer quelques routines liées au contact et pour mettre progressivement mes développements sur la version courante. Ce commit est pour améliorer quelques routines liées au contact et pour mettre progressivement mes développements sur la version courante.
Line 17: Line 17:
 === Méthode interfacée === === Méthode interfacée ===
  
-Après un petit refactoring, pour ne pas changer, j'ai scindé en deux les méthodes de Newton Raphson Modifiée : CpuModifiedNRStiffnessUpdateCriterion et PeriodicModifiedNRStiffnessUpdateCriterion. Évidemment, la méthode par défaut est NRStiffnessUpdateCriterion. Toutes ces méthodes dérivent de StiffnessUpdateCriterionBase et ont pour but de décider si nous devons mettre à jour la matrice de raideur tangente lors du calcul de la correction des positions.+Après un petit refactoring, pour ne pas changer, j'ai scindé en deux les méthodes de Newton Raphson Modifiée : CpuModifiedNRStiffnessUpdateCriterion et PeriodicModifiedNRStiffnessUpdateCriterion. Par ailleur, la méthode par défaut pour la stratégie de mise à jour de la matrice de raideur tangente est la méthode de Newton Raphson NRStiffnessUpdateCriterion. Toutes ces méthodes dérivent de StiffnessUpdateCriterionBase et ont pour but de décider si nous devons mettre à jour la matrice de raideur tangente lors du calcul de la correction des positions.
  
 === Stratégie de la méthode de Newton Raphson Modifiée  ===  === Stratégie de la méthode de Newton Raphson Modifiée  === 
Line 31: Line 31:
 Voici les méthodes disponibles et les options associées. Voici les méthodes disponibles et les options associées.
  
 +== NRStiffnessUpdateCriterion (Méthode Par défaut)==
  
-<note important>Je vous recommande d'utiliser ces méthodes, une fois que vous avez une application qui tourne correctement ! Il n'est pas toujours garanti que l'on gagne en temps CPU au final quelque soit le maillage et quelque soit le chemin emprunté par l'intégration temporelle (Pas de temps adaptatif) </note>+<code> 
 +    mim = metafor.getMechanicalIterationManager() 
 +    stiffUpdate = NRStiffnessUpdateCriterion(mim) 
 +    stiffUpdate.setDebug(parameters['StiffUpdateDebug']); Default = False 
 +    stiffUpdate.setVerbose(parameters['StiffUpdateVerbose']); Default = False 
 +    mim.setStiffnessUpdateCriterion(stiffUpdate) 
 +</code> 
 + 
 +== StiffnessUpdateCriterion (Ancienne méthode de mise à jour de la matrice de raideur tangente) == 
 + 
 +<code> 
 +    mim = metafor.getMechanicalIterationManager() 
 +    stiffUpdate = StiffnessUpdateCriterion(mim) 
 +    stiffUpdate.setNbOfIterationsForStiffUpdate(parameters['NbOfIterationsForStiffUpdate']); Default = 1 
 +    stiffUpdate.setCpuDependency(parameters['CpuDependency']); Default = False 
 +    stiffUpdate.setDebug(parameters['StiffUpdateDebug']); Default = False 
 +    stiffUpdate.setVerbose(parameters['StiffUpdateVerbose']); Default = False 
 +    mim.setStiffnessUpdateCriterion(stiffUpdate) 
 +</code> 
 + 
 +== CpuModifiedNRStiffnessUpdateCriterion == 
 + 
 +<code> 
 +    mim = metafor.getMechanicalIterationManager() 
 +    stiffUpdate = CpuModifiedNRStiffnessUpdateCriterion(mim) 
 +    stiffUpdate.setKeepStepStiffness(parameters['KeepStepStiffness']); Default = True 
 +    stiffUpdate.setDebug(parameters['StiffUpdateDebug']); Default = False 
 +    stiffUpdate.setVerbose(parameters['StiffUpdateVerbose']); Default = False 
 +    mim.setStiffnessUpdateCriterion(stiffUpdate) 
 +</code> 
 + 
 +== PeriodicModifiedNRStiffnessUpdateCriterion == 
 + 
 +<code> 
 +    mim = metafor.getMechanicalIterationManager() 
 +    stiffUpdate = PeriodicModifiedNRStiffnessUpdateCriterion(mim) 
 +    stiffUpdate.setMaxNbOfModifiedNRIterations(parameters['MaxNbOfModifiedNRIterations']); Default = 1 
 +    stiffUpdate.setResidualDecreaseFactor(parameters['ResidualDecreaseFactor']); Default = 1.0 
 +    stiffUpdate.setKeepStepStiffness(parameters['KeepStepStiffness']); Default = True 
 +    stiffUpdate.setDebug(parameters['StiffUpdateDebug']); Default = False 
 +    stiffUpdate.setVerbose(parameters['StiffUpdateVerbose']); Default = False 
 +    mim.setStiffnessUpdateCriterion(stiffUpdate) 
 +</code> 
 + 
 +Le paramètre keepStepStiffness permet de conserver la matrice de raideur tangente d'un pas de temps à l'autre, uniquement si le pas de temps est quasi-identique. Sinon, on force la mise à jour de la matrice de raideur tangente. 
 + 
 + 
 +<note important>Je vous recommande d'utiliser ces méthodes, une fois que vous avez une application qui tourne correctement ! Il n'est pas toujours garanti que l'on gagne en temps CPU au final quelque soit le maillage et quelque soit le chemin emprunté par l'intégration temporelle (Pas de temps adaptatif)</note>
 ===== Lagrangien Augmenté ===== ===== Lagrangien Augmenté =====
  
Line 47: Line 95:
 === Mise à jour de la matrice de raideur tangente === === Mise à jour de la matrice de raideur tangente ===
  
-aa+La raison principale qui m'a poussé à tenter de remettre à jour les méthodes de mise à jour de la matrice de raideur tangente est la combinaison de ce type de stratégie avec la méthode du Lagrangien augmenté. Lors de l'utilisation du Lagrangien augmenté pour traiter les contraintes de contact, nous avons en général une boucle supplémentaire liée aux augmentations, c'est à dire aux mises à jour des lagrangiens augmentés, jusqu'à satisfaire un critère de convergence sur la satisfaction des contraintes de contact. Cet algorithme permet de diminuer la valeur de la pénalité utilisée tout en gardant un contrôle sur la qualité des résultats du point de vue contact, ce qui permet de rendre la matrice de raideur tangente mieux conditionnée (en pratique), dès lors une meilleure convergence lors de la résolution du problème mécanique par la méthode Newton Raphson. Au fur et à mesure, que l'on réalise des augmentations, la résolution du problème mécanique se fait en général de manière plus aisée (moins d'itérations mécaniques), puisque les champs de contact sont de mieux en mieux connus au fur et à mesure des augmentations (meilleur connaissance de la condition aux limites). Par conséquent, on s'attend à ce que la matrice de raideur tangente ne varie presque plus d'une augmentation à l'autre.  
 + 
 +Ainsi, il semble intéressant d'utiliser la méthode de Newton Raphson modifiée pour éviter de mettre à jour la matrice de raideur tangente à chaque itération mécanique. En pratique, la difficulté de résolution du problème mécanique réside dans les non-linéarités (contact, géométrie, matériau) présentes au pas de temps courant. Si le problème mécanique est quasi linéaire, le problème se résout en quasi une seule itération comme en élasticité linéaire. Il est possible d'envisager un basculement entre la méthode de Newton Raphson et la méthode de Newton Raphson modifiée au travers des augmentations. Lors du passage à la méthode de Newton Raphson modifiée, il est intéressant aussi de mettre à jour les paramètres ResidualDecreaseFactor et MaxNbOfModifiedNRIterations en fonction du nombre d'augmentations réalisés. On constate que la valeur du premier résidu d'une résolution d'équilibre mécanique décroit au fur et à mesure des augmentations (Attention, ceci n'est pas toujours cas, surtout si on a des status de contact changeant d'une augmentation à l'autre !), ce qui se traduit par une diminution du nombre d'itérations mécaniques pour atteindre la tolérance prescrite sur la procédure itérative de Newton Raphson. Il serait intéressant de faire une moyenne pondérée entre ce rapport entre les premiers résidus entre deux augmentations successives et celui entre deux itérations mécaniques. Ainsi on corrige progressivement les valeurs des deux paramètres et nous pouvons admettre plus de souplesse dans la résolution de l'équilibre mécanique par la méthode de Newton Raphson modifiée puisque le problème devient plus en plus "linéaire" au fur et à mesure des augmentations. 
 + 
 +=== Récapitulatif === 
 + 
 +Voici les méthodes disponibles et les options associées. 
 + 
 +== AlmCpuModifiedNRStiffnessUpdateCriterion == 
 + 
 +<code> 
 +    alm = StandardAugmentedLagrangianManager(metafor) 
 +    mim = metafor.getMechanicalIterationManager() 
 +    stiffUpdate = AlmCpuModifiedNRStiffnessUpdateCriterion(mim,alm) 
 +    stiffUpdate.setAugmentationThreshold(parameters['AugmentationThreshold']); Default = 0 
 +    stiffUpdate.setKeepStepStiffness(parameters['KeepStepStiffness']); Default = True 
 +    stiffUpdate.setKeepAugmentationStiffness(parameters['KeepAugmentationStiffness']); Default = True 
 +    stiffUpdate.setDebug(parameters['StiffUpdateDebug']); Default = False 
 +    stiffUpdate.setVerbose(parameters['StiffUpdateVerbose']); Default = False 
 +    mim.setStiffnessUpdateCriterion(stiffUpdate) 
 +</code> 
 + 
 +== AlmPeriodicModifiedNRStiffnessUpdateCriterion == 
 + 
 +<code> 
 +    alm = StandardAugmentedLagrangianManager(metafor) 
 +    mim = metafor.getMechanicalIterationManager() 
 +    stiffUpdate = AlmPeriodicModifiedNRStiffnessUpdateCriterion(mim,alm) 
 +    stiffUpdate.setMaxNbOfModifiedNRIterations(parameters['MaxNbOfModifiedNRIterations']); Default = 1 
 +    stiffUpdate.setResidualDecreaseFactor(parameters['ResidualDecreaseFactor']); Default = 1.0 
 +    stiffUpdate.setAugmentationThreshold(parameters['AugmentationThreshold']); Default = 0 
 +    stiffUpdate.setKeepStepStiffness(parameters['KeepStepStiffness']); Default = True 
 +    stiffUpdate.setKeepAugmentationStiffness(parameters['KeepAugmentationStiffness']); Default = True 
 +    stiffUpdate.setDebug(parameters['StiffUpdateDebug']); Default = False 
 +    stiffUpdate.setVerbose(parameters['StiffUpdateVerbose']); Default = False 
 +    mim.setStiffnessUpdateCriterion(stiffUpdate) 
 +</code> 
 + 
 +Le paramètre keepAugmentationStiffness permet de conserver la matrice de raideur tangente après une augmentation, uniquement si le premier résidu avant l'augmentation est plus grand que le premier résidu après l'augmentation. Sinon, on force la mise à jour de la matrice de raideur tangente. 
 + 
 +Le paramètre augmentationThreshold permet de spécifier à partir de quel numéro d'augmentation, nous passons d'une méthode du type Newton Raphson à une méthode du type Newton Raphson modifiée. Si cette valeur est prise à -1, nous commençons d'office par une méthode du type Newton Raphson modifiée avant la première augmentation.  
 + 
 +Finalement, l'algorithme est suffisamment malin pour passer à une méthode du type Newton Raphson modifiée si nous ne sommes pas en contact (avant et après impact, après springback), quelque soit la valeur de augmentationThreshold.  
 +    
 ===== Formulation AIC ===== ===== Formulation AIC =====
  
Line 55: Line 146:
  
 <code> <code>
-[a]:+[a]:mtFEM/algos/AlmCpuModifiedNRStiffnessUpdateCriterion.cpp 
 +[a]:mtFEM/algos/AlmPeriodicModifiedNRStiffnessUpdateCriterion.cpp 
 +[a]:mtFEM/algos/AlmStiffnessUpdateCriterion.cpp 
 +[a]:mtFEM/algos/CpuModifiedNRStiffnessUpdateCriterion.cpp 
 +[a]:mtFEM/algos/ModifiedNRStiffnessUpdateCriterion.cpp 
 +[a]:mtFEM/algos/NRStiffnessUpdateCriterion.cpp 
 +[a]:mtFEM/algos/PeriodicModifiedNRStiffnessUpdateCriterion.cpp 
 +[a]:mtFEM/algos/StiffnessUpdateCriterionBase.cpp 
 +[a]:mtFEM/algos/StiffnessUpdateMethods.cpp 
 +[a]:mtFEM/algos/AlmCpuModifiedNRStiffnessUpdateCriterion.h 
 +[a]:mtFEM/algos/AlmPeriodicModifiedNRStiffnessUpdateCriterion.h 
 +[a]:mtFEM/algos/AlmStiffnessUpdateCriterion.h 
 +[a]:mtFEM/algos/CpuModifiedNRStiffnessUpdateCriterion.h 
 +[a]:mtFEM/algos/ModifiedNRStiffnessUpdateCriterion.h 
 +[a]:mtFEM/algos/NRStiffnessUpdateCriterion.h 
 +[a]:mtFEM/algos/PeriodicModifiedNRStiffnessUpdateCriterion.h 
 +[a]:mtFEM/algos/StiffnessUpdateCriterionBase.h 
 +[a]:mtFEM/algos/StiffnessUpdateMethods.h
 [r]: [r]:
 </code> </code>
Line 62: Line 170:
  
 <code> <code>
-[a]:+[a]:apps/bImp/cyl3DDynAnaModifiedNR.py 
 +[a]:apps/qs/cont2AugLagModifiedNR1.py 
 +[a]:apps/qs/cont2AugLagModifiedNR2.py 
 +[a]:apps/qs/cont2AugLagModifiedNR3.py 
 +[a]:apps/qs/cont2AugLagModifiedNR4.py 
 +[a]:apps/qs/cont2AugLagModifiedNR5.py 
 +[a]:apps/qs/cont2ModifiedNR.py 
 +[a]:mtContact/tests/twoToriContactTestAugLag.py 
 +[a]:mtContact/tests/twoToriContactTestAugLagModifiedNR.py 
 +[a]:mtContact/tests/twoToriContactTestModifiedNR.py
 [r]: [r]:
 </code> </code>
  
- --- //[[gwautelet@ulg.ac.be|gaëtan]] 2017/04/22 22:37//+ --- //[[gwautelet@ulg.ac.be|gaëtan]] 2017/04/26 22:37//
  
  
commit/2017/04_22.1493137579.txt.gz · Last modified: 2017/04/25 18:26 by wautelet

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki