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.

To handle multiple CGNS files at the same time, you should use different functions than those used in Steps of developing a solver (See List of subroutines). The names of functions for handling multiple CGNS files ends with "_mul_f", and the first argument is the file ID. You should call "cg_iric_initread_f" instead of "cg_iric_init_f" when initializing the CGNS file to be used by iRIClib.

List 12 shows the source code to handle multiple CGNS files.

List 12 Source code that handles multiple CGNS files (abstract)
 1! (abbr.)
 2
 3! File opening and initialization
 4call cg_open_f(cgnsfile, CG_MODE_MODIFY, fin1, ier)
 5call cg_iric_init_f(fin1, ier)
 6
 7! (abbr.)
 8
 9! Reading calculation condition etc.
10call cg_iric_read_functionalsize_mul_f(fin1, 'func', param_func_size, ier)
11
12! (abbr.)
13
14! File opening and initialization for reading calculation result
15call cg_open_f(param_inputfile, CG_MODE_READ, fin2, ier)
16call cg_iric_initread_f(fin2, ier)
17
18! (abbr.)
19
20! Reading calculation result etc.
21call cg_iric_read_sol_count_mul_f(fin2, solcount, ier)
22
23! (abbr.)
24
25! Calculation result analysis code
26
27! (abbr.)
28
29! Outputting analysis result
30call cg_iric_write_sol_time_mul_f(fin1, t, ier)
31
32! (abbr.)
33
34! Closing files
35call cg_close_f(fin1, ier)
36call cg_close_f(fin2, ier)
37
38! (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  implicit none
  3  include 'cgnslib_f.h'
  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  ! Code for Intel Fortran
 29  icount = nargs()
 30  if (icount.eq.2) then
 31    call getarg(1, cgnsfile, istatus)
 32  else
 33    write(*,*) "Input File not specified."
 34    stop
 35  end if
 36
 37  ! Opening CGNS file
 38  call cg_open_f(cgnsfile, CG_MODE_MODIFY, fin1, ier)
 39  if (ier /=0) STOP "*** Open error of CGNS file ***"
 40  ! Initializing internal variables
 41  call cg_iric_init_f(fin1, ier)
 42
 43  ! Read analysis conditions
 44  call cg_iric_read_string_mul_f(fin1, 'inputfile', param_inputfile, ier)
 45  call cg_iric_read_integer_mul_f(fin1, 'result', param_result, ier)
 46  call cg_iric_read_string_mul_f(fin1, 'resultother', param_resultother, ier)
 47
 48  call cg_iric_read_functionalsize_mul_f(fin1, 'func', param_func_size, ier)
 49  allocate(param_func_param(param_func_size), param_func_value(param_func_size))
 50  call cg_iric_read_functional_mul_f(fin1, 'func', param_func_param, param_func_value, ier)
 51
 52  if (param_result .eq. 0) resultname = 'Depth(m)'
 53  if (param_result .eq. 1) resultname = 'Elevation(m)'
 54  if (param_result .eq. 2) resultname = param_resultother
 55
 56  ! Read grid from the specified CGNS file
 57  call cg_open_f(param_inputfile, CG_MODE_READ, fin2, ier)
 58  if (ier /=0) STOP "*** Open error of CGNS file 2 ***"
 59  call cg_iric_initread_f(fin2, ier)
 60
 61  ! Reads grid
 62  call cg_iric_gotogridcoord2d_mul_f(fin2, isize, jsize, ier)
 63  allocate(grid_x(isize, jsize), grid_y(isize, jsize))
 64  call cg_iric_getgridcoord2d_mul_f(fin2, grid_x, grid_y, ier)
 65
 66  ! Output the grid to CGNS file
 67  call cg_iric_writegridcoord2d_mul_f(fin1, isize, jsize, &
 68    grid_x, grid_y, ier)
 69
 70  ! Allocate memory used for analysis
 71  allocate(target_result(isize, jsize), analysis_result(isize, jsize))
 72
 73  ! Start analysis of calculation results
 74  call cg_iric_read_sol_count_mul_f(fin2, solcount, ier)
 75
 76  do solid = 1, solcount
 77    ! Read calculation result
 78    call cg_iric_read_sol_time_mul_f(fin2, solid, t, ier)
 79    call cg_iric_read_sol_real_mul_f(fin2, solid, resultname, &
 80      target_result, ier)
 81
 82    ! Do fish habitat analysis
 83    do i = 1, isize
 84      do j = 1, jsize
 85        tmp_target_result = target_result(i, j)
 86        do f = 1, param_func_size
 87          if ( &
 88            param_func_param(f) .le. tmp_target_result .and. &
 89            param_func_param(f + 1) .gt. tmp_target_result) then
 90            tmp_analysis_result = &
 91              param_func_value(f) + &
 92              (param_func_value(f + 1) - param_func_value(f)) / &
 93              (param_func_param(f + 1) - param_func_param(f)) * &
 94              (tmp_target_result - param_func_param(f))
 95          endif
 96        end do
 97        analysis_result(i, j) = tmp_analysis_result
 98      end do
 99    end do
100
101    ! Output analysis result
102    call cg_iric_write_sol_time_mul_f(fin1, t, ier)
103    call cg_iric_write_sol_real_mul_f(fin1, 'fish_existence', analysis_result, ier)
104  end do
105
106  ! Close CGNS files
107  call cg_close_f(fin1, ier)
108  call cg_close_f(fin2, ier)
109  stop
110end program SampleProgram2