Bonjour à tous,
J'ai pour mes études un programme en fortran90 à faire,
Je dois simuler des particules avec une trajectoire rectiligne aléatoire et calculer le temps de la 1ère collision entre 2 particules ainsi que les nouvelles trajectoires de ces deux particules.
Le programme doit être en 2 dimensions, cependant j'ai un problème lors du calcul du temps de collision

Voici mon code :
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
program tp6
  implicit none
  integer n, t, tmax, i, j, icol, jcol, k, p
  parameter(p=2,n=p**3,tmax=1000)
  real(8) tfin,L,r(1:2,0:3,1:n),rij(1:2,1:n,1:n),h2,rij2(1:n,1:n),&
       x(1:2,1:n),y(1:2,1:n),pi,h1,v(1:2,1:n),v0,tcol,delta, tij
 
  parameter(tfin=1.0,h2=(tfin/tmax)**2,h1=sqrt(h2),&
       L=2**(1.d0/6)*p,pi=2*asin(1.d0),v0=0.5,delta=3.0)
 
  forall(k=1:2,i=1:n) r(k,0,i)=modulo((i-1)/p**(k-1),p)
  r=r*L/p; r=r+0.5
  call random_number(x); call random_number(y)
  v=v0*cos(2*pi*x)*sqrt(-2*log(1-y))
  forall(k=1:2) v(k,:)=v(k,:)-sum(v(k,:))/n
  r(:,1,:)=r(:,0,:)+h1*v(:,:)
  ! Nouvelles trajectoires : (v1' = v2 , v2' = v1 )
 
 
 
 
  ! Temps de collision :
  do t=1, tmax
     do i = 1,n;
        do j=i+1,n
           tij = min((delta - r(:,i) + r(:,j) ) / (v(1,i)-v(1,j)) , (-delta -r(:,i)+r(:,j))/(v(1,i) - v(1,j)))  ! On prend la valeur de t la plus petite. Solution d'équation du second degré.   !! Il y a des erreurs de code sur celle ligne" Rank mismatch in array reference at (1) (2/3)" 
 
           if (( tij>0) .and. (tij<tcol)) then  ! Temps de collision des deux premières particules 
              tcol = tij
              icol=i; jcol=j
           endif
        enddo
     enddo
  enddo
end program tp6
J'ai le message d'erreur suivant :
tij = min((delta - r(:,i) + r(:,j) ) / (v(1,i)-v(1,j)) , (-delta -r(:,i)+r(:,j))/(v(1,i) - v(1,j)))
1
Error: Rank mismatch in array reference at (1) (2/3)

Je n'arrive pas à résoudre le problème, j'ai essayé avec plusieurs choses dans les parenthèses de v( ) et r( ) mais toujours un problème..
Étant étudiant en physique et n'ayant pas eu de cours de fortran90, serait il possible que quelqu'un m'explique le problème pour que je puisse le corriger ?
J'ai réussi à résoudre ce problème en 1 dimension mais j'ai un problème lorsqu'il faut passer à la dimension supérieure
Code en 1 D :
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
program projet2
integer n, t, tmax, i, j, icol, jcol
parameter (tmax=10, n=6)
real r(1:n), rij(1:n,1:n), delta, v0, vi, tij, v(1:n), x(1:n), y(1:n), tcol, pi ! il faut que le delta soit > 0 pour que la collision ai lieu a t > 0
! x et y sont les nombres aléatoires qu'on va générer
 
parameter (delta=3.0, v0=0.5, pi=2*asin(1.0)) ! delta > 0 
r=2*delta*(/ (i, i=1,n) /)
r=r-sum(r)/n
call random_number(x) ; call random_number (y)
v = v0*cos(2*pi*x)*sqrt(-2*log(1-y))
v=v-sum(v)/n 
do t=1, tmax
   tcol = r(n)/v0
   do i=1,n;
      do j=i+1,n
      tij = min((delta-r(i) + r(j) )/(v(i)-v(j)) , (-delta-r(i)+r(j))/(v(i)-v(j))) ! On prend la valeur de t la plus petite. Solution d'équation du second degré. 
      if (( tij>0) .and. (tij<tcol)) then   ! On définit le temps de colision des deux premières particules. 
         tcol = tij
         icol=i; jcol=j
      endif
   enddo
enddo
enddo
end program projet2
Merci d'avance pour votre réponse