Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Write data to file in columns (Fortran)

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.

like image 631
alex Avatar asked Aug 17 '12 08:08

alex


2 Answers

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)
like image 70
Hristo Iliev Avatar answered Nov 06 '22 10:11

Hristo Iliev


This really depends on what data you are trying to write to file (i.e. whether you have a scalar within a loop or an array...). Can you include a description of this in your question?

If your are trying to write a scalar multiple times to the same row then try using non-advancing I/O, passing the keyword argument advance="no" to the write statement, e.g.

integer :: x

do x = 1,10
  write(*, fmt='(i4,1x)', advance="no") x
end do

However, be aware of a suprise with non-advancing I/O.

like image 40
Chris Avatar answered Nov 06 '22 11:11

Chris