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
 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
34
35
36
37
38
! (abbr.)

! File opening and initialization
call cg_open_f(cgnsfile, CG_MODE_MODIFY, fin1, ier)
call cg_iric_init_f(fin1, ier)

! (abbr.)

! Reading calculation condition etc.
call cg_iric_read_functionalsize_mul_f(fin1, 'func', param_func_size, ier)

! (abbr.)

! File opening and initialization for reading calculation result
call cg_open_f(param_inputfile, CG_MODE_READ, fin2, ier)
call cg_iric_initread_f(fin2, ier)

! (abbr.)

! Reading calculation result etc.
call cg_iric_read_sol_count_mul_f(fin2, solcount, ier)

! (abbr.)

! Calculation result analysis code

! (abbr.)

! Outputting analysis result
call cg_iric_write_sol_time_mul_f(fin1, t, ier)

! (abbr.)

! Closing files
call cg_close_f(fin1, ier)
call cg_close_f(fin2, ier)

! (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
  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
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
program SampleProgram2
  implicit none
  include 'cgnslib_f.h'

  integer icount
  character(len=300) cgnsfile

  integer:: fin1, fin2, ier, istatus

  character(len=300) param_inputfile
  integer:: param_result
  character(len=100) param_resultother
  integer:: param_func_size
  double precision, dimension(:), allocatable:: param_func_param
  double precision, dimension(:), allocatable:: param_func_value
  character(len=100) resultname

  integer:: isize, jsize
  double precision, dimension(:,:), allocatable:: grid_x, grid_y
  double precision, dimension(:,:), allocatable:: target_result
  double precision, dimension(:,:), allocatable:: analysis_result
  double precision:: tmp_target_result
  double precision:: tmp_analysis_result

  integer:: i, j, f, solid, solcount, iter
  double precision:: t

  ! Code for Intel Fortran
  icount = nargs()
  if (icount.eq.2) then
    call getarg(1, cgnsfile, istatus)
  else
    write(*,*) "Input File not specified."
    stop
  end if

  ! Opening CGNS file
  call cg_open_f(cgnsfile, CG_MODE_MODIFY, fin1, ier)
  if (ier /=0) STOP "*** Open error of CGNS file ***"
  ! Initializing internal variables
  call cg_iric_init_f(fin1, ier)

  ! Read analysis conditions
  call cg_iric_read_string_mul_f(fin1, 'inputfile', param_inputfile, ier)
  call cg_iric_read_integer_mul_f(fin1, 'result', param_result, ier)
  call cg_iric_read_string_mul_f(fin1, 'resultother', param_resultother, ier)

  call cg_iric_read_functionalsize_mul_f(fin1, 'func', param_func_size, ier)
  allocate(param_func_param(param_func_size), param_func_value(param_func_size))
  call cg_iric_read_functional_mul_f(fin1, 'func', param_func_param, param_func_value, ier)

  if (param_result .eq. 0) resultname = 'Depth(m)'
  if (param_result .eq. 1) resultname = 'Elevation(m)'
  if (param_result .eq. 2) resultname = param_resultother

  ! Read grid from the specified CGNS file
  call cg_open_f(param_inputfile, CG_MODE_READ, fin2, ier)
  if (ier /=0) STOP "*** Open error of CGNS file 2 ***"
  call cg_iric_initread_f(fin2, ier)

  ! Reads grid
  call cg_iric_gotogridcoord2d_mul_f(fin2, isize, jsize, ier)
  allocate(grid_x(isize, jsize), grid_y(isize, jsize))
  call cg_iric_getgridcoord2d_mul_f(fin2, grid_x, grid_y, ier)

  ! Output the grid to CGNS file
  call cg_iric_writegridcoord2d_mul_f(fin1, isize, jsize, &
    grid_x, grid_y, ier)

  ! Allocate memory used for analysis
  allocate(target_result(isize, jsize), analysis_result(isize, jsize))

  ! Start analysis of calculation results
  call cg_iric_read_sol_count_mul_f(fin2, solcount, ier)

  do solid = 1, solcount
    ! Read calculation result
    call cg_iric_read_sol_time_mul_f(fin2, solid, t, ier)
    call cg_iric_read_sol_real_mul_f(fin2, solid, resultname, &
      target_result, ier)

    ! Do fish habitat analysis
    do i = 1, isize
      do j = 1, jsize
        tmp_target_result = target_result(i, j)
        do f = 1, param_func_size
          if ( &
            param_func_param(f) .le. tmp_target_result .and. &
            param_func_param(f + 1) .gt. tmp_target_result) then
            tmp_analysis_result = &
              param_func_value(f) + &
              (param_func_value(f + 1) - param_func_value(f)) / &
              (param_func_param(f + 1) - param_func_param(f)) * &
              (tmp_target_result - param_func_param(f))
          endif
        end do
        analysis_result(i, j) = tmp_analysis_result
      end do
    end do

    ! Output analysis result
    call cg_iric_write_sol_time_mul_f(fin1, t, ier)
    call cg_iric_write_sol_real_mul_f(fin1, 'fish_existence', analysis_result, ier)
  end do

  ! Close CGNS files
  call cg_close_f(fin1, ier)
  call cg_close_f(fin2, ier)
  stop
end program SampleProgram2