16 integer,
parameter :: nx = 90
17 integer,
parameter :: ny = 90
19 double precision,
parameter :: dx = 1.0d0/(nx-1.0d0)
20 double precision,
parameter :: dy = 1.0d0/(ny-1.0d0)
22 double precision,
parameter :: wconst = 1.0d0/(4.0d0*dx)
25 double precision :: dt
27 double precision :: re
36 double precision,
dimension(nx,ny) :: u
37 double precision,
dimension(nx,ny) :: v
38 double precision,
dimension(nx,ny) :: p
39 double precision,
dimension(nx,ny) :: Fn
40 double precision,
dimension(nx,ny) :: Gn
41 double precision,
dimension(nx,ny) :: Q
57 double precision,
dimension(nx,ny),
intent(out) :: array
63 double precision,
dimension(nx,ny),
intent(out) :: array
69 double precision,
dimension(nx,ny),
intent(out) :: array
123 u(i,ny) = 2.0d0 - u(i,ny-1)
131 v(nx,j) = - v(nx-1,j)
147 double precision :: umax1(2),umax2,vmax1(2),vmax2,dtc,dtr
157 umax2 = maxval(umax1)
159 vmax2 = maxval(vmax1)
163 dtc = (1.0d0 / r) / (re * (abs(umax2) + abs(vmax2))**2 )
169 dt = (r/25.0d0)*dx*dy*re
206 fn(i,j) = u(i,j)+dt*(((u(i+1,j)-2*u(i,j)+u(i-1,j))/(re*dx*dx))+((u(i,j-1) &
207 -2.0d0*u(i,j)+u(i,j+1))/(re*dy*dy))-(((u(i,j)+u(i+1,j))*(u(i,j)+u(i+1,j)) &
208 -(u(i-1,j)+u(i,j))*(u(i-1,j)+u(i,j)))/(4.0d0*dx))-((((u(i,j)+u(i,j+1))*(v(i+1,j) &
209 +v(i,j)))-((u(i,j-1)+u(i,j))*(v(i+1,j-1)+v(i,j-1))))/(4.0d0*dy)))
210 gn(i,j) = v(i,j)+dt*(((v(i+1,j)-2.0d0*v(i,j)+v(i-1,j))/(re*dx*dx))+((v(i,j-1) &
211 -2.0d0*v(i,j)+v(i,j+1))/(re*dy*dy))-(((v(i,j+1)+v(i,j))*(v(i,j+1)+v(i,j)) &
212 -(v(i,j-1)+v(i,j))*(v(i,j-1)+v(i,j)))/(4.0d0*dy))-((((u(i,j)+u(i,j+1))*(v(i+1,j) &
213 +v(i,j)))-((u(i-1,j)+u(i-1,j+1))*(v(i,j)+v(i-1,j))))/(4.0d0*dx)))
243 q(i,j) =((fn(i,j)-fn(i-1,j)+gn(i,j)-gn(i,j-1))/(dt*dx))
269 u(i,j) = fn(i,j) - ( p(i+1,j) - p(i,j) ) * (dt/dx)
277 v(i,j) = gn(i,j) - ( p(i,j+1) - p(i,j) ) * (dt/dy)
293 double precision,
dimension(nx,ny),
intent(out) :: w
299 w(i,j) = wconst * (v(i+1,j) - v(i-1,j) - u(i,j+1) + u(i,j-1))
322 double precision,
parameter :: rf = 1.60d0
323 double precision,
parameter :: conv = 0.00010d0
324 integer,
parameter :: itmax = 200
325 double precision :: change, pold, po, ch
326 integer :: iter, im, jm, k
331 do while((change .ge. conv))
338 p(i,j) = 0.250d0*((p(i-1,j)+p(i,j-1)+p(i+1,j)+p(i,j+1))-(q(i,j)*dx*dx))
339 p(i,j) = pold + rf*(p(i,j)-pold);
342 if(pold .ne. 0) ch = abs((p(i,j)-pold)/pold)
345 if(ch .gt. change)
then
356 p(k,1) = p(k,2) - ((2.0 * v(k,2)) / (re*dx))
357 p(k,ny) = p(k,ny-1) + ((2.0 * v(k,ny-2)) / (re*dx))
358 p(1,k) = p(2,k) - ((2.0 * u(2,k)) / (re*dx))
359 p(nx,k) = p(nx-1,k) + ((2.0 * u(nx-2,k)) / (re*dx))
362 if(iter .gt. itmax)
then
378 double precision,
parameter :: rf = 1.60d0
379 double precision,
parameter :: conv = 0.00010d0
380 integer,
parameter :: itmax = 500
381 double precision :: pold, po, ch
382 integer :: iter, im, jm, k
384 integer :: rowper, colper, numthreads, istart, iend, myid, kstart, kend
385 double precision :: change, changethread
392 call omp_set_num_threads(numthreads)
395 rowper = int(ny/numthreads)
396 colper = int(nx/numthreads)
400 myid = omp_get_thread_num()
402 istart = myid*rowper + 1
403 if(myid == 0) istart = istart + 1
404 iend = (myid*rowper) + rowper
405 if(myid == numthreads-1) iend = iend - 1
408 do while(iter .lt. itmax)
421 p(i,j) = 0.250d0*((p(i-1,j)+p(i,j-1)+p(i+1,j)+p(i,j+1))-(q(i,j)*dx*dx))
422 p(i,j) = pold + rf*(p(i,j)-pold);
425 if(pold .ne. 0) changethread = max(changethread,abs((p(i,j)-pold)/pold))
431 change = max(change,changethread)
435 if(change .lt. conv) exit
442 p(k,1) = p(k,2) - ((2.0d0 * v(k,2)) / (re*dx))
443 p(k,ny) = p(k,ny-1) + ((2.0d0 * v(k,ny-2)) / (re*dx))
444 p(1,k) = p(2,k) - ((2.0d0 * u(2,k)) / (re*dx))
445 p(nx,k) = p(nx-1,k) + ((2.0d0 * u(nx-2,k)) / (re*dx))