【Fortran学習|豆知識】Fortranにおける動的メモリ管理:ALLOCATEでメモリ不足をスマートに回避する

導入

数値シミュレーションにおいて、計算対象の格子サイズが実行時に決まることは珍しくありません。かつては、メモリ不足を恐れて「最大サイズ」を静的に確保していましたが、これはリソースの無駄遣いであり、現代の計算環境では推奨されません。ALLOCATEステートメントを活用することで、必要な時に必要な分だけメモリを確保し、効率的かつ柔軟なプログラム設計が可能になります。

基礎知識

Fortranにおける「動的配列(Allocatable Array)」とは、プログラムの実行中にそのサイズや形状を決定できる配列のことです。通常の静的配列はコンパイル時にメモリ領域が固定されますが、動的配列はプログラムの実行時に「ヒープ領域」と呼ばれるメモリ空間から必要なサイズを切り出して使用します。これにより、大規模なシミュレーションでもメモリ効率を最大化できます。

実装/解決策

動的メモリ管理の基本フローは、「宣言」「割り当て」「解放」の3ステップです。
1. 配列を「allocatable」属性で宣言します。
2. 実行時に「allocate」でサイズを指定しメモリを確保します。
3. 使い終わったら「deallocate」でメモリを解放し、リソースをOSへ返却します。

サンプルプログラム

以下のコードは、ユーザーから入力された格子サイズに応じて配列を動的に確保する例です。

program dynamic_memory_example
    implicit none
    ! 1. 動的配列の宣言(次元数はコロンで指定)
    real, allocatable :: fluid_velocity(:, :)
    integer :: nx, ny, istat

    ! 格子サイズをユーザーから読み込む
    print , "格子サイズ(nx, ny)を入力してください:"
    read , nx, ny

    ! 2. メモリの割り当て
    ! statオプションを使うことで、メモリ確保に失敗した際にプログラムを落とさず制御可能
    allocate(fluid_velocity(nx, ny), stat=istat)

    if (istat /= 0) then
        print , "エラー: メモリの確保に失敗しました。"
        stop
    end if

    ! 配列に値を代入(例として初期化)
    fluid_velocity = 0.0
    print , "メモリ確保成功。サイズ:", nx, "x", ny

    ! 3. 使用後のメモリ解放
    deallocate(fluid_velocity)
    print , "メモリを解放しました。"
end program dynamic_memory_example

応用・注意点

現場で最も注意すべきは「メモリリーク」です。不要になった配列をdeallocateし忘れると、ループ処理の中でメモリが徐々に消費され、最終的に計算が強制終了してしまいます。特に、サブルーチン内でローカル配列としてallocateした場合は、そのサブルーチンを抜ける前に必ずdeallocateを行うか、あるいは配列自体をモジュール内で管理するなどの設計が重要です。また、allocateする前に既に確保されている配列を再度allocateしようとするとエラーになるため、allocated(配列名)関数で状態を確認する習慣をつけましょう。

コメント

タイトルとURLをコピーしました