在Fortran 90中编写动态数组

时间:2017-04-18 22:02:09

标签: arrays formatting fortran output fortran90

我有动态维度的数组(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

有办法做到这一点吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

补充其他答案,以及评论中提到的近似重复内容未涵盖的事项......

2008语言标准引入了 unlimited-format-item 的概念,这是一种语言标准机制,可根据需要多次重复格式规范。在过去的日子里,可能会在格式规范之前加上一个非常大的数字(如@ dave_thompson_085所提到的),现在可以使用*代替,例如

write(1,'(*(e16.6))') matA

而不是

write(1,'(999(e16.6))') matA

许多常用的编译器已经实现了这个功能。