我只想在输出文件中添加标题。
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
答案 0 :(得分:0)
我必须在代码中做些什么来获得这样的东西:
d b theta2 yinf/theta2 8.0000000000000000 0.10000000000000001 2.2362553308691373 1.7887089836339782
简短的回答,您必须做formatted I/O。 @HighPerformanceMark和@johncampbell在评论中提供了很好的建议,您可以在Fortran Standards或compiler 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