IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

La fonction DGBSV de Lapack diverge dans une boucle


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 3
    Par défaut La fonction DGBSV de Lapack diverge dans une boucle
    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 !

  2. #2
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Par défaut
    Salut!

    Tout d'abord, qu'entends-tu par diverger'

    Ensuite, pourquoi utilises-tu la matrice AB et non B?

    Enfin, es-tu sûr que l'erreur vient de DGBSV et non de matmul?

    Jean-Marc Blanc

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 3
    Par défaut
    Bonjour,

    Donc, pour essayer de vous répondre dans l'ordre :

    1) Par diverger, j'entends que la température calculée augmente très vite, et ne cesse pas d'augmenter.

    2) J'utilise AB, car la fonction DGBSV de Lapack nécessite d'avoir en entrée une matrice stockée sous forme de bandes (C'est expliquée dans le site de LAPACK), ce que je fais en stockant B dans AB.

    3) L'erreur vient bien de DGBSV (A priori, car je ne vais pas garantir que je suis parfait ^^) , car j'ai testé avec une subroutine qui fait la multiplication matricielle que j'ai écrit, et le résultat est le même.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 3
    Par défaut
    (re) Bonjour

    Je viens de résoudre le problème, il y avait une transposition cachée qui modifiait du coup mes conditions limites.


Discussions similaires

  1. Réponses: 6
    Dernier message: 31/07/2006, 16h01
  2. [VBA-PP]fonction qui écrit un chiffre dans une cellule excel
    Par alpking dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 26/04/2006, 19h34
  3. La fonction CurrentDb() ne fonctionne pas dans une requête
    Par Sébastien Le Goyet dans le forum Access
    Réponses: 8
    Dernier message: 24/11/2005, 17h46
  4. [VB.NET] fonction qui injecte du html dans une zone précise
    Par denisvignes dans le forum ASP.NET
    Réponses: 5
    Dernier message: 27/10/2005, 09h33
  5. Réponses: 2
    Dernier message: 15/10/2005, 23h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo