matlab数据转换为tecplot格式[ASCII码格式下的plt文件]

本文详细介绍了如何将MATLAB数据转换为tecplot支持的ASCII格式plt文件,包括文件格式、文件头、zone相关格式,以及一维、二维、三维数据的转换方法。 tecplot能读取ASCII格式的plt文件,支持多种数据类型和网格结构,如非矩形区域、多块数据和非结构网格。通过示例代码和tecplot的使用说明,帮助读者理解数据转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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(
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值