Fortran について
行方大輔/牧野淳一郎
理化学研究所 計算科学研究センター
粒子系シミュレータ研究チーム

2022/9/9

FDPS講習会

1概要• Fortran 77 (以下, F77) ユーザを対象に、FDPS
Fortran APIで使っているFortran 2003の見慣れない機能、文法について概説する。
• F77は知っていることを想定。

2022/9/9

FDPS講習会

2使っている新機能一覧
大きなもの
1. module, use
2. type (構造型、C++でいう構造体/クラス)

3. C言語と相互運用利用可能性 (組み込みモジュー
ル iso_c_binding)2022/9/9

FDPS講習会

3使っている新機能一覧 (続き)細々としたもの
1. 変数宣言、サブルーチンの引数宣言の形式、値渡し、パラメータ文の形式
2. do ... end do 文
3. コメントの形式
4. 比較演算子

2022/9/9

FDPS講習会

4参考書?
Fortran 2008入門(http://www.cutt.co.jp/book/978-4-87783-399-2.html)••

2022/9/9

module, use についての解説あり。
構造体についての記述も全くないわけではない。

FDPS講習会

5module, use
モジュール宣言文法
module モジュール名[宣言部][contains
モジュール副プログラム部]
end [module [モジュール名]]
モジュール使用文法
use モジュール名モジュールが定義されているソースファイルを先にコンパイルすると、 何か中間形式のファイルができる。使っているほうのコンパイルではコン パイラがそ
れを参照する。

2022/9/9

FDPS講習会

6module, use (続き)
• 複数のプログラム単位で使う様々なものをまとめられる。
• パラメータ宣言、データ (common block の代わりになる)、ユー ザー定義型、ユーザー定義の関数やサブルーチン等。
• 構造型はモジュール内で定義して、使うサブルーチンでモジュールを use するのが基本。
• ちなみに C/C++ には相変わらずモジュールにあたるものはない（C++には名前空間はある）。

2022/9/9

FDPS講習会

7module, use (簡単な例)
module sample
integer nparameter (n=10)
end
program mainuse sample
write(*,*) n
end

コンパイル、実行:% gfortran module.F90; ./a.out

2022/9/9

FDPS講習会

8type (derived type, 構造型)
型宣言
type student
character(32) nameinteger age
end

変数宣言、使用方法
type(student) a
a%name="Sato"a%age=18

2022/9/9

FDPS講習会

9type (derived type, 構造型)
• いわゆる構造体。
• FDPS では、3次元ベクトル型、ユーザーが定義する「粒子型」等を使用。
• プログラミングスタイル云々という話もあるが、キャッ シュに確実に載るようにするとかにも有用。

2022/9/9

FDPS講習会

10type (型束縛手続き)• いつのまにか Fortran も「オブジェクト志向」に。
• 雑にいうと、ある構造型の変数を第一引数にする手続
き を foo(x) の代わりに x%foo と書けるというだけ。こ
ういうのを言語によってメッセージとかメンバー関数とかいう。
• 但し、同じ名前でも別の構造体のメンバー関数なら別の関数になる。演算子も関数にできるので、構造体同士の演算を定義できる。
• 以下では「メンバー関数(手続き)」と呼ぶことに。

2022/9/9

FDPS講習会

11type (メンバー関数の文法)
モジュールstudentmoduleの定義

メイン関数の定義

module studentmodule
type, public:: student
character(32) nameinteger age
メンバー関数の宣言部
containsprocedure :: print
end type
メンバー関数の実装部
contains
subroutine print(self)class(student) selfwrite(*,*) self%age
endend

program mainuse studentmodule
type (student) aa%name="Sato"a%age=18
call a%print
end

2022/9/9

Fortran でもオブジェクト志向
関数のオーバーロード、演算子のオーバーロードができる (ベクトル型を定義して、ベクトル同士の加算とかする演算子を定義できる) (FDPS 側で提供してます)

FDPS講習会

12iso_c_binding• FortranとCの相互運用性を保証する仕掛け• 処理系とかOS依存ではなく言語定義として公式に• Fortran側で、C側で使える変数型とか関数の宣言のしかたを用意• 文法はなんか面倒だけど、とにかくそれに従っておけば Cから (従ってC++からも) Fortranで宣言した構造型や関数が使える• FDPSのFortran APIは全面的にこの仕掛けを利用

2022/9/9

FDPS講習会

13iso_c_binding (例)type, public, bind(c) :: full_particle
integer(kind=c_long_long) :: idreal(kind=c_double) mass !$fdps charge....
type(fdps_f64vec) :: pos !$fdps positionend type full_particle• bind(c)で構造体をCからもアクセスできるようになる (C側では別に同等の構造体を宣言/用意する必要あり)• Cと互換性のあるデータ型の選択は、(kind=c_double)等とkind値を指定する。
• fdps_f64vecはFDPSで提供している倍精度3次元ベクトル型。

2022/9/9

FDPS講習会

14細々としたこと
1. 変数宣言、サブルーチンの引数宣言の形式、値渡し、パラメータ文の形式
2. do ... end do 文
3. コメントの形式
4. 比較演算子

2022/9/9

FDPS講習会

15変数宣言
古代 (F77)
real a(50)real cparameter (c=1.0)

現代
real, dimension :: a(50)real, parameter :: c=1.0• dimension, parameter の他に色々属性をつけられる。つける時には変数名の前に ”::” を。
• 古代語でもコンパイラは文句いわない(他の新機能も基本的にそう)
2022/9/9

FDPS講習会

16do ... end do文
古代 (F77)
do 10 i=1, 50...
50 continue

現代
do i=1,50...
end do2022/9/9

FDPS講習会

17コメントの形式
古代 (F77)c この行はコメントです
x=x+1

現代! この行はコメントです
x=x+1

2022/9/9

FDPS講習会

18比較演算子古代 (F77)
if (a .lt. b) then...
end if現代
if (a < b) then...
end if==, /=, <, <=, >, >= がある。

2022/9/9

FDPS講習会

19まとめ• FDPS Fortran APIで使っているFortran 77にない機能を概説した。
• module, 構造体, iso_c_bindingが主。
• 他にも配列演算等の便利そうな機能があるが省略。

2022/9/9

FDPS講習会

20