HyperMesh 到 flac3d 的 MATLAB 程序

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%  主程序   %%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 将主程序存为 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

  • 发表于 · 2017.09.16 10:27 · 阅读 · 3682

[版权声明] :本文文字、代码及图片版权归原作者所有,任何媒体、网站或个人未经本网协议授权不得采集、整理、转载或以其他方式复制发表。已经本站协议授权的媒体、网站,在使用时必须注明“稿件来源:学研谷”。

0 条评论

请先 登录 后评论
猜猜我是谁
Boom -研究生

14
提问
32
回答
12
文章
注册推广