下面是一个Matlab函数,可以将结果(和位移,位移,阵型)输出到一个文本文件中,然后结合有限元模型文件,可以在HyperView中进行后处理。
function ToHyperView_Arg(inputArg)
%
% Maintenance date: 2024-12-21
%
% Parameters
% ----------
% inputArg.binding:(string)
% (必有参数),数据绑定的类型,可选择'NODE'或'ELEMENT'
%
%
% inputArg.RESULT_TYPE:string vector
% (必有参数),可按照下面这样做
% - inputArg.RESULT_TYPE = "uSum(s)";
% - inputArg.RESULT_TYPE = "Displacement(v)";
% - inputArg.RESULT_TYPE = "stress(t)";
% - inputArg.RESULT_TYPE = ["uSum(s)","stress(t)"];
%
%
% inputArg.filename:(string)
% (必有参数),要写出文件的名字
% 例如:inputArg.filename = 'ddx.txt';
%
% inputArg.SUBCASE:(string)
% (可选参数),子工况序号
% 例如:inputArg.SUBCASE='1';
%
%
%
% inputArg.MODE: (double)
% (可选参数),模态分析时特征值的阶数
% inputArg.MODE = '1';
% inputArg.MODE = '1 Freq=518(Hz)';
%
%
% inputArg.Data: (double)
% (必有参数), 位移, 应力, 阵型等,数据要和RESULT_TYPE对应
%
%
%
% Examples
% --------
% % many mode shape
% inputArg = [];
% inputArg.filename="E3_mode_zheng.txt";
% fid = fopen(inputArg.filename,'w');
% fclose(fid);
% inputArg.binding = 'NODE';
% inputArg.RESULT_TYPE = "disp(v)";
% inputArg.MODE = "1 F=518Hz";
% inputArg.Data= U1;
% ToHyperView_Arg(inputArg)
% inputArg.MODE = "2 F=622Hz";
% inputArg.Data= U2;
% ToHyperView_Arg(inputArg)
%
%%%%%%%%%% 写入 描述
fid=fopen(inputArg.filename,'a+');
fprintf(fid,'ALTAIR ASCII FILE \n');
fprintf(fid,'$DELIMITER = <TAB> \n');
fprintf(fid,'$BINDING = %s \n',upper(inputArg.binding));
fprintf(fid,'$COLUMN_INFO= ENTITY_ID \n');
%%%%%%%%%% 写入 描述
%%%%%%%%%% 写入 SUBCASE
if isfield(inputArg,"SUBCASE")
fprintf(fid,'$SUBCASE = %s \n',inputArg.SUBCASE);
end
%%%%%%%%%% 写入 SUBCASE
%%%%%%%%%% 写入 RESULT_TYPE
LabelStr = join(inputArg.RESULT_TYPE,',');
if contains(lower(LabelStr), 'ansys')
error(" === Label不能包含Ansys ===")
else
fprintf(fid,'$RESULT_TYPE = %s \n',LabelStr);
end
%%%%%%%%%% 写入 RESULT_TYPE
%%%%%%%%%% 写入 MODE
if isfield(inputArg,"MODE")
fprintf(fid,'$MODE = %s \n',inputArg.MODE);
end
%%%%%%%%%% 写入 MODE
%%%%%%%%%% 写入 Data(位移,应力,频率)
Data = inputArg.Data;
RESULT_TYPE = inputArg.RESULT_TYPE;
NcolShould = 0;
expression = '\(.*\)';
for ii = 1:length(RESULT_TYPE)
result = regexp(RESULT_TYPE(ii) ,expression ,'match');
if result == "(s)" || result == "(s)(M/P)"
NcolShould = NcolShould + 1;
elseif result == "(v)"
NcolShould = NcolShould + 3;
elseif result == "(t)"
NcolShould = NcolShould + 6;
elseif result == "(2t)"
NcolShould = NcolShould + 3;
else
error(" ===== RESULT_TYPE format eror =====")
end
end
if isreal(Data)
if NcolShould == size(Data,2)
format = ['%10d ', repmat('%16.8E', [1,size(Data,2)]),'\n'];
fprintf(fid,format, [(1:size(Data,1))',Data]');
else
error(" ===== RESULT_TYPE and Data does not match =====")
end
else
format = ['%10d ', repmat('%16.8E %16.8E', [1,size(Data,2)]),'\n'];
fprintf(fid,format, [(1:size(Data,1))',real(Data),imag(Data)]');
end
%%%%%%%%%% 写入 Data(位移,应力,频率)
%%%%%%%%%% 完成写出内容
fclose(fid);
disp([char(datestr(now,31)),' ',char(inputArg.filename),' succeeded '] )
%%%%%%%%%% 完成写出内容