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 :

Return après lecture de fichier


Sujet :

Fortran

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 82
    Points : 44
    Points
    44
    Par défaut Return après lecture de fichier
    Bonjour tout le monde !

    Tout d'abord merci pour ceux qui auront le courage de me lire, je vais essayer de faire le plus clair possible donc je risque d'écrire beaucoup,

    Ce que je souhaite faire : Faire une simplification assez conséquente d'un petit bout de programme pas compliqué mais un peu moche pour les yeux.

    Programme de base :
    Fonctionnement :

    On créé un tableau (avec des masses de particules) et plus tard on utilise ces tableaux pour faire un return de la masse dans nôtre subroutine.

    Problème de ce fonctionnement :

    On allait chercher l'index dans une autre subroutine par un calcul qui n'a pas vraiment de sens, puis lorsque l'on rajoutait des particules on devait tout faire à la main et si besoin décaler toutes les masses etc ... en soit c'était une perte de temps de rajouter une petite masse par rapport au temps de travail juste pour rajouter une valeur et tout décaler ...

    Bout du code précédent pour montrer la chose :

    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
    106
    107
    108
    109
          subroutine idmass(idi,amass)
          dimension ammes0(15),ammes1(15),ambar0(30),ambar1(30)
          dimension ambarnew(110),ammesnew(116)!gs
          dimension amlep(52)
          parameter ( nqlep=41,nmes=2)
    c-c   data amlep/.3,.3,.5,1.6,4.9,30.,-1.,-1.,0.,0.,
          data amlep/.002,.005,.100,1.20,4.60,171.,-1.,-1.,0.,0.,0.     !11
         *     ,.511003e-3                                              !12
         *     ,0.,.105661,0.,1.807,1.87656,2.8167,3.755,.49767,.49767, !21
         *     100.3,100.3,100.5,101.6,104.9,130.,2*-1.,100.,0.,        !31
         *     100.,100.005,100.,100.1,100.,101.8,2*-1.,100.,100.,      !41
         *     80.385,125.7,8*0.,91.1876/                               !W,higgs,Z0
    c          0- meson mass table
          data ammes0/.13499,.13957,.5479       !pi0,pi+-,eta
         *     ,.49368,.49761,.9578             !K+-, K0,etaprime
         *     ,1.8648,1.8696,1.968,2.984       !D0,D+-,Ds,etac
         1     ,5.279,5.279,5.367,6.276,9.359/  !B+-,B0,Bs,Bc,etab
    etc ....
    c       New particles meson mass table, the mass are put ine the same order at idtrafo  !gs
          data ammesnew/ 1.170,1.2751,1.2818,1.300,1.370,1.465,1.647,     !112 -> 118   !7
         * 1.6724,1.2295,1.23,1.3183,1.474,1.504,1.6888,1.720,1.732,      !119 -> 229   !7+9
         * 1.350,1.386,1.4264,1.453,1.518,1.525,1.562,1.724,1.2295,1.23,  !332 -> 123   !16+10 
         * 1.3,1.3183,1.465,1.474,1.647,1.6724,1.6888,1.720,1.732,        !124 -> 214   !26+9
         * 1.816,1.909,1.982,2.001,2.090,0.67,1.272,1.403,1.414,1.425,    !215 -> 136   !35+10
         * 1.4256,1.46,1.58,1.65,1.717,1.773,1.776,1.816,1.83,1.945,      !137 -> 318   !45+10
         * 1.973,0.67,1.272,1.403,1.414,1.425,1.4356,1.46,1.58,1.65,      !319 -> 322   !55+10
         * 1.717,1.773,1.776,1.816,1.83,1.945,1.973,2.318,2.4223,2.43,    !323 -> 144   !65+10
         * 2.4626,2.4,2.4223,2.43,2.4601,2.3178,2.4596,2.5354,2.5719,     !145 -> 345   !75+9
         * 3.41475,3.51066,3.52538,3.55620,3.637,3.68609,3.77292,3.929,   !442 -> 449   !84+8
         * 9.8594,9.8928,9.8993,9.9122,10.02326,10.3552,10.5794,10.865,   !552 -> 559   !92+8
         * 5.698,5.7249,5.7469,5.961,5.698,5.7268,5.7469,5.977,           !252 -> 155   !100+8
         * 5.82878,5.8397,5.853,5*-1./                                    !352 -> 455   !108+8
     
    etc ...
     
    c     entry
          id=idi
          amass=0.
          if(idi.gt.10000)return
          call idflav(id,ifl1,ifl2,ifl3,jspin,ind)
    etc ...
    c treatment for new mesons
          if ( (ifl1.eq.0.and.jspin.ge.2)
         .       .or.idabs/10.eq.21
         .       .or.idabs/10.eq.31
         .       .or.idabs/10.eq.32) goto 600
    c diquarks     
          if(id.ne.0.and.mod(id,100).eq.0) goto 400
          if(iabs(ifl1).ge.5.or.iabs(ifl2).ge.5.or.iabs(ifl3).ge.5)
         1     goto300
          if(ifl2.eq.0) goto200
          if(ifl1.eq.0) goto100
    c          baryons
          ind=ind-109*jspin-36*nmes-nqlep
          ind=ind-11
          amass=(1-jspin)*ambar0(ind)+jspin*ambar1(ind)
          return
    c          mesons
    100   continue
          ind=ind-36*jspin-nqlep
          ind=ind-11
          amass=(1-jspin)*ammes0(ind)+jspin*ammes1(ind)
          return
    c          quarks and leptons (+deuteron, triton, alpha, Ks and Kl)
    200   continue
          amass=amlep(ind)
          return
    c          b and t particles
    300   continue
          if(ifl1.eq.0)then !mesons
           if(iabs(ifl3).eq.5.and.jspin.eq.0)then !bottom spin0 mesons
            amass=ammes0(10+iabs(ifl2))
            return
           elseif(iabs(ifl3).eq.5.and.jspin.eq.1)then !bottom spin1 mesons
            amass=ammes1(10+iabs(ifl2))
            return
           endif
          endif
          amass=amlep(iabs(ifl2))+amlep(iabs(ifl3))+1.07+.045*jspin
          if(ifl1.ne.0) amass=amass+amlep(iabs(ifl1))
          return
    c          diquarks
    400   amass=amlep(iabs(ifl1))+amlep(iabs(ifl2))
          return
    etc ....
    600   continue
          if(idabs/10.eq.11)ixx=0
          if(idabs/10.eq.22)ixx=8
          if(idabs/10.eq.33)ixx=16
          if(idabs/10.eq.12)ixx=24
          if(idabs/10.eq.21)ixx=32
          if(idabs/10.eq.13)ixx=40
          if(idabs/10.eq.31)ixx=48
          if(idabs/10.eq.23)ixx=56
          if(idabs/10.eq.32)ixx=64
          if(idabs/10.eq.14)ixx=72
          if(idabs/10.eq.24)ixx=76
          if(idabs/10.eq.34)ixx=80
          if(idabs/10.eq.44)ixx=84      
          if(idabs/10.eq.55)ixx=92
          if(idabs/10.eq.25)ixx=100
          if(idabs/10.eq.15)ixx=104
          if(idabs/10.eq.35)ixx=108
          if(idabs/10.eq.45)ixx=112
          ix=ixx+jspin-1
          amass=ammesnew(ix)
          return
          !gs-end
          end
    Changement que j'effectue :

    Ce que je souhaite faire est de mettre toute mes valeurs dans un fichier, lire ce fichier et faire un return. Comme ça, si je veux rajouter une particule avec sa masse, j'ai juste à rajouter une ligne dans mon fichier et c'est bon ! Plus besoin de rechercher un index dans une autre subroutine (ce qui me permettra de simplifier également l'autre subroutine)

    Exemple de lignes dans mon fichier :

    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
    !table idmass
    !----------------------------------------------
    !          Most elementary Particles
    !----------------------------------------------
     1      0.002         u
     2      0.005         d
     3      0.100         s
     4      1.200         c
     5      4.600         b
     6      171.0         t
     10     0             gamma
     9      0             gluons
     12     0.511003e-3   e-
     11     0             nu_e-
     14     0.105661      mu
    Ce que j'ai fais en ce moment dans ma subroutine idmass pour retrouver la masse de ces particules :

    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
          parameter (nidtmax=500)
          character line*175,name*20
     
          data kidmass/0/
          kidmass=kidmass+1
          j=0
     
          if(kidmass.eq.1)then
            write(ifmt,'(a)')            'load idmass from '
            write(ifmt,'(1x,a)')'KWt/idmass.dt'
            open (97,file='/users/theoric/sophys/EPOS/epos9999/KWt/idmass.dt'
         *  ,STATUS='UNKNOWN')
     
            read(97,'(a)',end=999)line
            if(line(1:6).eq.'!table')ntab=1
            if(line(1:1).eq.'!')goto 998
            j=j+1
            if(j.gt.nidtmax)stop'ERROR nidtmax too small'
            read(line,*)id,amass,name
     
          else
            write(ifmt,'(a)')'idmass: already loaded'
          endif
    ifmt est quelque chose que j'ai défini avant, en gros si je lance en batch ça écrit dans un fichier où je souhaite que ce soit et si je lance en interactif, on voit tout directement dans le terminal.

    Mon problème est que je lis la masse ici à chaque ligne mais comment je peux faire un return de cette masse ?

    Merci beaucoup (j'ai essayé d'être concis ..)

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Salut.
    A ta place je créerais une fonction retournant la valeur lue dans le fichier, correspondant à la particule. Toutes les lignes sont lues jusqu'à trouver la particule.
    Le programme élémentaire pourrait être :
    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
    function get_mass(file_id, particule)
        integer, intent(in)             :: file_id
        character (len=*), intent(in)   :: particule
        integer                         :: err_msg
        integer                         :: read_id
        real                            :: get_mass
        real                            :: mass
        character (len=20)              :: read_name
     
        get_mass = -1.0
        rewind file_id
        do
            read(file_id, *, iostat=err_msg) read_id, mass, read_name
            if (err_msg < 0) exit
            if (err_msg > 0) cycle
            if (read_name == particule) then
                get_mass = mass
                exit
            endif
        enddo
    end function get_mass

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 82
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    Desole si je ne reponds que maintenant, entre temps j'avais trouve une autre solution puis j'ai eu beaucoup de choses qui se sont passees entre temps et j'oublia cette discussion, en tout cas j'aime assez la maniere de trouver la masse dans ta reponse, je vais surement m'en servir plus tard !

    Je mets en resolu !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Sauvegarde de fichier texte après lecture et modification de données
    Par ghada97 dans le forum MATLAB
    Réponses: 1
    Dernier message: 11/07/2014, 22h49
  2. [Débutant] changement de données après lecture de fichier
    Par ghada97 dans le forum MATLAB
    Réponses: 23
    Dernier message: 09/07/2014, 01h47
  3. trie fichier après lecture d'un dossier avec readDir
    Par jmsch dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 20/11/2012, 20h49
  4. Lecture de fichier
    Par Watcha dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 04/03/2003, 20h43
  5. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43

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