Table of Contents
Commit 2019-08-13
Ce commit a pour but d'interfacer directement l'algorithme du Line Search Structural dans le jeux de données python. Dès lors, nous ne passerons plus par l'IterationManager pour pouvoir l'activer dans nos jeux de données.
Pour mon prochain commit, il y aura une nouvelle implémentation du Line Search Structural plus performante que celle actuelle.
Structural Line Search - Refactoring
J'ai placé les fonctions relatives à l'algorithme du Line Search Structural de l'IterationManager vers une nouvelle arborescence d'objets. La classe d'interface pure virtuelle est StructuralLineSearchBase qui permet de communiquer entre l'IterationManager et l'algorithme du Line Search Structural.
FullStepStructuralLineSearch (Derive de StructuralLineSearchBase)
Cette méthode correspond à la méthode classique de Newton Raphson où la taille du pas selon la direction de recherche est de 1.
mim = metafor.getIterationManager() lineSearch = FullStepStructuralLineSearch(mim) lineSearch.setVerbose(boolParameter|default value = False) lineSearch.setDebug(boolParameter|default value = False) mim.setStructuralLineSearch(lineSearch)
StandardStructuralLineSearch (Derive de StructuralLineSearch = une classe virtuelle)
Cette méthode correspond au Line Search Structural programmée par Ludovic Noëls. Je remets ici les différents paramètres d'utilisation de l'algorithme.
mim = metafor.getIterationManager() lineSearch = StandardStructuralLineSearch(mim) lineSearch.setVerbose(boolParameter|default value = False) lineSearch.setDebug(boolParameter|default value = False) lineSearch.setMaxNbOfLineSearchIterations(integerParameter|default value = 10); lineSearch.setLineSearchTolerance1(doubleParameter|default value = 1.0); lineSearch.setLineSearchTolerance2(doubleParameter|default value = 1.0E-8); lineSearch.setAbsMaxLineSearchCoefficient(doubleParameter|default value = 10.0); lineSearch.setAbsMinLineSearchCoefficient(doubleParameter|default value = 0.0); mim.setStructuralLineSearch(lineSearch)
Désormais, il est possible de normaliser le résidu du Line Search Structural via la commande suivante :
lineSearch.setUseNormalisedCriterion(boolParameter|default value = False)
On divise tout simplement les résidus du Line Search Structural par la valeur obtenue à l'itération numéro 0. La tolérance 1 dans ce cas de figure est relative et non plus absolue.
Jeux de données - Structural Line Search
Par conséquent, j'ai du adapter tous les cas-tests de la batterie avec le nouvel interface. Principalement, j'ai du modifier la fonction defineMim() de apps.toolbox.createContactTests.py. La fonction defineMim() passe de cinq arguments d'entrée à trois arguments d'entrée pour configurer le Newton Raphson mécanique. L'algorithme du Line Search Structural est activé avec une fonction defineMls() qui prend trois arguments d'entrée.
Divers
J'ai regroupé dans cette section différentes modifications du code source.
- MiscValueExtractor
Suite au refactoring du Line Search, j'ai remis à plat les grandeurs archivées pour le Line Search Structural mécanique et thermique via le MiscValueExtractor(). J'en ai profité pour sortir aussi les nombres d'itération mécanique ou thermique avec ou sans mise à jour de la matrice de raideur tangente.
valueExtractor = MiscValueExtractor(meta, type)
Je vous renvoie vers la documentation mise à jour pour plus d'informations Saving history curves to disk.
Les cas-tests avec le Line Search Structural ont été adapté de manière à conserver les valeurs archivées avant le commit.
- Cast Test - nastranTriSkinContactTool.py
Pour diminuer l'utilisation du temps CPU lors de la recherche du contact, j'ai activé l'utilisation des arbres (BoundaryVolumeHierarchy).
- VectorToScalarOperator
J'ai ajouté de nouveaux opérateurs pour l'archivage des grandeurs au cours d'un calcul :
1) Recherche du minimum parmi les valeurs d'un vecteur en excluant les valeurs nulles.
MinOfNonZeroOperator()
2) Recherche du maximum parmi les valeurs d'un vecteur en excluant les valeurs nulles.
MaxOfNonZeroOperator()
3) Recherche du minimum en valeur absolue parmi les valeurs d'un vecteur en excluant les valeurs nulles. Cette grandeur garde son signe.
AbsMinOfNonZeroOperator()
4) Recherche du maximum en valeur absolue parmi les valeurs d'un vecteur en excluant les valeurs nulles. Cette grandeur garde son signe.
AbsMaxOfNonZeroOperator()
5) Recherche du minimum parmi les valeurs prises en valeur absolue d'un vecteur en excluant les valeurs nulles. Cette grandeur est toujours positive.
MinAbsOfNonZeroOperator()
6) Recherche du maximum parmi les valeurs prises en valeur absolue d'un vecteur en excluant les valeurs nulles. Cette grandeur est toujours positive.
MaxAbsOfNonZeroOperator()
- QuadSide
J'ai enrichi le message d'erreur et le message de warning lors l’exécution de la fonction giveCornerEdgeProjection().
Fichiers ajoutés/supprimés
[a]:mtFEM/algos/FullStepStructuralLineSearch.cpp [a]:mtFEM/algos/FullStepStructuralLineSearch.h [a]:mtFEM/algos/StandardStructuralLineSearch.cpp [a]:mtFEM/algos/StandardStructuralLineSearch.h [a]:mtFEM/algos/StructuralLineSearch.cpp [a]:mtFEM/algos/StructuralLineSearch.h [a]:mtFEM/algos/StructuralLineSearchBase.cpp [a]:mtFEM/algos/StructuralLineSearchBase.h [r]:
Cas tests ajoutés/supprimés
[a]: [r]:
— gaëtan 2019/08/13 22:30