計算結果分析ソルバーの開発手順

概要

iRICでは、既存のCGNSファイルの計算結果を読み込み、分析(・加工)することができます。 分析結果は、新たな CGNS ファイルに書き出すことができます。 計算結果分析ソルバーの開発手順は、通常のソルバー開発手順と同様です ( ソルバーの開発手順 参照)。

ここでは、計算結果分析ソルバーをFORTRANで開発する例を説明します。

2つのCGNSファイルを扱い、計算結果の分析をするソルバーのソースコードの例を リスト 12 に示します。

リスト 12 複数CGNSファイルを扱ったソースコード(抜粋)
 1! (前略)
 2
 3! ファイルオープン、初期化
 4call cg_iric_open(cgnsfile, IRIC_MODE_MODIFY, fin1, ier)
 5
 6! (略)
 7
 8! 計算条件の読み込み等
 9call cg_iric_read_functionalsize(fin1, 'func', param_func_size, ier)
10
11! (略)
12
13!ファイルオープン、初期化(計算結果読み込み用)
14call cg_iric_open(param_inputfile, IRIC_MODE_READ, fin2, ier)
15
16! (略)
17
18! 計算結果の読み込み等
19call cg_iric_read_sol_count(fin2, solcount, ier)
20
21! (略)
22
23! 計算結果の分析等
24
25! (略)
26
27! 分析結果等の出力
28call cg_iric_write_sol_time(fin1, t, ier)
29
30! (略)
31
32! ファイルのクローズ
33call cg_iric_close(fin1, ier)
34call cg_iric_close(fin2, ier)
35
36! (後略)

既存のCGNSの計算結果をもとに、「魚の生息しやすさ」を算出するソルバーのソースコードを リスト 13 に示します。

リスト 13 既存のCGNSファイルを読み込み、分析するソルバーのソースコード
  1program SampleProgram2
  2  use iric
  3  implicit none
  4
  5  integer icount
  6  character(len=300) cgnsfile
  7
  8  integer:: fin1, fin2, ier, istatus
  9
 10  character(len=300) param_inputfile
 11  integer:: param_result
 12  character(len=100) param_resultother
 13  integer:: param_func_size
 14  double precision, dimension(:), allocatable:: param_func_param
 15  double precision, dimension(:), allocatable:: param_func_value
 16  character(len=100) resultname
 17
 18  integer:: isize, jsize
 19  double precision, dimension(:,:), allocatable:: grid_x, grid_y
 20  double precision, dimension(:,:), allocatable:: target_result
 21  double precision, dimension(:,:), allocatable:: analysis_result
 22  double precision:: tmp_target_result
 23  double precision:: tmp_analysis_result
 24
 25  integer:: i, j, f, solid, solcount, iter
 26  double precision:: t
 27
 28  icount = nargs()
 29  if (icount.eq.2) then
 30    call getarg(1, cgnsfile, istatus)
 31  else
 32    write(*,*) "Input File not specified."
 33    stop
 34  end if
 35
 36  ! CGNS ファイルのオープン
 37  call cg_iric_open(cgnsfile, IRIC_MODE_MODIFY, fin1, ier)
 38  if (ier /=0) STOP "*** Open error of CGNS file ***"
 39
 40  ! 計算条件を読み込む
 41  call cg_iric_read_string(fin1, 'inputfile', param_inputfile, ier)
 42  call cg_iric_read_integer(fin1, 'result', param_result, ier)
 43  call cg_iric_read_string(fin1, 'resultother', param_resultother, ier)
 44
 45  call cg_iric_read_functionalsize(fin1, 'func', param_func_size, ier)
 46  allocate(param_func_param(param_func_size), param_func_value(param_func_size))
 47  call cg_iric_read_functional(fin1, 'func', param_func_param, param_func_value, ier)
 48
 49  if (param_result .eq. 0) resultname = 'Depth(m)'
 50  if (param_result .eq. 1) resultname = 'Elevation(m)'
 51  if (param_result .eq. 2) resultname = param_resultother
 52
 53  ! 指定された CGNS ファイルから、格子を読み込む
 54  call cg_iric_open(param_inputfile, IRIC_MODE_READ, fin2, ier)
 55  if (ier /=0) STOP "*** Open error of CGNS file 2 ***"
 56
 57  ! 格子を読み込む
 58  call cg_iric_read_grid2d_str_size(fin2, isize, jsize, ier)
 59  allocate(grid_x(isize, jsize), grid_y(isize, jsize))
 60  call cg_iric_read_grid2d_coords(fin2, grid_x, grid_y, ier)
 61
 62  ! 読み込んだ格子を cgnsfile に出力する
 63  call cg_iric_write_grid2d_coords(fin1, isize, jsize, &
 64    grid_x, grid_y, ier)
 65
 66  ! 計算結果を読み込んで加工するためのメモリを確保
 67  allocate(target_result(isize, jsize), analysis_result(isize, jsize))
 68
 69  ! 計算結果を処理
 70  call cg_iric_read_sol_count(fin2, solcount, ier)
 71
 72  do solid = 1, solcount
 73    ! 計算結果を読み込み
 74    call cg_iric_read_sol_time(fin2, solid, t, ier)
 75    call cg_iric_read_sol_node_real(fin2, solid, resultname, &
 76      target_result, ier)
 77
 78    ! 読み込んだ計算結果をもとに、魚の生息しやすさを算出する。
 79    do i = 1, isize
 80      do j = 1, jsize
 81        tmp_target_result = target_result(i, j)
 82        do f = 1, param_func_size
 83          if ( &
 84            param_func_param(f) .le. tmp_target_result .and. &
 85            param_func_param(f + 1) .gt. tmp_target_result) then
 86            tmp_analysis_result = &
 87              param_func_value(f) + &
 88              (param_func_value(f + 1) - param_func_value(f)) / &
 89              (param_func_param(f + 1) - param_func_param(f)) * &
 90              (tmp_target_result - param_func_param(f))
 91          endif
 92        end do
 93        analysis_result(i, j) = tmp_analysis_result
 94      end do
 95    end do
 96
 97    ! 処理済みの計算結果を出力
 98    call cg_iric_write_sol_time(fin1, t, ier)
 99    call cg_iric_write_sol_node_real(fin1, 'fish_existence', analysis_result, ier)
100  end do
101
102  ! CGNS ファイルのクローズ
103  call cg_iric_close(fin1, ier)
104  call cg_iric_close(fin2, ier)
105  stop
106end program SampleProgram2