在使用fortran, c语言等进行科学计算时,常常会出现某个case的计算时间较长,而数据输出的迭代步长较大,case结果的迭代变化并不明显,往往期望能够对生成的结果进行实时的展示和输出。
基于Matlab语言,对fortran生成的数据文件进行监测并得到相应的“实时”(与真实计算存在一个时间差)图片。程序的逻辑较为简单,查找文件夹中数据文件的数量,对文件进行读写操作,画图,生成GIF动画。
本例中的数据文件为下面形式:
ITLE="RESULT_V"
VARIABLES="X","V"
ITER= 1000
1.00250624120235 7.808651116880838E-007
3.00751872360706 1.349819874126379E-006
5.01253120601177 1.211866283504929E-006
7.01754368841648 9.670211951072779E-007
9.02255617082119 7.992737613514242E-007
11.0275686532259 7.107701954877268E-007
13.0325811356306 6.739803962184800E-007
15.0375936180353 6.640896067336087E-007
17.0426061004400 6.657497084456198E-007
19.0476185828447 6.716665208342410E-007
21.0526310652494 6.790229404302768E-007
23.0576435476542 6.869140482201853E-007
.......
其中,X与V数据总计为400行。
程序为
%显示最新数据图像,并存储在gif文件中
clear,clc
datadir = '1106';%待检测文件夹名称
if ~exist([datadir,'_done'],'dir')
mkdir([datadir,'_done'])%将显示完的结果放在这个文件夹中
end
time_acc_flag = 1000%1000s内没有文件产生则程序停止;
time_acc=0;
while time_acc<=time_acc_flag
%待测文件夹内是否有文件
file_all = dir([datadir,'/.']);%1106文件夹内所有文件和文件夹
file_all = struct2cell(file_all);
if isempty(find(cell2mat(file_all(5,:))==0,1))%是否存在文件
pause(10);%暂停10s,与数据文件产生速度相匹配
time_acc = time_acc+10;
else
FileName = file_all(1,~cell2mat(file_all(5,:)));%确定所有文件的名字,剔除文件夹
for i=1:numel(FileName)
%读取
x=zeros(1,400);v=zeros(1,400);%输出的数据数量:400
fileID = fopen([datadir,'/',FileName{i}]);%1106文件夹
fscanf(fileID,'%sn',2)
iter = fscanf(fileID,'ITER= %d');
for j=1:numel(x)
temp = fscanf(fileID,'%f %e',2);
x(j) = temp(1);
v(j) = temp(2);
end
%画图
plot(x,v)
xlabel('x')
ylabel('y')
title([num2str(iter),'ITER'])
frame=getframe;
im=frame2im(frame);
[II,map]=rgb2ind(im,256);
if(i==1)
imwrite(II,map,[datadir,'.gif'],'DelayTime',0.2,'LoopCount',Inf)
else
imwrite(II,map,[datadir,'.gif'],'WriteMode','append','DelayTime',0.2)
end
%读取完的文件放置在*_done文件中
movefile([datadir,'/',FileName{i}],[datadir,'_done/',FileName{i}]);
end
time_acc = 0;
end
end
如有错误,欢迎指正。