Fortran子例程

时间:2017-02-28 14:01:45

标签: arrays fortran dynamic-memory-allocation fortran90

我的问题是关于Fortran中的数组分配。

我有一个子程序,比如 readParams ,我想从文件中读取一些动态大小的数组。这些也在子程序之外使用。 处理这个问题的最佳方法是什么?

在F95中,似乎无法在子例程中进行分配,并将填充了值的数组传递回主程序。 但是如果我在主程序中分配它并在子程序中使用“intent(inout)”,它也会在那里被释放。

(我在这里使用的是F90 / 95,但由于代码不大,我也可以将它修改为更新的版本......我对Fortran很新,所以我不确定是否改进了数组处理是值得的时间投资^^

编辑感谢提示。我不是试图在子程序中取消分配我的数组。

问题是:我有一个数组,我需要在程序中的某处分配。只有在我从子程序 readArgs 的输入中读取数组后,才知道数组大小。因此我将数组设为“可分配”。 一旦分配,该状态必须永远不会再次更改。 该数组填充了子程序 readParams 中的值。 我是否最好在主要 readParams 以及如何分配?

...我现在把我的子程序放在一个模块中并从那里使用它们。 目前我在 main 中进行分配,将数组传递给我的子程序,并删除子程序中数组声明中的“allocatable”语句。 它似乎有效,但我仍然不明白这是否可行。

2 个答案:

答案 0 :(得分:0)

在我看来,这个问题与Can a input argument of a Fortran subroutine be deallocated and allocated in the body of the subroutine?完全相同,如果是的话 不是,那么它应该关闭因为你没有显示任何代码所以我们怎么能告诉你你的代码(有效)是否正确???

但我对很多人持这种观点,所以如果你的代码与此类似,那么它可能是正确的:

您可以读取子程序中的大小并将其分配到主程序中:

module subs
contains
  subroutine readArgs(n)
    integer, intent(out) :: n
    !read n here
  end subroutine

  subroutine readParams(a)
    real :: a(:)

    do i = 1, size(a)
      !read values of a
      a(i) =
    end do
  end subroutine
end module

program main

  use subs

  integer :: n

  readArgs(n)

  allocate(a(n))

  readParams(n)
end program

或者你可以在子程序中分配它。您必须满足Can a input argument of a Fortran subroutine be deallocated and allocated in the body of the subroutine?

中的所有要求
module subs
contains
  subroutine readArgs(n)
    integer, intent(out) :: n
    !read n here
  end subroutine

  subroutine readParams(n, a)
    real, allocatable :: a(:)

    allocate(a(n))

    do i = 1, size(a)
      !read values of a
      a(i) =
    end do
  end subroutine
end module

program main

  use subs

  integer :: n

  readArgs(n)

  readParams(n)
end program

无论你做什么都没关系,两种方法都很完美。

答案 1 :(得分:0)

如果仍然有人感兴趣,我正在使用Cuda编译器pgf90和以下作品:

module subs  
implicit none  
    contains  
    subroutine load_array( b )  
        real, allocatable :: b(:)  
        allocate( b(10) )  
        b( 7 ) = 4  
    end subroutine load_array  
end module subs  

Program main  
    use subs  
    implicit none  
    real, allocatable :: a(:)  
    Call load_array( a )  
    print *, a(7)  
    deallocate( a )  
end program main