# Fortran runtime error

• Fortran

## Main Question or Discussion Point

Hi, I am a beginner of Fortran. Recently I try to use a fortran code for my simulation. But it always shows me the following error when execute the program: At line 18 of the file sous.f (unit =11, file = 'fluid'), fortran runtime error, End of file, Error termination. Backtrace: could not print backtrace.
The program is the following:

the file fluid.int is the following:
1.0200167 1403.0953
1.0400334 2930.1503
1.06005 3005.3186
1.0800667 3079.2313
1.1000834 3159.2497
1.1201001 3232.848
1.1401168 3307.9705
1.1601334 3381.9916
1.1801501 3445.305
1.2001668 3501.6538
1.2201835 3563.9407
1.2402002 3629.1324
1.2602168 3676.5754
1.2802335 3716.7428
1.3002502 3769.7548
1.3202669 3827.6405
1.3402836 3879.3974
1.3603003 3921.094
1.3803169 3966.1734
1.4003336 4016.8839
1.4203503 4060.472
1.440367 4100.4401
1.4603837 4143.1311
1.4804003 4185.0333
1.500417 4228.3119
1.5204337 4273.3999
1.5404504 4315.4772
1.5604671 4351.4981
1.5804837 4386.2771
1.6005004 4426.1663
1.6205171 4466.9572
1.6405338 4503.2937
1.6605505 4535.8692
1.6805671 4568.8949
1.7005838 4607.0189

I really don't know the reason. Very appreciate to help me!!

Related Programming and Computer Science News on Phys.org
Mark44
Mentor
The biggest problem I see is that you have a loop that runs 1200 times, but there aren't anywhere near that number of pairs of data items in the input file.

See https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vnat/index.html for a description of the READ statements.

Here's an example from the doc page above of how you might use READ.
Fortran:
READ( 1, 2, ERR=8, END=9, IOSTAT=N ) X, Y
...
8     WRITE( *, * ) 'I/O error # ', N, ', on 1'
STOP
9     WRITE( *, * ) 'EoF on 1'
RETURN
END
In the READ statement, 1 is the unit number, 2 is (I believe) a format line. If an error occurs, control branches to line 8. If the end of the file is reached, line 9 is executed.

jedishrfu
Mentor
Beyond what @Mark44 has pointed out:

You read in the number of points at line 12 then you should use its value to control your do loop at line 17 and line 22 ie replace 1200 with N.

Of course, you should check that N is in the range of [1,1200] inclusively.

Using the variable "name" may not be the best choice as your syntax coloring implies its a keyword in your FORTRAN. Perhaps name1 would be a better choice.

Another problem, I see is when you read in your data from fileno 11 you read it into an x array and a y1 array. (line 18) The next statement reads into the same x array again and the y2 array. (line 19)

While you can do that how do you know the x arrays that are read are in fact the same arrays with the same values?

Mark44
Mentor
You read in the number of points at line 12 then you should use its value to control your do loop at line 17 and line 22 ie replace 1200 with N.
Good point. I overlooked that part of the code.
Using the variable "name" may not be the best choice as your syntax coloring implies its a keyword in your FORTRAN. Perhaps name1 would be a better choice.
Not a keyword, so I don't know why the GUI treats name and name1 differently. Neither of these is a good choice for a variable name. It would be better to give these variables names that indicate what they're being used for.
Another problem, I see is when you read in your data from fileno 11 you read it into an x array and a y1 array. (line 18) The next statement reads into the same x array again and the y2 array. (line 19)
I'm guessing this is an oversight. The names of the arrays are very inconsistent, and include x1, x, y1, y2, y, and y3. Of these, neither x1 nor y3 is used in the code shown.

I don't understand what the code is supposed to be doing in the loop that reads from units 11 and 12. Whatever value gets read into x(i) in the first read statement will be overwritten by the second read statement.

Also, in the final loop, unit 15 is never opened. Other than the default units for Fortran 77 input (unit 5) and output (unit 6), you need to open a unit before writing to it.

The biggest problem I see is that you have a loop that runs 1200 times, but there aren't anywhere near that number of pairs of data items in the input file.

See https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vnat/index.html for a description of the READ statements.

Here's an example from the doc page above of how you might use READ.
Fortran:
READ( 1, 2, ERR=8, END=9, IOSTAT=N ) X, Y
...
8     WRITE( *, * ) 'I/O error # ', N, ', on 1'
STOP
9     WRITE( *, * ) 'EoF on 1'
RETURN
END
In the READ statement, 1 is the unit number, 2 is (I believe) a format line. If an error occurs, control branches to line 8. If the end of the file is reached, line 9 is executed.
Hi,

Here are files of fluid and bk. They are both not less than 1200.
Sorry I can't give the original txt file. It's said the file does not have an allowed extension. So I just copy it into excel. And what I do in terminal is the following:

Should I build the file of fort.11 and fort.12 before running the program?

#### Attachments

• 47.6 KB Views: 8
Beyond what @Mark44 has pointed out:

You read in the number of points at line 12 then you should use its value to control your do loop at line 17 and line 22 ie replace 1200 with N.

Of course, you should check that N is in the range of [1,1200] inclusively.

Using the variable "name" may not be the best choice as your syntax coloring implies its a keyword in your FORTRAN. Perhaps name1 would be a better choice.

Another problem, I see is when you read in your data from fileno 11 you read it into an x array and a y1 array. (line 18) The next statement reads into the same x array again and the y2 array. (line 19)

While you can do that how do you know the x arrays that are read are in fact the same arrays with the same values?
Hi,

Many thanks for your answer. The N is 1200. And for the two files, the x is the same.

jedishrfu
Mentor
We used to use a sentinel value as the last line of the data. Something like 999999 999999 that when read indicated there was no more data to read.

Basically it eliminates the N-value question? Let the computer do the work and you tell it what to do.

Sentinels were most useful for dealing with card decks but then I'd be giving away my age and someone will say "OK, Boomer!"

jedishrfu
Mentor
Hi,

Many thanks for your answer. The N is 1200. And for the two files, the x is the same.
Its good to know you're aware of that. I would caution that you should tighten your code up and use the N value, checking it's between 1 and 1200 having it decide how much data to read and process.

It would also be a good check to verify the two x arrays or you could allow the x values to vary from file to file and use interpolations to line them up for design flexibility but I digress.

Its good to know you're aware of that. I would caution that you should tighten your code up and use the N value, checking it's between 1 and 1200 having it decide how much data to read and process.

It would also be a good check to verify the two x arrays or you could allow the x values to vary from file to file and use interpolations to line them up for design flexibility but I digress.
haha Thanks for your detailed reminder. It's tricky I didn't find obvious fault in the code, but it just couldn't give the right result.

Mark44
Mentor
Should I build the file of fort.11 and fort.12 before running the program?
What are fort.11 and fort.12? Your source code is sous.f, which gfortran will compile and link to produce the executable, sous.exe.
The N is 1200. And for the two files, the x is the same.
If your program can't find the input files, it could be due to the files not being where the program expects them, or the files have a file extension which your program isn't using. Either of these could be why your program isn't working.

Where are your two input files? I believe they should be in the same directory as the executable, sous.exe.

Is your program using the correct names for the input files? Possibly they are fluid.txt and bk.txt, or using some other file extension such as .dat.

Also, rather than have two separate input files with the same x values, why don't you put the y values of the bk file into the fluid file?

Each line of the resulting file would look like this:
<x value> <y value from liquid> <y value from bk>
If you did this, it would simplify your code quite a lot.

Last edited:
Dr Transport
Gold Member
fort.11 and fort.12 are defined in lines 14 and 15, that is the old FORTRAN way of naming files. You opened a unit =number and that file was written as fort.number.

jedishrfu
Mentor
What time frame was that?

in my experience, while running batch fortran you would reference the number only and in the job control language a card would indicate what device actually had the data to read Ie card reader or from within the deck itself or a tape device or a disk pack.

In timesharing Fortran, I think the file name was the name you give and it didnt need a number suffix.

my experience was limited to Honeywell 6000 Fortran-y.

FactChecker
Gold Member
Another problem in reading in the file names is that the dimensions of variables name and name2 are large. I believe that it will try to open a file with random memory trash filling in the unused part of the file names.

A quick temporary test is to hard-code file names into the open statements and see if the program gets farther.

Dr Transport
Gold Member
@jedishrfu I recently worked (within the past couple of months) with an old fortran writer, he hadn't upgraded any of his programming skills in 35+ years, no unstructured *.f90 files, plain *.f, and he didn't care. No one really looked at his development codes, he did research and wrote papers, but rarely if ever passed along his codes to anyone to use.

TeethWhitener
Gold Member
Stupid question: what happens when you comment out line 18?

Dr Transport
Gold Member
Which file are you reading from 11 or 12?

FactChecker
Gold Member
The error message refers to the file named "fluid", but you say that the true file name is "fluid.int". That would be a problem. You should add the option to your open statements that will only open existing files for reading, so it will not create a new file with the wrong name. You should also include the options that and will jump to some error handling code if the opens or writes cause an error.