在动态大小声明后在 Fortran 中定义数组
defining arrays in fortran after dynamic size declaration
我是 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,所以任何细节都会很方便。
我认为这最接近您想要实现的目标:
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)
我是 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,所以任何细节都会很方便。
我认为这最接近您想要实现的目标:
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)