如何在Fortran中的输出文件中添加标题

时间:2018-06-22 19:43:25

标签: header fortran

我只想在输出文件中添加标题。

program deltatheta
implicit none

integer :: i, yminpos
integer, parameter :: Ny=100000, Nloop=43795
real(8), allocatable, dimension(:) :: y,U
real(8), allocatable, dimension(:) :: yinf,bb,cc
real(8) :: ymax,aa,ymin,Umin,Uinf,hr,theta2,Integ,delta2,l0,l2,l3

Uinf=1.d0  !U at infinity
ymax=80.d0 !Coordinate y at infinity
aa=2.d0

allocate (y(Ny),U(Ny),yinf(Nloop),bb(Nloop),cc(Nloop))

open(unit=10,file='Data/loop.dat')
    do i = 1,Nloop
        read(10,*) bb(i),cc(i),l0,yinf(i),l2,l3
    enddo
close(10) 

open(unit=12,file='Data/loop_thetanew.dat')
write(12,*) 'd','b','theta2','yinf/theta2'

do i = 1,Nloop

    call mesh(Ny,ymax,y)

    call velocity(Ny,y,aa,bb(i),cc(i),yminpos,U,Umin,ymin,hr)

    call theta1(Ny,Uinf,ymax,y,yminpos,U,Umin,Integ)

    theta2 = Integ + y(yminpos)

    write(12,*) bb(i),cc(i),theta2,yinf(i)/theta2

enddo

close(12)

endprogram

我只使用write函数,但是我知道这不是最好的方法。 我的输出文件的最终结果是:

 dbtheta2yinf/theta2
   8.0000000000000000       0.10000000000000001        2.2362553308691373        1.7887089836339782

我必须在代码中做些什么来获得这样的东西:

d                        b                          theta2                    yinf/theta2
8.0000000000000000       0.10000000000000001        2.2362553308691373        1.7887089836339782 

1 个答案:

答案 0 :(得分:0)

  

我必须在代码中做些什么来获得这样的东西:

d                        b                          theta2                    yinf/theta2
8.0000000000000000       0.10000000000000001        2.2362553308691373        1.7887089836339782

简短的回答,您必须做formatted I/O。 @HighPerformanceMark和@johncampbell在评论中提供了很好的建议,您可以在Fortran Standardscompiler docs中找到更详细的信息,以实际情况为准。我不会深入探讨这个主题(会让您自由进行研究)。

但是我将解决您的特定问题-正确分隔标题标签以匹配数据的输出长度-提出一个简单的建议(同样,不要压制一组正确的定义符合您需求的I / O格式化规则)。来自旧的Oracle compiler docs

  

未格式化的I / O用于将二进制信息往返于   内存位置,而无需更改其内部表示。每   执行未格式化的I / O语句会导致单个逻辑   要读取或写入的记录。由于内部代表形式有所不同   在不同的架构下,未格式化的I / O受到限制   可移植性。

     

您可以使用未格式化的I / O临时写出数据或进行写操作   快速输出数据,以便随后输入到另一个FORTRAN程序   在具有相同架构的计算机上运行。

基本上,我将标题字符串放入具有定义长度的数组中(在这种情况下,我考虑使用26,因为这是您提供的未格式化输出样本的长度,但是如果您决定将其调整为不同的记录长度)。这样做的原因是,默认情况下,Fortran将尾随空格添加到字符变量的右侧,因此实际上它们使它们保持左对齐。

write(12, '(4a26)') [character(26) :: 'd', 'b', 'theta2', 'yinf / theta2']

到目前为止,您将获得以下输出:

d                         b                         theta2                    yinf/theta2               
   8.0000000000000000       0.10000000000000001        2.2362553308691373        1.7887089836339782  

编译器特定的未格式化输出将实际值的开头和结尾空格放在此处,以考虑负号,指数和其他内容。摆脱它们的唯一方法是执行格式化的I / O。

仅出于完整性考虑,如果您确实希望默认的 unformatted 输出像标题一样保持左对齐,则可以将然后写入字符串变量,然后对齐,然后写入文件。我不会输入此信息,因为据我所知,将数据传输到内部文件需要格式化,因此您不应该在任何地方都依赖此格式(我在Fortran标准中找不到此限制,但是所有编译器文档页面我知道说这个。)

使用格式化写可能获得的最接近的东西是:

character(26) :: recs(4)
! (...)
write(recs, '(4g26.17)') bb(i), cc(i), theta2, yinf(i) / theta2
write(12, '(4a26)') adjustl(recs)

这将导致以下结果:

d                         b                         theta2                    yinf/theta2               
8.0000000000000000        0.10000000000000001       2.2362553308691373        1.7887089836339782        

另一种方法,但不太可靠,是:

write(12, '(t1,g0,t27,g0,t53,g0,t79,g0)') bb(i), cc(i), theta2, yinf(i) / theta2

这将通过gfortran 8.0产生:

d                         b                         theta2             yinf/theta2               
8.0000000000000000        0.10000000000000001       2.2362553308691373        1.7887089836339782

但这是ifort 18.0

d                         b                         theta2                    yinf/theta2               
8.000000000000000         .1000000000000000         2.236255330869137         1.788708983633978