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 ..)