Bonjour,
Je viens vous poser une question face à un problème qui m'intrigue quelque peu...
Mon problème est le suivant :
Dans le cadre du projet sur lequel je travaille actuellement je suis en train de développer un code de résolution de l'équation de la chaleur en 1D et 2D. La partie 1D a néanmoins un souci lorsque j'essaye d'utiliser la fonction DGBSV de Lapack.
J'utilise une discrétisation à 5 points pour l'instant dans un milieu homogène, ce qui crée une matrice pentadiagonale, ainsi qu'un schéma thêta. J'arrive donc un système du type :
B*X = A*T, T étant le profil de température 1D au temps t, et X le profil à t+dt. A et B deux matrices carrées (n,n), pentadiagonales, que je connais donc.
Lorsque je code une routine qui transforme B en une matrice triangulaire supérieure, B', A' ne l'étant pas a priori, et que je résouts B'*X = A'*T à chaque itération l'évolution du profil colle quasi parfaitement à l'évolution du profil réel (obtenu par résolution analytique d'un problème simple, servant de cas test initial). En revanche, lorsque j'essaye d'utiliser DGBSV, qui permet d'accélérer le calcul surtout si je souhaite augmenter l'ordre spatial, la solution numérique diverge très violemment...
Sachant que j'ai d'abord tester la boucle sur l'exemple disponible sur le site de netlib, et que ça marche.
La boucle qui utilise DGBSV ressemble à ceci :
do
if (temps > tfin) then
exit
else
AB2 = AB
T_temp = matmul(A(:,,T(
)
DGBSV(n, 2, 2, 1, AB2, n, IPIV, T_temp, n, INFO)
if (INFO /= 0)
print *, "erreur avec DGBSV"
print *, "l'erreur est :" , INFO
stop
end if
T = T_temp
write() .....
end if
end do
j'ai pris LDAB = LDB = n.
AB est la matrice B stockée par bande, que je réutilise à chaque itération, d'où l'utilisation de AB2 comme intermédiaire puisque DGBSV modifie la matrice par bandes.
Autre détail, qui aurait peut être son importance, j'utilise un mac et gfortran.
Voilà, donc si quelqu'un aurait une idée de pourquoi la routine LAPACK diverge, je lui serais très reconnaissant
Merci d'avance !
Partager