我是Fortran的新手,我想要的是我的矩阵大小取决于N是偶数还是奇数, 天真的我会尝试类似下面的东西,但这不会编译,如果我删除if语句它工作正常,
subroutine f(fMatrix,oMatrix,N)
implicit none;
integer,intent(in)::N
integer::d2
if(mod(N,2)==0) then ! if N is even then 1 type of size
parameter(d2=1)
else
parameter(d2=2)
endif
double precision,intent(in),dimension(N, d2):: fMatrix
double precision,intent(out),dimension(N, d2):: oMatrix
!do stuff here with fMatrix
oMatrix = fMatrix
end subroutine f
对此有什么可行的解决方法?不打算分配? 我正在使用f2py,所以这样的任何细节都很方便。
答案 0 :(得分:2)
我认为这最接近你想要达到的目标:
subroutine f(fMatrix,oMatrix,N)
implicit none
integer,intent(in) :: N
double precision,intent(in),dimension(N, mod(N,2)+1) :: fMatrix
double precision,intent(out),dimension(N, mod(N,2)+1) :: oMatrix
! ...
oMatrix = fMatrix
end subroutine
我个人更喜欢以下解决方案之一:
fMatrix
和oMatrix
都是伪参数并传递给子例程,因此您可以使用assumed shape array specifications:subroutine f(fMatrix,oMatrix,N)
implicit none
integer,intent(in) :: N
double precision,intent(in),dimension(:, :) :: fMatrix
double precision,intent(out),dimension(:, :) :: oMatrix
! ...
end subroutine
现在调用程序需要指定数组的形状。
d2
并将其传递给子程序:subroutine f(fMatrix,oMatrix,N, d2)
implicit none
integer,intent(in) :: N, d2
double precision,intent(in),dimension(N, d2) :: fMatrix
double precision,intent(out),dimension(N, d2) :: oMatrix
! ...
end subroutine
并使用以下命令调用子程序:
call f(fMatrix,oMatrix,N,mod(N,2)+1)