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

Write results between different text while adapting spaces in Fortran

我尝试用一​​个小代码在各种文本之间写出带有数值的输出结果。

目前,我是:

   ! 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”,我只想在值“5.213814”之前的“Wall Clock =”之后得到一个 space juste .目前,我认为我得到的这些多个 space 来自带有 1002 format(' Wall Clock = ',f15.6).

的“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”,因为我可以获得“Wall Clock”的高数字,espilonstep 变量也是如此。

我不知道在所有情况下如何在单词和值之间只设置一个space来写在它们之间,就像我printf,在C语言中,不同的值和单词同一条线。

我知道有一个简单的解决方案,但找不到。

更新 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”来尽可能少吗?

谢谢

现代 Fortran 编译器将 'length' 理解为 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 意味着尽可能少的数字,可能就是您想要的。

第二部分比较棘手,它似乎可以归结为 'at least that many digits, but more if needed'——而且我认为没有格式说明符(但我可能错了)。

我可能会作弊并使用这样的东西:

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)

这有点麻烦,但是获得最小宽度并保留前导零的一种方法是使用这样的内部写入:

 character*30 val
 write(val,'(f11.9)')0.1d0
 write(*,'(3a,i0,a)')'converge = ',trim(adjustl(val)),' after ',32432,' steps'

converge = 0.100000000 after 32432 steps