jacobi.f90 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. ! allocate ( A(0:n-1,0:m-1), Anew(0:n-1,0:m-1) )
  36. ! A = 0.0_fp_kind
  37. ! Anew = 0.0_fp_kind
  38. ! Set B.C.
  39. ! A(0,:) = 1.0_fp_kind
  40. ! Anew(0,:) = 1.0_fp_kind
  41. call initialize(A, Anew, m, n)
  42. write(*,'(a,i5,a,i5,a)') 'Jacobi relaxation Calculation:', n, ' x', m, ' mesh'
  43. call cpu_time(start_time)
  44. iter=0
  45. !$acc data copy(A) create(Anew)
  46. do while ( error .gt. tol .and. iter .lt. iter_max )
  47. error = calcNext(A, Anew, m, n)
  48. call swap(A, Anew, m, n)
  49. if(mod(iter,100).eq.0 ) write(*,'(i5,f10.6)'), iter, error
  50. iter = iter + 1
  51. end do
  52. !$acc end data
  53. call cpu_time(stop_time)
  54. write(*,'(a,f10.3,a)') ' completed in ', stop_time-start_time, ' seconds'
  55. ! deallocate (A,Anew)
  56. end program jacobi