matlab數據轉換爲tecplot格式[ASCII碼格式下的plt文件]
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(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
生成example_3D.plt文件,導入tecplot內,可以生成如下的流場示意圖。