計算条件、計算格子、境界条件の読み込み処理の記述

計算条件、計算格子、境界条件の読み込み処理を記述します。

iRIC は、 ソルバー定義ファイルの作成 で作成したソルバー定義ファイルに従って、 計算条件、格子、格子属性、境界条件を計算データファイルに出力しますので、 ソルバー定義ファイルでの記述に対応するように、計算条件、計算格子、境界条件の 読み込み処理を記述します。

計算条件、計算格子の読み込み処理を追記したソースコードを リスト 8 に示します。強調して示したのが追記した部分です。

リスト 8 計算データファイルを開く処理、閉じる処理を追記したソースコード
  1program SampleProgram
  2  use iric
  3  implicit none
  4  integer:: fin, ier
  5  integer:: icount, istatus
  6  character(200)::condFile
  7  integer:: maxiterations
  8  double precision:: timestep
  9  integer:: surfacetype
 10  double precision:: constantsurface
 11  integer:: variable_surface_size
 12  double precision, dimension(:), allocatable:: variable_surface_time
 13  double precision, dimension(:), allocatable:: variable_surface_elevation
 14
 15  integer:: isize, jsize
 16  double precision, dimension(:,:), allocatable:: grid_x, grid_y
 17  double precision, dimension(:,:), allocatable:: elevation
 18  integer, dimension(:,:), allocatable:: obstacle
 19
 20  integer:: inflowid
 21  integer:: inflow_count
 22  integer:: inflow_element_max
 23  integer:: discharge_variable_sizemax
 24  integer, dimension(:), allocatable:: inflow_element_count
 25  integer, dimension(:,:,:), allocatable:: inflow_element
 26  integer, dimension(:), allocatable:: discharge_type
 27  double precision, dimension(:), allocatable:: discharge_constant
 28  integer, dimension(:), allocatable:: discharge_variable_size
 29  double precision, dimension(:,:), allocatable:: discharge_variable_time
 30  double precision, dimension(:,:), allocatable:: discharge_variable_value
 31
 32  write(*,*) "Sample Program"
 33
 34  ! (略)
 35
 36  ! 計算条件の読み込み
 37  call cg_iric_read_integer(fin, "maxIteretions", maxiterations, ier)
 38  call cg_iric_read_real(fin, "timeStep", timestep, ier)
 39  call cg_iric_read_integer(fin, "surfaceType", surfacetype, ier)
 40  call cg_iric_read_real(fin, "constantSurface", constantsurface, ier)
 41
 42  call cg_iric_read_functionalsize(fin, "variableSurface", variable_surface_size, ier)
 43  allocate(variable_surface_time(variable_surface_size))
 44  allocate(variable_surface_elevation(variable_surface_size))
 45  call cg_iric_read_functional(fin, "variableSurface", variable_surface_time, variable_surface_elevation, ier)
 46
 47  ! 格子のサイズを調べる
 48  call cg_iric_read_grid2d_str_size(fin, isize, jsize, ier)
 49
 50  ! 格子を読み込むためのメモリを確保
 51  allocate(grid_x(isize,jsize), grid_y(isize,jsize))
 52  ! 格子を読み込む
 53  call cg_iric_read_grid2d_coords(fin, grid_x, grid_y, ier)
 54
 55  ! 格子点で定義された属性 のメモリを確保
 56  allocate(elevation(isize, jsize))
 57  allocate(obstacle(isize - 1, jsize - 1))
 58
 59  ! 属性を読み込む
 60  call cg_iric_read_grid_real_node(fin, "Elevation", elevation, ier)
 61  call cg_iric_read_grid_integer_cell(fin, "Obstacle", obstacle, ier)
 62
 63  ! 流入口の数に従って、境界条件を保持するメモリを確保。
 64  allocate(inflow_element_count(inflow_count))
 65  allocate(discharge_type(inflow_count), discharge_constant(inflow_count))
 66  allocate(discharge_variable_size(inflow_count))
 67
 68  ! 流入口に指定された格子点の数と、時間依存の流入量のサイズを調べる
 69  inflow_element_max = 0
 70  do inflowid = 1, inflow_count
 71    ! 流入口に指定された格子点の数
 72    call cg_iric_read_bc_indicessize(fin, 'inflow', inflowid, inflow_element_count(inflowid))
 73    if (inflow_element_max < inflow_element_count(inflowid)) then
 74      inflow_element_max = inflow_element_count(inflowid)
 75    end if
 76    ! 流入口の時間依存の流入量のデータの数
 77    call cg_iric_read_bc_functionalsize(fin, 'inflow', inflowid, 'FunctionalDischarge', discharge_variable_size(inflowid), ier);
 78    if (discharge_variable_sizemax < discharge_variable_size(inflowid)) then
 79      discharge_variable_sizemax = discharge_variable_size(inflowid)
 80    end if
 81  end do
 82
 83  ! 流入口に指定された格子点と、時間依存の流入量を保持するメモリを確保。
 84  allocate(inflow_element(inflow_count, 2, inflow_element_max))
 85  allocate(discharge_variable_time(inflow_count, discharge_variable_sizemax))
 86  allocate(discharge_variable_value(inflow_count, discharge_variable_sizemax))
 87
 88  ! 境界条件の読み込み
 89  do inflowid = 1, inflow_count
 90    ! 流入口に指定された格子点
 91    call cg_iric_read_bc_indices(fin, 'inflow', inflowid, inflow_element(inflowid:inflowid,:,:), ier)
 92    ! 流入量の種類 (0 = 一定、1 = 時間依存)
 93    call cg_iric_read_bc_integer(fin, 'inflow', inflowid, 'Type', discharge_type(inflowid:inflowid), ier)
 94    ! 流入量 (一定)
 95    call cg_iric_read_bc_real(fin, 'inflow', inflowid, 'ConstantDischarge', discharge_constant(inflowid:inflowid), ier)
 96    ! 流入量 (時間依存)
 97    call cg_iric_read_bc_functional(fin, 'inflow', inflowid, 'FunctionalDischarge', discharge_variable_time(inflowid:inflowid,:), discharge_variable_value(inflowid:inflowid,:), ier)
 98  end do
 99
100  ! 計算データファイルを閉じる
101  call cg_iric_close(fin, ier)
102  stop
103end program SampleProgram

計算条件などを読み込む関数に渡す引数が、 計算条件の定義, 格子属性の定義 でソルバー定義ファイルに定義した Item 要素の name 属性と一致していることに注目してください。

なお、ソルバー定義ファイルで定義する計算条件、格子、格子属性と、それを読み込むための iRIClib の関数の対応関係については、 計算条件・境界条件・格子生成条件の項目の定義と読み込み処理の例 を参照してください。

また、計算条件、計算格子、境界条件の読み込みに使う関数の詳細については、 計算条件 (もしくは格子生成条件) の読み込み, 計算格子の読み込み, 境界条件の読み込み を参照してください。