jacobi.f90 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. ! Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
  2. !
  3. ! Redistribution and use in source and binary forms, with or without
  4. ! modification, are permitted provided that the following conditions
  5. ! are met:
  6. ! * Redistributions of source code must retain the above copyright
  7. ! notice, this list of conditions and the following disclaimer.
  8. ! * Redistributions in binary form must reproduce the above copyright
  9. ! notice, this list of conditions and the following disclaimer in the
  10. ! documentation and/or other materials provided with the distribution.
  11. ! * Neither the name of NVIDIA CORPORATION nor the names of its
  12. ! contributors may be used to endorse or promote products derived
  13. ! from this software without specific prior written permission.
  14. !
  15. ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
  16. ! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. ! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  18. ! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  19. ! CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  20. ! EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  21. ! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  22. ! PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  23. ! OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24. ! (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  25. ! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. program jacobi
  27. use laplace2d
  28. implicit none
  29. integer, parameter :: fp_kind=kind(1.0d0)
  30. integer, parameter :: n=4096, m=4096, iter_max=1000
  31. integer :: i, j, iter
  32. real(fp_kind), dimension (:,:), allocatable :: A, Anew
  33. real(fp_kind) :: tol=1.0e-6_fp_kind, error=1.0_fp_kind
  34. real(fp_kind) :: start_time, stop_time
  35. call initialize(A, Anew, m, n)
  36. write(*,'(a,i5,a,i5,a)') 'Jacobi relaxation Calculation:', n, ' x', m, ' mesh'
  37. call cpu_time(start_time)
  38. iter=0
  39. do while ( error .gt. tol .and. iter .lt. iter_max )
  40. error = calcNext(A, Anew, m, n)
  41. call swap(A, Anew, m, n)
  42. if(mod(iter,100).eq.0 ) write(*,'(i5,f10.6)'), iter, error
  43. iter = iter + 1
  44. end do
  45. call cpu_time(stop_time)
  46. write(*,'(a,f10.3,a)') ' completed in ', stop_time-start_time, ' seconds'
  47. deallocate (A,Anew)
  48. end program jacobi