ChaChing 发表于 2009-11-7 23:25

提取Nastran结果文件.f06中的模态信息matlab程序

昨天在中文看到这个 http://www_ilovematlab_cn/viewthread.php?tid=55785&page=1#pid521066 (最近那个点打, 都说不良讯息, why? 所以以下画线地替代)
刚好个人许久前也曾写过! 想想贴在那边为何不贴常到的地方
整理下, 有需要可以参考!
*** 许久前写的, 不知是否还适用? ***
*** 个人程式时常互有呼叫, 不知是否修好没? 有问题请告知 ***function varargout = LinkF06(varargin)
% LinkF06 - Read the normal data from NASTRAN output file *.f06.
%
% = LinkF06(FileF06,FileAset,NMode)
%
% FileF06 : filename of NASTRAN output file (*.f06)
% FileAset : filename include Aset grid ID / Aset direction
% NMode : no of used mode (default : all)
%
% GM : generalized mass matrix (M, NMode*1)
% FreqW : frequency (Radian, NMode*1)
% ModeS : normal mode shape (NAset*NMode)
%
% *** input/output is optinal select

% Ckeck the input & output property
PreS = ; EndS = ' ! <== LinkF06 ***';
PreW = ;
if nargin > 3, error(); end
if nargin < 2, error(); end
if nargout > 3, error(); end

FileF06 = varargin{1};
if ~ischar(FileF06), error(); end
fid = fopen(FileF06,'rt');
if fid == -1, error(); end
fclose(fid);

FileAset = varargin{2};
if ~ischar(FileAset), error(); end
fid = fopen(FileAset,'rt');
if fid == -1, error(); end
fclose(fid);

NMode=[];
if nargin >= 3, NMode = varargin{3}; if ~isempty(NMode)
if ~isInteger(NMode), error(); end
if NMode <= 0 , error(); end
end; end

% *** Begin the reading/sorting process ***

% read the ASET data want to sort the normal data
fid = fopen(FileAset,'rt'); frewind(fid); fgetl(fid); % read title
Aset = fscanf(fid,'%i',); fclose(fid);
Aset = Aset'; Aset = sortrows(Aset,); NAset = size(Aset,1);
for k=2:NAset, if Aset(k,1)==Aset(k-1,1), if Aset(k,2)==Aset(k-1,2)
error(); end; end; end
if ~isempty(find( Aset(:,2)<1 | Aset(:,2)>6, 1 ))
error(); end

% read the normal data from NASTRAN output file
if ~isempty(NMode), NModeF = NMode; else NModeF = 300; end % max default = 300
EigenV = zeros(NModeF,1); FreqW = zeros(NModeF,1); GM = zeros(NModeF,1);
fid = fopen(FileF06,'rt'); frewind(fid);

% read the eigen matrix ( EigenV / FreqW / GM )
while ~feof(fid), ChkStr = fscanf(fid,'%s',1);
if strcmp(ChkStr,'MODE'), ChkStr = fscanf(fid,'%s',2); ChkStr = fscanf(fid,'%s',1);
if strcmp(ChkStr,'RADIANS'), ChkStr = fscanf(fid,'%s',1);
if strcmp(ChkStr,'CYCLES'), fgetl(fid); k=1;
while k<=NModeF, ChkStr = fscanf(fid,'%s',1); ModeNo = str2num(ChkStr);
if isInteger(ModeNo), if ModeNo==k, Mx = fscanf(fid,'%f',);
if Mx(5)~=0, EigenV(k) = Mx(2); FreqW(k) = Mx(3); GM(k) = Mx(5); k= k+1;
else if ~isempty(NMode), if k-1 < NMode,
disp(); end; end
break; end
end; end; fgetl(fid);
end; NMode = k-1; break
end; end; end; fgetl(fid);
end
EigenV = EigenV(1:NMode); FreqW = FreqW(1:NMode); GM = GM(1:NMode);

% read the Normal Mode matrix ( NAset*NMode )
ModeS = zeros(NAset,NMode);
for iMode=1:NMode, while ~feof(fid), ChkStr = fscanf(fid,'%s',1);
if strcmp(ChkStr,'EIGENVALUE'), ChkStr = fscanf(fid,'%s',1);
ChkStr = fscanf(fid,'%s',1); EigenR = str2num(ChkStr);
if EigenR==EigenV(iMode), fgetl(fid); ChkStr = fscanf(fid,'%s',1);
if strcmp(ChkStr, 'CYCLES'), ChkStr = fscanf(fid,'%65c',1); % bypass 65 blanks
ChkStr = fscanf(fid,'%s',1); ModeNo = str2num(ChkStr);
if ModeNo==iMode, fgetl(fid); k=1;
while k<=NAset, ChkStr = fscanf(fid,'%s',1); AsetID = str2num(ChkStr);
if isInteger(AsetID)
if AsetID==Aset(k,1), ChkStr = fscanf(fid,'%s',1);
Mx = fscanf(fid,'%f',); ModeS(k,iMode) = Mx(Aset(k,2)); k=k+1;
if k>NAset, break; end
while AsetID==Aset(k,1), ModeS(k,iMode) = Mx(Aset(k,2)); k=k+1;
if k>NAset, break; end; end
elseif AsetID > Aset(k,1),
error(); end
elseif strcmp(ChkStr,'EIGENVALUE')
ChkStr = fscanf(fid,'%s',1); EigenR = fscanf(fid,'%f',1);
if EigenR~=EigenV(iMode)
error(); end
end; fgetl(fid);
end; break
end; end; end; end; fgetl(fid);
end; end

% output arguments definition
if nargout >= 1,varargout{1} = GM;
if nargout >= 2, varargout{2} = FreqW;
if nargout >= 3, varargout{3} = ModeS; end;
end;
end

beep; disp();
return


[ 本帖最后由 ChaChing 于 2009-11-7 23:33 编辑 ]

dreamstone 发表于 2010-6-2 23:44

多谢CHaching大哥

唯有时光 发表于 2010-9-22 00:24

谢谢楼主分享@!

phi 发表于 2010-9-25 22:10

多谢楼主分享 很实用的东东

那帅哥 发表于 2011-9-2 23:54

大家好,新手,我想问一下% FileAset : filename include Aset grid ID / Aset direction指的是什么文件啊????急!!!!!!!!!!!!

ChaChing 发表于 2011-9-3 23:23

回复 5 # 那帅哥 的帖子

喔, 原来的运用是针对ASET点!
其实程序的写法并无这个限制!
这个说明应该改成
% FileAset : filename include grid ID / direction
ex: 10001 1 10001 2 10002 1 ....

怎现在自己的帖被回应, 都没通知下! (for 管理阶层)

那帅哥 发表于 2011-9-4 00:16

不好意思,我还是没明白,您帮我看一下:比如一个无阻尼模型有两个节点ID分别是1,2,每个节点有2个自由度第一和第二自由度1,2,那么我想得到这个系统的模态矩阵【 】(2×2),我应该怎么写那个fileaset文件,它是什么格式的(比如是txt?)?能具体说明一下么?

ChaChing 发表于 2011-9-4 10:50

经楼上的问题提醒, 我想我忽略说明一些注意事项了
f06档中必须要有eigen matrix及Normal Mode matrix的输出, 至於相应的NASTRAN的输入档应该如何, 真的已经模糊不清了!(汗)
而且以前NASTRAN并无相对应的前处理软件, 都是一张一张卡堆积而成, 输出的样式也不知是否改动过
总之, 个人以为基本语法/精神应该类似, 但个人真不知是否还适用现况(没测试过)

ChaChing 发表于 2011-9-4 10:59

本帖最后由 ChaChing 于 2011-9-4 11:01 编辑

回复 7 # 那帅哥 的帖子

fileaset文件是txt格式
还有不清楚LS的系统有两个节点, 每个节点有2个自由度, 所以共有4个自由度, 为何说这个系统的模态矩阵是2*2?
若LS两个ID都是要取第一自由度, fileaset文件就如下
1   1    2   1
or
1   1
2   1

那帅哥 发表于 2011-9-6 01:02

恩,谢谢,明白了

启航 发表于 2013-10-31 15:40

这个程序该怎么用呀,有点看不大懂
页: [1]
查看完整版本: 提取Nastran结果文件.f06中的模态信息matlab程序