Write data to file in columns (Fortran)

alex picture alex · Aug 17, 2012 · Viewed 39.5k times · Source

I need to write some data to file in Fortran 90. How should I use WRITE (*,*) input to have the values grouped in columns? WRITE always puts a new line after each call, that's the problem.

code example:

open (unit = 4, file = 'generated_trajectories1.dat', form='formatted')

do time_nr=0, N
   write (4,*) dble(time_nr)*dt, initial_traj(time_nr)
end do

And now the point is to have it written in separate columns.

Answer

Hristo 'away' Iliev picture Hristo 'away' Iliev · Aug 17, 2012

You can use implied DO loops to write values as single records. Compare the following two examples:

integer :: i

do i=1,10
   write(*,'(2I4)') i, 2*i
end do

It produces:

1   2
2   4
3   6
...

Using implied DO loops it can rewritten as:

integer :: i

write(*, '(10(2I4))') (i, 2*i, i=1,10)

This one produces:

1   2   2   4   3   6   ...

If the number of elements is not fixed at compile time, you can either use the <n> extension (not supported by gfortran):

write(*, '(<n>(2I4))') (i, 2*i, i=1,n)

It takes the number of repetitions of the (2I4) edit descriptor from the value of the variable n. In GNU Fortran you can first create the appropriate edit descriptor using internal files:

character(len=20) :: myfmt

write(myfmt, '("(",I0,"(2I4))")') n
write(*, fmt=myfmt) (i, 2*i, i=1,n)

Of course, it also works with list directed output (that is output with format of *):

write(*, *) (i, 2*i, i=1,10)