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 :

Barre d'avancement boucle DO


Sujet :

Fortran

  1. #21
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Petit problème d'insertion dans un programme:

    j'ai essayé de mettre tout ça dans une boucle F90 assez longue (pas utile de la lire, le call et la souroutine sont à la fin en gras)

    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    [...]
    do ntime= ntime_deb, Tdomain%TimeD%NtimeMax-1
    !before newmark the current time of Displ etc is ntime, after newmark, it is ntime+1
    !if (ntime==2000) then
    Tdomain%test_flag=.true.
    !else
    !Tdomain%test_flag=.false.
    !endif
    
        Tdomain%TimeD%rtime = Tdomain%TimeD%rtime + Tdomain%TimeD%dtmin
        Tdomain%TimeD%itime=ntime
        call Newmark (Tdomain)
        if (Tdomain%logicD%save_snapshots .or. Tdomain%logicD%save_deformation)  i_snap = mod (ntime, Tdomain%TimeD%nsnap)
        if (Tdomain%save_for_inversion) call save_wf(Tdomain)
        if (i_snap == 0 ) then
             if (Tdomain%MPI_var%my_rank == 0) write (*,*) "Iteration number    ", ntime 
              if (Tdomain%logicD%save_snapshots) call savefield (Tdomain,ntime,is_save)
    	  if (Tdomain%logicD%save_deformation) then
    	                   call save_vorticity (Tdomain,ntime,is_save)
    			   call save_deformation (Tdomain, ntime,is_save)
    	  endif
    !	  if (Tdomain%logicD%save_fault_trace) call save_fault_trace (Tdomain, ntime)
        endif
    
        if (Tdomain%logicD%save_trace) call save_trace(Tdomain, ntime,is_save) 
        if (Tdomain%trmd.and.mod(ntime,Tdomain%TimeD%nsamp)==0)     call dump_trm_direct_fields(Tdomain)
        if (Tdomain%debugflag) then
           call maxfield(Tdomain,ntime,maxf,0)
           if (Tdomain%Mpi_var%my_rank==0) print*,'debugflag on:',ntime,maxf,Tdomain%debuglevel
           if (maxf>Tdomain%debuglevel) then
              print*,'maxf>Tdomain%debuglevel',maxf,Tdomain%debuglevel
              call savefield (Tdomain,ntime,is_save)
              call MPI_FINALIZE(ierr)
              stop 'leveldebug has been reached ... exit.'
           endif
        endif
        if (ntime/=ntime_deb.and.Tdomain%backupflag &
          .and.((mod(ntime,Tdomain%TimeD%backupsamp)==0) &
                .or.ntime==Tdomain%TimeD%NtimeMax-1)) call checkpoint(ntime,Tdomain)
    !if (Tdomain%Mpi_var%my_rank==Tdomain%Mpi_var%smallestrankwithtrace.and.mod(ntime,10)==0) then
    !t22=mpi_wtime()
    !print*,'ntime=',ntime,Tdomain%TimeD%NtimeMax-1,sngl(t22-t12),sngl(maxval(abs(Tdomain%Store_Trace)))
    !t12=t22
    !endif
        if (mod(ntime,Tdomain%TimeD%nsamp)==0) then
           if (Tdomain%n_receivers_in>0) then 
              tmpv=maxval(abs(Tdomain%Store_Trace(:,:,ntime/Tdomain%TimeD%nsamp)))
           else
              tmpv=0.
           endif
           call MPI_REDUCE(tmpv,tmpvv,1,MPI_DOUBLE_PRECISION,MPI_MAX,0,MPI_COMM_WORLD,ierr)
           if (Tdomain%Mpi_var%my_rank==0) then
              t22=mpi_wtime()
              print*,'ntime=',ntime+1,Tdomain%TimeD%NtimeMax-1,sngl(t22-t12),sngl(tmpvv)
              itav=itav+1; tav=tav+t22-t12
    
              
    
              if (sngl(tmpvv)>1.d40) STOP 'The code is unstable!'
              t12=t22
           endif
           inquire(file="stop_in_run",exist=flag)
           if (flag) then
              if (Tdomain%MPI_var%my_rank == 0) then
                 print*,'Stoping at time=',Tdomain%TimeD%rtime
                 print*,'Stop in run requested, but checkingpoint first'
              endif
              if (Tdomain%backupflag) call checkpoint(ntime,Tdomain)
              call MPI_Finalize  (ierr)
              STOP "Exit requested by user done!"
           endif
        endif
        if (Tdomain%adjoint) call update_kernel(Tdomain) 
    	
    
    call progress(ntime,Tdomain%TimeD%NtimeMax-1) !! progress bar
    
     enddo
    
    [...]
    
    end program
    
    !!!! progress bar subroutine : !!!!
    subroutine progress(NbrEval,NbrEvalTot)
     
    implicit none
    integer(kind=4) :: k,NbTics,NbrEvalTot,NbrEval
    integer, save :: NbTicsPrec = 0
    
    
    NbrEval = NbrEval + 1
    NbTics = 50.0 * real(NbrEval) / real(NbrEvalTot)
    do k = NbTicsPrec + 1, NbTics
    if (mod(k,5) == 0) then
    write(0,'(i0)',advance='no') k / 5
    else
    write(0,'(a)',advance='no') '-'
    end if
    enddo
    NbTicsPrec = NbTics
     
    return
    end
    Pas de problème de compilation mais la barre de progression ne s'affiche pas.

    Une idée?

    merci
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  2. #22
    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
    Points : 1 346
    Points
    1 346
    Par défaut
    Il y a un NbrEval = NbrEval + 1 dans la routine. Comme NbrEval est ntime, soit l'indice de la boucle, c'est illégal. Commence par enlever cette ligne.

  3. #23
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Effectivement merci.

    Mais il n'y a toujours par d'affichage de la barre de progression.
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  4. #24
    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
    Points : 1 346
    Points
    1 346
    Par défaut
    La boucle s'exécute-elle au complet ? Il y a plusieurs stop dans la boucle. Peut-être s'arrête-elle avant d'avoir atteint 2 %.

    La barre s'affiche sur le unit 0, lequel correspondait au stderr pour le compilateur d'origine. Est-ce le cas pour le tien ?

    Je vois des MPI dans ton code. Est-ce bien un code multi processeurs? Peut-être que ça cause un conflit avec le unit 0 ?

    Y-a-t-il un fichier unit 0 qui est apparu ? (ou FTN00 ou autre fichier du genre...)

    Si tu ajoute un write(0,*) 'Debut de la boucle' juste avant la boucle, s'affiche-t-il ?

  5. #25
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Citation Envoyé par Sylvain Bergeron Voir le message
    La boucle s'exécute-elle au complet ? Il y a plusieurs stop dans la boucle. Peut-être s'arrête-elle avant d'avoir atteint 2 %.

    La barre s'affiche sur le unit 0, lequel correspondait au stderr pour le compilateur d'origine. Est-ce le cas pour le tien ?

    Je vois des MPI dans ton code. Est-ce bien un code multi processeurs? Peut-être que ça cause un conflit avec le unit 0 ?

    Y-a-t-il un fichier unit 0 qui est apparu ? (ou FTN00 ou autre fichier du genre...)

    Si tu ajoute un write(0,*) 'Debut de la boucle' juste avant la boucle, s'affiche-t-il ?
    - Oui la boucle s'exécute complètement

    - comprends pas les mots comme "unit 0" et "stderr" et même en cherchant la définition
    For example, unit 10 is associated with the fort.10 file in the current directory.
    (?)

    - Oui c'est bien un code multi mais je vois pas du tout les causalités avec le unit 0

    - Non aucun fichier unit 0 est apparue (en même temps je sais pas trop à quoi ça ressemblerait)

    - si j'ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write(0,*) 'Debut de la boucle'
    au début de la boucle, non, il ne s'affiche pas. les seuls affichages sont le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [...]write (*,*) "Iteration number    ", ntime
    (au début de la boucle) et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print*,'ntime=',ntime+1,Tdomain%TimeD%NtimeMax-1,sngl(t22-t12),sngl(tmpvv)
    Merci !
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  6. #26
    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
    Points : 1 346
    Points
    1 346
    Par défaut
    Résumons :

    • Tu as testé le routine dans un petit programme et la barre de progression s'affichait correctement.
    • Le test a été effectué dans le même environnement (même OS, même compilateur), mais pas MPI.
    • Dans le code MPI, un write(0,* avant la boucle ne produit pas d'affichage. La barre ne s'affiche pas non plus.
    • Dans le code MPI, un write(*,* fonctionne.


    Le premier * dans write(*,* indique le stdout, soit la sortie normale (standard). Le stderr est la sortie des erreurs. C'est normalement la même sortie que stdout, soit la console (l'écran), mais le comportement peut être un peu différent. Il est fort possible que le stdout soit buffered (tamponné?). La ligne pourrait être gardée en mémoire jusqu'à ce qu'elle soit complétée, puis affichée. Le stderr n'est généralement pas buffered. En cas d'erreur, il faut afficher sans délai.

    En plus du *, le stdout peut aussi être accédé par le unit 6 (pour des raisons historiques). Le stderr correspond souvent, mais rien n'est garanti, au unit 0. Si le module ISO_FORTRAN_ENV est fourni par ton compilateur, il devrait contenir le unit de stderr.

    Pour notre barre de progression, on veut afficher les caractères de progression l'un après l'autre sur une même ligne. C'est pourquoi la clause advance='no' du write. Mais si on utilise advance='no' sur stdout, il est possible (probable?) que la ligne ne s'affiche qu'une fois complétée à la fin de l'exécution. Pas très utile pour une barre de progression.

    Alors, essaies d'utiliser le stdout en remplaçant les write(0 par des write(*. Peut-être que la ligne s'affichera à mesure. Sinon, chercher dans le userguide de ton compilateur pour le stderr...

  7. #27
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Merci pour ces précisions.

    Je n'ai même pas la ligne qui s'affiche à la fin..

    Citation Envoyé par Sylvain Bergeron Voir le message
    Résumons :


    Alors, essaies d'utiliser le stdout en remplaçant les write(0 par des write(*. Peut-être que la ligne s'affichera à mesure. Sinon, chercher dans le userguide de ton compilateur pour le stderr...
    J'ai gfortran et dans la doc on peut lire :

    3.3
    GFORTRAN_STDERR_UNIT
    —Unit number for standard error
    This environment variable can be used to select the unit number preconnected to standard
    error. This must be a positive integer. The default value is 0.
    donc les write(0, aurait du fonctionner ?
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  8. #28
    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
    Points : 1 346
    Points
    1 346
    Par défaut
    De l'extérieur, j'ai vraiment l'impression qu'il y a conflit entre MPI et l'écriture sur stderr, puisque ça fonctionne bien sur ton programme test. Ou un problème de configuration.

    Puisque tu dis que l'écriture sur stdout (*) fonctionne bien, j'utiliserais ce dernier, quitte à réduire la barre de progression à une écriture séquentielle de % significatif:

    10 % complété...
    20 % complété...
    30 % complété...
    etc.

  9. #29
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Citation Envoyé par Sylvain Bergeron Voir le message
    De l'extérieur, j'ai vraiment l'impression qu'il y a conflit entre MPI et l'écriture sur stderr, puisque ça fonctionne bien sur ton programme test. Ou un problème de configuration.

    Puisque tu dis que l'écriture sur stdout (*) fonctionne bien, j'utiliserais ce dernier, quitte à réduire la barre de progression à une écriture séquentielle de % significatif:

    10 % complété...
    20 % complété...
    30 % complété...
    etc.
    C'est à dire?
    Je suis un peu perdu car je ne vois pas du tout en quoi la barre de progression plus haut n'est pas elle même séquentielle.

    Que signifie utiliser stdout? simplement remplacer le 0 par * ?

    Merci
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Afficher une barre d'avancement dans une fenêtre
    Par Olivier.p dans le forum VBScript
    Réponses: 8
    Dernier message: 05/08/2010, 17h01
  2. Creer une barre d'avancement avec FORMS
    Par bm_oracliste dans le forum Forms
    Réponses: 3
    Dernier message: 19/11/2007, 13h47
  3. Barre d'avancement d'une tâche
    Par Wolfgang31 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/09/2007, 18h05
  4. barre d'avancement pour la lecture d'un mp3 : Pb onChange!
    Par avogadro dans le forum C++Builder
    Réponses: 3
    Dernier message: 25/12/2006, 20h40
  5. barre d'avancement html ?
    Par djnellio dans le forum Langage
    Réponses: 4
    Dernier message: 11/04/2006, 11h58

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