【问题标题】:Write dynamical arrays in Fortran 90 [duplicate]在 Fortran 90 中编写动态数组
【发布时间】:2017-09-14 22:16:37
【问题描述】:

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

有没有办法做到这一点?

【问题讨论】:

  • 对于 Firtran 问题,请始终使用标签 fortran。您可以添加特定的版本标签,但这只是补充。其他人,也请重新标记,当我自己这样做时,我失去了关闭重复项的能力(尽管这可能是一件好事,取决于我的判断能力)。

标签: arrays formatting fortran output fortran90


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    补充另一个答案,以及cmets中提到的近乎重复的内容中未涵盖的问题...

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

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

    而不是

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

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

    【讨论】:

    猜你喜欢
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2010-10-24
    相关资源
    最近更新 更多