访问存储在复杂数组中的数据

时间:2019-06-22 02:04:13

标签: multidimensional-array fortran fortran90

我正在编写一些Fortran代码,这些代码难以可视化如何存储数组层次结构中的数据,这给我带来了如何处理此数据子集的麻烦。我已读入一些存储在未格式化的二进制PLOT3D文件中的数据。数据格式如下:

  1. 1个int(n个块):计算网格中的块(或区域)数
  2. 4 x nblocks个整数:(ni(m),nj(m),nk(m),nvars(m)):每个块中i,j和k点的数量以及其中的多个解变量每个街区。
  3. 在块上循环(m)
  4. ni(m)x nj(m)x nk(m)x nvars(m)浮点数(q(ni,nj,nk,nv,m)):在每个i,j和k点处的求解变量每个街区。
  5. 结束循环遍历
program my_program

use iso_fortran_env

implicit none

character(*), parameter :: soln_file = 'my_file_name.q'

integer :: nblks, io_stat, imax, jmax, kmax, nv, m

integer, dimension (:), allocatable :: ni, nj, nk, nvars

real(real64), dimension (:,:,:,:), allocatable :: qq
real(real64), dimension (:,:,:,:,:), allocatable :: q

open(unit=10, form='unformatted', file=soln_file, status='old', iostat=io_stat)

if ( io_stat /= 0 ) then
    write(*,*) '*** Error reading solution file ', soln_file, ' ***'
    stop
end if

read(10) nblks

allocate( ni(nblks), nj(nblks), nk(nblks) )

read(10) ( ni(m), nj(m), nk(m), nvars(m), m = 1, nblks )

imax = maxval(ni)
jmax = maxval(nj)
kmax = maxval(nk)
nv = maxval(nvars)

allocate( q(imax,jmax,kmax,nv,nblks) )

do m = 1, nblks
    allocate( qq(ni(m),nj(m),nk(m),nvars(m)) )

    read(10) qq(ni(m),nj(m),nk(m),nvars(m))

    q(1:ni(m),1:nj(m),1:nk(m),1:nvars(m),m) = qq

    deallocate( qq )
end do

close(10)

deallocate( ni, nj, nk, nvars, q )

stop

end program my_program

就我而言,我感兴趣的是提取每个块中所有点的单个解决方案变量的子集,或者只是修改它们的值。看来我应该在3 x nblocks数组中每个块的每个i,j和k点处得到该变量的解值。

但是,我在运行时遇到段错误,这表明我没有正确调整阵列的大小。

1 个答案:

答案 0 :(得分:1)

在您的代码段中

do m = 1, nblks
    allocate( qq(ni(m),nj(m),nk(m),nvars(m)) )

    read(10) qq(ni(m),nj(m),nk(m),nvars(m))

    q(1:ni(m),1:nj(m),1:nk(m),1:nvars(m),m) = qq

    deallocate( qq )
end do

您只读取4个值,而不是qq倒入ni(m) x nj(m) x nk(m) x nvars(m)。 然后,您尝试将这些值复制到q中,直到不一致为止。

在我看来,正确的循环应该是

do m = 1, nblks
    allocate( qq(ni(m),nj(m),nk(m),nvars(m)) )

    do iv = 1 ,nvars(m)
      do ik = 1 ,nk(m)
        do ij = 1 ,nj(m)
          do ii = 1 ,ni(m)
             read(10) qq(ii,ij,ik,iv)
          end do
        end do
      end do
    end do

    q(1:ni(m),1:nj(m),1:nk(m),1:nvars(m),m) = qq

    deallocate( qq )
end do

我不确定这是否可以解决您的问题,但是这里有些 fishy 。