gluuke
gluuke

Reputation: 1239

Avoid newline in list-directed output with Intel Fortran compiler

I have noticed the results of list-directed output write(*,*) in Fortran is compiler dependent.

Indeed, with the code:

program one
real(8), dimension(5):: r1
do i=1,5
    r1(i)=sqrt(i*10.0)
end do
write(*,*) (r1(i), i =1,5)
end program one

intel compiler ifort gives standard output broken by a newline:

   3.16227769851685        4.47213602066040        5.47722530364990     
   6.32455539703369        7.07106781005859     

while gfortran gives the equivalent one line result:

    3.1622776601683795        4.4721359549995796        5.4772255750516612        6.3245553203367590        7.0710678118654755     

I think that ifort is writing maximum 3 items per line (when floating real numbers). Is there any way to make the ifort output be like gfrotran, i.e. avoid the newline? Ideally, I would like to keep list-directed output (*,*) instructions, so I am looking for something like a compiler option or so, if any.

Upvotes: 8

Views: 3843

Answers (4)

Nicolas D
Nicolas D

Reputation: 236

Since verson 14, intel fortran compiler has the wrap-margin function. By default, the record is wrapped after 80 characters. For disabling this restriction, you should specify:

on Linux: -no-wrap-margin

on WIndows: /wrap-margin-

See more on Intel Fortran's reference guide

Upvotes: 7

user3651717
user3651717

Reputation: 1

See https://software.intel.com/en-us/forums/topic/401555

Specify FORT_FMT_RECL or use write (,"(G0,1X))"

Upvotes: -2

M. S. B.
M. S. B.

Reputation: 29391

No. List-directed (free-format) output provides convenience, but you give up control. Various aspects of the output are unspecified and allowed to be chosen to the compiler. If you want full control, you have to use formatted output.

Upvotes: 7

milancurcic
milancurcic

Reputation: 6241

Look into edit descriptors in your favorite Fortran book or online documentation. You can use fmt specifier in the write statement to specify edit descriptors. For example:

write(*,fmt='(5(F6.4,3X))') (r1(i), i =1,5)

should output something similar to:

3.1623   4.4721   5.4772   6.3246   7.0711   

Upvotes: 2

Related Questions