0

我正在尝试适当地构建我的 Fortran 程序。我有一个程序 GridGeneration.f90 生成我的网格。我想在我的主程序中控制网格的大小,即网格大小参数N_x和N_y。例如,这会起作用吗?

module MySubsAndParameters

implicit none
integer :: N_x, N_y

include 'GridGeneration.f90'

code

end module MySubsAndParameters
program main

use MySubsAndParameters

N_x = 100
N_y = 50

code

end program main

如何在 GridGeneration.f90 中定义 N_x 和 N_y 才能实现这一点?

此外,GridGeneration.f90 中定义的变量现在是否也在我的模块和主程序中定义和分配?例如,如果在 GridGeneration.f90 中定义了一个实数 x,我可以在我的主程序中使用它吗?

4

1 回答 1

1

您的问题有些不清楚,但可能有以下帮助:

至于模块变量:每个模块变量都可以被该模块中的所有子程序访问,如果没有明确定义private,它也可以从主程序访问。所以如果你在主程序中给它们一些值,模块中的子程序就会意识到这一点。反之亦然,如果你将它们分配在某个模块程序中,主程序就可以使用它们。

但是,如果您交换 nr,这是可能的(并且在我看来更清楚)。网格点和网格通过主程序和子程序之间的子程序参数(而不是模块变量)。考虑以下内容(我假设您的网格坐标是整数):

module grid
  implicit none

contains

  subroutine gengrid(nx, ny, grid)
    integer, intent(in) :: nx, ny
    integer, intent(out) :: grid(:,:)

    ! create grid based on nx and ny

  end subroutine gengrid

end module grid


program test
  use grid
  implicit none

  integer, allocatable :: mygrid(:,:)
  integer :: nx, ny

  nx = 100
  ny = 50
  allocate(mygrid(nx, ny))
  call gengrid(nx, ny, mygrid)
  :

end program test
  • 通过将网格大小显式传递给例程,您不会忘记在调用例程之前从外部初始化一些模块变量。此外,可以立即清楚例程需要哪些变量来创建网格。

  • 实际上,您甚至可以将网格大小传递给子例程,因为它可以从分配的数组的大小中猜测它:

    subroutine gengrid(grid)
      integer, intent(out) :: grid(:,:)
    
      integer :: nx, ny
    
      nx = size(grid, dim=1)
      ny = size(grid, dim=2)
      ! create grid based on nx and ny
    
    end subroutine gengrid
    
  • 另一方面,如果您有一个支持 Fortran 2003 的编译器,您可以将grid其作为allocatable数组传递给gengrid例程并在例程中分配它。虽然这在 Fortran 90 中是不可能的,但我所知道的所有 Fortran 编译器都将可分配数组实现为子例程参数。

于 2013-05-12T09:00:42.350 回答