L'algorithme du Lagrangien Augmenté pour la gestion du contact est implementé sous les formes suivantes :
alm = StandardAugmentedLagrangianManager(metafor) alm.setNbOfIterationsPerStep(parameter['NbreAugmentation']) augLagAugmentation = AugLagClassicalAugmentation(alm) ci.setAugLagAugmentation(augLagAugmentation) alm.addContactInteraction(ci)
alm = AutomaticAugmentedLagrangianManager(metafor) alm.setMaxNbOfIterations(parameter['NbreAugmentationMax']) augLagCriterion = AugLagGeoCriterion(alm) augLagCriterion.setNormalGapPrec(parameter['gapNTol']) augLagCriterion.setTangentialGapPrec(parameter['gapTTol']) ci.setAugLagCriterion(augLagCriterion) augLagAugmentation = AugLagClassicalAugmentation(alm) ci.setAugLagAugmentation(augLagAugmentation) alm.addContactInteraction(ci)
Il existe 4 critères de base :
augLagGeoCriterion= AugLagGeoCriterion(alm) augLagGeoCriterion.setNormalGapNorm(ALM_MAX_NORM) augLagGeoCriterion.setTangentialGapNorm(ALM_MEAN_NORM) augLagGeoCriterion.setNormalGapPrec(parameter['gapNTol']) augLagGeoCriterion.setTangentialGapPrec(parameter['gapTTol'])
augLagNormalisedGeoCriterion= AugLagNormalisedGeoCriterion(alm) augLagNormalisedGeoCriterion.setNormalGapNorm(ALM_MAX_NORM) augLagNormalisedGeoCriterion.setTangentialGapNorm(ALM_MEAN_NORM) augLagNormalisedGeoCriterion.setNormalGapPrec(parameter['gapNTol']) augLagNormalisedGeoCriterion.setTangentialGapPrec(parameter['gapTTol'])
augLagForceCriterion= AugLagForceCriterion(alm) augLagForceCriterion.setContactPressureNorm(ALM_MAX_NORM) augLagForceCriterion.setContactShearNorm(ALM_MEAN_NORM) augLagForceCriterion.setContactPressurePrec(parameter['contactPressureTol']) augLagForceCriterion.setContactShearPrec(parameter['contactShearTol'])
augLagNormalisedForceCriterion= AugLagNormalisedForceCriterion(alm) augLagNormalisedForceCriterion.setContactPressureNorm(ALM_MAX_NORM) augLagNormalisedForceCriterion.setContactShearNorm(ALM_MEAN_NORM) augLagNormalisedForceCriterion.setContactPressurePrec(parameter['contactPressureTol']) augLagNormalisedForceCriterion.setContactShearPrec(parameter['contactShearTol'])
Il est possible de les combiner pour faire un critère multiple :
augLagGeoForceCriterion = AugLagMultipleCriterions(alm) augLagGeoForceCriterion.add(augLagGeoCriterion) augLagGeoForceCriterion.add(augLagNormalisedForceCriterion)
Il est possible d'enlever un critère du critère multiple :
augLagGeoForceCriterion.remove(augLagNormalisedForceCriterion)
Pour finir, il faut associer le matériau suivant pour chaque interaction de contact sélectionnée :
if(parameter['ContactType']=='Frictionless'): materset.define (2, AugLagFrictionlessContactMaterial) materset(2).put(PROF_CONT, parameter['Prof']) materset(2).put(PEN_NORMALE, parameter['CN']) materset(2).put(TYPE_CONT,parameter['ContactDetection']) print "Frictionless Contact Material" elif(parameter['ContactType']=='Sticking'): materset.define (2, AugLagStickingContactMaterial) materset(2).put(PROF_CONT, parameter['Prof']) materset(2).put(PEN_TANGENT, parameter['CT']) materset(2).put(PEN_NORMALE, parameter['CN']) materset(2).put(TYPE_CONT,parameter['ContactDetection']) print "Sticking Contact Material" elif(parameter['ContactType']=='Coulomb'): materset.define (2, AugLagCoulombContactMaterial) materset(2).put(PROF_CONT, parameter['Prof']) materset(2).put(COEF_FROT_STA, parameter['MuSTA']) materset(2).put(COEF_FROT_DYN, parameter['MuDYN']) materset(2).put(PEN_TANGENT, parameter['CT']) materset(2).put(PEN_NORMALE, parameter['CN']) materset(2).put(TYPE_CONT,parameter['ContactDetection']) print "Coulomb Contact Material" else: print "Bad definition of type contact"
Étant donné que la configuration/état interne de l'objet “critère” et “augmentation” dépend du matériau associé à l'interaction de contact, il faut à chaque fois instancier un objet critère et augmentation pour chaque interaction de contact qui possède un matériau différent (Frictionless, Sticking et Coulomb).
D'autres explications seront données dans la documentation de l'algorithme.
La gestion du contact tangentielle se fait au moyen d'une base locale associée à chaque nœud en contact construite à partir du gap tangentiel, de manière à ce que la direction tangentielle soit toujours alignée avec la direction du glissement. Ainsi, par construction, la valeur du cisaillement (force tangentielle) de contact est toujours positive ou nulle.
Dans certains cas de figure, afin de comparer avec des résultats de la littérature, il peut être intéressant d'utiliser la base locale de l'outil, qui est identique pour chaque nœud en contact, afin d'avoir une valeur du cisaillement (force tangentielle) de contact positive (c'est à dire que la force tangentielle de contact est alignée avec la tangente de l'outil) ou négative (cas contraire).
Pour se faire, il suffit d'utiliser les commandes suivantes :
extractorFt = TangentForceValueExtractor(ci) extractorFt.setUseToolLocalSystemAxes(True) valuesmanager.add(1, extractorFt,'Ft')
Cette fonctionnalité ne marche que pour l'instant en état plan déformation et en axisymétrique.
Afin de tenir compte de la fraction du temps CPU passée dans les routines liées à l'algorithme du Lagrangien Augmenté (dès le début jusqu'à la fin de l'intégration temporelle), j'ai ajouté un timer dans le même ordre d'idée que ceux qui existent pour l'assemblage de la matrice de raideur tangente, la détection du contact, etc.
Il est possible de
Le cas test apps.ale.friction2Ddd utilise le mailleur gen4. J'ai constaté que le maillage dans la version de développement du cas-test dépend du fait que l'on lance Metafor avec la fenêtre de visualisation graphique ou en ligne de commande. Le cas-test plante suite à la présence de contact déformable déformable et une faible valeur de la pénalité tangentielle avec le maillage généré suite au lancement du cas test en ligne de commande.
Pour obtenir des résultats cohérents et (avoir des résultats puisqu'il plantait), j'ai augmenté la pénalité tangentielle de 1.E4 à 1.E5.
Il y a quelques cas-tests dans la batterie sur le lagrangien augmenté :
J'ai adapté l'interfaçage des cas-tests en modifiant les fonctions de la boite à outil apps.toolbox.createContactTests . Les cas-tests fonctionnent mais rien ne garantit que
Dans la suite du commit, il faut
[a]:mtContact/ActiveContactInteractionIterator.cpp [a]:mtContact/ActiveContactInteractionIterator.h [a]:mtContact/ActiveContactInteractionIterator.inl [a]:mtContact/AugLagAugmentation.cpp [a]:mtContact/AugLagAugmentation.h [a]:mtContact/AugLagAugmentationPart.cpp [a]:mtContact/AugLagAugmentationPart.h [a]:mtContact/AugLagClassicalAugmentation.cpp [a]:mtContact/AugLagClassicalAugmentation.h [a]:mtContact/AugLagCriterion.cpp [a]:mtContact/AugLagCriterion.h [a]:mtContact/AugLagCriterionNormMethod.cpp [a]:mtContact/AugLagCriterionNormMethod.h [a]:mtContact/AugLagCriterionPart.cpp [a]:mtContact/AugLagCriterionPart.h [a]:mtContact/AugLagCriterionStatus.cpp [a]:mtContact/AugLagCriterionStatus.h [a]:mtContact/AugLagForceCriterion.cpp [a]:mtContact/AugLagForceCriterion.h [a]:mtContact/AugLagFrictionalForceCriterion.cpp [a]:mtContact/AugLagFrictionalForceCriterion.h [a]:mtContact/AugLagFrictionalGeoCriterion.cpp [a]:mtContact/AugLagFrictionalGeoCriterion.h [a]:mtContact/AugLagFrictionalNormalisedForceCriterion.cpp [a]:mtContact/AugLagFrictionalNormalisedForceCriterion.h [a]:mtContact/AugLagFrictionalNormalisedGeoCriterion.cpp [a]:mtContact/AugLagFrictionalNormalisedGeoCriterion.h [a]:mtContact/AugLagGeoCriterion.cpp [a]:mtContact/AugLagGeoCriterion.h [a]:mtContact/AugLagMaxNorm.cpp [a]:mtContact/AugLagMaxNorm.h [a]:mtContact/AugLagMeanNorm.cpp [a]:mtContact/AugLagMeanNorm.h [a]:mtContact/AugLagMultipleCriterions.cpp [a]:mtContact/AugLagMultipleCriterions.h [a]:mtContact/AugLagNorm.cpp [a]:mtContact/AugLagNorm.h [a]:mtContact/AugLagNormalClassicalAugmentation.cpp [a]:mtContact/AugLagNormalClassicalAugmentation.h [a]:mtContact/AugLagNormalForceCriterion.cpp [a]:mtContact/AugLagNormalForceCriterion.h [a]:mtContact/AugLagNormalGeoCriterion.cpp [a]:mtContact/AugLagNormalGeoCriterion.h [a]:mtContact/AugLagNormalisedForceCriterion.cpp [a]:mtContact/AugLagNormalisedForceCriterion.h [a]:mtContact/AugLagNormalisedGeoCriterion.cpp [a]:mtContact/AugLagNormalisedGeoCriterion.h [a]:mtContact/AugLagNormalisedGeoCriterionPart.cpp [a]:mtContact/AugLagNormalisedGeoCriterionPart.h [a]:mtContact/AugLagNormalNormalisedForceCriterion.cpp [a]:mtContact/AugLagNormalNormalisedForceCriterion.h [a]:mtContact/AugLagNormalNormalisedGeoCriterion.cpp [a]:mtContact/AugLagNormalNormalisedGeoCriterion.h [a]:mtContact/AugLagSingleCriterion.cpp [a]:mtContact/AugLagSingleCriterion.h [a]:mtContact/AugLagTangentialClassicalAugmentation.cpp [a]:mtContact/AugLagTangentialClassicalAugmentation.h [a]:mtContact/AugLagTangentialForceCriterion.cpp [a]:mtContact/AugLagTangentialForceCriterion.h [a]:mtContact/AugLagTangentialGeoCriterion.cpp [a]:mtContact/AugLagTangentialGeoCriterion.h [a]:mtContact/AugLagTangentialNormalisedForceCriterion.cpp [a]:mtContact/AugLagTangentialNormalisedForceCriterion.h [a]:mtContact/AugLagTangentialNormalisedGeoCriterion.cpp [a]:mtContact/AugLagTangentialNormalisedGeoCriterion.h [a]:mtContact/AugmentedLagrangianAugmentationManager.cpp [a]:mtContact/AugmentedLagrangianAugmentationManager.h [a]:mtContact/AugmentedLagrangianConvergenceManager.cpp [a]:mtContact/AugmentedLagrangianConvergenceManager.h [a]:mtContact/AugmentedLagrangianIterationManager.cpp [a]:mtContact/AugmentedLagrangianIterationManager.h [a]:mtContact/AugmentedLagrangianManager.cpp [a]:mtContact/AugmentedLagrangianManager.h [a]:mtContact/AutomaticAugmentedLagrangianConvergenceManager.cpp [a]:mtContact/AutomaticAugmentedLagrangianConvergenceManager.h [a]:mtContact/AutomaticAugmentedLagrangianManager.cpp [a]:mtContact/AutomaticAugmentedLagrangianManager.h [a]:mtContact/ContactInteractionIterator.cpp [a]:mtContact/ContactInteractionIterator.h [a]:mtContact/ContactInteractionIterator.inl [a]:mtContact/ContactInteractionSet.cpp [a]:mtContact/ContactInteractionSet.h [a]:mtContact/StandardAugmentedLagrangianConvergenceManager.cpp [a]:mtContact/StandardAugmentedLagrangianConvergenceManager.h [a]:mtContact/StandardAugmentedLagrangianManager.cpp [a]:mtContact/StandardAugmentedLagrangianManager.h [a]:mtFEM/algos/AugmentedLagrangianBase.cpp [a]:mtFEM/algos/AugmentedLagrangianBase.h [r]:mtFEM/algos/AugmentedLagrangianManager.cpp [r]:mtFEM/algos/AugmentedLagrangianManager.h
[r]: [a]:
— Gaëtan WAUTELET 2014/10/29