Я создаю код Fortran для расчета температуры модели CFD. Этот код будет вызываться на каждой итерации моделирования стационарного состояния и вычислять температуру. При каждом вызове моего кода / итерации я хочу, чтобы мой код fortran также сохранял поле температуры в текстовом файле и сохранял. После расчета поля температуры и сохранения значений в 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)

С этим кодом он перезаписывает только первую строку моего текстового файла на каждой итерации. Но я хочу вставить каждый массив TFIELD (100,1: 6) в новую строку. Как я могу это сделать?

0
T.BTC 28 Май 2017 в 12:19

2 ответа

Лучший ответ

Добавьте POSITION = 'APPEND' в OPEN:

OPEN(UNIT=35,FILE='W:\temperaturField.txt',
&FORM ='FORMATTED',STATUS='UNKNOWN',POSITION='APPEND',
&ACTION='READWRITE')
1
Jack 29 Май 2017 в 00:17

Кажется, вы открываете и закрываете файл для каждой итерации. Это быстрый и грязный метод, если вам нужно отладить, но он медленный.

Если вы хотите это сделать, вы можете сделать то, что сказал @Jack: добавьте POSITION='APPEND' в оператор OPEN, чтобы задать позицию для записи данных в конец файла. Кроме того, вы должны быть уверены, что закрываете его каждый раз.

Лучшим (более эффективным) способом было бы держать файл открытым в течение всего времени. Я бы сделал это с помощью модуля:

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 до завершения вашей программы.

0
chw21 29 Май 2017 в 04:19