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
| MODULE parametres
INTEGER,PARAMETER :: nx=900,ny=300,nt=1000 !Déclaration des entiers
REAL,PARAMETER :: dx=1/nx,dy=1/ny,dt=1/nt,h=2.0,k=0.3,m=0.8,e1=0.0000002,e2=0.00003,e3=0.00012 !Déclaration des réels
END MODULE parametres
MODULE my_variables
USE parametres
REAL, DIMENSION(0:nx+1,0:ny+1) :: u,v,u2,v2 !Déclaration des abondances (u =proie, v=prédateur) comme une matrice à deux dimensions
END MODULE my_variables
SUBROUTINE initiale(u,v,dx,dy,dt,h,k,m,nx,ny,e1,e2,e3,nt) !sous programme créant les tableaux initiaux u et v à l'instant t=0
USE parametres
USE my_variables
do i=1,nx
do j=1,ny
u(i,j)=m/k*h/(1-m/k)-e1*(i-0.1*j-225)*(i-0.1*j-675) !conditions initiales sur u
v(i,j)=(1-(m/k*h/(1-m/k)))*(h+(m/k*h/(1-m/k)))-e2*(i-450)-e3*(j-150)!conditions initiales sur v
end do
end do
END SUBROUTINE initiale
SUBROUTINE stockage(u,v,u2,v2,nx,ny) !sous programme qui stock les matrices u et v de l'instant n dans les matrices u2 et v2 et qui impose les conditions aux bords (absence de flux aux bords)
USE parametres, ONLY:nx,ny
USE my_variables
do i=0,nx+1 !première et dernière ligne égale à 3e et avant avant dernière
u(i,0)=u(i,2)
u(i,nx+1)=u(i,nx-1)
v(i,0)=v(i,2)
v(i,nx+1)=v(i,nx-1)
end do
do j=0,ny+1 !première et dernière colonne égale à 3e et avant avant dernière
u(0,j)=u(2,j)
u(ny+1,j)=u(ny-1,j)
v(0,j)=v(2,j)
v(ny+1,j)=v(ny-1,j)
end do
u2=u !on stock les valeurs de u à l'instant n dans u2
v2=v !on stock les valeurs de v à l'instant n dans v2
END SUBROUTINE stockage
SUBROUTINE espace(u,v,dx,dy,dt,h,k,m,u2,v2,nx,ny,nt)
USE parametres
USE my_variables
CALL stockage(u,v,u2,v2,nx,ny)
do i=1,nx
do j=1,ny
u(i,j)=u2(i,j) + dt*((u2(i+1,j)-2*u2(i,j)+u2(i-1,j))/dx**2 + &
(u2(i,j+1)-2*u2(i,j)+u2(i,j-1))/dy**2 + &
u2(i,j)*(1-u2(i,j)) - u2(i,j)*v2(i,j)/(u2(i,j)+h)) !calcul de u(n+1) en fonction de u(n) et v(n)
v(i,j)=v2(i,j) + dt*((v2(i+1,j)-2*v2(i,j)+v2(i-1,j))/dx**2 + &
(v2(i,j+1)-2*v2(i,j)+v2(i,j+1))/dy**2 + &
k*u2(i,j)*v2(i,j)/(u2(i,j)+h) - m*v2(i,j)) !calcule de v(n+1) en fonction de u(n) et v(n)
end do
end do
END SUBROUTINE espace
PROGRAM proie_predateur
USE parametres
USE my_variables
IMPLICIT NONE
CALL initiale(u,v,dx,dy,dt,h,k,m,nx,ny,e1,e2,e3)
do t=1,nt
CALL espace(u,v,dx,dy,dt,h,k,m,u2,v2)
end do
END PROGRAM proie_predateur |
Partager