123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- ! Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
- !
- ! Redistribution and use in source and binary forms, with or without
- ! modification, are permitted provided that the following conditions
- ! are met:
- ! * Redistributions of source code must retain the above copyright
- ! notice, this list of conditions and the following disclaimer.
- ! * Redistributions in binary form must reproduce the above copyright
- ! notice, this list of conditions and the following disclaimer in the
- ! documentation and/or other materials provided with the distribution.
- ! * Neither the name of NVIDIA CORPORATION nor the names of its
- ! contributors may be used to endorse or promote products derived
- ! from this software without specific prior written permission.
- !
- ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
- ! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- ! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- ! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- ! CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- ! EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- ! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- ! PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- ! OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- ! (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- ! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- program jacobi
- use laplace2d
- implicit none
- integer, parameter :: fp_kind=kind(1.0d0)
- integer, parameter :: n=4096, m=4096, iter_max=1000
- integer :: i, j, iter
- real(fp_kind), dimension (:,:), allocatable :: A, Anew
- real(fp_kind) :: tol=1.0e-6_fp_kind, error=1.0_fp_kind
- real(fp_kind) :: start_time, stop_time
- call initialize(A, Anew, m, n)
-
- write(*,'(a,i5,a,i5,a)') 'Jacobi relaxation Calculation:', n, ' x', m, ' mesh'
-
- call cpu_time(start_time)
- iter=0
-
- !$acc data copy(A(:,:)) create(Anew(:,:))
- do while ( error .gt. tol .and. iter .lt. iter_max )
- error = calcNext(A, Anew, m, n)
- call swap(A, Anew, m, n)
- if(mod(iter,100).eq.0 ) write(*,'(i5,f10.6)'), iter, error
- iter = iter + 1
- end do
- !$acc end data
- call cpu_time(stop_time)
- write(*,'(a,f10.3,a)') ' completed in ', stop_time-start_time, ' seconds'
- deallocate (A,Anew)
- end program jacobi
|