1. 導入:なぜMOLD指定が重要なのか
数値計算の現場では、同じ「変数」であっても、実行中にデータ構造や型を切り替えたいケースがよくあります。例えば、シミュレーション対象の形状によって必要なパラメータセットが変わるような場合です。しかし、メモリ確保の際に型を誤ると、プログラムは即座にクラッシュします。ここで役立つのが ALLOCATE文のMOLD指定 です。この機能を使えば、実行時の型情報(Dynamic Type)を自動的に引き継いでメモリを確保できるため、バグを未然に防ぎ、コードの汎用性を大幅に向上させることができます。
2. 基礎知識:MOLDとは何か
通常、Fortranで配列やオブジェクトを確保する際は、サイズを明示する必要があります。しかし、クラス継承を使ったポリモーフィズム(多態性)環境下では、変数が「親」なのか「子」なのか実行時まで判別できないことがあります。
MOLD(型枠)は、ある変数(reference_var)の型と構造をそのまま「型枠」として利用し、新しい変数(class_var)に同じ形状をコピーしてメモリを確保する仕組みです。これにより、開発者が一つ一つサイズを計算して指定する手間から解放されます。
3. 実装と解決策
実装の肝は、ベースとなる変数(テンプレート)を定義し、それを参照してALLOCATEを実行することです。これにより、派生クラス固有のデータ領域を、親クラス型の変数ポインタに対しても安全に割り当てることが可能になります。
4. サンプルプログラム
以下のコードは、親クラスの型を持つ変数に、派生クラスの構造をMOLD経由で適用する例です。コンパイルして動作を確認してみてください。
module shape_mod
! 基底クラス
type, abstract :: shape
end type
! 派生クラス(データ量が多い)
type, extends(shape) :: circle
real :: radius
end type
end module
program allocate_mold_test
use shape_mod
implicit none
class(shape), pointer :: my_shape => null()
type(circle), target :: ref_circle ! 型枠となる変数
! ref_circleの構造を元に、my_shapeにメモリを割り当てる
! my_shapeは元々shape型だが、中身はcircleとして確保される
allocate(my_shape, mold=ref_circle)
if (associated(my_shape)) then
print , "メモリ確保に成功しました!"
end if
! 使い終わったら解放
deallocate(my_shape)
end program
5. 応用・注意点
現場で活用する際の注意点は、「必ずターゲットとなる変数が定義されていること」です。MOLDに指定する変数が未定義(未初期化)の場合、予期せぬメモリ領域を参照し、セグメンテーション違反を引き起こす可能性があります。
また、MOLDはあくまで「型と形状」のコピーである点に注意してください。値そのものはコピーされません。動的メモリ管理を多用する大規模なコードでは、メモリリークを防ぐために、ALLOCATEとDEALLOCATEをセットで記述するルールを徹底しましょう。この手法をマスターすれば、より柔軟で堅牢な科学技術計算プログラムが構築できるようになります。

コメント