Fortran Codingにおけるメモ
Fortranで数値計算用コードを書く時に、気をつけるべきことを自分が見返すようにメモを残しておきます。
間違い・補足等あれば、指摘していただけると幸いです。
多次元配列へのアクセス
Fortranでは、配列の格納方向が列方向(Column major)になっている。そのため多重ループを使う時には、キャッシュミスに配慮したループを書く必要がある。
do k=1, 100
do j=1, 100
do i=1, 100
!多重ループ処理
end do
end do
end do
詳しくは以下のサイト"5.9.2Column majorとRow major"を参考
動的確保
基本動作
プログラム実行中に配列の大きさを変更する時に、allocatable属性を付けることで、動的にメモリを確保することができる。
!動的な倍精度1次元配列の宣言
real(8), allotable :: array(:)
!メモリの割り付け
allocate(array(100))
!メモリの解放
deallocate(array)
使うべきとき
1. 大規模配列の利用
通常の(静的)配列では、保存場所(スタック領域)の都合により大規模な配列は格納できないようになっている。そこで、動的配列と確保すると、保存場所が変わるため(スタック領域->ヒープ領域)、より大きな配列を宣言することができる。ただ、その分メモリへのアクセうが遅くなってしまうことは留意していてほしい。
詳しくは以下のサイトを参照
->"5.9.1.メモリ領域"
2. MPI通信を用いた並列化
MPI通信を用いてプロセス並列を行うときに、メモリの無駄を省くため各プロセスで担当する範囲分だけメモリを確保する時に、メモリを動的確保すると良い。
詳しくは以下のサイトp11-p14を参照
型(構造体)の利用
物理量などをまとめて型として扱うことで、シンプルかつ効率的なコードを書くことができる。長いコードを書く際には推奨される書き方である。ただ、高速化という観点でメリットはそこまで大きくないと思われる。
詳しくは以下のサイトを参照