Fortran について
行方大輔/牧野淳一郎
神戸大学理学研究科
惑星科学研究センター

2024/9/6

FDPS講習会

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

2024/9/6

FDPS講習会

2使っている新機能一覧
大きなもの
1. module, use
1. type (構造型、C++でいう構造体/クラス)
1. C言語と相互運用利用可能性 (組み込みモジュー
ル iso_c_binding)2024/9/6

FDPS講習会

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

FDPS講習会

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

2024/9/6

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

FDPS講習会

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

2024/9/6

FDPS講習会

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

2024/9/6

FDPS講習会

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

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

2024/9/6

FDPS講習会

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

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

2024/9/6

FDPS講習会

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

2024/9/6

FDPS講習会

10type (型束縛手続き)• いつのまにか Fortran も「オブジェクト志向」に。

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

2024/9/6

FDPS講習会

11type (メンバー関数の文法)
モジュールstudentmoduleの定義
module studentmodule
type, public:: studentcharacter(32) nameinteger age
メンバー関数の宣言部
contains
procedure :: print
end type
メンバー関数の実装部
contains
subroutine print(self)class(student) selfwrite(*,*) self%age
end
end
2024/9/6

メイン関数の定義
program mainuse studentmodule
type (student) a
a%name="Sato"a%age=18
call a%print
end
Fortran でもオブジ
ェクト志向
関数のオーバーロード、演算子のオーバ
ーロードができる (ベ
クトル型を定義して、ベクトル同士の加算とかする演算子を定義できる) (FDPS 側で提供してます)

FDPS講習会

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

2024/9/6

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次元ベクトル型。
2024/9/6

FDPS講習会

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

2024/9/6

FDPS講習会

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

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

FDPS講習会

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

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

FDPS講習会

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

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

2024/9/6

FDPS講習会

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

2024/9/6
2

FDPS講習会

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

2024/9/6
20

FDPS講習会

20