Вдохновленный комментариями @Rodrigo Rodrigues, @Ian Bush и @Richard, здесь предлагается переписать сегмент кода из @SW.Ким
program test
use, intrinsic :: iso_fortran_env, only : real64
implicit none
! --- [local entities]
! Determine the kind of your real variables (select one):
! for specifying a given numerical precision
integer, parameter :: wp = selected_real_kind(15, 307) !15 digits, 10**307 range
! for specifying a given number of bits
! integer, parameter :: wp = real64
real(kind=wp), parameter :: pi = atan(1._wp)*4._wp
real(kind=wp) :: rrr, th, U0, amp, alp, Ndiv
real(kind=wp) :: alpR, NR, Rmin, Rmax, z
integer :: ir, i, j
do i = 0, 50
do j = 0, 50
th = atan2(real(i, kind=wp), real(j, kind=wp))
!
Ndiv= 24._wp !! Number of circumferential division
alp = 90._wp/180._wp*pi !! phase [rad]
U0 = 11.4_wp !! average velocity
amp = 0.5_wp !! amplitude of velocity
Rmin = 10 !! [m]
Rmax = 50 !! [m]
NR = 6._wp !! Number of radial division
!
rrr = sqrt(real(i, kind=wp)**2 + real(j, kind=wp)**2)
ir = int((rrr - Rmin) / (Rmax - Rmin) * NR)
alpR = 2._wp * pi / Ndiv * mod(ir, 2)
z = U0 * (1._wp + amp * sin(0.5_wp * Ndiv * th + alp + alpR))
!
write(*,*) 'i, j, z'
write(*,*) i, j, z
end do
end do
stop
end program test
В частности, были внесены следующие изменения в отношении исходного размещенного кода:
- Минимальное изменение для ответа на вопрос: приведение
integer
переменных i
иj
до real
значений для использования их в вещественных функциях datan
и dsqrt
. - Использование общих имен для внутренних процедур, то есть
sqrt
вместо dsqrt
, atan
вместо datan
и sin
вместо dsin
.Одним из преимуществ этого подхода является то, что тип рабочей точности wp
можно изменить в одном месте, не требуя явных изменений в других местах кода. - Определение переменных
kind
из real
и вызовэто wp
.Расширенное обсуждение этой темы, ее последствий и последствий можно найти на этом сайте, например, здесь и здесь .Также @Steve Lionel имеет подробное сообщение в своем блоге , где его общий совет - использовать selected_real_kind
. - Определение
pi
как parameter
, вычисляющего его значение один раз,вместо того, чтобы повторно вычислять одно и то же значение внутри вложенных циклов for.