自由维数组作为子程序的输入

Free-dimensional array as input in subroutine

我正在尝试编写一个可以将一维数组或二维数组作为输入的子例程。如何声明子程序的输入既可以是向量也可以是矩阵?

如果我这样做:

SUBROUTINE TEST1(x)
   REAL, INTENT(IN) :: x(:)
   <do something>
END SUBROUTINE TEST1

我显然不能将矩阵作为子例程的输入传递。一个不优雅的解决方案可能是以向量化形式传递矩阵,然后在子例程中以矩阵形式重新排列它(当然,我需要一些额外的输入)。有更好的方法吗?

创建通用接口似乎是一种非常简洁的方法。 (根据评论,但我虽然值得写下来)

 module gen
 interface test1
 module procedure t1,t2
 end interface
 contains 
 subroutine t1(y)
 real y(:)
 write(*,*)'shape is',shape(y)
 y=2*y
 end subroutine
 subroutine t2(y)
 real y(:,:)
 write(*,*)'shape is',shape(y)
 y=2*y
 end subroutine
 end module

 use gen
 real m(4),n(3,3)
 m=4 
 n=3
 call test1(m)
 call test1(n)
 end

对于 Intel,您还可以使用 MAP/UNION,因此您可以将 1d 作为一个 1d 传递,也可以将 2D 作为 MAP/UNION 1D 版本传递。

您可能想要使用 RESHAPE,但通常不需要,具体取决于您在做什么。

您对 "clearly cannot pass in a matrix" 的评论似乎与我所知道的相反。如果它是二维的,而且总是二维的,那么就没有任何问题。您可以通过任何排名。