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內,可以生成如下的流場示意圖。
在這裏插入圖片描述

發佈了23 篇原創文章 · 獲贊 117 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章