Steps of developing a calculation result analysis program

Abstract

Calculation result analysis program is a program that reads calculation result of a soler from a CGNS file, execute analysis or modify calculation result. Analysis result or modified calculation results can be output to another CGNS file.

The steps of developing a calculation result analysis program is basically the same to that of a solver (See Steps of developing a solver). The difference is that it handles multiple CGNS files.

List 12 shows the source code of sample calculation result analysis program.

List 12 Source code that handles multiple CGNS files (abstract)
 1! (abbr.)
 2
 3! File opening and initialization
 4call cg_iric_open(cgnsfile, IRIC_MODE_MODIFY, fin1, ier)
 5
 6! (abbr.)
 7
 8! Reading calculation condition etc.
 9call cg_iric_read_functionalsize(fin1, 'func', param_func_size, ier)
10
11! (abbr.)
12
13! File opening and initialization for reading calculation result
14call cg_iric_open(param_inputfile, IRIC_MODE_READ, fin2, ier)
15
16! (abbr.)
17
18! Reading calculation result etc.
19call cg_iric_read_sol_count(fin2, solcount, ier)
20
21! (abbr.)
22
23! Calculation result analysis code
24
25! (abbr.)
26
27! Outputting analysis result
28call cg_iric_write_sol_time(fin1, t, ier)
29
30! (abbr.)
31
32! Closing files
33call cg_iric_close(fin1, ier)
34call cg_iric_close(fin2, ier)
35
36! (abbr.)

List 13 shows the source code the analysis program that reads calculation result from CGNS file, and executes fish habitat analysis.

List 13 Source code that reads calculation result from CGNS file and output analysis result
  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  ! Opening CGNS file
 37  call cg_iric_open(cgnsfile, IRIC_MODE_MODIFY, fin1, ier)
 38  if (ier /=0) STOP "*** Open error of CGNS file ***"
 39
 40  ! Read analysis conditions
 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  ! Read grid from the specified CGNS file
 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  ! Reads grid
 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  ! Output the grid to CGNS file
 63  call cg_iric_write_grid2d_coords(fin1, isize, jsize, &
 64    grid_x, grid_y, ier)
 65
 66  ! Allocate memory used for analysis
 67  allocate(target_result(isize, jsize), analysis_result(isize, jsize))
 68
 69  ! Start analysis of calculation results
 70  call cg_iric_read_sol_count(fin2, solcount, ier)
 71
 72  do solid = 1, solcount
 73    ! Read calculation result
 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    ! Do fish habitat analysis
 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    ! Output analysis result
 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  ! Close CGNS files
103  call cg_iric_close(fin1, ier)
104  call cg_iric_close(fin2, ier)
105  stop
106end program SampleProgram2