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 135 136 137 138
| program cavite
implicit none
integer, parameter::nt=100,nx=20,nz=nx,km=1000 !km=iterations maximum!
real,parameter :: eps=1.e-8, Re=100, omg=1.7, h=1./nx, dt=0.25*Re*h**2
real,dimension(0:nx,0:nz+1)::un,u
real,dimension(0:nx+1,0:nz)::wn,w
real,dimension(0:nx+1,0:nz+1)::p,AP,SM,PK ! ce sont des vecteurs
real,dimension(nx,nz) :: psi
integer :: i, j, K, n
real :: t
real :: ududx, wm, wdudz, lapun, um, wdwdz, udwdx, lapwn, dudx, dwdz, sigma! on doit définir toutes les variables
! open(10,file='psi.out')
! initialisation des champs!
un=0. ; w=0. ; wn=0. ; p=0.
do i=1,nx ; un(i,nz+1)=2.-un(i,nz) ; enddo ; U=UN
! write(*,*) ' champs U*' ; do j=nz+1,1,-1 ; write(*,fmt='(20F7.3)')(U(i,j),i=0,nx) ; enddo
! valeurs de AP(i,j)
AP=4.
AP(2:nx-1,1)=3; AP(2:nx-1,nz)=3;AP(1,2:nz-1)=3; AP(nx,2:nz-1)=3
AP(1,1)=2 ; AP(1,nz)=2 ; AP(nx,1)=2 ; AP(nx,nz)=2
DO n=1,nt
t=n*dt
!resolution [1] calcul de u*!
DO i=1,nx-1
Do j=1,nz
ududx=un(i,j)*(un(i+1,j)-un(i-1,j))/(2*h)
wm=0.25*(wn(i,j-1)+wn(i+1,j+1)+wn(i,j)+wn(i+1,j))
wdudz=wm*((un(i,j+1)-un(i,j-1))/(2*h))
lapun=(un(i+1,j)-2*un(i,j)+un(i-1,j))/(h**2)+(un(i,j+1)-2*un(i,j)+un(i,j-1))/(h**2)
u(i,j)=un(i,j)-dt*(ududx+wdudz)+(dt/Re)*(lapun)
enddo
enddo
u(1:nx,0)=-u(1:nx,1)
u(1:nx,nz+1)=2.-u(1:nx,nz)
u(0,0:nz)=0
u(nx,0:nz)=0
! write(*,*) ' champs U*' ; do j=nz+1,1,-1 ; write(*,fmt='(20F7.3)')(U(i,j),i=0,nx) ; enddo
!resolution [2 ] calcul de w*!
DO i=1,nx
do j=1,nz-1
um=0.25*(un(i-1,j)+un(i,j)+un(i-1,j+1)+un(i,j+1))
wdwdz=wn(i,j)*(wn(i,j+1)-wn(i,j-1))/(2*h)
udwdx=um*(wn(i+1,j)-wn(i-1,j))/(2*h)
lapwn=(wn(i+1,j)-2*wn(i,j)+wn(i-1,j))/(h**2)+(wn(i,j+1)-2*wn(i,j)+wn(i,j-1))/(h**2)
w(i,j)=wn(i,j)-dt*(udwdx+wdwdz)+(dt/Re)*(lapwn)
enddo
enddo
w(0:nx,0)=0
W(0:nx,nz)=0
w(0,0:nz)=-w(1,0:nz)
w(nx+1,0:nz)=-w(nx,0:nz)
! write(*,*) ' champs W*' ; do j=nz,0,-1 ; write(*,fmt='(20F7.3)')(W(i,j),i=1,nx+1) ; enddo
!résolution [3]!
do i=1,nx
do j=1,nz
!lappn=(1/h**2)*(pn(i,j-1)+pn(i-1,j)-4*pn(i,j)+pn(i+1,j)+pn(i,j+1))!
dudx=(u(i,j)-u(i-1,j))/h
dwdz=(w(i,j)-w(i,j-1))/h
SM(i,j)=h**2/dt*(dudx+dwdz)
enddo
enddo
sigma=1. ; k=0
DO WHILE ( sigma > eps .and. K < KM)
PK=p ; k=k+1 ; sigma=0.
do i=1,nx
do j=1,nz
P(i,j)=(1.-omg)*P(i,j)+omg*(P(i,j-1)+P(i-1,j)+P(i,j+1)+P(i+1,j)-SM(i,j))/AP(i,j)
sigma = sigma + ((P(i,j)-Pk(i,j))**2)
enddo
enddo
sigma=sqrt(sigma)
! print *,' k sigma ',n,k,sigma
enddo
print *,t,k,sigma
! write(*,*) ' champs P' ; do j=nz,1,-1 ; write(*,fmt='(20F7.3)')(p(i,j),i=1,nx) ; enddo
!conditions limites sur p
! p(1:nx,0)=p(1:nx,1)
! p(1:nx,nz+1)=p(1:nx,nz)
! p(0,1:nz)=p(1,1:nz)
! p(nx+1,1:nz)=p(nx,1:nz)
!résolution 4 pour obtenir Vn+1!
Do i=1,nx-1
DO j=1,nz
u(i,j)=u(i,j)-dt*(p(i+1,j)-p(i,j))/h ! la variable à gauche écrase celle de droite!
enddo
enddo
!résolution 5!
do i=1,nx
do j=1,nz-1
w(i,j)=w(i,j)-dt*(p(i,j+1)-p(i,j))/h
enddo
enddo
! reinit
UN=U ; WN=W
enddo
!
call gnu(psi,x,z,h,nx,nz)
!
end program
! subroutine gnup(psi,x,z,h,nx,nz)
! implicit none
! integer :: nx,nz,i,j
! real :: h
! real, dimension(nx,nz) :: psi
! real, dimension(nx) :: x
! real, dimension(nz) :: z
! do j=1,nz
! do i=1,nx
! write(20,fmt='(2F8.3,2E14.5)') x(i),z(j),psi(i,j)
! enddo
! write(20,*)
! enddo
! end subroutine gnup
!
! subroutine calpsi(psi,u,w,h,nx,nz)
! integer :: nx,nz,i,j
! real :: h
! real, dimension(nx,nz) :: psi
! real,dimension(0:nx,0:nz+1):: u
! real,dimension(0:nx+1,0:nz)::w
! !calcul pour psi qui est la même grille que p (décalé-décalé)!
! psi(1,1)=0
! do i=2,nx
! psi(i,1)=psi(i-1,1)-w(i,1)*h!on travail sur la première ligne
! enddo
! do j=2,nz
! psi(1,j)=psi(1,j-1)+u(1,j)*h!on travail sur la première colonne!
! enddo
! do i=2,nx
! do j=2,nz
! psi(i,j)=psi(i,j-1)+u(i,j)*h
! enddo
! enddo
! end subroutine
! |
Partager