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,d3n), 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 if(d2n<j)then write(*,*) "*** ERROR ***" write(*,*) "read array exceeds d2n. STOP." stop else call read_file( file_name, nx, ny, i, d2var(:,:,j)) end if 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 if(d3n<j)then write(*,*) "*** ERROR ***" write(*,*) "read array exceeds d3n. STOP." stop else do k=1,nz call read_file( file_name, nx, ny, all_count+k, d3var(:,:,k,j)) end do end if 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 if(d2n<j)then write(*,*) "*** ERROR ***" write(*,*) "read array exceeds d2n. STOP." stop else call read_file( file_name, nx, ny, all_count+i, d2var(:,:,j)) end if 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 j=j+1 if(d3n<j)then write(*,*) "*** ERROR ***" write(*,*) "read array exceeds d3n. STOP." stop else do k=1,nz call read_file( file_name, nx, ny, all_count+k, d3var(:,:,k,j)) end do end if end if all_count=all_count+nz ! if 文で読んでいなくても nz 行分カウント end do end if end subroutine