multidimensional-array - 访问存储在复杂数组中的数据
问题描述
我正在编写一些 fortran 代码,其中我很难可视化数组层次结构中的数据是如何存储的,这给我带来了如何操作这些数据子集的麻烦。我已经读入了一些存储在未格式化的二进制 PLOT3D 文件中的数据。数据格式如下所示:
- 1 int (nblocks):计算网格中的块(或区域)数
- 4 x nblocks 整数:(ni(m), nj(m), nk(m), nvars(m)):每个块中 i、j 和 k 点的数量以及每个块中的解变量的数量。
- 循环块(m)
- ni(m) x nj(m) x nk(m)x nvars(m) floats (q(ni,nj,nk,nv,m)):每个块的每个 i、j 和 k 点的解变量。
- 结束循环块
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 点处得到该变量的解值。
但是,我在运行时遇到段错误,这表明我没有正确调整数组的大小。
解决方案
在您的代码块中
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
我不确定这会解决你的问题,但这里有一些可疑的地方。
推荐阅读
- android - 如何在前台回调后台应用程序
- android - 在使用 DataBinding 在 android 中调用 API 后,当 MutableLiveData 的 reposity 发生变化时,如何更新 View?
- javascript - XLSX 表 js 图像在第二个选项卡中放置问题
- java - Raspberry Pi 上的 Java SE 还是 Java ME?Pi 上的 Java ME 仍然有用吗?
- oracle - 使用 ORDS Rest API 将 JSON 数据加载/插入到 Apex 表中
- spring - 禁用 Spring Sleuth 中少数端点的日志记录 Trace id、Span Id
- sql-server - Error converting data type varchar to int. get error in create page
- android - 如何在 Flutter 中获取原生启动画面?
- python - 在 Apache Beam 中为每个键应用有状态的 DoFn
- database - $in 和 $or 在 MongoDB 中可以互相替换吗?