導入
数値計算エンジニアにとって、Fortranでの配列初期化は避けて通れない作業です。特に他のプログラミング言語から移行した際、最も混乱しやすいのが「配列構成子(Array Constructor)」の挙動です。PythonやC言語のように多次元配列のリテラルを記述しても、Fortranでは意図せず1次元に平坦化(フラット化)されてしまう仕様があります。本記事では、この仕様を正しく理解し、安全に多次元配列を構築するための最適解を解説します。
基礎知識
Fortranにおける配列構成子 `[…]` は、リスト内の要素を順番に並べた「1次元のベクトル」を生成する機能です。仮に `[ [1, 2], [3, 4] ]` と記述した場合、コンパイラはネストされた構造を解釈するのではなく、単に全要素を結合して `[1, 2, 3, 4]` という1次元配列として扱います。
多次元配列(行列など)としてメモリ上に展開するためには、生成された1次元配列に対し、reshape(形状変更)関数を適用し、次元情報を明示的に与える必要があります。この手順を踏まない限り、メモリレイアウトが意図した行列形式になりません。
実装/解決策
多次元配列を正しく構築するための手順は以下の通りです。
1. 配列構成子を用いて、必要なデータを1次元で並べる。
2. reshape関数を使い、ターゲットの形状(shape)を指定する。
3. 必要に応じて、列優先(Column-major)のデータ配置を意識する。
Fortranは伝統的に列優先でメモリを確保するため、reshapeを行う際は、行列の「列」から順にデータが並んでいるかを確認することが重要です。
サンプルプログラム
以下のコードは、2×2の行列を正しく初期化する例です。そのままコンパイルして動作を確認してください。
プログラム:
program array_init
implicit none
integer, dimension(2, 2) :: matrix
! reshape(source, shape) を使用して、1次元構成子を2×2行列に変換する
! 第1引数に構成子、第2引数に形状を指定する
matrix = reshape([1, 3, 2, 4], [2, 2])
! 出力結果の確認:列優先で埋め込まれるため [1, 3] が第1列、[2, 4] が第2列となる
print , “Matrix(1,1):”, matrix(1,1)
print , “Matrix(2,1):”, matrix(2,1)
print , “Matrix(1,2):”, matrix(1,2)
print , “Matrix(2,2):”, matrix(2,2)
end program array_init
応用・注意点
現場でよくある失敗として、reshapeの引数順序を間違えて行列が転置した状態で初期化してしまうケースがあります。特に物理シミュレーション等でデータを読み込む際、データの並び順(ファイル上の順序)とreshapeの形状指定が一致しているか、必ずデバッグ出力で確認してください。
また、大きな配列を初期化する場合、構成子を直接書くと可読性が著しく低下します。その場合は、doループを用いるか、あるいはデータファイルから `read` 文で直接読み込む手法を検討してください。構成子はあくまで「小さな定数配列」の定義に留め、ロジックの可読性を損なわないように管理するのがエンジニアとしてのベストプラクティスです。

コメント