声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 7717|回复: 10

[共享资源] 提取Nastran结果文件.f06中的模态信息matlab程序

[复制链接]
发表于 2009-11-7 23:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

  15. % Ckeck the input & output property
  16. PreS = [blanks(10),'*** Error : ']; EndS = ' ! <== LinkF06 ***';
  17. PreW = [blanks(5),'*** Warning : '];
  18. if nargin > 3, error([PreS,'No more 3 input arguments',EndS]); end
  19. if nargin < 2, error([PreS,'At least 2 input arguments',EndS]); end
  20. if nargout > 3, error([PreS,'No more 3 output arguments',EndS]); end

  21. FileF06 = varargin{1};
  22. if ~ischar(FileF06), error([PreS,'Wrong input arguments (not char)',EndS]); end
  23. fid = fopen(FileF06,'rt');
  24. if fid == -1, error([PreS,'Can not open the file - ',FileF06,EndS]); end
  25. fclose(fid);

  26. FileAset = varargin{2};
  27. if ~ischar(FileAset), error([PreS,'Wrong input arguments (not char)',EndS]); end
  28. fid = fopen(FileAset,'rt');
  29. if fid == -1, error([PreS,'Can not open the file - ',FileAset,EndS]); end
  30. fclose(fid);

  31. NMode=[];
  32. if nargin >= 3, NMode = varargin{3}; if ~isempty(NMode)
  33. if ~isInteger(NMode), error([PreS,'Wrong used mode no (not integer)',EndS]); end
  34. if NMode <= 0 , error([PreS,'Wrong used mode no (not positive)',EndS]); end
  35. end; end

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

  37. % read the ASET data want to sort the normal data
  38. fid = fopen(FileAset,'rt'); frewind(fid); fgetl(fid); % read title
  39. Aset = fscanf(fid,'%i',[2,inf]); fclose(fid);
  40. Aset = Aset'; Aset = sortrows(Aset,[1,2]); NAset = size(Aset,1);
  41. for k=2:NAset, if Aset(k,1)==Aset(k-1,1), if Aset(k,2)==Aset(k-1,2)
  42. error([PreS,'Wrong input file - ',FileAset,' (repeat ASET)',EndS]); end; end; end
  43. if ~isempty(find( Aset(:,2)<1 | Aset(:,2)>6, 1 ))
  44. error([PreS,'Wrong direction - ',FileAset,EndS]); end

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

  49. % read the eigen matrix ( EigenV / FreqW / GM )
  50. while ~feof(fid), ChkStr = fscanf(fid,'%s',1);
  51. if strcmp(ChkStr,'MODE'), ChkStr = fscanf(fid,'%s',2); ChkStr = fscanf(fid,'%s',1);
  52. if strcmp(ChkStr,'RADIANS'), ChkStr = fscanf(fid,'%s',1);
  53. if strcmp(ChkStr,'CYCLES'), fgetl(fid); k=1;
  54. while k<=NModeF, ChkStr = fscanf(fid,'%s',1); ModeNo = str2num(ChkStr);
  55. if isInteger(ModeNo), if ModeNo==k, Mx = fscanf(fid,'%f',[1,6]);
  56. if Mx(5)~=0, EigenV(k) = Mx(2); FreqW(k) = Mx(3); GM(k) = Mx(5); k= k+1;
  57. else if ~isempty(NMode), if k-1 < NMode,
  58. disp([PreW,'Mode no in F06 is not enough',EndS]); end; end
  59. break; end
  60. end; end; fgetl(fid);
  61. end; NMode = k-1; break
  62. end; end; end; fgetl(fid);
  63. end
  64. EigenV = EigenV(1:NMode); FreqW = FreqW(1:NMode); GM = GM(1:NMode);

  65. % read the Normal Mode matrix ( NAset*NMode )
  66. ModeS = zeros(NAset,NMode);
  67. for iMode=1:NMode, while ~feof(fid), ChkStr = fscanf(fid,'%s',1);
  68. if strcmp(ChkStr,'EIGENVALUE'), ChkStr = fscanf(fid,'%s',1);
  69. ChkStr = fscanf(fid,'%s',1); EigenR = str2num(ChkStr);
  70. if EigenR==EigenV(iMode), fgetl(fid); ChkStr = fscanf(fid,'%s',1);
  71. if strcmp(ChkStr, 'CYCLES'), ChkStr = fscanf(fid,'%65c',1); % bypass 65 blanks
  72. ChkStr = fscanf(fid,'%s',1); ModeNo = str2num(ChkStr);
  73. if ModeNo==iMode, fgetl(fid); k=1;
  74. while k<=NAset, ChkStr = fscanf(fid,'%s',1); AsetID = str2num(ChkStr);
  75. if isInteger(AsetID)
  76. if AsetID==Aset(k,1), ChkStr = fscanf(fid,'%s',1);
  77. Mx = fscanf(fid,'%f',[1,6]); ModeS(k,iMode) = Mx(Aset(k,2)); k=k+1;
  78. if k>NAset, break; end
  79. while AsetID==Aset(k,1), ModeS(k,iMode) = Mx(Aset(k,2)); k=k+1;
  80. if k>NAset, break; end; end
  81. elseif AsetID > Aset(k,1),
  82. error([PreS,'Can not find ASET ID - ',num2str(Aset(k,1)),EndS]); end
  83. elseif strcmp(ChkStr,'EIGENVALUE')
  84. ChkStr = fscanf(fid,'%s',1); EigenR = fscanf(fid,'%f',1);
  85. if EigenR~=EigenV(iMode)
  86. error([PreS,'Can not find ASET ID - ',num2str(Aset(k,1)),EndS]); end
  87. end; fgetl(fid);
  88. end; break
  89. end; end; end; end; fgetl(fid);
  90. end; end

  91. % output arguments definition
  92. if nargout >= 1,varargout{1} = GM;
  93. if nargout >= 2, varargout{2} = FreqW;
  94. if nargout >= 3, varargout{3} = ModeS; end;
  95. end;
  96. end

  97. beep; disp([blanks(5),'*** Function is complete',EndS]);
  98. return
复制代码

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

评分

1

查看全部评分

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

发表于 2010-6-2 23:44 | 显示全部楼层
多谢CHaching大哥
发表于 2010-9-22 00:24 | 显示全部楼层
谢谢楼主分享@!
发表于 2010-9-25 22:10 | 显示全部楼层
多谢楼主分享 很实用的东东
发表于 2011-9-2 23:54 | 显示全部楼层
大家好,新手,我想问一下% FileAset : filename include Aset grid ID / Aset direction指的是什么文件啊????急!!!!!!!!!!!!
 楼主| 发表于 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?)?能具体说明一下么?
 楼主| 发表于 2011-9-4 10:50 | 显示全部楼层
经楼上的问题提醒, 我想我忽略说明一些注意事项了
f06档中必须要有eigen matrix及Normal Mode matrix的输出, 至於相应的NASTRAN的输入档应该如何, 真的已经模糊不清了!(汗)
而且以前NASTRAN并无相对应的前处理软件, 都是一张一张卡堆积而成, 输出的样式也不知是否改动过
总之, 个人以为基本语法/精神应该类似, 但个人真不知是否还适用现况(没测试过)
 楼主| 发表于 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 | 显示全部楼层
这个程序该怎么用呀,有点看不大懂
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-29 04:24 , Processed in 0.060886 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表