问题
将子例程标记为 时是否有任何并发症elemental
?这个页面似乎暗示了这一点,但没有详细说明它们可能是什么。
注意:我标记了多个 fortran 版本,因为我想知道在开发可移植代码时是否应该注意这些差异。
例子
假设我想编写一个基本子程序来在笛卡尔坐标和极坐标之间进行转换。这可以按如下方式完成:
elemental subroutine calc_xy_from_rt( r, t, x, y )
real*8, intent(IN) :: r ! radius
real*8, intent(IN) :: t ! theta
real*8, intent(OUT) :: x
real*8, intent(OUT) :: y
x = r * cos(t)
y = r * sin(t)
end subroutine calc_xy_from_rt
因为它是基本的,所以可以在以下上下文中调用它:
program main
implicit none
real*8, dimension(1:100) :: r
real*8, dimension(1:100) :: t
real*8, dimension(1:100) :: x
real*8, dimension(1:100) :: y
! (Initialize r and t arrays here)
! Calculate x and y for each element
call calc_xy_from_rt( r, t, x, y ) ! gets called 100 times
end program main
我猜这个简单的过程不会有副作用,但我提供了一个例子来使讨论具体化,并提供一个可以扩展以说明可能的副作用的 MWE。