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、メイン プログラムからもアクセスできます。したがって、メイン プログラムで何らかの値を指定すると、モジュール内のサブルーチンがそれを認識します。逆に、それらを何らかのモジュールプロシージャに割り当てると、メインプログラムはそれらを使用できるようになります。

ただし、番号を交換すれば可能です(私の意見ではより明確です)。メインプログラムとサブルーチンの間のサブルーチン引数(モジュール変数の代わりに)を介したグリッドポイントとグリッドの。次のことを考慮してください(グリッド座標は整数であると想定しました):

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 コンパイラは、割り当て可能な配列をサブルーチン引数として実装しています。allocatablegengrid

于 2013-05-12T09:00:42.350 に答える