Class file_operate
In: file_operate.f90

CReSS の計算結果出力ファイルデータの操作用モジュール

Methods

Public Instance methods

Subroutine :
file_name :character(*), intent(in)
: 読み出すファイル名
d2n :integer, intent(in)
: d2 変数用に用意すべき配列総数 (変数の種類数)
d3n :integer, intent(in)
: d3 変数用に用意すべき配列総数 (変数の種類数)
d2val :character(*), intent(in)
: CReSS のダンプファイルの最初の d2 データ
d3val :character(*), intent(in)
: CReSS のダンプファイルの最初の d3 データ
ad2val :character(*), intent(in)
: CReSS のダンプファイルの後の d2 データ
ad3val :character(*), intent(in)
: CReSS のダンプファイルの後の d3 データ
nx :integer, intent(in)
: x 方向の要素数
ny :integer, intent(in)
: y 方向の要素数
nz :integer, intent(in)
: z 方向の要素数
d2var :real, dimension(nx,ny,d2n), intent(inout)
: d2 変数用配列
d3var :real, dimension(nx,ny,nz,d2n), intent(inout)
: d3 変数用配列

読み込む変数の個数を指定することで, 不要な変数データはメモリに読み込まない ルーチン. (For CReSS) このルーチンを呼び出す前に必ず, val_counter で用意する変数の総数を求めておく.

[Source]

subroutine auto_read_file( file_name, d2n, d3n, d2val, d3val, ad2val, ad3val, nx, ny, nz, d2var, d3var )
! 読み込む変数の個数を指定することで, 不要な変数データはメモリに読み込まない
! ルーチン. (For CReSS)
! このルーチンを呼び出す前に必ず, val_counter で用意する変数の総数を求めておく.
  implicit none
  character(*), intent(in) :: file_name  ! 読み出すファイル名
  integer, intent(in) :: d2n  ! d2 変数用に用意すべき配列総数 (変数の種類数)
  integer, intent(in) :: d3n  ! d3 変数用に用意すべき配列総数 (変数の種類数)
  character(*), intent(in) :: d2val  ! CReSS のダンプファイルの最初の d2 データ
  character(*), intent(in) :: d3val  ! CReSS のダンプファイルの最初の d3 データ
  character(*), intent(in) :: ad2val  ! CReSS のダンプファイルの後の d2 データ
  character(*), intent(in) :: ad3val  ! CReSS のダンプファイルの後の d3 データ
  integer, intent(in) :: nx  ! x 方向の要素数
  integer, intent(in) :: ny  ! y 方向の要素数
  integer, intent(in) :: nz  ! z 方向の要素数
  real, dimension(nx,ny,d2n), intent(inout) :: d2var  ! d2 変数用配列
  real, dimension(nx,ny,nz,d2n), intent(inout) :: d3var  ! d3 変数用配列
  integer :: d2m, d3m, d2am, d3am, i, j, k, all_count, d2_count, d3_count

  d2m=len_trim(d2val)
  d3m=len_trim(d3val)
  d2am=len_trim(ad2val)
  d3am=len_trim(ad3val)
write(*,*) "len=", d2m, d3m, d2am, d3am
  all_count=0
!-- ファイルの 1 レコード目から順に読むかどうかの判断を行って読む ---
!-- まず, 最初の d2 データについて
  j=0
  if(d2m>=1)then
  do i=1,d2m
     if(d2val(i:i)=='1')then
        j=j+1
        call read_file( file_name, nx, ny, i, d2var(:,:,j))
     end if
  end do
  end if
  d2_count=j  ! 最初の d2 データでいくら入ったか (読み飛ばしを入れない)
  all_count=all_count+d2m  ! 読み飛ばした分も含めて何レコード分読んだかのカウント

!-- 次, 最初の d3 データについて
  j=0
  if(d3m>=1)then
  do i=1,d3m
     if(d3val(i:i)=='1')then
        j=j+1
        do k=1,nz
           call read_file( file_name, nx, ny, all_count+k, d3var(:,:,k,j))
        end do
     end if
     all_count=all_count+nz  ! if 文で読んでいなくても nz 行分カウント
  end do
  end if
  d3_count=j  ! 最初の d3 データでいくら入ったか (読み飛ばしを入れない)

!-- 続いて, 後の d2 データについて
  j=d2_count
  if(d2am>=1)then
  do i=1,d2am
     if(ad2val(i:i)=='1')then
        j=j+1
        call read_file( file_name, nx, ny, all_count+i, d2var(:,:,j))
     end if
  end do
  end if
  all_count=all_count+d2am  ! 読み飛ばした分も含めて何レコード分読んだかのカウント

!-- 最後に, 後の d3 データについて
  j=d3_count
  if(d3am>=1)then
  do i=1,d3am
     if(ad3val(i:i)=='1')then
        do k=1,nz
           call read_file( file_name, nx, ny, all_count+k, d3var(:,:,k,j))
        end do
        j=j+1
     end if
     all_count=all_count+nz  ! if 文で読んでいなくても nz 行分カウント
  end do
  end if

end subroutine
Subroutine :
file_name :character(*), intent(in)
: 読み出すデータファイル名
nx :integer, intent(in)
: データの x 方向の個数
ny :integer, intent(in)
: データの y 方向の個数
rec_num :integer, intent(in)
: 読み出すデータのレコード番号
var(nx,ny) :real, intent(inout)
: 読み出すデータ

出力結果読み取りルーチン 本ルーチンでは, ダイレクトアクセスを読み出す際, 1 変数のバイト数を 4 バイト と仮定して読み出すので, 4 バイト以外のファイルを読み出すときは, やはりソースファイルの書き換えが必要となる(要修正)

[Source]

subroutine read_file( file_name, nx, ny, rec_num, var )  ! 出力結果読み取りルーチン
  ! 本ルーチンでは, ダイレクトアクセスを読み出す際, 1 変数のバイト数を 4 バイト
  ! と仮定して読み出すので, 4 バイト以外のファイルを読み出すときは,
  ! やはりソースファイルの書き換えが必要となる(要修正)
  implicit none
  integer, intent(in) :: nx  ! データの x 方向の個数
  integer, intent(in) :: ny  ! データの y 方向の個数
  integer, intent(in) :: rec_num  ! 読み出すデータのレコード番号
  character(*), intent(in) :: file_name  ! 読み出すデータファイル名
  real, intent(inout) :: var(nx,ny)  ! 読み出すデータ
  integer :: i, j, er, k  ! 作業用配列

  open(unit=11, file=file_name, access='direct', recl=4*nx*ny, status='old')
     read(11,rec=rec_num) ((var(i,j),i=1,nx),j=1,ny)
  close(unit=11, status='keep')

end subroutine read_file
Subroutine :
file_name :character(*), intent(in)
: 読み出すデータファイル名
nx :integer, intent(in)
: データの x 方向の個数
ny :integer, intent(in)
: データの y 方向の個数
rec_num :integer, intent(in)
: 読み出すデータのレコード番号
var(nx,ny) :real, intent(inout)
: 読み出すデータ

解析出力ルーチン 本ルーチンでは, ダイレクトアクセスを読み出す際, 1 変数のバイト数を 4 バイト と仮定して読み出すので, 4 バイト以外のファイルを読み出すときは, やはりソースファイルの書き換えが必要となる(要修正)

[Source]

subroutine write_file( file_name, nx, ny, rec_num, var )  ! 解析出力ルーチン
  ! 本ルーチンでは, ダイレクトアクセスを読み出す際, 1 変数のバイト数を 4 バイト
  ! と仮定して読み出すので, 4 バイト以外のファイルを読み出すときは,
  ! やはりソースファイルの書き換えが必要となる(要修正)
  implicit none
  integer, intent(in) :: nx  ! データの x 方向の個数
  integer, intent(in) :: ny  ! データの y 方向の個数
  integer, intent(in) :: rec_num  ! 読み出すデータのレコード番号
  character(*), intent(in) :: file_name  ! 読み出すデータファイル名
  real, intent(inout) :: var(nx,ny)  ! 読み出すデータ
  integer :: i, j, er, k  ! 作業用配列

  open(unit=11, file=file_name, access='direct', recl=4*nx*ny, status='old')
     write(11,rec=rec_num) ((var(i,j),i=1,nx),j=1,ny)
  close(unit=11, status='keep')

end subroutine write_file