matlab数据转换为tecplot格式[ASCII码格式下的plt文件]
2021.06更新。(1)修改了之前1.1节演示代码,之前ZONE前面忘记加注释(2)新增了结构网格的多块数据的写入说明。感谢评论区的老铁们。
2021.08更新。(1)添加了离散点数据以及非结构数据的导入。
2022.08更新。(1)偷不了懒,ZONETYPE还差两个多边形导入的没有提到,果然评论区就有人指出来了,O(∩_∩)O哈哈~,更新这两个FEPolygon和FEPolyhedron。
1 tecplot能读取的的常见ASCII格式
1.1 文件格式与文件头
tecplot默认的数据读取与保存格式为二进制格式。与ASCII码格式相比,tecplot对二进制格式的读取数据速度更快。但是为了更方便的文件交互与人为校验,对于数据量不太大的ASCII格式也是必须的。
本文输出的文件后缀为*.plt,由于是ASCII码格式,所以可以用记事本等软件打开。文件命名或者路径可以包含中文。对于单个文件导入时,可以采用load data,或者直接拖拽的方式读取文件。多个文件(比如非定常)不支持拖拽,需要load data。
在文件中,以#号开头的行会作为注释而忽略。字符串需要采用双引号"X"进行括起来,如果字符串内包含双引号,则可以采用反斜杠的方式输入(")。
文件对换行不是很敏感,多余的换行会被忽略掉(除了注释)。双引号内的字符串不能换行。文件也对大写小写不太敏感,ZONE和zone都可以被相同的识别,除双引号内的字符串。如果遇到并列,采用空格还是逗号也同样无所谓,亦或是混合搭配,这两种方式都可以被识别。
文件中的数字可以采用整数 (101325),小数(101325.0),或科学计数法 (1.01325E+05)。数字和数字之间可以用空格、逗号、Tab、回车、换行进行分隔。如果有连续的重复数字,例如:37个120.5,后面跟着100个0.0,可以简写作:37120.5,1000.0。
一个tecplot文件,可以分为文件头和数据两部分。文件头需要标明:TITLE名称、FILETYPE文件类型和VARIABLES变量名称。
- TITLE,后面内容为字符串,格式为 TITLE = “Example File”
- FILETYPE,可以选择为GRID(网格)、SOLUTION(结果)、FULL(全部)。这一项可以省略,默认为FULL。
- VARIABLES,后面接数据名称。同样为字符串格式,如果有多个数据,用空格或逗号隔开。
数据则分为 ZONE、TEXT、GEOMETRY、CUSTOMLABELS、 DATASETAUXDATA 和 VARAUXDATA。本文以zone区域进行演示,这也是最主要被用到的。
其中zone分为 Block和Point两种数据格式,这在之后的章节再解释。
一个典型的tecplot下ASCII格式的plt文件,如下所示:
#保存为Example.plt
#标题
TITLE = "Example File"
#变量名
VARIABLES = "X","F"
#定义ZONE
#ZONE
#定义IJK,一维只需要写I
zone I = 11,t="F=x*x"
DATAPACKING=point
0 0
0 .1 0.01
0.2 0.04
0.3 0.09
0.4 0.16
0.5 0.25
0.6 0.36
0.7 0.49
0.8 0.64
0.9 0.81
1 1
zone I = 11,t="F=x"
DATAPACKING=block
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
导入到tecplot,勾选symbol,和mapping style 中的show map选项,显示的图像如下:
更多相关信息,可以搜索tecplot的帮助文档,我的版本对应的pdf文档名称为:360_data_format_guide.pdf。
1.2 zone相关的格式
数据以zone开头,标志着后面所有内容均为其下的内容,直到另一个数据类型标识为止。
必须指定的变量有:
变量 | 含义 |
---|---|
I,J,K | 数据点的个数。如果是二维,只需要定义IJ。如果是1维,只需定义I |
可以不指定的变量有:
变量 | 含义 |
---|---|
T | zone的名称 |
ZONETYPE | 可选ordered(默认)和 finite element两种。有限元需要额外的nodes、elements、faces 等信息 |
DATAPACKING | 可选block(默认)和point两种。point可认为是每一行代表一个点,block可认为是每一列代表一个点(虽然tecplot不在乎换行) |
DT | 储存精度,默认Single。可选Double,single,longint,shortint,byte,bit。其中bit只支持Block格式。 |
VARLOCATION | 可选 NODAL(默认)和CELLCENTERED。其中Cellcentered只支持Block格式,允许在中心定义变量,此时数据点个数应为(I-1)×(J-1)×(K-1) |
SOLUTIONTIME | 求解时间 |
2 一维数据
一维数据,以抛物线为示例。主要代码为plt_Head和plt_Zone。
clear
fclose('all');
t=0:0.1:1;
F=t.^2;
%1准备数据
filename='example_1D.plt';
title=[];
variables={
'X','F'};
Mat_Data=[t(:),F(:)];
IJK=length(t);
%2创建文件
if exist(filename,'file')
delete(filename)
end
f_id=fopen(filename,'a');
fclose(f_id);
%3创建表头
plt_Head(filename,'',variables)
%4创建zone(point)格式
plt_Zone(filename,'1',IJK,Mat_Data)
function plt_Head(filename,title,variables)
%创建表头
f_id=fopen(filename,'a');
%名称
if ~isempty(title)
s=['TITLE = "',title,'"'];
fprintf(f_id,'%s \r\n',s);
end
%变量
v=numel(variables);
s='VARIABLES = ';
for k=1:v
if k~=1
s=[s,','];
end
s=[s,' "',variables{
k},'"'];
end
fprintf(f_id,'%s \r\n',s);
fclose(f_id);
end
function plt_Zone(filename,zone_title,IJK,Mat_Data)
%创建zone,point格式
f_id=fopen(filename,'a');
N=size(Mat_Data,1);
Dim=numel(IJK);
if Dim==1
s=['zone I=',num2str( IJK(1) )];
elseif Dim==2
s=['zone I=',num2str( IJK(1) ),',J=',num2str( IJK(2) )];
elseif Dim==3
s=['zone I=',num2str( IJK(1) ),',J=',num2str( IJK(2) ),',K=',num2str( IJK(3) )];
end
%标题
if ~isempty(zone_title)
s=[s,',t="',zone_title,'"'];
end
fprintf(f_id,'%s \r\n',s);
%格式为point
s='DATAPACKING=point';
fprintf(f_id,'%s \r\n',s);
%导入数据
for k=1:N
fprintf(f_id,'%s \r\n',num2str(Mat_Data(k,:)));
end
fclose(f_id);
end
导入到tecplot的结果为
3 二维数据
二维数据,采用标准的xy网格。包括X、Y、U、V、P5个变量。主要代码为plt_Head和plt_Zone。
代码和一维相似,如下所示。
这里要注意IJ的排列顺序,Tecplot里的IJ等于matlab里size(meshgrid(**))生成的尺寸。Tecplot里数据的读取顺序,等效于meshgrid生成的数据,再进行x(:)操作的读取顺序。tecplot里如果这里出错会造成读取错误,但两种软件相似的数据读取方式也减少了不必要的麻烦。
clear
fclose('all');
%0数据
[x,y]=meshgrid(-5:0.5:5,-4:0.5:4);
u=-sin(x);
v=cos(y);
F=u.^2+v.^2;
%1准备数据
filename='example_2D.plt';
title='';%无标题
variables={
'X','Y','U','V','F'};
zone_title='';%无标题
Mat_Data=[x(:),y(:),u(:),v(:),F(:)];
IJK=size(x);
time=[];%无时间
%2创建文件
if exist(filename,'file')
delete(filename)
end
f_id=fopen(filename,'a');
fclose(f_id);
%3创建文件头
plt_Head(filename,title,variables)
%4创建zone(point)格式
plt_Zone(filename,zone_title,IJK,time,Mat_Data)
function plt_Head(filename,title,variables)
%创建文件头
f_id=fopen(filename,'a');
%名称
if ~isempty(title)
s=['TITLE = "',title,'"'];
fprintf(f_id,'%s \r\n',s);
end
%变量
v=numel(variables);
s='VARIABLES = ';
for k=1:v
if k~=1
s=[s,','];
end
s=[s,' "',variables{
k},'"'];
end
fprintf(f_id,'%s \r\n',s);
fclose(f_id);
end
function plt_Zone(filename,zone_title,IJK,time,Mat_Data)
%创建zone,point格式
f_id=fopen(filename,'a');
N=size(Mat_Data,1);
Dim=numel(IJK);
if Dim==1
s=['zone I=',num2str( IJK(1) )];
elseif Dim==2
s=['zone I=',num2str( IJK(1) ),',J=',num2str( IJK(2) )];
elseif Dim==3
s=['zone I=',num2str( IJK(1) ),',J=',num2str( IJK(2) ),',K=',num2str( IJK(3) )];
end
%标题
if ~isempty(zone_title)
s=[s,',t="',zone_title,'"'];
end
fprintf(f_id,'%s \r\n',s);
%格式为point
s='DATAPACKING=point';
fprintf(f_id,'%s \r\n',s);
%定义非定常时间
if ~isempty(time)
s=['SOLUTIONTIME=',num2str(time)];
fprintf(f_id,'%s \r\n',s);
end
%导入数据
for k=1:N
fprintf(f_id,'%s \r\n',num2str(Mat_Data(k,:)));
end
fclose(f_id);
end
将生成的plt文件,导入tecplot生成结果为:
对于二维非定常问题,需要添加SOLUTIONTIME选项,生成程序如下。自定义函数plt_Head和plt_Zone与上一个程序内的相同。
clear
fclose('all');
k=0;
for t=0.2:0.2:3
k=k+1;
%0数据
[x,y]=meshgrid(-5:0.5:5,-4:0.5:4);
u=-sin(x+t);
v=cos(y);
F=u.^2+v.^2;
%1准备数据
filename=['example_2D',num2str(k,'%02.f'),'.plt'];
title='';%无标题
variables={
'X','Y','U','V','F'};
zone_title='';%无标题
Mat_Data=[x(:),y(:),u(:),v(:),F(:)];
IJK=size(x);
time=t;%非定常时间
%2创建文件
if exist(filename,'file')
delete(filename)
end
f_id=fopen(filename,'a');
fclose(f_id);
%3创建文件头
plt_Head(filename,title,variables)
%4创建zone(point)格式
plt_Zone(filename,zone_title,IJK,time,Mat_Data)
end
function plt_Head(filename,title,variables)
%创建文件头
f_id=fopen(filename,'a');
%名称
if ~isempty(title)
s=['TITLE = "',title,'"'];
fprintf(f_id,'%s \r\n',s);
end
%变量
v=numel(variables);
s='VARIABLES = ';
for k=1:v
if k~=1
s=[s,','];
end
s=[s,' "',variables{
k},'"'];
end
fprintf(f_id,'%s \r\n',s);
fclose(f_id);
end
function plt_Zone(filename,zone_title,IJK,time,Mat_Data)
%创建zone,point格式
f_id=fopen(filename,'a');
N=size(Mat_Data,1);
Dim=numel(IJK);
if Dim==1
s=['zone I=',num2str( IJK(1) )];
elseif Dim==2
s=['zone I=',num2str( IJK(1) ),',J=',num2str( IJK(2) )];
elseif Dim==3
s=['zone I=',num2str( IJK(1) ),',J=',num2str( IJK(2) ),',K=',num2str( IJK(3) )];
end
%标题
if ~isempty(zone_title)
s=[s,',t="',zone_title,'"'];
end
fprintf(f_id,'%s \r\n',s);
%格式为point
s='DATAPACKING=point';
fprintf(f_id,'%s \r\n',s);
%定义非定常时间
if ~isempty(time)
s=['SOLUTIONTIME=',num2str(time)];
fprintf(f_id,'%s \r\n',s);
end
%导入数据
for k=1:N
fprintf(f_id,'%s \r\n',num2str(Mat_Data(k,:)));
end
fclose(f_id);
end
生成的plt文件有15个,每个文件代表某一时刻的流场。打开Tecplot,选择File-Load Data,就可以导入所有时刻的流场。选择Animation-Time就可以进行非定常展示。可以添加文本框,输入 t=&(solutiontime)s即可以显示文字版时间。
4 三维数据
三维数据采用matlab自带的wind数据。输入load wind,便可得到包含meshgrid格式的x,y,z,u,v,w流场数据。
程序如下所示,其中自定义函数plt_Head和plt_Zone与第3节程序内的相同。
clear
fclose('all');
load wind
V2=sqrt(u.^2+v.^2+w.^2);
%1准备数据
filename=['example_3D.plt'];
title='';%无标题
variables={
'X','Y','Z','U','V','W','V2'};
zone_title='';%无标题
Mat_Data=[x(:),y(:),z(:),u(:),v(:),w(:),V2(:)];
IJK=size(