在Fortran中调整空格时,在不同文本之间写入结果

时间:2017-09-19 23:14:32

标签: fortran fortran90

我尝试使用小代码在各种文本之间用数值写出输出结果。

目前,我这样做:

   ! 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"的高数字,espilonstep变量也是如此。

在所有情况下,我都不知道如何在单词和值之间设置一个空格来在它们之间进行写入,就像我{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"尽可能少?

由于

2 个答案:

答案 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