mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages
※2018年9月15日より非力な環境でサーバを運用しているため、各ページの表示に時間がかかる場合があります。ご了承ください。(改良の予定あり)

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Fortran - 1次元配列各要素の逆数平均(Rosseland Mean)の計算!

[ プログラミング, 数学 ] [ Fortran ]

こんばんは。

Fortran 95 で1次元配列の各要素の逆数平均(Rosseland Mean)を計算してみました。

0. 前提条件

  • LMDE 3 (Linux Mint Debian Edition 3; 64bit) での作業を想定。
  • GCC 6.3.0 (GFortran 6.3.0) でのコンパイルを想定。

1. ソースコードの作成

  • 1次元配列はソースコード内で直接設定している。
rosseland_mean.f95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
program rosseland_mean
  implicit none
  real(8) :: a(3) = (/1.0_8, 2.0_8, 3.0_8/)

  write (*,*) rmean(a)

  stop
contains
  ! Rosseland-mean 計算
  !
  ! :param  integer x(:)
  ! :return read(8)
  real(8) function rmean(x)
    implicit none
    real(8), intent(IN) :: x(:)  ! 形状仮定配列

    rmean = size(x) / sum(1.0_8 / x)
  end function rmean
end program rosseland_mean

以下は、内部副プログラムではなく、外部副プログラム(interface)を使用するバージョン。

rosseland_mean_2.f95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
!****************************************************
! 1次元配列の各要素の逆数平均(Rosseland mean)を計算
!
! date          name            version
! 2018.08.20    mk-mode.com     1.00 新規作成
!
! Copyright(C) 2018 mk-mode.com All Rights Reserved.
!****************************************************
!
program rosseland_mean
  implicit none
  real(8) :: a(3) = (/1.0_8, 2.0_8, 3.0_8/)
  interface
    real(8) function rmean(x)
      real(8) :: x(:)  ! 形状仮定配列
    end function rmean
  end interface

  write (*,*) rmean(a)

  stop
end program rosseland_mean

! Rosseland-mean 計算
!
! :param  integer x(:)
! :return read(8)
real(8) function rmean(x)
  implicit none
  real(8), intent(IN) :: x(:)  ! 形状仮定配列

  rmean = size(x) / sum(1.0_8 / x)
end function rmean

2. ソースコードのコンパイル

1
2
3
$ gfortran -o rosseland_mean rosseland_mean.f95

$ gfortran -o rosseland_mean_2 rosseland_mean_2.f95
  • interface 版の rosseland_mean_2 では、引数 x に対して INTENT がミスマッチしている旨の警告が出力されるかもしれないが、問題ない。

3. 動作確認

1
2
$ ./rosseland_mean
   1.6363636363636365
  • rosseland_mean_2 も結果は同じ。

以上、

プログラミング, 数学 Fortran



« Fortran - 階乗の計算! Fortran - フィボナッチ数列の計算! »

Comments