在动态大小声明后定义fortran中的数组

时间:2015-03-02 14:14:12

标签: python arrays fortran f2py

我是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,所以这样的任何细节都很方便。

1 个答案:

答案 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

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

  1. 由于fMatrixoMatrix都是伪参数并传递给子例程,因此您可以使用assumed shape array specifications
  2.  
    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并将其传递给子程序:
    2. 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)