在动态大小声明后在 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

我个人更喜欢以下解决方案之一:

  1. 由于 fMatrixoMatrix 都是 伪参数 并传递给子例程,您可以使用 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

现在调用程序需要指定数组的形状。

  1. 在外部定义 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)