在Fortran 90中编写动态数组

4

我有一些具有动态尺寸(dimxdim)的数组,并且我需要一种通过Write指令将这些数组写入文件的方法。问题是,到目前为止,我还没有能够自动地生成这样的文件,我的意思是到目前为止,我必须手动更改Write指令中数组的维度,我需要一种方法,使得维度根据dimxdim的尺寸变化而变化,方式如下:

integer :: dimx, dim 
complex, allocatable :: matA(:,:), vectB(:)

 allocate(matA(dimx,dimx), vectB(dim))  

write(1,'(**dimx** e16.6) matA
write(2,'(**dim** e16.6) vecB

有没有一种方法可以做到这一点?


请始终使用标签[tag:fortran]来提出Fortran相关问题。您可以添加特定版本的标签,但这只是补充性的。其他人也请重新标记,当我自己这样做时,我会失去关闭重复问题的能力(尽管根据我的判断力,这可能是一件好事)。 - Vladimir F Героям слава
2个回答

3
为了补充其他答案并解决评论中提到的问题……
2008年的语言标准引入了“无限制格式项目”的概念,这是一种标准机制,用于重复一个格式规范多次,直到满足需求。在旧时代,人们可能会在格式规范前加上一个非常大的数字(如@dave_thompson_085所提到的),现在可以使用“*”代替,例如:
write(1,'(*(e16.6))') matA

不是...而是...
write(1,'(999(e16.6))') matA

许多常用编译器已经实现了此功能。


即使数量无限制,我们仍然存在重复项。http://stackoverflow.com/questions/27728502/dynamic-output-format-setting/27732194 - Vladimir F Героям слава

3

在I/O语句中,格式说明符上的重复次数不一定是数据列表中数组的维度。多个不同的数据项对应一个重复的格式说明符是完全合法的,例如:

 write(unit,'(3f5.1)') x,y,z

或者一个数组对应于几个不同的格式说明符:

 real::a(3)
 write(unit,'(f5.1,f10.2,f5.1)') a

如果格式说明符的数量超过数据列表所需的数量(可以使用动态边界和/或暗示-do 变量),包括但不限于重复说明符,则多余的说明符将被忽略。因此,传统方式(至少追溯到F66)处理可变数量的数据项(在一维中)是使用一个“巨大”的重复计数器,其大小至少与数据一样大。

您的数组由 complex 元素组成,因此每个元素实际上有两个值,格式重复必须至少是元素数量的两倍。

自从F77以来,格式可以是字符变量,您可以使用“内部” WRITE 设置该(或任何其他)字符变量的值,这允许构造并使用一个数据相关的格式。该方法允许您将二维数组的格式调整到一个(精确的)维度。

以下是针对您情况的这两种方法的示例:

program SO43482939
integer,parameter::dimx=2,dimy=3,dim=4
complex,allocatable::mata(:,:),vecb(:)
character(len=80)::fmt
integer i,j
allocate (mata(dimx,dimy),vecb(dim))
do i=1,dimx
  do j=1,dimy
    mata(i,j)=complex(i*10+j,i*10+j)
  end do
end do
do i=1,dim
  vecb(i)=complex(i*10+j,i*10+j)
end do
write(*,'(999f5.1)') vecb
write(fmt,'(a,i5,a)') '(',2*dimx,'f5.1)'
write(*,'(a)') fmt
write(*,fmt) mata
end program

OUTPUT

 14.0 14.0 24.0 24.0 34.0 34.0 44.0 44.0
(    4f5.1)
 11.0 11.0 21.0 21.0
 12.0 12.0 22.0 22.0
 13.0 13.0 23.0 23.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接