%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%% 主程序 %%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 将主程序存为 m 文件
clear;
% 背景:
% HyperMesh 具有强大的网格划分功能,可以作为很多有限元的前处理,
% 大家知道,HyperMesh 可以导出 LSDYNA 的 keyword 文件,ABAQUS 的 inp 文件
% Nastran,Marc,ANSYS 等软件的模型文件。
% 暂时为止还不能导出 Flac3D 的模型文件。
% 程序目的:
% 本程序为了能够使得 HyperMesh 能作为 Flac3D 的前处理。
% 使用步骤:
% 1. 利用 HyperMesh 划分网格
% 2. 导出为 LSDYNA 的关键字文件 k 文件。
% 3. 利用此程序,导出 flac3d 模型文件。
% 方法:把 k 文件替换如下的‘Pile2.k',outputname 为输出的结果文件名,可任取。
% 注意事项:本程序只针对实体单元,8 节点六面体单元(B8),或者 6 节点棱柱单元(W6)
%hl.ren@hotmail.com
%%%% 输入 LSDYNA 的关键字模型文件。
keyfilename='Pile2.k'; % 输入关键字文件
outputname='Pile2.txt'; % 输出的关键字文件名。
[Nodesum,elementsum,partsum]=keyfileinput(keyfilename);
Gnode=Nodesum(:,1:4);
%%%% 模型数据转换 keyword->Flac3D 文件
iele=size(elementsum,1);
eh=[2 1 3 4 5 6 7 8 9 10];
elementsum=elementsum(:,eh);
B8=zeros(1,9);iB=1;
W6=zeros(1,7);iW=1;
partsum=partsum(:,1);
ipa=size(partsum,1);
Zgroup=ones(1,ipa);
for i=1:iele
k56(1:3)=elementsum(i,[1 7 8]);
iz=find(partsum==k56(1));
if size(iz,1)>1
disp('part error');
end
iz1=Zgroup(1,iz);
Zgroup(iz1+1,iz)=elementsum(i,2);
Zgroup(1,iz)=Zgroup(1,iz)+1;
if k56(2)==k56(3)
W6(iW,:)=elementsum(i,[2 3 4 5 6 7 9]);
iW=iW+1;
else
B8(iB,:)=elementsum(i,[2 3 4 5 6 7 8 9 10]);
iB=iB+1;
end
end
Bh=[1 2 4 5 3 8 6 7]+1;
Wh=[1 2 4 5 3 6]+1;
B=B8(:,[1 Bh]);
W=W6(:,[1 Wh]);
%%%%% 按照 Flac3D 的文件格式输出
GG=Gnode';
BB8=B';
WW6=W';
fid = fopen(outputname,'w');
fprintf(fid,'* FLAC3D grid produced by MATLAB\n ! Author:Prometheus\n ! 2013-07-30\n');
fprintf(fid,'* GRIDPOINTS\n');
fprintf(fid,'G %8.0f.6e.6e.6e\n',GG);
fprintf(fid,'* ZONES\n');
if B8(1,1)~=0
fprintf(fid,'Z B8 %8.0f%8.0f%8.0f%8.0f%8.0f%8.0f%8.0f%8.0f%8.0f\n',BB8);
end
if W6(1,1)~=0
fprintf(fid,'Z W6 %8.0f%8.0f%8.0f%8.0f%8.0f%8.0f%8.0f\n',WW6);
end
fprintf(fid,'* GROUPS\n');
for i=1:ipa
fprintf(fid,'ZGROUP %8.0f\n',i);
j=2;
while j<=size(Zgroup(:,i),1)&&Zgroup(j,i)~=0
fprintf(fid,'%8.0f\n',Zgroup(j,i));
j=j+1;
end
end
fclose(fid);
%%% 主程序结束
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%% 文件输入函数 %%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%% 将文件输入函数存为 m 文件 %%%%%%%%%%%
function [node,element,part]=keyfileinput(keyfilename)
node=zeros(1,6);
element=zeros(1,10);
part=zeros(1,8);
fid=fopen(keyfilename,'r');
inode=1;iele=1; ipa=1;
tline = fgetl(fid);
while 1
if ~ischar(tline), break;
end
if strmatch(tline,'*NODE')
tline=fgetl(fid);
while tline(1)~='*'
if strcmp('$',tline(1))
tline=fgetl(fid);
else
tt=str2num(tline);
node(inode,:)=tt;
inode=inode+1;
tline=fgetl(fid);
end
end
elseif strmatch('*ELEMENT_SOLID',tline)
tline=fgetl(fid);
while ~strcmp(tline(1),'*')
if strcmp('$',tline(1))
tline=fgetl(fid);
else
element(iele,:)=str2num(tline);
iele=iele+1;
tline=fgetl(fid);
end
end
elseif strmatch('*PART',tline)
tline=fgetl(fid);
while ~strcmp(tline(1),'*')
if strcmp('$',tline(1))
tline=fgetl(fid);
else
if size(tline,2)<40
tline=fgetl(fid);
else
part(ipa,:)=str2num(tline);
ipa=ipa+1;
tline=fgetl(fid);
end
end
end
else
tline=fgetl(fid);
end
end % while
fclose(fid);
disp('Key file input compeleted');
% 文件输入函数结束
% 将上面两个程序存为 m 文件就可以在 MATLAB 中运行。
附件下载地址:https://stuch.cn/goods/6
[版权声明] :本文文字、代码及图片版权归原作者所有,任何媒体、网站或个人未经本网协议授权不得采集、整理、转载或以其他方式复制发表。已经本站协议授权的媒体、网站,在使用时必须注明“稿件来源:学研谷”。