我正在尝试适当地构建我的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,我可以在我的主程序中使用它吗?
答案 0 :(得分: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编译器都将可分配数组实现为子例程参数。