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 :

fonction en argument de matrice


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Avril 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 2
    Par défaut fonction en argument de matrice
    salut,

    Quelqu'un peut m'aider à corriger ce petit program pour la methode de Gradient conjugué? Pour l'instant, le bug se situe au niveau de passage en fonction avec la matrice 'AA', il y a un message d'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tgc.f90:31.15:
    sol = gradconj(AA,f,x0)     
    Warning: Extension: REAL array index at (1)
    tgc.f90:31.15:
    sol = gradconj(AA,f,x0)
    Error: Array index at (1) is an array of rank 2
    Mon program est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    program test_gc   !!gradient conjugue
    implicit none
     
    integer, parameter :: pr=selected_real_kind(10,70)
     
    real(pr),dimension(:,:), allocatable :: AA
    real(pr),dimension(:),   allocatable :: f,x0,sol, gradconj
     
    integer :: i,j
     
    Allocate( AA(4,4),f(4),x0(4),sol(4),gc(4) )
     
    ! Affectation des AA,f,x0
    do i=1,4
      f(i)  = 1.0
      x0(i) = 4.0
      do j=1,4
        AA(i,j) = 4*(i-1)+j
      end do
    end do
     
    ! Printing for check
    print*, "AA est :"
    do i=1,4
      print*, AA(i,:)
    end do
    print*, "f  est : ", f
    print*, "x0 est :", x0
     
    ! Solving by Gradient Conjugue   ---> Problems here !!!
    sol = gradconj(AA,f,x0)
     
    print*, "la solution est :"
    print*, "Sol = ", sol
     
    Deallocate( AA,f,x0,sol,gc )
     
    end program test_gc
     
     
    !contains
     
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    function gradconj(A,b,x0) result (gc)
    implicit none
     
    integer, parameter :: pr=selected_real_kind(10,70)
     
    real(pr), dimension(:,:), intent(in) :: A 
    real(pr), dimension(:),   intent(in) :: b, x0
    real(pr), dimension(size(x0))        :: gc
     
    integer  :: i,j,k
    real(pr) :: ff
    real(pr), dimension(:,:), allocatable :: r,p,q, x
    real(pr), dimension(:),   allocatable :: alfa,beta
     
     
    !! rO = b - (A|x0)   ET  p0 = r0
    do i=1, size(b)
      do j= 1, size(A,1)
        ff = A(i,j)*x0(j)
      end do 
      r(i,0) = b(i) - ff
      p(i,0) = r(i,0)
    end do
     
    k=0         !! Nombre d'iterations
    do while ( sum(r(:,k)) > 0.001 )
     
      k = k+1
      if (k==1) then
        p(:,k) = r(:,0)
      else
        beta(k-1) = dot_product ( r(:,k-1),r(:,k-1) ) / dot_product ( r(:,k-2),r(:,k-2) )
        p(:,k) = r(:,k-1) + beta(k-1)*p(:,k-1)
      end if
        q(i,k) = dot_product( A(i,:),p(:,k) )
     
      alfa(k) = dot_product( r(:,k-1),r(:,k-1) ) / dot_product ( p(:,k),q(:,k) )
      x(:,k) = x(:,k-1) + alfa(k)*p(:,k)
      r(:,k) = r(:,k-1) - alfa(k)*q(:,k)
     
    end do
     
    gc = x(:,k)
    print*, "Solution trouvee! Le nombre d'iterations = ",k
     
    end function gradconj
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    Merci de votre attention.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    À la ligne 7, tu dois enlever gradconj de la déclaration.

    Comme gradconj est une fonction contenue dans ton programme, tu n'a pas à déclarer le type de résultat (à la F77). L'interface est automatiquement générée par le compilateur. Par ta déclaration à la ligne 7, tu déclares probablement une variable locale masquant la fonction...

Discussions similaires

  1. Signature d'une fonction sans argument
    Par cj227854 dans le forum C++
    Réponses: 5
    Dernier message: 20/10/2005, 17h01
  2. creer une fonction avec arguments
    Par niglo dans le forum ASP
    Réponses: 3
    Dernier message: 03/06/2005, 08h04
  3. Passer une fonction comme argument à une fonction
    Par Cocotier974 dans le forum Général Python
    Réponses: 4
    Dernier message: 29/06/2004, 13h41
  4. [VB.NET] Fonctions en argument ?
    Par BobLeNain dans le forum VB.NET
    Réponses: 8
    Dernier message: 03/06/2004, 12h47
  5. Fonction divisant argument de type inconnu
    Par Nasky dans le forum C
    Réponses: 9
    Dernier message: 29/07/2003, 00h32

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