在 Fortran 77 中的每个 write(33,*) 命令中写入一个新行
Write in a new line on every write(33,*) comand in Fortran77
我创建了一个 Fortran 代码来计算 cfd 模型的温度。此代码将在稳态模拟的每次迭代中调用并计算温度。在我的 code/iteration 的每次调用中,我希望我的 Fortran 代码也将温度字段保存在 txt 文件中并保存。在计算温度场并将值保存在 TFIELD(100;1:6) 中后,保存在 txt 文件中的部分如下所示:
OPEN(UNIT=35,FILE='W:\temperaturField.txt',
&FORM ='FORMATTED',STATUS='UNKNOWN',
&ACTION='READWRITE')
WRITE (35,FMT='5(F8.3,2X))') TFIELD(100,1:6)
使用此代码,它只会在每次迭代时覆盖我的 txt 文件的第一行。但我想将每个 TFIELD(100,1:6) 数组粘贴到一个新行上。我该怎么做?
将 POSTITION='APPEND' 添加到 OPEN:
OPEN(UNIT=35,FILE='W:\temperaturField.txt',
&FORM ='FORMATTED',STATUS='UNKNOWN',POSITION='APPEND',
&ACTION='READWRITE')
您好像每次迭代都在打开和关闭文件。如果您需要调试,这是一种快速而肮脏的方法,但它很慢。
如果你想这样做,你可能想做@Jack 所说的:在 OPEN
语句中包含一个 POSITION='APPEND'
以设置将数据写入末尾的位置文件。另外,您需要确保每次都关闭它。
更好(更有效)的方法是让文件始终保持打开状态。我会用一个模块来做到这一点:
module temp_writer_module
implicit none
integer :: temp_writer_unit
logical :: is_opened = .FALSE.
private :: temp_writer_unit, is_opened
contains
subroutine temp_writer_open()
integer :: ios
character(len=100) :: iomsg
if (is_opened) then
print*, "Warning: Temperature file already openend"
return
end if
open(newunit=temp_writer_unit, file='W:\temperatureField', &
form='FORMATTED', status='UNKNOWN', action='WRITE', &
iostat=ios, iomsg=iomsg)
if (ios /= 0) then
print*, "Error opening temperature file:"
print*, trim(iomsg)
STOP
end if
is_opened = .TRUE.
end subroutine temp_writer_open
subroutine temp_writer_close()
if (.not. is_opened) return
close(temp_writer_unit)
is_opened = .FALSE.
end subroutine temp_writer_close
subroutine temp_writer(temps)
real, intent(in) :: temps(6)
integer :: ios
character(len=100) :: iomsg
if (.not. is_opened) call temp_writer_open()
write(temp_writer_unit, *, iostat=ios, iomsg=iomsg) temps
if (ios /= 0) then
print*, "Error writing to temperature file:"
print*, trim(iomsg)
end if
end subroutine temp_writer
end module temp_writer_module
然后你可以像这样在你的程序中使用它:
subroutine calc_temps(...)
use temp_writer_module
<variable declarations>
<calculations>
call temp_writer(tfield(100, 1:6))
end subroutine calc_temps
只是不要忘记在程序结束前调用 temp_writer_close
例程。
我创建了一个 Fortran 代码来计算 cfd 模型的温度。此代码将在稳态模拟的每次迭代中调用并计算温度。在我的 code/iteration 的每次调用中,我希望我的 Fortran 代码也将温度字段保存在 txt 文件中并保存。在计算温度场并将值保存在 TFIELD(100;1:6) 中后,保存在 txt 文件中的部分如下所示:
OPEN(UNIT=35,FILE='W:\temperaturField.txt',
&FORM ='FORMATTED',STATUS='UNKNOWN',
&ACTION='READWRITE')
WRITE (35,FMT='5(F8.3,2X))') TFIELD(100,1:6)
使用此代码,它只会在每次迭代时覆盖我的 txt 文件的第一行。但我想将每个 TFIELD(100,1:6) 数组粘贴到一个新行上。我该怎么做?
将 POSTITION='APPEND' 添加到 OPEN:
OPEN(UNIT=35,FILE='W:\temperaturField.txt',
&FORM ='FORMATTED',STATUS='UNKNOWN',POSITION='APPEND',
&ACTION='READWRITE')
您好像每次迭代都在打开和关闭文件。如果您需要调试,这是一种快速而肮脏的方法,但它很慢。
如果你想这样做,你可能想做@Jack 所说的:在 OPEN
语句中包含一个 POSITION='APPEND'
以设置将数据写入末尾的位置文件。另外,您需要确保每次都关闭它。
更好(更有效)的方法是让文件始终保持打开状态。我会用一个模块来做到这一点:
module temp_writer_module
implicit none
integer :: temp_writer_unit
logical :: is_opened = .FALSE.
private :: temp_writer_unit, is_opened
contains
subroutine temp_writer_open()
integer :: ios
character(len=100) :: iomsg
if (is_opened) then
print*, "Warning: Temperature file already openend"
return
end if
open(newunit=temp_writer_unit, file='W:\temperatureField', &
form='FORMATTED', status='UNKNOWN', action='WRITE', &
iostat=ios, iomsg=iomsg)
if (ios /= 0) then
print*, "Error opening temperature file:"
print*, trim(iomsg)
STOP
end if
is_opened = .TRUE.
end subroutine temp_writer_open
subroutine temp_writer_close()
if (.not. is_opened) return
close(temp_writer_unit)
is_opened = .FALSE.
end subroutine temp_writer_close
subroutine temp_writer(temps)
real, intent(in) :: temps(6)
integer :: ios
character(len=100) :: iomsg
if (.not. is_opened) call temp_writer_open()
write(temp_writer_unit, *, iostat=ios, iomsg=iomsg) temps
if (ios /= 0) then
print*, "Error writing to temperature file:"
print*, trim(iomsg)
end if
end subroutine temp_writer
end module temp_writer_module
然后你可以像这样在你的程序中使用它:
subroutine calc_temps(...)
use temp_writer_module
<variable declarations>
<calculations>
call temp_writer(tfield(100, 1:6))
end subroutine calc_temps
只是不要忘记在程序结束前调用 temp_writer_close
例程。