fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文...

24
Fortranプログラミング入門 関根 晃太 -外部副プログラム-

Upload: others

Post on 03-Apr-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

Fortranプログラミング入門

関根 晃太

-外部副プログラム-

Page 2: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

副プログラム

副プログラムとは… ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない ・Fortranには関数とサブルーチンがある プログラムにバグが出にくい! バグが出ても,エラーになる部分が限定される!

P-1

Page 3: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

プログラム単位

Fortranのプログラムを構成する基本的な構成要素を プログラム単位と呼ぶ. ・主プログラム program文で始まる.一つのプログラムに必ず一つ. ・外部副プログラム 現在はモジュールで代替.様々な主プログラムから 呼び出せる副プログラム. ・モジュール(Fortran90から追加) 変数や外部副プログラムなどをまとめたもの. P-2

Page 4: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

プログラム単位

・主プログラム(program文) 内部関数 内部サブルーチン ・外部副プログラム 外部関数 外部サブルーチン ・モジュール

P-3

今回はこれ!! 現在は推奨されていない!!

Page 5: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

外部副プログラム

内部副プログラムとは… ・主プログラムの中に記述する副プログラム ・内部副プログラムが記述してある主プログラム以外 からは利用できない. ・主プログラムと変数が共有される 外部副プログラムとは… ・program文の外に(別ファイルにも)記述する. ・いろいろな主プログラムに利用できる. ・主プログラムと変数が共有されない P-4

Page 6: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

外部関数

program プログラム名 宣言文 実行文 stop end program プログラム名 function 関数名(引数1,・・・) 宣言文 実行文 end function 関数名

P-5

主プログラムは終わり

主プログラムの外に 書いたら外部関数となる!!

Page 7: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

外部サブルーチン

program プログラム名 宣言文 実行文 stop end program プログラム名 subroutineサブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名

P-6

主プログラムは終わり

サブルーチンも 同様に…

Page 8: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

external文

☆文法 外部関数の戻り値の型, external 外部関数名 ・外部関数を使用する際に必要. ・現在は非推奨な書き方(interface文を推奨)!! program examp real(8), external :: expfunc ・・・ end program examp function expfunc(・・・) result(res) real(8) :: res ・・・ end function

P-7

外部関数expfuncの使用を宣言! real(8)はexpfuncの戻り値の型

外部関数(end programの後に書かれる) expfuncの戻り値の型.これが上のexternalのreal(8)と一致!

外部サブルーチンには必要ない!!

Page 9: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

例題1

rを倍精度実数型の変数とし,適当に値を代入する.そのとき,rを半径とする球の体積を計算する外部関数と外部サブルーチンを作成せよ.

P-8

Page 10: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

例題1

P-9

program examp1 implicit none real(8) :: r real(8) :: V real(8), external :: volfunc r = 1d0 V = volfunc(r) write(*,*) V stop end program examp1 function volfunc(r) result(V) real(8), intent(in) :: r real(8) :: pi = acos(-1d0) real(8) :: V V = 4d0/3d0*pi*r**3 end function volfunc

外部関数

外部関数volfuncの使用を宣言! real(8)はvolfuncの戻り値の型

外部関数volfuncの使用!

program文の外にvolfuncを書くと 外部関数になる

Page 11: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

例題1

P-10

program examp1 implicit none real(8) :: r real(8) :: V r = 1d0 call volsub(r,V) write(*,*) V stop end program examp1 subroutine volsub(r,V) real(8), intent(in) :: r real(8) :: pi = acos(-1d0) real(8), intent(out) :: V V = 4d0/3d0*pi*r**3 end subroutine volsub

外部サブルーチン

外部サブルーチンの場合external文は必要なし!!

program文の外にvolsubを書くと 外部サブルーチンになる

Page 12: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

例題1 : 内部関数と外部関数の比較

P-11

program examp1 implicit none real(8) :: r real(8) :: V real(8), external :: volfunc r = 1d0 V = volfunc(r) write(*,*) V stop end program examp1 function volfunc(r) result(V) real(8), intent(in) :: r real(8) :: pi = acos(-1d0) real(8) :: V V = 4d0/3d0*pi*r**3 end function volfunc

外部関数 program examp1 implicit none real(8) :: r real(8) :: V r = 1d0 V = volfunc(r) write(*,*) V stop contains function volfunc(r) result(V) real(8), intent(in) :: r real(8) :: pi = acos(-1d0) real(8) :: V V = 4d0/3d0*pi*r**3 end function volfunc end program examp1

内部関数

Page 13: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

例題1 : 内部関数と外部関数の比較

P-12

program examp1 implicit none real(8) :: r real(8) :: V real(8) :: pi = acos(-1d0) real(8), external :: volfunc r = 1d0 V = volfunc(r) write(*,*) V stop end program examp1 function volfunc(r) result(V) real(8), intent(in) :: r real(8) :: V V = 4d0/3d0*pi*r**3 end function volfunc

外部関数 program examp1 implicit none real(8) :: r real(8) :: V real(8) :: pi = acos(-1d0) r = 1d0 V = volfunc(r) write(*,*) V stop contains function volfunc(r) result(V) real(8), intent(in) :: r real(8) :: V V = 4d0/3d0*pi*r**3 end function volfunc end program examp1

内部関数

関数の中で宣言していたpiを消して, 主プログラムでpiを宣言すると…?

Page 14: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

例題1 : 内部関数と外部関数の比較

P-13

program examp1 implicit none real(8) :: r real(8) :: V real(8) :: pi = acos(-1d0) real(8), external :: volfunc r = 1d0 V = volfunc(r) write(*,*) V stop end program examp1 function volfunc(r) result(V) real(8), intent(in) :: r real(8) :: V V = 4d0/3d0*pi*r**3 end function volfunc

外部関数 program examp1 implicit none real(8) :: r real(8) :: V real(8) :: pi = acos(-1d0) r = 1d0 V = volfunc(r) write(*,*) V stop contains function volfunc(r) result(V) real(8), intent(in) :: r real(8) :: V V = 4d0/3d0*pi*r**3 end function volfunc end program examp1

内部関数

関数の中で宣言していたpiを消して, 主プログラムでpiを宣言すると…?

ERROR… OK!

主プログラムと 変数を共有しない…

主プログラムと 変数を共有する!!

※プログラム単位が1つ ※プログラム単位が2つ

Page 15: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

common文

☆文法 common /ブロック名/ 変数1, ・・・ ・変数をプログラム単位をまたいで利用できるようにする ・現在は非推奨な書き方(module文を推奨)!! program examp real(8) :: pi common /pidata/ pi pi = acos(-1) ・・・ end program examp subroutine expsub(・・・) real(8) :: pi common /pidata/ pi end function

P-14

変数piを共有できるように宣言. ブロック名は個人で決められる!!

ブロック名とpiをcommon文で書くことにより, 主プログラムのpiと関連付けられる!!

Page 16: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

例題2

rを倍精度実数型の変数とし,適当に値を代入する.そのとき,rを半径とする球の体積を計算する外部関数と外部サブルーチンを作成せよ.ただし,piは主プログラムで値を代入し,common文で値を共有せよ.

P-15

Page 17: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

program examp2 implicit none real(8) :: r real(8) :: V real(8) :: pi real(8),external :: volfunc common /pidata/ pi pi = acos(-1d0) r = 1d0 V = volfunc (r) write(*,*) V stop end program examp2 function volfunc(r) result(V) real(8), intent(in) :: r real(8) :: pi real(8) :: V common /pidata/ pi V = 4d0/3d0*pi*r**3 end function volfunc

例題2

P-16

変数piを共有できるように宣言. 主プログラムで変数piに値を代入!!

主プログラムで値を代入したpiを利用!!

Page 18: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

例題2

P-17

program examp2 implicit none real(8) :: r real(8) :: V real(8) :: pi common /pidata/ pi pi = acos(-1d0) r = 1d0 call volsub(r,V) write(*,*) V stop end program examp2 subroutine volsub(r,V) real(8), intent(in) :: r real(8) :: pi real(8), intent(inout) :: V common /pidata/ pi V = 4d0/3d0*pi*r**3 end subroutine volsub

変数piを共有できるように宣言. 主プログラムで変数piに値を代入!!

主プログラムで値を代入したpiを利用!!

Page 19: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

分割コンパイル

プログラム単位ごとにファイルを分けられる. この場合コンパイルは… gfortran bbb.f90 aaa.f90 必要なファイルを全部書く!! P-18

aaa.f90 program aaa implicit none ・・・ stop end program aaa

bbb.f90 function bbb(・・・) ・・・ end function bbb subroutine ccc(・・・) ・・・ end subroutine ccc

Page 20: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

例題3

rを倍精度実数型の変数とし,適当に値を代入する.そのとき,rを半径とする球の体積を計算する外部関数を

作成せよ.ただし,外部関数は主プログラムと別のファイルに保存せよ.

P-19

Page 21: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

例題3

P-20

program examp2 implicit none real(8) :: r real(8) :: V real(8) :: pi common /pidata/ pi pi = acos(-1d0) r = 1d0 call volsub(r,V) write(*,*) V stop end program examp2

subroutine volsub(r,V) real(8), intent(in) :: r real(8) :: pi real(8), intent(inout) :: V common /pidata/ pi V = 4d0/3d0*pi*r**3 end subroutine volsub

examp3.f90 ex3func.f90

gfortran ex3func.f90 examp3.f90 コンパイル

Page 22: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

課題1

i,j,k,l,m,nを整数型の変数で宣言し,i,j,k,lに適当な値を代入する.そのとき, を満たすm,nを返す外部サブルーチンbunnsuuを作成せよ.ただし,bunnsuuと主プログラムはファイルを別に作成せよ.

P-21

Page 23: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

課題2

nを整数型xを倍精度実数型とする.そのとき,引数nとxを入力引数とし,指数関数のテイラー展開 を計算する外部関数myexpを作成せよ.ただし,myexpと主プログラムはファイルを別に作成せよ.

P-22

Page 24: Fortranプログラミング入門...subroutine サブルーチン名 (引数1,・・・) 宣言文 実行文 end subroutine サブルーチン名 P-6 主プログラムは終わり

エクストラ課題1

nを整数型xを倍精度実数型とする.そのとき,引数nとxを入力引数とし,指数関数のテイラー展開 を計算する外部関数myiexpを作成せよ.ただし,myiexpと主プログラムはファイルを別に作成せよ.

P-23