Вычисление перекрестного произведения двух векторов в Fortran 90

Я хотел бы вычислить перекрестное произведение двух векторов в Fortran 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) . Похоже, я неправильно указал размер. Вот несколько идей, которые у меня есть:

  1. Возможно, объявление функции cross в основной программе должно быть просто целочисленной переменной, а не целочисленным массивом размером 1 на 3. Поэтому я попытался удалить , DIMENSION (3) в строке INTEGER, DIMENSION (3) :: cross в основной программе. Но я получаю сообщение об ошибке:

     crosstest.f90: 10.4:
    
      r = крест (м, п)
      1
    Ошибка: ссылка на функцию «крест» в (1) требует либо
    явный ИНТЕРФЕЙС или ранг неверный
     

    , так что, вероятно, это еще хуже.

  2. Некоторые (но не все) примеры функций Fortran в Интернете помещают оператор EXTERNAL после объявления функции в основной программе. Поэтому я попытался разместить строку ВНЕШНИЙ крест после блока объявления в основной программе. Я получаю сообщение об ошибке:

     crosstest.f90: 8.16:
    
      ВНЕШНИЙ крест
      1
    Ошибка: атрибут EXTERNAL конфликтует с атрибутом DIMENSION в (1)
     

    Так что это тоже кажется неверным.

  3. Некоторые (но не все)Примеры функций Fortran в Интернете помещают оператор RETURN во предпоследнюю строку определения функции. Я пробовал это, но получаю исходную ошибку несоответствия рангов:

     crosstest.f90: 10.9:
    
      r = крест (м, п)
      1
    Ошибка: несоответствие ранга в ссылке на массив в (1) (2/1)
     

    Так что это не решает проблему.

Не могли бы вы помочь мне увидеть мою ошибку?

7
задан francescalus 16 November 2017 в 14:01
поделиться