====== FORTRAN入門 ====== ====== Fortran 90 ====== ===== コンパイルと実行 ===== * テキストエディタでソースプログラムを作成し、ソースプログラムを、''f90''という拡張子を持ったファイル名、すなわち''○○○○.f90''のような名前で保存する。 * ターミナルで $ g95 ○○○○.f90 -o △△△△ と入力することにより''△△△△''という名前のプログラムが作られる。 (''$''自身は入力しない。) * ターミナルで $ ./△△△△ と入力することにより''△△△△''という名前のプログラムを実行できる。 (''$''自身は入力しない。''./''に注意) * [[数値積分]] ===== FORTRAN90の書式 ===== PROGRAM EXAMPLE ! PROGRAM 文   IMPLICIT NONE ! IMPLICIT 文   INTEGER, PARAMETER:: IMAX = 10 ! 定数(整定数)宣言   INTEGER:: I ! 変数(整数変数)宣言   REAL(8), DIMENSION(0:IMAX):: DD ! 配列(実数配列)宣言   REAL(8):: D, DMAX = 0.D0 ! 変数(実数変数)初期化 ! コメント   READ (*, *) DD ! 入力   DO I = 0, IMAX ! DO 文     D = DD(I) ! 代入文     IF (D > DMIN) THEN ! IF 文       DMAX = D ! 字下げ     END IF ! END IF文     PRINT "(I4, 3E12.5)", I, D, & ! 書式文字列による書式付出力     &     DMIN, DMAX ! 継続行   END DO ! END DO文   PRINT *, 'MAXIMUM VALUE = ', DMAX ! 出力   STOP ! STOP文 END PROGRAM EXAMPLE ! END PROGRAM文 ===== 定数と変数 ===== | 定数 | 整定数 | | 絶対値が2147483647以下の整数 | -10 200 -123456 | | 定数 | 実定数 | F形式 | 有効桁数約6桁の実数 | -10.0 3.14159 .00153 | | | | E形式 | 有効桁数約6桁の実数 | 3.14159E0 15.3E-3 | | | | D形式 | 有効桁数約16桁の実数 | 3.141592654D0 | | 変数 | 整変数 | INTEGER | I,J,K,L,M,Nで始めるのが望ましい | II KJ J123 M123 | | | 実変数 | REAL(8) | A-H, O-Zで始めるのが望ましい | AA CC D123 B123 | ===== 例題 1 ===== program prog1 print *, 'Hello, World' stop end program prog1 program prog1 print *, 'Hello, World (1)' print '(A)', 'Hello, World (2)' print '(A8)', 'Hello, World (3)' print '(A)', 'Hello, World' print '(A$)', 'Hello, ' print '(A)', 'World' stop end program prog1 print *, 'Hello, World' print '(A)', 'Hello, World' write (*, *) 'Hello, World' write (*, '(A)') 'Hello, World' ===== 例題 2 ===== program prog2 implicit none real(8):: xvalue write (*, '(A)', advance = 'no') 'Input X: ' read (*, *) xvalue write (*, '("X = ", E15.7)') xvalue stop end program prog2 program prog2 implicit none real(8):: xvalue print '(A$)', 'Input X: ' read (*, *) xvalue print '("X = ", E15.7)', xvalue stop end program prog2 ===== 例題 3 ===== program prog3 implicit none integer:: counter real(8):: xvalue do counter = 1, 5 xvalue = 1./dble(counter) write (*, *) counter, xvalue end do stop end program prog3 program prog3 implicit none integer:: counter real(8):: xvalue do counter = 1, 5 xvalue = 1./dble(counter) print *, counter, xvalue end do stop end program prog3 ===== 例題 4 ===== program prog4 implicit none integer, parameter:: IMAX = 10 integer:: i, isum real(8):: dsum isum = 0 dsum = 0.d0 do i = 1, IMAX isum = isum + i dsum = dsum + dble(i) write (*, *) i, isum, dsum end do write (*, *) 'ISUM = ', isum write (*, *) 'DSUM = ', dsum write (*, *) '1/ISUM = ', 1/isum write (*, *) '1.D0/DSUM = ', 1.d0/dsum stop end program prog4 program prog4 implicit none integer, parameter:: IMAX = 10 integer:: i, isum real(8):: dsum isum = 0 dsum = 0.d0 do i = 1, IMAX isum = isum + i dsum = dsum + dble(i) print *, i, isum, dsum end do print *, 'ISUM = ', isum print *, 'DSUM = ', dsum print *, '1/ISUM = ', 1/isum print *, '1.D0/DSUM = ', 1.d0/dsum stop end program prog4 ===== 例題 5 ===== program prog5 implicit none integer, parameter:: IMAX = 10 integer:: i real(8):: r do i = 1, IMAX call random_number(r) write (*, *) i, r end do stop end program prog5 ===== 例題 6 ===== program prog6 implicit none integer:: N, M !!! M <- N - 1 integer:: i !!! Counter real(8), dimension(:), allocatable:: r write (*, '(A)', advance = 'no') 'N = ' read (*, *) N write (*, *) 'N = ', N M = N - 1 allocate (r(0:M)) call random_seed() call random_number(r) do i = 0, M write (*, *) i, r(i) end do deallocate (r) stop end program prog6 ===== 例題 7 ===== program prog7 implicit none integer:: N, M integer:: i, idummy real(8):: dmini, trial real(8), dimension(:), allocatable:: r read (*, *) N write (*, *) 'Number of Data = ', N M = N - 1 allocate (r(0:M)) do i = 0, M read (*, *) idummy, r(i) end do ! dmini = r(0) do i = 1, M trial = r(i) if (trial <= dmini) then dmini = trial write (*, '(A10)', advance = 'no') 'CHANGED: ' write (*, '(I8, 2E15.7)') i, trial, dmini else write (*, '(A10, I8, 2E15.7)') ' ', i, trial, dmini end if end do deallocate (r) write (*, *) 'Minimum Value = ', dmini stop end program prog7 ===== 例題 8 ===== program prog8 implicit none integer, parameter:: N = 100, M = N - 1 real(8):: a, b, h real(8), dimension(0:M):: x, y, z real(8):: getvalue integer:: i a = 0.d0 b = 1.d0 h = (b - a)/dble(N) do i = 0, M x(i) = a + h*dble(i) call setvalue(x(i), y(i)) z(i) = getvalue(x(i)) end do do i = 0, M write (*, '(3E15.7)') x(i), y(i), z(i) end do stop end program prog8 ! subroutine setvalue(xval, yval) implicit none real(8):: xval, yval yval = sin(xval) return end subroutine setvalue ! function getvalue(xval) result(yval) implicit none real(8):: xval, yval yval = exp(-xval) return end function getvalue program prog10 implicit none integer, parameter:: NX = 511, NY = 511 real(8):: a = -5.D0, b = 5.D0, c = -5.D0, d = 5.D0 real(8):: h, zmin, zmax real(8), dimension(0:NX):: x real(8), dimension(0:NY):: y real(8), dimension(0:NX, 0:NY):: z integer, dimension(0:NX, 0:NY):: iz real(8):: getvalue integer:: i, j ! h = (b - a)/dble(NX) do i = 0, NX x(i) = a + h*dble(i) end do ! h = (d - c)/dble(NY) do j = 0, NY y(j) = c + h*dble(j) end do do i = 0, NX do j = 0, NY z(i, j) = getvalue(x(i), y(j)) end do end do ! zmin = minval(z) zmax = maxval(z) do i = 0, NX do j = 0, NY iz(i, j) = int(255.0*(z(i, j) - zmin)/(zmax - zmin)) end do end do do j = 0, NY do i = 0, NX print '(I4$)', iz(i, j) end do print '(A)', ' ' end do ! stop end program prog10 ! function getvalue(xval, yval) result(zval) implicit none real(8):: xval, yval, zval zval = exp(-(xval*xval + yval*yval)) return end function getvalue x=Aからx=Bまでの区間をN分割し、関数値 f(x) を出力するプログラムを作成する。 - $\begin{array}{*{20}c}{f\left( x \right) = \sqrt x ,} & {\left( {0 \le x \le 10} \right)}\end{array}$ - $\begin{array}{*{20}c}{f\left( x \right) = \log |x+1| ,} & {\left( {-1 < x \le 10} \right)}\end{array} $ - $\begin{array}{*{20}c}{f\left( x \right) = x^2{\rm e}^{-x} ,} & {\left( {0 \le x \le 6} \right)}\end{array} $ - $\begin{array}{*{20}c}{f\left( x \right) = x^2{\rm e}^{-x^2} ,} & {\left( {-4 \le x \le 4} \right)}\end{array} $ - $\begin{array}{*{20}c}{f\left( x \right) = \displaystyle\frac{\sin^2 x}{x^2} ,} & {\left( {-4\pi \le x \le 4\pi} \right)}\end{array} $ ===== 簡易版 例題8 ===== program prog81 implicit none integer, parameter:: N = 100 real(8):: a = 0.D0, b = 1.D0 real(8):: h real(8), dimension(0:N):: x, y real(8):: getvalue integer:: i ! h = (b - a)/dble(N) ! do i = 0, N x(i) = a + h*dble(i) end do ! do i = 0, N y(i) = getvalue(x(i)) end do ! do i = 0, N print '(2E15.7)', x(i), y(i) end do ! stop end program prog81 ! function getvalue(xval) result(yval) implicit none real(8):: xval, yval yval = exp(-xval) return end function getvalue プログラム「moge_exec」に、ファイル「hoge_in.data」から入力を読み込んで、出力をファイル「hage_out.data」に書き込むには $ ./moge_exec < hoge_in.data > hage_out.data または $ cat hoge_in.data | ./moge_exec > hage_out.data とする。 ===== 固定サイズ配列型 例題7 ===== program prog71 implicit none integer, parameter:: N = 100, M = N - 1 real(8), dimension(0:M):: r integer:: i, idummy real(8):: dmini, trial ! do i = 0, M read (*, *) idummy, r(i) end do ! dmini = r(0) do i = 1, M trial = r(i) if (trial <= dmini) then dmini = trial print '(A10$)', 'CHANGED: ' print '(I8, 2E15.7)', i, trial, dmini else print '(A10, I8, 2E15.7)', '', i, trial, dmini end if end do ! print *, 'Minimum Value = ', dmini stop end program prog71 prog5に - ''call random_seed()'' を加えて実行。 - 配列を使う real(8):: r → real(8), dimension(IMAX):: r r → r(i) - ''call random_number(r)'' に変更して場所も''do''の前に移動 - print '(A$)', 'Input N: ' read (*, *) n を追加 * ''integer:: i'' を ''integer:: i, n'' に変更 * ''do i = 1, IMAX'' を ''do i = 1, n'' に変更 ===== 最終的な例題5 ===== program prog55 implicit none integer, parameter:: IMAX = 10 integer:: i, n, m real(8), dimension(0:IMAX):: r ! r(0), r(1), ..., r(10) call random_seed() print '(A$)', 'Input N: ' read (*, *) n m = n - 1 call random_number(r) do i = 0, m print *, i, r(i) end do stop end program prog55 ===== 例題 2 ===== ===== 例題 3 ===== ===== 例題 4 ===== ===== 例題 5 ===== program prog5 implicit none integer, parameter:: IMAX = 10 integer:: i real(8):: r do i = 1, IMAX call random_number(r) print *, i, r end do stop end program prog5 ===== 例題 6 ===== program prog6 implicit none integer:: N, M !!! M <- N - 1 integer:: i !!! Counter real(8), dimension(:), allocatable:: r print '(A$)', 'N = ' read (*, *) N print *, 'N = ', N M = N - 1 allocate (r(0:M)) call random_seed() call random_number(r) do i = 0, M print *, i, r(i) end do deallocate (r) stop end program prog6 ===== 例題 7 ===== program prog7 implicit none integer:: N, M integer:: i, idummy real(8):: dmini, trial real(8), dimension(:), allocatable:: r read (*, *) N write (*, *) 'Number of Data = ', N M = N - 1 allocate (r(0:M)) do i = 0, M read (*, *) idummy, r(i) end do ! dmini = r(0) do i = 1, M trial = r(i) if (trial <= dmini) then dmini = trial print '(A10$)', 'CHANGED: ' print '(I8, 2E15.7)', i, trial, dmini else print '(A10, I8, 2E15.7)', '', i, trial, dmini end if end do deallocate (r) print *, 'Minimum Value = ', dmini stop end program prog7 ===== 例題 8 ===== program prog8 implicit none integer, parameter:: N = 100, M = N - 1 real(8):: a, b, h real(8), dimension(0:M):: x, y, z real(8):: getvalue integer:: i a = 0.d0 b = 1.d0 h = (b - a)/dble(N) do i = 0, M x(i) = a + h*dble(i) call setvalue(x(i), y(i)) z(i) = getvalue(x(i)) end do do i = 0, M print '(3E15.7)', x(i), y(i), z(i) end do stop end program prog8 subroutine setvalue(xval, yval) implicit none real(8):: xval, yval yval = sin(xval) return end subroutine setvalue function getvalue(xval) result(yval) implicit none real(8):: xval, yval yval = exp(-xval) return end function getvalue