我正在编写一些Fortran代码,这些代码难以可视化如何存储数组层次结构中的数据,这给我带来了如何处理此数据子集的麻烦。我已读入一些存储在未格式化的二进制PLOT3D文件中的数据。数据格式如下:
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点处得到该变量的解值。
但是,我在运行时遇到段错误,这表明我没有正确调整阵列的大小。
答案 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
我不确定这是否可以解决您的问题,但是这里有些