技術メモ

技術メモ

This project is maintained by kino-3

文法(数値計算用)

Fortran90 の概要メモ 「数値計算のための Fortran90/95 プログラミング 第1版」 3.8節まで

gfortran によるコンパイル(省略版)

gfortran hoge.f90 fuga.f90 # 依存関係に注意すること
./a.exe # 実行ファイルへのパスを書く

コメント

call hoge() ! 複数行のコメントは存在しない

変数名

主プログラム (program ~ end)

program hoge        ! プログラム名は省略してもよい(書いたほうが良い)
    implicit none   ! 暗黙の変数の型に関する規約を無効にするため, 変数宣言する前に使用する。
    integer i       ! 宣言文を実行文よりも上に書く
    i = 0           ! 代入前の変数は不定値        
    write(*,*) i
end program hoge

ループ処理

do - enddo

integer counter         ! 変数宣言必要
do counter = 1, 100     ! 制御変数(do変数)はかならず整数型変数を用いる。制御変数を省略して `do` のみ書いた場合は無限ループとなる。
    ! counter は 1, 2, ..., 100
    ! 内部で制御変数を書き換えてはならない。
    ! do counter = 1,100,2 -> 1,3,5,...,99
    ! do counter = 100,1,-2 -> 100,98,96,...,2
enddo

離脱処理

条件式

if (論理式) then
    !
else if (論理式) then
    !
else
    !
endif

変数型

変数宣言

入出力

基本

ファイル操作

integer :: ina, inb, iv, is, iost, fi = 10, fo = 11
                                        ! 0以上の整数。数字は5,6 は標準入出力なので良くない。
open(fi, file = "inputFilename", action = "read", iostat = is)
                                        ! action はオプション(無指定の場合は"readwrite")
                                        ! iostat はオプション(openに成功するとisには0が代入される。失敗すると非0が代入される。)
open(fo, file = "outputFilename", position = "append")
                                        ! ファイルがあれば上書き。なければ新規作成。
                                        ! append は追記するためのオプション
read(fi, *) ina, inb                    ! 並び出力でファイルを読み込む(入力ファイルに合わせる)
do                                      ! 入力が何行あるかわからん時
    read(fi, *, iostat = iost) iv       
    if (iost < 0) exit                  ! 代入により終端に達するとiostは負になる。
endif      
close(fi)
write(fo,*) "hoge"                      ! 何回writeを呼び出してもよい。(追記される)
close(fo)

書式

ベクトルと行列

基本(配列の上下限が自明である)

副プログラム (programに対して)

program fuga use hoge ! module の使用宣言。使用するモジュールは先に定義する。 implicit none ! use はこれより上に書く。以下 end program 内で有効 integer v1, v2 real e1, e2 call hoge_sub(v1, v2) ! subroutineの呼び出し(実引数を参照渡しする) v1 = hoge_func(e1, e2) ! call 不要 end program fuga

#### subroutine の属性
- subroutine の局所変数の save 属性
    - `real, save :: i` とすると, subroutine 呼び出し後も変数が保存される。
    - `real :: i = 0` のように初期化した場合は自動的に save 属性となる。
        - 初期化は 1回目のsubroutine呼び出し時のみ有効で2回目以降は初期化されない。
        - 毎回初期化したいなら代入すべし。
    - 局所配列にも save 属性を与えることは可能
- subroutine の仮引数の intent 属性
```Fortran
subroutine hoge_sub2(a, b, c)
    real, intent(in) :: a, b    ! プログラム中で書き換え不可
    real, intent(out) :: c      ! プログラム中で代入必須(書き換えたいやつ)

モジュール副プログラムで配列を引数にする(function も同様)

module hoge implicit none contains subroutine fuga use params integer tmp(n) ends subroutine fuga end module hoge

#### 配列を返すモジュール関数
```Fortran
function hoge_func2(v) result(nv)
    real(8), intent(in) :: v(:)     ! 形状引継ぎ配列
    real(8) nv(size(v, 1))          ! 自動割付配列?
    nv = 2 * v
end function hoge_func2

モジュールによる変数の共有

グローバル変数モジュール(プログラム単位間で共有したい変数)

module global_params                    ! use global_params とかで使用宣言する
    implicit none
    integer, params :: global_i = 1     ! 定数なので書き換え不可能
    integer, save :: global_j           ! 書き換えて記憶させるやつは save 属性
end module global_params

その他文法