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.
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.
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