在 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
”的高数字,espilon
和 step
变量也是如此。
我不知道在所有情况下如何在单词和值之间只设置一个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
我尝试用一个小代码在各种文本之间写出带有数值的输出结果。
目前,我是:
! 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
”的高数字,espilon
和 step
变量也是如此。
我不知道在所有情况下如何在单词和值之间只设置一个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