自由维数组作为子程序的输入
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" 的评论似乎与我所知道的相反。如果它是二维的,而且总是二维的,那么就没有任何问题。您可以通过任何排名。
我正在尝试编写一个可以将一维数组或二维数组作为输入的子例程。如何声明子程序的输入既可以是向量也可以是矩阵?
如果我这样做:
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" 的评论似乎与我所知道的相反。如果它是二维的,而且总是二维的,那么就没有任何问题。您可以通过任何排名。