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 :

where, indices tableaux et test logique


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chercheur - Programmeur amateur
    Inscrit en
    Août 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur - Programmeur amateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2005
    Messages : 65
    Par défaut where, indices tableaux et test logique
    Bonjour à tous

    Voila ma question du jour
    Comment, en fortran 90, récupérer la position (les indices) des valeurs d'un tableau qui vérifient un test logique.

    Avec "WHERE", il est possible d'effectuer une action sur ces valeurs, mais pas de récupérer leur position.
    Bref, comment faire?

    Merci d'avance

  2. #2
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Bonjour

    Tu ne peux pas les enregistrer dans un tableau au passage ?

    Tu fais ta boucle where qui fait un test sur les valeurs de ton tableau et tu dis que si le test logique est vrai tu enregistres l'indice courant dans un tableau et tu incrémente l'indice du tableau en question.

  3. #3
    Membre confirmé
    Homme Profil pro
    Chercheur - Programmeur amateur
    Inscrit en
    Août 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur - Programmeur amateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2005
    Messages : 65
    Par défaut
    Bonjour

    Je veux bien, mais justement, comment avoir accès à l'indice courant?

    C'est possible avec une structure en "DO ENDDO" avec un "IF" imbriqué, mais je voudrais éviter cette solution car et est beaucoup trop lente. Je cherche justement a optimiser un programme qui est très lent car comportant de nombreuses boucles et test imbriqué.
    Le but était justement de récupérer ces indices afin de limiter l'étendue des boucle "DO ENDDO"

  4. #4
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Exact, je comprend mieux ton problème. Je pense malheureusement que le bloc WHERE n'est pas fait pour. Il est indiqué que les instructions dans un bloc where doivent concerner uniquement des affectations dans un tableau.

    En fait l'instruction WHERE permet simplement de rajouter des filtres sur une instructions du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sqrta(:) = sqrt( a(:) )
     
    where ( a > 0 ) sqrta(:) = sqrt( a(:) )
    D'autre part (sauf si tu fais de la parallélisation) un bloc do avec un if ne doit pas avoir une efficacité très différentes de celle d'un bloc where. Peut être que where est bien adapté à l'utilisation d'instruction OpenMP mais je ne m'y connais pas trop. Pour te convaincre voici un petit test :

    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
     
    # user@dvp  ~
    > ifort -O0 -o exe test.f90
     
    # user@dvp  ~
    > exe
    bloc where
    temps cpu      :    0.0330
    temps systeme  :    0.0327
     
    bloc do if then else end if end do
    temps cpu      :    0.0120
    temps systeme  :    0.0119
     
    # user@dvp  ~
    > gfortran -o exe test.f90
     
    # user@dvp  ~
    > exe
    bloc where
    temps cpu      :    0.0150
    temps systeme  :    0.0150
     
    bloc do if then else end if end do
    temps cpu      :    0.0130
    temps systeme  :    0.0130
    Et voilà le code en question :

    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
     
    program test
     
      implicit none
     
      integer            :: i
      integer, parameter :: n = 1000000
      integer            :: t2, t1, freq, maxt, nb_periodes
      real, dimension(n) :: a, sqrta
      real               :: x, cpu1, cpu2, tps_systeme
     
      call system_clock( count_rate=freq, count_max=maxt )
     
      ! a entre -1 et 1
      do i = 1, n
        call random_number(x)
        a(i) = 2.d0 * x - 1.d0
      end do
     
      !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
      ! bloc where
      !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
     
      call system_clock( t1 )
      call cpu_time( cpu1 )
     
      where ( a(:) > 0.d0 ) 
        sqrta(:) = sqrt(a(:))
      else where
        sqrta(:) = 0.d0
      end where
     
      call cpu_time( cpu2 )
      call system_clock( t2 )
     
      nb_periodes = t2 - t1
      do while ( nb_periodes < 0 ) 
        nb_periodes = nb_periodes + maxt
      end do
      tps_systeme = real(nb_periodes) / real(freq)
     
      write(*,"('bloc where')")
      write(*,"('temps cpu      :',F10.4)") cpu2 - cpu1
      write(*,"('temps systeme  :',F10.4)") tps_systeme
     
      !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
      ! bloc do if else end do
      !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
     
      call system_clock( t1 )
      call cpu_time( cpu1 )
     
      do i = 1, n
        if( a(i) > 0.d0 ) then
          sqrta(i) = sqrt(a(i))
        else
          sqrta(i) = 0.d0
        end if
      end do
     
      call cpu_time( cpu2 )
      call system_clock( t2 )
     
      write(*,*)
      write(*,"('bloc do if then else end if end do')")
     
      nb_periodes = t2 - t1
      do while ( nb_periodes < 0 ) 
        nb_periodes = nb_periodes + maxt
      end do
      tps_systeme = real(nb_periodes) / real(freq)
     
      write(*,"('temps cpu      :',F10.4)") cpu2 - cpu1
      write(*,"('temps systeme  :',F10.4)") tps_systeme
     
    end program test

  5. #5
    Membre confirmé
    Homme Profil pro
    Chercheur - Programmeur amateur
    Inscrit en
    Août 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur - Programmeur amateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2005
    Messages : 65
    Par défaut
    Oui c'est bien ce que je pensais.
    Merci pour le test, finalement, il semble que where soit plus lent que if, je suis étonné.

    Quoi qu'il en soit, j'ai trouvé une solution, a base de where/minloc et count. C'est sioux, mais ca marche. Maintenant reste a voir si j'y gagne en temps

  6. #6
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Oui au final c'est le gain de temps le plus important !

    Il faut aussi voir que si c'est un script à usage unique le facteur limitant peut être l'écriture du script et il vaut mieux éviter les trucs trop sophistiqué !

Discussions similaires

  1. [xls] décrémenter de 1 dans un test logique
    Par Biker-Robby dans le forum Excel
    Réponses: 4
    Dernier message: 23/01/2008, 17h06
  2. [Tableaux] Multiple test. Simplification ?
    Par Yein-Yein dans le forum Langage
    Réponses: 8
    Dernier message: 23/11/2007, 11h06
  3. [VBA]Execution de Requêtes automatique et test logique
    Par nicacc dans le forum VBA Access
    Réponses: 4
    Dernier message: 14/08/2007, 19h31
  4. Tests logiques sur les flags : cmp /jna
    Par lylia SI dans le forum Assembleur
    Réponses: 2
    Dernier message: 27/09/2006, 18h42
  5. [Tableaux] Problème test script
    Par masseur dans le forum Langage
    Réponses: 6
    Dernier message: 03/12/2005, 19h48

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