Bonjour,

je suis developpeur en VB.NET et ma cousine qui est en ecole d'ingé de chimie m'a demandé de l'aider pour un exo, seulement voila, j'ai un peu de mal.

je vous montre l'énoncé, apparemment il est pas important pour resoudre les questions, je le mets pour info :

Le programme donné en annexe correspond à une tentative pour répondre à l’algorithme
suivant :
- lecture des symboles chimiques et des coordonnées cartésiennes dans un fichier
contenant les géométries successives d’un ensemble d’atomes en interaction au cours
du temps.
5
STEP: 1.000000
Ge 8.000000 8.000000 8.000000
Se 8.000000 8.000000 10.73000
Se 10.57387 8.000000 7.091000
Se 6.726934 5.789036 7.091000
Se 6.726934 10.22904 7.091000
5
STEP: 2.000000
Ge 8.042190 7.989649 7.951481
Se 7.990602 8.022567 10.69024
Se 10.60506 7.976897 7.084902
Se 6.705598 5.764101 7.072665
Se 6.727215 10.22114 7.063205

- affichage de la matrice des distances interatomiques sous forme triangulaire pour la
première géométrie :
1 Ge 0.000
2 Se 2.730 0.000
3 Se 2.730 4.457 0.000
4 Se 2.708 4.444 4.437 0.000
5 Se 2.723 4.453 4.446 4.440 0.000
- sélection par l’utilisateur d’un atome de référence et d’une liste d’atomes dont
l’utilisateur souhaite suivre l’évolution au cours des différents pas ( = du temps)
- stockage des distances calculées pour tous les couples sélectionnés dans un fichier
résultat
Le programme fourni ne réalise pas correctement le traitement demandé, car il comporte un
certain nombre d’erreurs de logique. Il est parfaitement valide du point de vue de la
compilation, c’est à dire qu’il ne comporte pas d’erreurs de syntaxe.
Les questions :

1°) Indiquez (sans les corriger) les erreurs de logique que comporte d’après vous ce
programme. Justifiez vos réponses.
Supposons maintenant que le programme est rendu fonctionnel. Il peut malgré tout faire
l’objet d’améliorations, par exemple pour éviter certaines erreurs à la suite de choix faits par
l’utilisateur.
2°) Expliquez (sans écrire le code Fortran correspondant) les améliorations qui vous
sembleraient pertinentes pour ce programme.
le programme, désolé c'est pas super mis en forme

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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
 
module def_interface
   interface
       subroutine lecture_geom_toutes(symb,xyz,pas)
        real,pointer :: xyz(:,:,:)
        character,pointer :: symb(:)
       integer pas
end subroutine
 
       subroutine ecriture(distances)
          real,pointer :: distances(:,:)
       end subroutine 
   end interface
end module
 
program Suivi_Distances
use def_interface
 
implicit none
real,pointer :: xyz(:,:,:)
character,pointer :: symb(:)
integer pas
integer,pointer :: liste(:)
integer atomRef
real,pointer :: distances(:,:)
integer i,j,nbatomes
real dist
integer nb,nbgeom
 
call lecture_geom_toutes(symb,xyz,pas)
 
nbatomes = size(symb)
 
do i=1,nbatomes
          print '(I3,A3,100(F8.3))',i,symb(i), &
          (sqrt( (xyz(1,i,1)-xyz(1,j,1))**2 + (xyz(2,i,1)-
          xyz(2,j,1))**2 + (xyz(3,i,1)-xyz(3,j,1))**2 ),j=1,i)
enddo
 
print*,'n° de l''atome de référence'
read*,atomRef
 
print*,'Nombre d''atomes à suivre'
read*,nb
 
allocate(liste(nb))
 
print*,'Donner les n° des atomes à suivre'
read*,liste(:)
 
nbgeom = size(xyz,dim=1)
 
do i=1,size(xyz,dim=1)
   do j=1,nb
      distances(i,j) = sqrt( (xyz(i,liste(j),1) -
      xyz(i,atomRef,1))**2 &
      +(xyz(i,liste(j),2) -
      xyz(i,atomRef,2))**2 &
      +(xyz(i,liste(j),3) -
      xyz(i,atomRef,3))**2)
   enddo
enddo
 
call ecriture(distances)
end program
 
subroutine lecture_geom_toutes(symb,xyz,pas)
 
implicit none
real,pointer :: xyz(:,:,:)
character,pointer :: symb(:)
integer nbgeom
real,parameter:: tempsua = 2.41888E-17
integer nbatomes,pas
character(len=50) :: fich,dump
integer ioerr
integer i,j
 
do
    print*,'Donner le nom du fichier'
    read*,fich
     open(1,file=fich,status='old',iostat=ioerr)
       if (ioerr == 0) exit
       print *,'Erreur de fichier à l''ouverture'
enddo
 
nbgeom = 1
 
do
     read(1,*,iostat=ioerr) nbatomes
         if (ioerr == -1) exit
         nbgeom = nbgeom + 1
         read(2,*) dump,pas
    do i=1,nbatomes
       read(i,*)
    enddo
enddo
 
print*,'Nombre de géométries dans le fichier:',nbgeom
print*,'Temps de simulation en ps:',pas*tempsua/1E-12
 
allocate(symb(nbatomes),xyz(nbgeom,nbatomes,3))
 
rewind(1)
 
do i=1,nbgeom
    read(1,*)
    read(1,*)
        do j=1,nbgeom
          read(1,*) symb(j),xyz(i,j,:)
        enddo
enddo
 
close(1)
deallocate(symb,xyz)
 
end subroutine lecture_geom_toutes
 
subroutine ecriture(distances)
real,pointer :: distances(:,:)
integer i
character(len=30) fich
 
print*,"nom du fichier résultat :"
read*,fich
 
open(2, file=fich)
 
do i=1,size(distances,dim=1)
    write(2,*) distances(i,:)
enddo
 
close(2)
end subroutine
je suis sur qu'il y as des crack en Fortran ici, merci par avance (désolé de balancer le code comme ca)