あなたの質問はやや不明確ですが、おそらく次のことが役立ちます。
モジュール変数について: すべてのモジュール変数は、そのモジュール内のすべてのサブルーチンからアクセスできます。明示的に定義されていない場合はprivate
、メイン プログラムからもアクセスできます。したがって、メイン プログラムで何らかの値を指定すると、モジュール内のサブルーチンがそれを認識します。逆に、それらを何らかのモジュールプロシージャに割り当てると、メインプログラムはそれらを使用できるようになります。
ただし、番号を交換すれば可能です(私の意見ではより明確です)。メインプログラムとサブルーチンの間のサブルーチン引数(モジュール変数の代わりに)を介したグリッドポイントとグリッドの。次のことを考慮してください(グリッド座標は整数であると想定しました):
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
としてルーチンに渡し、それをルーチン内に割り当てることができます。これは Fortran 90 では不可能ですが、私が知っているすべての Fortran コンパイラは、割り当て可能な配列をサブルーチン引数として実装しています。allocatable
gengrid