C======================================================================= C======================================================================= C C example program poisson: C uses Jacobi relaxation to solve the Poisson equation C C======================================================================= C======================================================================= program poisson C=======grid size integer NX integer NY parameter (NX=10) parameter (NY=10) real H parameter (H=0.05) C how often to check for convergence integer NCHECK parameter (NCHECK=10) C convergence criterion real TOL parameter (TOL=0.00001) C maximum number of steps integer MAXSTEPS parameter (MAXSTEPS=1000) external F external G C=======grid variables real uk(1:NX,1:NY), ukp1(1:NX,1:NY) real diff, diffmax C=======initialization C interior points do i = 2, NX-1 do j = 2, NY-1 uk(i,j) = F(i,j,NX,NY,H) enddo enddo C boundary points do j = 1, NY uk(1,j) = G(1,j,NX,NY,H) uk(NX,j) = G(NX,j,NX,NY,H) enddo do i = 2, NX-1 uk(i,1) = G(i,1,NX,NY,H) uk(i,NY) = G(i,NY,NX,NY,H) enddo C=======main loop (until convergence) diffmax = TOL + 1.0 do k=1,MAXSTEPS C=======grid computation (compute new values) do i = 2, NX-1 do j = 2, NY-1 ukp1(i,j) = 0.25*(H*H*F(i,j,NX,NY,H) - + uk(i-1,j) + uk(i,j-1) - + uk(i+1,j) + uk(i,j+1) ) enddo enddo C=======convergence test (global max) if (mod(k,NCHECK) .eq. 0) then diffmax = 0.0 do i = 2, NX-1 do j = 2, NY-1 diff = abs(ukp1(i,j) - uk(i,j)) if (diff .gt. diffmax) diffmax = diff enddo enddo endif C=======grid computation (copy new values to old values) do i = 2, NX-1 do j = 2, NY-1 uk(i,j) = ukp1(i,j) enddo enddo C=======convergence check if (diffmax .le. TOL) go to 1000 enddo C=======sequential output 1000 continue print*, 'NX, NY = ', NX, NY print*, 'H = ', H print*, 'tolerance = ', TOL call Fprint call Gprint if (diffmax .le. TOL) then print*, 'convergence occurred in ', k, ' steps' else print*, 'no convergence in ', MAXSTEPS, ' steps; ', - 'max. difference ', diffmax endif do i = 1, NX if (NX .gt. 10) print*, ' ' print 9999, (uk(i,j), j = 1, NY) enddo 9999 format(10F8.4) end C======================================================================= real function F(i,j,nx,ny,h) integer i, j, nx, ny real h F = 0.0 end subroutine Fprint print*, 'F(i,j) = 0.0' end C======================================================================= real function G(i,j,nx,ny,h) integer i, j, ny, ny real h G = (i+j)*h end subroutine Gprint print*, 'G(i,j) = (i+j)*H' end C=======================================================================