我尝试使用小代码在各种文本之间用数值写出输出结果。
目前,我这样做:
! Print results
write(*,*)
write(*,*) ' Time step = ',dt
write(*,*)
write(*,1001) epsilon,step
write(*,*)
write(*,*) ' Problem size = ',size_x*size_y
write(*,*)
write(*,1002) elapsed_time
write(*,*)
write(*,*) ' Computed solution in seq.dat file '
write(*,*)
! Formats available to display the computed values on the grid
1001 format(' Convergence = ',f11.9,' after ',i9,' steps ')
1002 format(' Wall Clock = ',f15.6)
在执行时产生:
Time step = 0.000003755783907217
Convergence = 0.100000000 after 8882 steps
Problem size = 24576
Wall Clock = 5.213814
Computed solution in Seq.dat
我的问题是" Wall Clock = 5.213814
",我希望在" Wall Clock =
"之后只能获得一个空格。在价值" 5.213814
"之前。目前,我认为这些多个空间来自" f15.6
"与1002 format(' Wall Clock = ',f15.6)
。
这是我想要得到的(步骤的另一个值):
Time step = 0.000003755783907217
Convergence = 0.100000000 after 20910988821 steps
Problem size = 24576
Wall Clock = 5.213814
Computed solution in Seq.dat
我已设置" f15.6
"因为我可以获得#34; Wall Clock
"的高数字,espilon
和step
变量也是如此。
在所有情况下,我都不知道如何在单词和值之间设置一个空格来在它们之间进行写入,就像我{C}语言printf
,同一行中的不同值和单词一样。
我知道这是一个简单的解决方案,但无法找到它。
更新1:
我尝试了第一个答案中指出的解决方案。
这就是我所做的:
write(*,1001) epsilon,step
write(*,1002) elapsed_time
1001 format(' Convergence = ',f0.9,' after ',i9,' steps ')
1002 format(' Wall Clock = ',f0.6)
我得到了:
Convergence = .100000000 after 8882 steps
Problem size = 24576
Wall Clock = 2.492813
如您所见," Convergence
"值为.100000000
而非0.100000000
(前导零已消失)。
那么整数值怎么样,我可以写" i0
"尽可能少?
由于
答案 0 :(得分:0)
现代Fortran编译器将'长度'0理解为:尽可能少:
program write_format
use iso_fortran_env, only: real64
implicit none
print 1001, 5.213814
print 1001, 12345678.901234_real64
1001 format("Wall Clock = ", f0.6)
end program write_format
输出:
Wall Clock = 5.213814
Wall Clock = 12345678.901234
干杯
通常不喜欢在回答问题之后更新问题,但是由于它们非常相似,我认为没关系。
首先,是的,格式I0
表示必要的数字,可能就是您想要的数字。
第二部分比较棘手,它似乎归结为“至少那么多数字,但如果需要更多数字” - 而且我认为没有格式说明符(但我可能错了)。< / p>
我可能会欺骗并使用这样的东西:
if (epsilon < 10.) then
write(*, 1002) epsilon
else
write(*, 1003) epsilon
end if
1002 format("Convergenge = ", f11.9)
1003 format("Convergence = ", f0.9)
但话又说回来,我也发现这个答案非常直观:How to pad FORTRAN floating point output with leading zeros?
适合你,这意味着将浮点数分成一个整数和其余部分,并将它重新组合在一起:
write(*, 1002) int(epsilon), epsilon-int(epsilon)
1002 format("Convergence = ", I0, F0.9)
答案 1 :(得分:0)
这有点麻烦,但获得最小宽度并保留前导零的一种方法是使用这样的内部写:
character*30 val
write(val,'(f11.9)')0.1d0
write(*,'(3a,i0,a)')'converge = ',trim(adjustl(val)),' after ',32432,' steps'
32432步后收敛= 0.100000000