首页 > 解决方案 > 访问存储在复杂数组中的数据

问题描述

我正在编写一些 fortran 代码,其中我很难可视化数组层次结构中的数据是如何存储的,这给我带来了如何操作这些数据子集的麻烦。我已经读入了一些存储在未格式化的二进制 PLOT3D 文件中的数据。数据格式如下所示:

  1. 1 int (nblocks):计算网格中的块(或区域)数
  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) floats (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 点处得到该变量的解值。

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

标签: multidimensional-arrayfortranfortran90

解决方案


在您的代码块中

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 个值 pour 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

我不确定这会解决你的问题,但这里有一些可疑的地方。


推荐阅读