Cálculo del producto cruzado de dos vectores en Fortran 90

Me gustaría calcular el producto cruzado de dos vectores en Fortran 90. Por ejemplo, en palabras, el producto cruzado de (1, 2, 3) y (4, 5, 6) resulta ser (-3, 6 , -3) en coordenadas cartesianas. Escribí el siguiente código (programa principal seguido de la definición de la función):

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

Pero recibo un mensaje de error:

crosstest.f90:10.9:

  r=cross(m,n)
         1
Error: Rank mismatch in array reference at (1) (2/1)

where line 10 esr=cross(m,n). Parece que debo estar especificando una dimensión incorrectamente. Aquí hay algunas ideas que tengo:

Quizás la declaración de la funcióncross en el programa principal debería ser simplemente una variable entera, en lugar de una matriz entera 1by3. Así que intenté eliminar la, DIMENSION(3) en elINTEGER, DIMENSION(3) :: cross line en el programa principal. Pero recibo un mensaje de error:

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

so esto es aún peor, probablemente.

Algunos (pero no todos) ejemplos de funciones de Fortran en el sitio web yEXTERNAL declaración después de la declaración de función en el programa principal. Así que intenté colocar una líneaEXTERNAL cross después del bloque de declaración en el programa principal. Recibo un mensaje de error:

crosstest.f90:8.16:

  EXTERNAL cross
                1
Error: EXTERNAL attribute conflicts with DIMENSION attribute at (1)

Así que esto también parece incorrecto.

Algunos (pero no todos) ejemplos de funciones de Fortran en el sitio web aRETURNnstrucción @ en la penúltima línea de la definición de la función. Intenté esto, pero recibo el error de desajuste de rango original:

crosstest.f90:10.9:

  r=cross(m,n)
         1
Error: Rank mismatch in array reference at (1) (2/1)

Así que esto no soluciona el problema.

¿Puedes ayudarme a ver mi error?

Respuestas a la pregunta(2)

Su respuesta a la pregunta