T.BTC
T.BTC

Reputation: 15

Write in a new line on every write(33,*) comand in Fortran77

I create a fortran code to calculate the temperature of a cfd model. This code will be called on every iteration of a steady state simulation and calculate the temperature. On every calling of my code/iteration i want my fortran code also save the temperature field on a txt file and save. After calculating the temperature field and saving the values in TFIELD(100;1:6) the part with saving in txt file looks like:

OPEN(UNIT=35,FILE='W:\temperaturField.txt',
&FORM ='FORMATTED',STATUS='UNKNOWN',
&ACTION='READWRITE')

WRITE (35,FMT='5(F8.3,2X))') TFIELD(100,1:6)

With this code it only overwrites the first line of my txt file on every iteration. But i want to paste every TFIELD(100,1:6) array on a new line. How can i do this?

Upvotes: 0

Views: 940

Answers (2)

chw21
chw21

Reputation: 8140

It seems like you are opening and closing the file for each iteration. This is a quick and dirty method if you need to debug, but it's slow.

If you want to do that, you might want to do what @Jack said: Include a POSITION='APPEND' to the OPEN statement to set the position to write the data to the end of the file. Also, you need to make sure that you close it every time.

A better (more efficient) method would be to keep the file open for the whole time. I'd do that with a module:

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

Then you can use it in your program like this:

subroutine calc_temps(...)
    use temp_writer_module
    <variable declarations>
    <calculations>
    call temp_writer(tfield(100, 1:6))
end subroutine calc_temps

Just don't forget to call the temp_writer_close routine before your program ends.

Upvotes: 0

Jack
Jack

Reputation: 6158

Add POSTITION='APPEND' to the OPEN:

OPEN(UNIT=35,FILE='W:\temperaturField.txt',
&FORM ='FORMATTED',STATUS='UNKNOWN',POSITION='APPEND',
&ACTION='READWRITE')

Upvotes: 1

Related Questions