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

时间:2017-09-08 09:29:26

标签: fortran intel-fortran

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

如果我这样做:

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

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

2 个答案:

答案 0 :(得分:1)

创建通用界面似乎是一种非常干净的方式。 (每条评论,但我虽然值得写)但

 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

答案 1 :(得分:0)

使用英特尔,您也可以使用MAP / UNION,因此您可以将1d作为1d传递,并将2D作为其MAP / UNION 1D版本传递。

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

您的评论&#34;显然不能通过矩阵&#34;似乎与我所知道的相反。如果它是2D,并且总是2D,则没有任何问题。你可以通过任何等级。