Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
28456 Discussions

WRITE FORMAT statement - problem with "+" option

Intel_C_Intel
Employee
954 Views
I am running a simulation of which I would like to print the value of a current variable to stdout (integration time step), such that I can have a "running" counter on the console.


I have to admit that I am not too used to the FORMAT concept of FORTRAN but I guess I understood the issue with the "1X" etc. I some documentation I found that putting the character "+" instead of a blank or a "1X" will result in printing the given value in the same line. I thought that might do the trick.

As a simple example I would like to print the values of k as a counter to stdout:

DO k=1,100
WRITE(*,100) k
100 FORMAT (1X, I3)
ENDDO

which is nice if I want all the numbers below each other. But what I would like to have is that in each iteration of the loop, the previous value of k is overwritten "on top" of the previous value of k.

My idea was to place the identifier "+" (as found in a FORTRAN book) as the first character of the output line to tell the "printer" to "not go" into a new line. But with that I get error messages from the compiler.

My idea was:

DO k=1,100
WRITE(*,100) k
100 FORMAT (+, I3)
ENDDO

such that the output line internally lokks like "+###" such that no new line is started. I can find the "+" in some docs but no code example where it is used.

I hope I explained the problem thoroughly and that somebody can give me a hint.

Thanks in advance

Bastian

0 Kudos
3 Replies
Steven_L_Intel1
Employee
954 Views
You are using Fortran carriage control, which is not the default (and which is deprecated in the Fortran standard.) To use this, you must write to a numbered unit (such as 6) which you have opened with the option CARRIAGECONTROL='FORTRAN'. Please note that this type of carriage control was defined in the era of line printers and it can have odd effects when displayed on monitors.
0 Kudos
Intel_C_Intel
Employee
954 Views
Hi Steve!

Thanks for your reply. I am aware that the concept of the carriage control is an old one, but I guessed that it might be preserved as an easy-to-understand concept.

I don't have to stick to my solution, I am grateful to a hint towards a more standard-conform solution. As far as I see, the standard output always assumes to output on a new line (and so far I could not find a solution to suppress that).

Can you give me a hint?

Thanks in advance

BAstian
0 Kudos
Steven_L_Intel1
Employee
954 Views
There is no standard-conforming solution to this. Some might think that "non-advancing I/O" would do it, but the standard does not specify that partial records "become available" until the final advancing write is done. You can do it this way, though, without requiring Fortran carriage control:

use ifport ! For SLEEPQQ
do i=1,10
write (*,'($,I0)') i
call sleepqq(1000)
end do
write (*, *) 'Done'
end

The $ format means "suppress new line at the end of this write" and is an extension.
0 Kudos
Reply