Anomalie #372
Erreur d'allocation de memoire en RD
0%
Description
Bonjour,
Dans un calcul ballon en RD simple avec un grand nombre de nœuds (50 000) j'ai le massage suivant avant le début du calcul:
Erreur d'allocation de memoire: taille de reel demandee: 151527*163131= -1051052739
MatBand::MatBand (...
passage dans la methode Sortie
Y-a-t'il des paramètres dans para_syteme_lineaire à spécifier pour des problèmes de grande taille ?
Merci
Frank
Fichiers
Mis à jour par Frank Petitjean il y a 6 mois
Une simple renumérotation des noeuds permet de passer le cas.
Mais il y a quand même peut être un meilleur choix de paramètres pour la résolution...
Mis à jour par Gérard Rio il y a 6 mois
bonjour Frank,
en fait sans renumérotation, la taille nécessaire pour la matrice est celle indiquée qu'il faut *8 car c'est en nombre de réel donc dans ton cas cela fait: 1.9775e+11, c-a-d si je compte bien 197 gigaoctets donc c'est un peu beaucoup.
La fonction renumérotation permet d'optimiser le stockage bande donc aussitôt que tu manipules un grand nombre de noeuds il faut renuméroter.
Concernant la performance de la résolution globale en implicite avec du Newton-Raphson, qui nécessite l'inversion de la raideur:
- lorsque le nombre de noeuds est faible (inf à 1000 ou 500 pour un test) souvent le type de matrice retenue n'a pas vraiment d'impact sur le résultat.
- lorsque le nombre de noeuds est important (typiquement ton cas) il est nettement préférable d'utiliser au stockage et une résolution particulière.
La plus simple est d'utiliser une matrice de la bibliothèque lapack. Les temps de résolution du système linéaire sont bien meilleurs : par exemple 5 fois plus rapide (ou plus) ! mais ...
1) le stockage nécessaire est en général plus important (lapack utilise des stockages transitoires : typiquement 1.5 à 2 fois le stockage par défaut)
2) il faut faire le choix : symétrique ou pas:
- symétrique -> résolution plus rapide (cholesky) mais on peut perdre de l'info: par exemple l'utilisation d'une pression induit une raideur normalement non symétrique. Si on choisit un stockage symétrique, la matrice sera symétrisée. En général cela ne pose pas de pb mais pas toujours. Dans certains cas il faut absolument utiliser un stockage non symétrique pour converger.
- en non symétrique -> stockage + important et résolution de gauss donc moins performant. Mais néanmoins plus performant que le stockage par défaut.
Le plus simple est d'essayer d'abord avec du symétrique et si ça marche dans rester là, sinon voir si du non symétrique améliore la chose sachant que plein d'autres facteurs peuvent impacter la convergence
On peut aussi utiliser un stockage matrice creuse (c'est le meilleur stockage ) par contre au niveau résolution cela impose d'utiliser du gradient conjugué avec préconditionnement. Quand ça marche, c'est très très performant pour les grosses matrices, par contre la résolution ne fonctionne pas toujours (il s'agit d'une méthode itérative de résolution).