6. Résolution du système matriciel#
On obtient donc un système linéaire à résoudre:
Quel que soit le champ des déplacements virtuels, donc:
6.1. Imposition des conditions aux limites cinématiques#
Le traitement des conditions aux limites cinématiques du type \(u={u}^{D}\) se fait de deux manières différentes:
La méthode «cinématique» (AFFE_CHAR_CINE dans Code_Aster) consiste à modifier la matrice et le second membre. Cette méthode est rapide et n’introduit pas de variables supplémentaires. Par contre, elle n’est pas générale et ne permet pas d’appliquer des conditions limites complexes du style \(\sum{u}_{i}.{a}_{i}={u}^{D}\) .
La méthode par dualisation (AFFE_CHAR_MECA dans Code_Aster) consiste à introduire un vecteur de multiplicateurs (ou paramètres) de Lagrange \(\lambda\) , ce qui augmente le nombre d’inconnues mais permet de traiter tous les cas.
6.2. Résolution#
Le système linéaire peut être résolu par un certain nombre de méthodes numériques. Les méthodes utilisées dans Code_Aster sont une factorisation \({\mathit{LDL}}^{T}\) par blocs, une méthode multi-frontale (ou son équivalent avec pivotage, MUMPS), un gradient conjugué préconditionné ainsi que la collection de solveurs itératifs PETSC.
Les méthodes de résolution se divisent en deux catégories:
Les méthodes directes qui résolvent exactement (aux erreurs numériques près)
Les méthodes itératives qui construisent une suite de vecteurs convergeant vers la solution
Les matrices issues de la méthode des éléments finis sont très creuses (elles comportent une majorité de termes nuls). En pratique, sur des systèmes de taille standard (quelques dizaines de milliers d’équations), la densité de termes non nuls dépasse rarement les 0.01%. Elles sont donc stockées sous forme creuse (ou «sparse») et prennent peu de place en mémoire. A contrario, les matrices ne sont pas construites pour être utilisés efficacement avec les bibliothèques de programmes mathématiques optimisées dédiées aux matrices pleines (libraires BLAS par exemple). Des solveurs sont donc développés spécifiquement pour ces problèmes.
Un solveur direct a pour principe de décomposer la matrice en un produit de matrices de forme particulières. Par exemple, la décomposition \({\mathit{LDL}}^{T}\) :
Où la matrice \(D\) est diagonale et la matrice \(L\) est triangulaire inférieure. Cette décomposition n’est valable que pour les matrices symétriques. Si ce n’est pas le cas, il faut utiliser d’autres décompositions.
Le principe est le suivant:
A partir de la matrice initiale (très creuse), on construit un produit de matrices remarquables. C’est l’opération de factorisation .
Ces matrices remarquables permettent de résoudre le problème de manière très rapide. C’est la phase de descente-remontée.
La phase de factorisation est la plus coûteuse. Pour les décompositions les plus répandues, le coût machine est en \({n}^{3}\) où \(n\) est le nombre d’équations. Le coût mémoire dépendra du profil de la matrice (de la numérotation des éléments finis). Des procédés automatiques cherchent à optimiser cette numérotation pour avoir une structure aussi compacte que possible. Même avec cette optimisation, il est fréquent que la matrice factorisée prennent plusieurs centaines de fois, voire plusieurs milliers de fois plus de mémoire que la matrice initiale. Les solveurs directs consomment donc beaucoup de mémoire et ça en devient rédhibitoire à partir de plusieurs centaines de milliers de degrés de liberté, même sur les machines les plus puissantes. Par contre, ces méthodes directes sont particulièrement robustes. Les problèmes en mécanique des structures et des solides conduisent bien souvent à des matrices avec un mauvais conditionnement (c’est particulièrement le cas de toutes les dernières innovations numériques qui utilisent des méthodes mixtes avec beaucoup de multiplicateurs de Lagrange).
Lorsque c’est possible, on utilise préférentiellement des méthodes itératives dont le principe consiste à trouver une approximation de l’inverse de la matrice et à procéder ensuite à une résolution itérative, pas par pas, qui n’utilise que des produits matrices-vecteurs, très efficaces et peu coûteux en mémoire.
Toutefois, ces méthodes itératives ont plusieurs défauts:
Elles sont moins robustes que les méthodes directes, particulièrement lorsque le conditionnement est mauvais
Les méthodes de pré-conditionnement sont très nombreuses et il en existe autant que de problèmes différents (voire plusieurs possibles par problème). Ce qui oblige l’utilisateur à jongler avec les différentes méthodes, sans jamais être assuré d’obtenir un résultat à la fin.
Ce sont des méthodes itératives, ce qui implique un critère d’arrêt du processus, et donc un paramètre à gérer mais aussi des problèmes de cumul d’erreurs d’arrondi.