上面是OpenFOAM二进制文件的格式,我们可以看出,前面21行都是无关的说明文件,22开始时除了一个括号之外,其它的都是数据。
读取数据的思路非常简单,忽略不需要的,读取需要的。
接下来我们将使用到四个函数,fopen(),fgetl(),fread(),fclose()
fidU = fopen(Ufatch,'r');%Upatch为文件的路径
%%忽略头文件
for n = 1:21
[~] = fgetl(fidU);
end
[~] = fread(fidU,1,'char');
注意这里首先忽略了21行,然后忽略了一个字节,也就是那个括弧
%%读取数据
U_mag = fread(fidU,3*nx*ny*nz,'double');
最后的最后,一定要记得关闭文件,不然程序可能会崩
fclose(fidU);
注意上面的3nxny*nz是数据的大小,nx,ny,nz是每个方向的网格数,由于速度有三个分量,所以这里乘以3。‘double’代表我们读取的是双精度的文件,告诉程序每个分量是多少个字节(这里好像是16个?忘了,不重要,知道是double就行)。前面的括弧就是只有一个字节。
这里我们就成功从二进制文件中读取到了数据!是不是非常简单。
最后附上一个我个人写的读取数据的函数,该函数有四个输入参数,路径(fpatch),以及各个方向的网格数(gridNumY,gridNumX,gridNumZ)
返回参数是速度和温度矩阵。
%%read data
function [U,V,W,T] = readBinaryFile(fpatch,nx,ny,nz)
%---读取OpenFOAM-8二进制文件U,T
%---nx,ny,nz为网格数,fpatch为文件所在路径
Ufatch = strcat(fpatch,'U');
Tfatch = strcat(fpatch,'T');
fidU = fopen(Ufatch,'r');
fidT = fopen(Tfatch,'r');
%---读取速度数据
%%忽略头文件
for n = 1:21
[~] = fgetl(fidU);
end
[~] = fread(fidU,1,'char');
%%读取数据
U_mag = fread(fidU,3*nx*ny*nz,'double');
un = 1:3:3*nx*ny*nz;vn = 2:3:3*nx*ny*nz;wn = 3:3:3*nx*ny*nz;
if nz==1
U = reshape(U_mag(un),nx,ny);
V = reshape(U_mag(vn),nx,ny);
W = reshape(U_mag(wn),nx,ny);
elseif nz>1
U = reshape(U_mag(un),nx,ny,nz);
V = reshape(U_mag(vn),nx,ny,nz);
W = reshape(U_mag(wn),nx,ny,nz);
end
fclose(fidU);
%---读取温度数据
%%忽略头文件
for n = 1:21
[~] = fgetl(fidT);
end
[~] = fread(fidT,1,'char');
%%读取数据
T = fread(fidT,nx*ny*nz,'double');
if nz==1
T = reshape(T,nx,ny);
elseif nz>1
T = reshape(T,nx,ny,nz);
end
fclose(fidT);
end