Осложнения с элементарными подпрограммами в Фортране

Вопрос

Есть ли какие-либо осложнения при маркировке подпрограммы как 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, который можно расширить, чтобы проиллюстрировать возможные побочные эффекты.

1 ответ

Решение

Очевидное осложнение элементарной подпрограммы состоит в том, что все фиктивные аргументы должны быть скалярными. Есть моменты, когда требуется элементарные действия, имеющие доступ к общему массиву: это не может происходить через аргументы.

Кроме того, если элементарная подпрограмма является чистой, она подчиняется всем ограничениям, исходящим от этой природы.

Является ли он чистым или нет, элементарная подпрограмма подвергается дополнительным ограничениям:

  • фиктивные аргументы не должны быть указателями или размещаться;
  • фиктивные аргументы не должны быть грубыми;
  • фиктивные аргументы должны быть объектами данных.

Относительно того, как эти ограничения меняются во времени и реализации, мало о чем беспокоиться.

До Fortran 2008 все элементарные подпрограммы были чистыми, а запрет на пустые аргументы не имел смысла.

Кроме того, компиляторы должны быть в состоянии обнаружить нарушения указанных ограничений, и я не знаю каких-либо расширений, ослабляющих их.

Наконец, все эти годы были разные ошибки компилятора, когда возникали элементарные процедуры. Не нужно слишком беспокоиться о них, если не заберешь машину, найденную в гараже великого дяди.

Другие вопросы по тегам