【发布时间】:2018-12-20 05:21:02
【问题描述】:
我想计算 z 值作为 x:-50~50 和 y:-50~50 范围内的坐标,如下面的代码。
program test
implicit none
! --- [local entities]
real*8 :: rrr,th,U0,amp,alp,Ndiv
real*8 :: pi,alpR,NR,Rmin,Rmax,z
integer :: ir, i, j
do i=0, 50
do j=0, 50
th=datan2(i,j)
pi=datan(1.d0)*4.d0
!
Ndiv= 24.d0 !! Number of circumferential division
alp = 90.d0/180.d0*pi !! phase [rad]
U0 = 11.4d0 !! average velocity
amp = 0.5d0 !! amplitude of velocity
Rmin = 10 !! [m]
Rmax = 50 !! [m]
NR = 6.d0 !! Number of radial division
!
rrr=dsqrt(i**2+j**2)
ir=int((rrr-Rmin)/(Rmax-Rmin)*NR)
alpR=2.d0*pi/dble(Ndiv)*dble(mod(ir,2))
z=U0*(1.d0+amp*dsin(0.5d0*Ndiv*th+alp+alpR))
write(*,*) 'i, j, z'
write(*,*) i, j, z
end do
end do
stop
end program test
但我无法让它像下面的错误一样工作。我认为因为 i, j 在 datan(i,j) 中。我应该如何更改这些代码?
test.f90:10.16:
th=datan2(i,j)
1
Error: 'y' argument of 'datan2' intrinsic at (1) must be REAL
test.f90:21.16:
rrr=dsqrt(i**2+j**2)
1
Error: 'x' argument of 'dsqrt' intrinsic at (1) must be REAL
【问题讨论】:
-
你必须弄清楚如何将整数转换为实数。
-
datan2(real(i, kind(0d0)), real(j, kind(0d0))) -
甚至更好 atan2(real(i, kind(0d0)), real(j, kind(0d0))) 几十年来不应该使用内部过程的特定名称 - 我希望没有人正在教这个。同样完全非标准的实数*8。
-
我找不到合适的副本。这是一个相当琐碎的问题,我应该写一个正确的答案吗?你觉得@IanBush 怎么样?或者以某种方式标记它?
-
如果您找不到重复的答案,请写下答案 - 如果某个地方已经隐藏了答案,则不会造成任何伤害