commit:futur:gaetan
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
commit:futur:gaetan [2016/04/23 12:16] – wautelet | commit:futur:gaetan [2019/07/14 11:11] (current) – [Boundary Volume Hierarchy] wautelet | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Commit | + | ====== Commit |
===== Modifications principales ===== | ===== Modifications principales ===== | ||
- | Ce commit porte principalement sur l' | + | Ce commit porte principalement sur l' |
- | ==== Algorithme du Lagrangien Augmenté ==== | + | |
- | Je vous met à profit les derniers développements sur l' | + | ==== Algorithme du Line Search Structurel |
+ | |||
+ | Je vous mets à profit les derniers développements sur l' | ||
=== Algorithme Général === | === Algorithme Général === | ||
- | J'ai constaté à ma grande surprise qu'il faut forcer le calcul d'une itération mécanique après une augmentation. | ||
- | Après chaque augmentation (modification des lagrangiens augmentés à configuration cinématique fixée), on résout l' | ||
- | |||
- | Il est vrai que les articles de référence en la matière travaillent en général en terme de norme énergétique (ce qui nécessite d' | ||
- | |||
- | Dans le jeux de données Python, on a | ||
< | < | ||
Line 24: | Line 19: | ||
</ | </ | ||
- | Par défaut, ce paramètre est mis à False ! | ||
- | === Mise à jour des lagrangiens augmentés | + | ==== Algorithme du Lagrangien Augmenté dans le contexte de la mise en charge avec vitesse de rotation initiale ==== |
- | J'ai développé une autre approche pour mettre à jour les lagrangiens augmentés sur base de l' | + | ==== Divers ==== |
- | Avec ces derniers gardes fous, l' | ||
- | < | ||
- | augLagAugmentation = AugLagExtrapolationAugmentation(alm) | ||
- | augLagAugmentation.setStabilityCriterion(True) | ||
- | augLagAugmentation.setExtrapolationCriterion(True) | ||
- | augLagAugmentation.setExtrapolationFactor(_factor) | ||
- | </ | ||
- | Par défaut, tous les critères sont activés et le facteur d' | + | === VectorToScalarOperator === |
- | Cette procédure est activée si on a le nœud de contact est en contact au cours de deux résolutions successives de l' | + | === MiscValueExtractor === |
- | === Critère d' | ||
- | J'ai ajouté une nouvelle méthode de calcul de longueur de contact utilisée lors des critères géométriques normalisés. | + | ==== Boundary Volume Hierarchy ==== |
- | Dans les estimateurs de pas de temps critique dans les schémas explicites, la notion de dimension équivalente d'un élément apparaît naturellement dans la définition du pas de temps critique. Cependant, ce choix reste vague (distance minimale entre deux nœuds de la maille ou autre) et dès lors, il propose une analyse des valeurs propres à partir de laquelle il dérive une longueur équivalente (plus conservative !). Leur raisonnement est indépendant à priori du type de maille et de la dimension de l' | + | |
- | En résumé, on a les méthodes suivantes : | ||
- | * _method = ALM_AIC_LENGTH (Par défaut) : on calcule une longueur équivalente basée sur la surface de contact (en 2D, c'est la moyenne des demi-longueurs des courbes adjacentes au nœud et en 3D, c'est la moyenne de la racine carrée | ||
- | * _method = ALM_CRITICAL_LENGTH : on calcule une longueur équivalente basée sur l' | ||
- | * _method = ALM_GEO_LENGTH : Pour le gap normal, on calcule une distance normale des mailles volumiques par rapport au plan tangent de contact ce qui donne une épaisseur des éléments volumiques sous-jacents. On divise cette distance par deux pour obtenir la longueur caractéristique. Pour le gap tangentiel, on procède de la même manière que dans la première méthode mais on travaille dans le plan tangent de contact ! Dès lors, ce critère est par définition anisotrope. | ||
- | Par exemple, pour un élément quadrangulaire rectangulaire a×b (avec b>a>0), on a | + | === Cas Tests Modifiés === |
- | * _method = ALM_AIC_LENGTH : LcN=LcT=b2 | + | En activant l' |
- | * _method = ALM_GEO_LENGTH : $Lc_N = \frac{a}{2}etLc_T = \frac{b}{2}$ | + | |
- | * _method = ALM_CRITICAL_LENGTH : LcN=LcT=a√1+b2a2 (= Moitié | + | |
- | Dans le jeux de données Python, on choisit les options comme ceci : | ||
- | < | ||
- | augLagGeoCriterion = AugLagNormalisedGeoCriterion(alm) | ||
- | augLagGeoCriterion.setCharacteristicLengthMeth(_method) | ||
- | </ | ||
- | | ||
- | Sur un pas de temps donné, la maille peut subir de grande déformation d'où le fait que l'on recalcule à chaque fois la longueur caractéristique au cours des augmentations. | ||
- | === Mise à jour du pas de temps === | + | Nastran test |
- | L'algorithme du Lagrangien augmenté permet à priori de résoudre un problème de contact sur un pas de temps plus élevé que l'équivalent en Méthode de Pénalité. Pour mettre à jour le pas de temps, j'ai proposé plusieurs méthodes : | + | J'ai activé |
- | * _equivalentIteMethod = ALM_TSCM_FIRST : Nombre d' | ||
- | * _equivalentIteMethod = ALM_TSCM_MAX : Nombre d' | ||
- | * _equivalentIteMethod = ALM_TSCM_MEAN : Nombre d' | ||
- | * _equivalentIteMethod = ALM_TSCM_WEIGHTEDMEAN : Nombre d' | ||
- | Cette valeur d' | + | apps.toolbox.createContactTests.py |
- | Dans le jeux de données Python, on a | ||
- | |||
- | < | ||
- | tscm = NbOfAugLagMechNRIterationsTimeStepComputationMethod(metafor) | ||
- | tscm.setTimeStepDivisionFactor(_timeStepDivisionFactor) | ||
- | tscm.setEquivalentIteMethod(_equivalentIteMethod) | ||
- | tscm.setMaxNbOfIteInAdaptOfTimeStep(_maxNbOfIteInAdaptOfTimeStep) | ||
- | tscm.setNbOptiIte(_nbOptiIte) | ||
- | tsm.setTimeStepComputationMethod(tscm) | ||
- | </ | ||
- | Par exemple, si on a le profil suivant de convergence sur un pas de temps de donné | + | La fonction defineMim() passe de cinq arguments d'entrée à trois arguments d' |
- | ^ ALM ITE NO ^ MECH ITE NUMBER | + | |
- | | 0 | 2 | | + | |
- | | 1 | 3 | | + | |
- | | 2 | 4 | | + | |
- | | 3 | 3 | | + | |
- | | 4 | 3 | | + | |
- | | 5 | 3 | | + | |
- | | 6 | 2 | | + | |
- | | 7 | 2 | | + | |
- | | 8 | 2 | | + | |
- | | 9 | 2 | | + | |
- | | 10 | 2 | | + | |
- | | 11 | 1 | | + | |
- | | 12 | 1 | | + | |
- | on obtient l'itération | + | |
- | ^ ALMTSCM | + | |
- | | ALM_TSCM_FIRST | + | |
- | | ALM_TSCM_MAX | + | |
- | | ALM_TSCM_MEAN | + | |
- | | ALM_TSCM_WEIGHTEDMEAN | + | |
- | === Benchmark - Cont2 === | + | SurfaceSelector() Nouveau selecteur... |
- | ==== Informations sur Interaction de Contact ==== | ||
- | Il est possible de demander d' | + | === Vector To Scalar Operator |
- | < | + | |
- | ci = RdContactInteraction(1) | + | |
- | ci.setShowInformation(True) | + | |
- | </ | + | |
- | Voici un exemple de sortie. | + | |
- | < | + | |
- | mechanical iteration 0 : Rmean = 1.000000e+000 | + | |
- | RdContactInteraction #2 | + | |
- | Actual/ | + | |
- | Number of Nodes in Sticking/ | + | |
- | mechanical iteration 1 : Rmean = 2.192696e-001 | + | |
- | RdContactInteraction #2 | + | |
- | Actual/ | + | |
- | Number of Nodes in Sticking/ | + | |
- | mechanical iteration 2 : Rmean = 2.016662e-001 | + | |
- | RdContactInteraction #2 | + | |
- | Actual/ | + | |
- | Number of Nodes in Sticking/ | + | |
- | mechanical iteration 3 : Rmean = 1.084675e-001 | + | |
- | RdContactInteraction #2 | + | |
- | Actual/ | + | |
- | Number of Nodes in Sticking/ | + | |
- | mechanical iteration 4 : Rmean = 2.831632e-002 | + | |
- | RdContactInteraction #2 | + | |
- | Actual/ | + | |
- | Number of Nodes in Sticking/ | + | |
- | mechanical iteration 5 : Rmean = 1.060746e-003 | + | |
- | RdContactInteraction #2 | + | |
- | Actual/ | + | |
- | Number of Nodes in Sticking/ | + | |
- | mechanical iteration 6 : Rmean = 1.744038e-005 | + | |
- | RdContactInteraction #2 | + | |
- | Actual/ | + | |
- | Number of Nodes in Sticking/ | + | |
- | </ | + | |
- | Cela peut permettre de comprendre la raison pour laquelle un pas de temps ne converge pas (Status collant glissant qui change ou status en contact ou hors contact qui change). | + | |
- | ==== Nombre de conditionnement réciproque ==== | + | J'ai ajouté |
- | + | ||
- | Il est désormais possible d' | + | |
- | + | ||
- | On peut demander de calculer à chaque résolution du système linéaire, le nombre de conditionnement réciproque. Pour se faire, il suffit de faire : | + | |
- | + | ||
- | < | + | |
- | solvermanager = metafor.getSolverManager() | + | |
- | solver = DSSolver() | + | |
- | solver.setShowRCond(True) | + | |
- | solvermanager.setSolver(solver) | + | |
- | </ | + | |
- | + | ||
- | Également, il est possible de faire un extracteur de cette grandeur (Nombre de conditionnement réciproque de la matrice FreeJacobian du schéma d' | + | |
- | + | ||
- | < | + | |
- | valuesmanager.add(1, | + | |
- | </ | + | |
- | + | ||
- | Dans Matlab, on compare ce nombre de conditionnement réciproque avec l' | + | |
- | + | ||
- | Finalement, cet extracteur peut aider à quantifier l' | + | |
- | + | ||
- | + | ||
- | ==== Nouveaux extracteurs de contact ==== | + | |
- | + | ||
- | Par la même occasion, j'ai ajouté plein de nouveau extracteurs de variables de contact. | + | |
+ | MinOfNonZeroOperator() | ||
+ | MaxOfNonZeroOperator() | ||
+ | AbsMinOfNonZeroOperator() | ||
+ | AbsMaxOfNonZeroOperator() | ||
+ | MinAbsOfNonZeroOperator() | ||
+ | MaxAbsOfNonZeroOperator() | ||
Line 196: | Line 77: | ||
< | < | ||
[r]: | [r]: | ||
- | [a]: | + | [a]: |
</ | </ | ||
- | --- // | + | --- // |
commit/futur/gaetan.1461406591.txt.gz · Last modified: 2016/04/23 12:16 by wautelet