fortranプログラミング入門...副プログラム 副プログラムとは …...

27
Fortranプログラミング入門 関根 晃太 -モジュール-

Upload: others

Post on 05-Oct-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

Fortranプログラミング入門

関根 晃太

-モジュール-

Page 2: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

副プログラム

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

P-1

Page 3: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

プログラム単位

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

Page 4: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

プログラム単位

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

P-3

今回はこれ!!

Page 5: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

モジュールとは

モジュールとは,関数,サブルーチン,共有変数をまとめて宣言する一つのプログラム単位.Fortran90で追加された目玉機能の一つ.

P-4

Fortran90以降では,モジュール推奨!!

Page 6: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

モジュールとは

module モジュール名 implicit none 宣言文 contains 関数/サブルーチンの宣言 end module モジュール名

P-5

暗黙の型宣言をオフに!

共有させたい変数をここに宣言!!

関数やサブルーチンの書き方は 今まで通り!!

Page 7: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

use文

☆文法 use モジュール名 ・モジュールを使いたいプログラム単位の最初に書く!! ・変数の参照の制限や別名での参照方法がある(今回はなし!!) module testmod ・・・ end module testmod program examp use testmod implicit none ・・・・ end examp

P-6

モジュールの宣言は使用するプログラムの前 (別ファイルも含め)に行う

use文はimplicit noneの前に書く!! use文で使用するモジュールを指定!

Page 8: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

別ファイルを利用するモジュールのコンパイル

コンパイルは必ず使用するモジュールが先!! gfortran testmod.f90 main.f90

P-7

module testmod implicit none ・・・ contains ・・・ end module

testmod.f90

program main use testmod implicit none ・・・ stop end program main

main.f90

Page 9: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

例題1

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

P-8

Page 10: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

例題1

P-9

module volmod implicit none contains function dvolfunc(r) result(V) real(8), intent(in) :: r real(8) :: pi = acos(-1d0) real(8) :: V V = 4d0/3d0*pi*r**3 end function dvolfunc subroutine dvolsub(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 dvolsub end module volmod

volmod.f90 program vol use volmod implicit none real(8) :: r, V r = 2d0 V = dvolfunc(r) write(*,*) V call dvolsub(r,V) write(*,*) V stop end program vol

main.f90

Page 11: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

例題1

P-10

module volmod implicit none contains function dvolfunc(r) result(V) real(8), intent(in) :: r real(8) :: pi = acos(-1d0) real(8) :: V V = 4d0/3d0*pi*r**3 end function dvolfunc subroutine dvolsub(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 dvolsub end module volmod

volmod.f90 program vol use volmod implicit none real(8) :: r, V r = 2d0 V = dvolfunc(r) write(*,*) V call dvolsub(r,V) write(*,*) V stop end program vol

main.f90

piについていろいろ検討してみる!

Page 12: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

例題1

P-11

module volmod implicit none contains function dvolfunc(r) result(V) real(8), intent(in) :: r real(8) :: pi = acos(-1d0) real(8) :: V V = 4d0/3d0*pi*r**3 end function dvolfunc subroutine dvolsub(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 dvolsub end module volmod

volmod.f90 program vol use volmod implicit none real(8) :: r, V r = 2d0 V = dvolfunc(r) write(*,*) V call dvolsub(r,V) write(*,*) V write(*,*) pi stop end program vol

main.f90

piについていろいろ検討してみる!

piは参照できない…

Error…

Page 13: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

例題1

P-12

module volmod implicit none real(8) :: pi = acos(-1d0) contains function dvolfunc(r) result(V) real(8), intent(in) :: r real(8) :: V V = 4d0/3d0*pi*r**3 end function dvolfunc subroutine dvolsub(r,V) real(8), intent(in) :: r real(8), intent(out) :: V V = 4d0/3d0*pi*r**3 end subroutine dvolsub end module volmod

volmod.f90 program vol use volmod implicit none real(8) :: r, V r = 2d0 V = dvolfunc(r) write(*,*) V call dvolsub(r,V) write(*,*) V write(*,*) pi stop end program vol

main.f90

piについていろいろ検討してみる!

piは参照できる!!

piは共有変数に!!

ここでpiを宣言!

Page 14: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

例題1

P-13

module volmod implicit none real(8) :: pi = acos(-1d0) contains function dvolfunc(r) result(V) real(8), intent(in) :: r real(8) :: V V = 4d0/3d0*pi*r**3 end function dvolfunc subroutine dvolsub(r,V) real(8), intent(in) :: r real(8), intent(out) :: V V = 4d0/3d0*pi*r**3 end subroutine dvolsub end module volmod

volmod.f90 program vol use volmod implicit none real(8) :: r, V r = 2d0 V = dvolfunc(r) write(*,*) V pi = 0d0 call dvolsub(r,V) write(*,*) V write(*,*) pi stop end program vol

main.f90

piについていろいろ検討してみる!

piが変更された ため間違った答 えを返す…

piは共有変数に!!

ここでpiを宣言!

piの値を変更

Page 15: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

例題1

P-14

module volmod implicit none real(8), parameter :: pi = acos(-1d0) contains function dvolfunc(r) result(V) real(8), intent(in) :: r real(8) :: V V = 4d0/3d0*pi*r**3 end function dvolfunc subroutine dvolsub(r,V) real(8), intent(in) :: r real(8), intent(out) :: V V = 4d0/3d0*pi*r**3 end subroutine dvolsub end module volmod

volmod.f90 program vol use volmod implicit none real(8) :: r, V r = 2d0 V = dvolfunc(r) write(*,*) V pi = 0d0 call dvolsub(r,V) write(*,*) V write(*,*) pi stop end program vol

main.f90

piについていろいろ検討してみる!

Error!!

piをparameter属性で宣言! (変更不可の属性) piはparameterで

あるため,変更し ようとするとError!

Page 16: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

課題1

i,j,k,l,m,nを整数型の変数で宣言し,i,j,k,lに適当な値を代入する.そのとき, を満たすm,nを返すサブルーチンをモジュールを利用し

て作成せよ.ただし,モジュールと主プログラムはファイルを別に作成せよ.

P-15

Page 17: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

課題2

xを倍精度実数型とする.そのとき,xを入力引数とし,指数関数のテイラー展開 を計算する関数mydexpをmyfuncモジュールに作成せよ.ただし,nは適切な項数で止まるようにせよ.モジュールと主プログラムはファイルを別に作成せよ.

P-16

Page 18: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

例題2

rを一次元配列の倍精度実数型の変数とし,適当に値を代入する.そのとき,rを半径とする球の体積を計算する関数とサブルーチンを例題1で書いたモジュールに追加せよ

P-17

Page 19: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

例題2

P-18

module volmod implicit none real(8), parameter :: pi = acos(-1d0) contains function dvolfunc(r) result(V) real(8), intent(in) :: r real(8) :: V V = 4d0/3d0*pi*r**3 end function dvolfunc function dmvolfunc(r) result(V) real(8), intent(in) :: r(:) real(8) :: V(size(r)) V = 4d0/3d0*pi*r**3 end function dmvolfunc (右に続く・・・)

subroutine dvolsub(r,V) real(8), intent(in) :: r real(8), intent(out) :: V V = 4d0/3d0*pi*r**3 end subroutine dvolsub subroutine dmvolsub(r,V) real(8), intent(in) :: r(:) real(8), intent(out) :: V(size(r)) V = 4d0/3d0*pi*r**3 end subroutine dmvolsub end module volmod

Page 20: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

例題2

P-19

module volmod implicit none real(8), parameter :: pi = acos(-1d0) contains function dvolfunc(r) result(V) real(8), intent(in) :: r real(8) :: V V = 4d0/3d0*pi*r**3 end function dvolfunc function dmvolfunc(r) result(V) real(8), intent(in) :: r(:) real(8) :: V(size(r)) V = 4d0/3d0*pi*r**3 end function dmvolfunc (右に続く・・・)

subroutine dvolsub(r,V) real(8), intent(in) :: r real(8), intent(out) :: V V = 4d0/3d0*pi*r**3 end subroutine dvolsub subroutine dmvolsub(r,V) real(8), intent(in) :: r(:) real(8), intent(out) :: V(size(r)) V = 4d0/3d0*pi*r**3 end subroutine dmvolsub end module volmod

配列の宣言は 内部関数のときと同じ!

配列の宣言は 内部関数のときと同じ!

関数/サブルーチン名は違うのにする!

Page 21: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

エクストラ課題1

xを一次元配列の倍精度実数型とする.そのとき,xを入力引数とし,指数関数のテイラー展開 を計算する関数mydmexpをmyfuncモジュールに追加せよ.ただし,nは適切な項数で止まるようにせよ.モジュールと主プログラムはファイルを別に作成せよ.

P-20

Page 22: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

個別名と総称名

Fortranの関数名には個別名と総称名がある!! 例えば… sin(x)はxの型がreal(8)でもcomplexでもOK!! このカラクリは… ・xがreal(8)のときのsin関数は別でdsin ・xがcomplexのときのsin関数は別にcsin とある.このときdsin, csinは個別名で,個別名の引数を 判断して適切な関数を呼び出すsinを総称名という.

P-21

Page 23: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

個別名と総称名

Fortranの関数名には個別名と総称名がある!! 例題2で作成したモジュールにはdvolfunc, dmvolfuncがある.これらは個別名であり,別の関数とみなされる.この関数について引数の違い(配列かどうか)を自動で見分けて適切な関数を呼び出す総称名関数volfuncをつくるには,interface文を使う!!

P-22

Page 24: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

interface文

☆文法 interface 総称名 module procedure 個別名1, 個別名1, ・・・ end interface 総称名 注意: interface文は総称名を定義する以外の機能もあり

P-23

Page 25: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

例題3

例題2で作成したモジュールの関数dvolfuncとdmvolfuncに総称名volfuncをつけ,サブルーチンdvolsubとdmvolsubに総称名volsubをつけよ.

P-24

Page 26: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

例題3

P-25

module volmod implicit none real(8), parameter :: pi = acos(-1d0) interface volfunc module procedure dvolfunc, dmvolfunc end interface volfunc interface volsub module procedure dvolsub, dmvolsub end interface volsub contains function dvolfunc(r) result(V) real(8), intent(in) :: r real(8) :: V V = 4d0/3d0*pi*r**3 end function dvolfunc (右に続く・・・)

function dmvolfunc(r) result(V) real(8), intent(in) :: r(:) real(8) :: V(size(r)) V = 4d0/3d0*pi*r**3 end function dmvolfunc subroutine dvolsub(r,V) real(8), intent(in) :: r real(8), intent(out) :: V V = 4d0/3d0*pi*r**3 end subroutine dvolsub subroutine dmvolsub(r,V) real(8), intent(in) :: r(:) real(8), intent(out) :: V(size(r)) V = 4d0/3d0*pi*r**3 end subroutine dmvolsub end module volmod

ここに追加!!

Page 27: Fortranプログラミング入門...副プログラム 副プログラムとは … ・プログラムを小さいプログラムに分割して使う機能 ・単独では実行出来ない

エクストラ課題2

エクストラ課題1で作成したモジュールmyfuncの中の関数mydexpとmydmexpに総称名myexpをつけよ.

P-26