Read and process a Fortran90 binary file

51 次查看(过去 30 天)
Carola Forlini
Carola Forlini about 10 hours 前
评论: Carola Forlini about 8 hours 前
Hi,
I have a Fortran90 code where a variable called 'stream' is defined such that it stores certain variable every nstep:
open(19,file='stream',form='UNFORMATTED',position='append')
if(mod(NSTEP,100).eq.0)then
write(19)NSTEP,U,W,zeta
endif
How can I properly read the file in Matlab for postprocessing?
FYI, the fortran code is built with double precision.
Thank you
  3 个评论
Walter Roberson
Walter Roberson about 8 hours 前
The FORTRAN runtime system embeds the record boundaries in the data by inserting an INTEGER*4 byte count at the beginning and end of each unformatted sequential record during an unformatted sequential WRITE. The trailing byte count enables BACKSPACE to operate on records.
Carola Forlini
Carola Forlini about 8 hours 前
I am attaching an extract of the file.
NSTEP is an integer = 2000
U, W, zeta are matrices = 32x512
Thank you

请先登录,再进行评论。

回答(1 个)

Les Beckham
Les Beckham about 9 hours 前
编辑:Les Beckham about 9 hours 前
It would help to have a sample file to experiment with.
Nevertheless, assuming that the write call that you have shown is the only thing that writes to this file in your Fortran code, I would suggest something like this using fread and reshape:
fid = fopen('your_file_name.ext', 'rb');
A = fread(fid);
data = reshape(A, 4, numel(A)/4)';
nstep = A(:,1);
U = A(:,2);
W = A(:,3);
zeta = A(:,4);
Note that you might run into endian-ness issues if your Fortran code runs on a different architecture than your Matlab is running on. See the documentation for the machinefmt option to fread if necessary.
  2 个评论
Walter Roberson
Walter Roberson about 8 hours 前
form='UNFORMATTED' has record length markers before and after each record.
Walter Roberson
Walter Roberson about 8 hours 前
If you start with fread(fid, 1, 'integer*4') and discard that, and thereafter fread() with a skip field of 8 then it should be properly positioned to fread() more.
Unfortunately we are not told the size of NSTEP, U, W, zeta

请先登录,再进行评论。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by