Я хотел бы вычислить перекрестное произведение двух векторов в Фортране-90. Например, на словах перекрестное произведение (1, 2, 3) и (4, 5, 6) оказывается (-3, 6, -3) в декартовых координатах.Я написал следующий код (основная программа, за которой следует определение функции):
PROGRAM crosstest
IMPLICIT NONE
INTEGER, DIMENSION(3) :: m, n
INTEGER, DIMENSION(3) :: cross
INTEGER, DIMENSION(3) :: r
m=(/1, 2, 3/)
n=(/4, 5, 6/)
r=cross(m,n)
END PROGRAM crosstest
FUNCTION cross(a, b)
INTEGER, DIMENSION(3) :: cross
INTEGER, DIMENSION(3), INTENT(IN) :: a, b
cross(1) = a(2) * b(3) - a(3) * b(2)
cross(2) = a(3) * b(1) - a(1) * b(3)
cross(3) = a(1) * b(2) - a(2) * b(1)
END FUNCTION cross
Но я получаю сообщение об ошибке:
crosstest.f90:10.9:
r=cross(m,n)
1
Error: Rank mismatch in array reference at (1) (2/1)
, где строка 10 равна r=cross(m,n)
.Кажется, что я должен указывать размер неправильно.Вот несколько идей, которые у меня есть:
Возможно, объявление функции cross
в основной программе должно быть просто целочисленной переменной, а не целочисленным массивом 1by3.Поэтому я попытался удалить , DIMENSION(3)
в строке INTEGER, DIMENSION(3) :: cross
в основной программе.Но я получаю сообщение об ошибке:
crosstest.f90:10.4:
r=cross(m,n)
1
Error: The reference to function 'cross' at (1) either needs an
explicit INTERFACE or the rank is incorrect
, так что это еще хуже, вероятно.
Некоторые (но не все) примеры функций Fortran в Интернете размещаютEXTERNAL
оператор после объявления функции в основной программе.Поэтому я попытался поместить строку EXTERNAL cross
после блока объявления в основной программе.Я получаю сообщение об ошибке:
crosstest.f90:8.16:
EXTERNAL cross
1
Error: EXTERNAL attribute conflicts with DIMENSION attribute at (1)
Так что это тоже кажется неправильным.
Некоторые (но не все) примеры функций Fortran в Интернете размещают RETURN
оператор в последней строке определения функции.Я пробовал это, но я получаю оригинальную ошибку несоответствия ранга:
crosstest.f90:10.9:
r=cross(m,n)
1
Error: Rank mismatch in array reference at (1) (2/1)
Так что это не решает проблему.
Можете ли вы помочь мне увидеть мою ошибку?