首页/文章/ 详情

基于临界平面法的多轴疲劳分析

11月前浏览1769

基于临界平面法的多轴疲劳分析

    %程序用于读取多个单元中心在单个加载循环的应力应变历程并计算SWT参量clear,clc%*****************************计算参数设置**********************************Elem_num=2400;                                       %待提取节点数量Step_inc_num=51;                                    %分析步增量数量Theta_num=181;                                       %临界平面角度theta分段数Phi_num=181;                                         %临界平面角度phi分段数%**************************************************************************%*******************************变量初始化**********************************Theta=linspace(0,pi,Theta_num);Phi=linspace(0,pi,Phi_num);SWT=zeros(Elem_num,1);                              %存放每个待评估点的SWTTheta_Critical=zeros(Elem_num,1);                   %存放每个待评估点的临界角度Phi_Critical=zeros(Elem_num,1);                     %存放每个待评估点的临界角度Elem_eval_centroid_coord_X=zeros(Elem_num,1);       %待评估单元中心X坐标Elem_eval_centroid_coord_Y=zeros(Elem_num,1);       %待评估单元中心Y坐标Elem_eval_centroid_coord_Z=zeros(Elem_num,1);       %待评估单元中心Z坐标%**************************************************************************%*********************读取单元中心应力应变数据*****************************File_input_id=fopen("abaqus.rpt");                    %读取Abaqus数据文件File_output_id=fopen("Stress_Strain_Hist.txt","w");%创建文件存放应力应变数据while ~feof(File_input_id)                    %判断指针是否已指向文件末尾行  tline=fgetl(File_input_id);                 %读取当前指针指向行的文件内容  if ~isempty(tline)                          %跳过空行    if numel(tline)>=11                       %跳过字符数少于10个的文件行      if double(tline(16))>=48&&double(tline(16))<=57        %根据ASCII码判断文件行的第12个字符是否为数字 满足条件则为数据行        fprintf(File_output_id,'%s\n\n',tline); %写入数据到应力应变数据文件      end    end  endendfclose(File_output_id);                         %关闭文件fclose(File_input_id);SE_Data=importdata("Stress_Strain_Hist.txt");   %导入应力应变数据%**************************************************************************%***************************整理应力应变数据*******************************%初始化元胞数组存放数据Stress_Data=cell(Elem_num,1);                   %存放所有单元中心的应力数据Strain_Data=cell(Elem_num,1);                   %存放所有单元中心的应变数据%格式化存储数据(元胞数组每个元素为一个单元中心在所有增量步的数据)for i=1:Elem_num  for j=1:Step_inc_num    Strain_Data{i}(j,:)=SE_Data(Elem_num*(j-1)+i,2:7);        %读取应变数据    Stress_Data{i}(j,:)=SE_Data(Elem_num*(j-1)+i,8:13);       %读取应力数据  endend%读取待评估单元的单元号Elem_eval_id=SE_Data(1:Elem_num,1);%**************************************************************************%*****************************计算SWT参数**********************************for i=1:Elem_num%读取当前单元中心的应力和应变分量在一个完整循环的变化历程S11=Stress_Data{i}(:,1);                                    %应力分量S22=Stress_Data{i}(:,2);S33=Stress_Data{i}(:,3);S12=Stress_Data{i}(:,4);S13=Stress_Data{i}(:,5);S23=Stress_Data{i}(:,6);E11=Strain_Data{i}(:,1);                                    %应变分量E22=Strain_Data{i}(:,2);E33=Strain_Data{i}(:,3);E12=Strain_Data{i}(:,4);E13=Strain_Data{i}(:,5);E23=Strain_Data{i}(:,6);%计算不同平面对应的SWT值SWT_Plane=zeros(Theta_num,Phi_num);                  %存放每个平面的SWT取值for j=1:Theta_num                                            %遍历角度theta  for k=1:Phi_num                                            %遍历角度phi    %计算旋转平面之后的应力和应变分量在一个完整循环的变化历程    S11_trans=cos(Theta(j))^2*sin(Phi(k))^2*S11+...      2*sin(Theta(j))*cos(Theta(j))*sin(Phi(k))^2*S12+...      2*cos(Theta(j))*sin(Phi(k))*cos(Phi(k))*S13+...      sin(Theta(j))^2*sin(Phi(k))^2*S22+...      2*sin(Theta(j))*sin(Phi(k))*cos(Phi(k))*S23+...      cos(Phi(k))^2*S33;                                %变换之后的应力分量    E11_trans=cos(Theta(j))^2*sin(Phi(k))^2*E11+...      2*sin(Theta(j))*cos(Theta(j))*sin(Phi(k))^2*E12+...      2*cos(Theta(j))*sin(Phi(k))*cos(Phi(k))*E13+...      sin(Theta(j))^2*sin(Phi(k))^2*E22+...      2*sin(Theta(j))*sin(Phi(k))*cos(Phi(k))*E23+...      cos(Phi(k))^2*E33;                                %变换之后的应变分量    %计算当前平面下的法向应变幅值    Delta_Eps_normal=(max(E11_trans)-min(E11_trans))/2;    %计算当前平面下的最**向应力    Sigma_normal_max=max(abs(S11_trans));    %计算当前平面下的SWT参量    SWT_Plane(j,k)=Sigma_normal_max*Delta_Eps_normal;     endend%计算当前待评估点的SWT及对应的临界角度[SWT_Plane_Column,Theta_max_index]=max(SWT_Plane);[SWT_Max,Phi_max_index]=max(SWT_Plane_Column);SWT(i)=SWT_Max;Theta_Critical(i)=Theta(Theta_max_index(Phi_max_index));Phi_Critical(i)=Phi(Phi_max_index);end%**************************************************************************%**************************重新构造待评估单元定义信息**********************%读取节点信息数据Node_Data=importdata("Node_id.txt");%读取单元定义信息Elem_Def_Data=importdata("Elem_id.txt");Elem_eval_connect=zeros(Elem_num,5);              %用于存放新的单元定义信息%读取待评估单元在单元定义信息中的编号for i=1:Elem_num  %存放待评估单元号至新的单元定义信息  Elem_eval_connect(i,1)=Elem_eval_id(i);  Elem_eval_index=find(Elem_Def_Data(:,1)==Elem_eval_id(i));  k=2;  for j=1:8    %读取待评估单元的节点编号    Elem_eval_node_id=Elem_Def_Data(Elem_eval_index,j+1);    %根据节点编号查询该节点在节点定义信息中的索引    Elem_eval_node_index=find(Node_Data(:,1)==Elem_eval_node_id);     %读取待评估单元节点坐标    Elem_eval_node_coord_X=Node_Data(Elem_eval_node_index,2);    Elem_eval_node_coord_Y=Node_Data(Elem_eval_node_index,3);    Elem_eval_node_coord_Z=Node_Data(Elem_eval_node_index,4);    %根据Z向坐标判断是否需要剔除(!!!!!!!!!根据不同程序可能需要更改)    if Elem_eval_node_coord_Y==0      Elem_eval_connect(i,k)=Node_Data(Elem_eval_node_index,1);      k=k+1;    else      continue;    end  endend%**************************************************************************%*************************重新整理待评估单元节点信息***********************%读取待评估单元的所有节点号Node_eval_all=zeros(4*Elem_num,1);      %所有待评估单元节点号(含重复节点号)for i=1:Elem_num  for j=1:4    Node_eval_all(4*(i-1)+j)=Elem_eval_connect(i,j+1);  endend%剔除重复节点并对节点编号重新排序Node_eval_all_unique=unique(Node_eval_all);Node_eval_num=size(Node_eval_all_unique,1);           %待评估单元的节点总数%排序后的节点编号重组形成新的节点信息表Node_eval_list=zeros(Node_eval_num,4);Node_eval_list(:,1)=Node_eval_all_unique;%重新读取节点坐标信息至新的节点信息表for i=1:Node_eval_num  %查询节点在原节点信息表中的索引  Node_index=find(Node_Data(:,1)==Node_eval_list(i,1));  %根据索引读取节点坐标至新的节点信息表  Node_eval_list(i,2)=Node_Data(Node_index,2);                   %读取X坐标  Node_eval_list(i,3)=Node_Data(Node_index,3);                   %读取Y坐标  Node_eval_list(i,4)=Node_Data(Node_index,4);                   %读取Z坐标end%**************************************************************************%**************重新基于新节点定义信息的待评估单元定义信息******************Elem_eval_connect_new=zeros(Elem_num,5);Elem_eval_connect_new(:,1)=Elem_eval_connect(:,1);for i=1:Elem_num  for j=2:5    %计算待评估单元节点在新节点定义信息中对应的索引    Node_index=find(Node_eval_list(:,1)==Elem_eval_connect(i,j));    Elem_eval_connect_new(i,j)=Node_index;  endend%**************************************************************************%****************************绘制SWT分布***********************************%采用patch函数绘制 需将数据整理为patch要求的格式Patch_X=zeros(4,Elem_num);Patch_Y=zeros(4,Elem_num);Patch_Z=zeros(4,Elem_num);for i=1:Elem_num     %针对单元的循环  for j=1:4             %针对单元内部节点的循环    %读取坐标值    Patch_X(j,i)=Node_eval_list(Elem_eval_connect_new(i,j+1),2);    Patch_Y(j,i)=Node_eval_list(Elem_eval_connect_new(i,j+1),3);    Patch_Z(j,i)=Node_eval_list(Elem_eval_connect_new(i,j+1),4);  endend%绘制每个临界平面的法向量Plane_Normal_Vector=zeros(Elem_num,3);                %存放每个平面的法向量Elem_Center_Coord_X=zeros(Elem_num,1);                %存放单元中心坐标Elem_Center_Coord_Y=zeros(Elem_num,1);Elem_Center_Coord_Z=zeros(Elem_num,1);for i=1:Elem_num  %计算单元中心临界平面法向量  Plane_Normal_Vector(i,1)=sin(Phi_Critical(i))*cos(Theta_Critical(i));  Plane_Normal_Vector(i,2)=sin(Phi_Critical(i))*sin(Theta_Critical(i));  Plane_Normal_Vector(i,3)=cos(Phi_Critical(i));  %计算单元中心坐标  Elem_Center_Coord_X(i)=mean(Patch_X(:,i));  Elem_Center_Coord_Y(i)=mean(Patch_Y(:,i));  Elem_Center_Coord_Z(i)=mean(Patch_Z(:,i));endpatch(Patch_X,Patch_Z,SWT);axis equal;hold on;quiver(Elem_Center_Coord_X,Elem_Center_Coord_Z,...  Plane_Normal_Vector(:,1),Plane_Normal_Vector(:,3),1,'b');axis equal;xlim([-6 6]);set(gca,'color','none');%**************************************************************************%***********************输出Tecplot可读取的数据文件************************File_Tecplot_id=fopen("SWT_Visual.dat","w");%输出基本信息fprintf(File_Tecplot_id,'title=\"SWT Visualization in 2D FEM\"\n');fprintf(File_Tecplot_id,'variables=\"x\",\"z\",\"SWT\",\"Theta\",\"Phi\"\n');fprintf(File_Tecplot_id,"zone N=%d,",Node_eval_num);fprintf(File_Tecplot_id,"E=%d,",Elem_num);fprintf(File_Tecplot_id,"datapacking=block\n");fprintf(File_Tecplot_id,"varlocation=([3,4,5]=cellcentered)\n");fprintf(File_Tecplot_id,"zonetype=fequadrilateral\n");%输出所有节点的坐标for i=1:Node_eval_num  fprintf(File_Tecplot_id,"%f ",Node_eval_list(i,2));endfprintf(File_Tecplot_id,"\n");for i=1:Node_eval_num  fprintf(File_Tecplot_id,"%f ",Node_eval_list(i,4));endfprintf(File_Tecplot_id,"\n");%输出位于单元中心的SWT值for i=1:Elem_num  if i==Elem_num    fprintf(File_Tecplot_id,"%f\n",SWT(i));  else    fprintf(File_Tecplot_id,"%f ",SWT(i));  endend%输出位于单元中的临界Theta角for i=1:Elem_num  if i==Elem_num    fprintf(File_Tecplot_id,"%f\n",Theta_Critical(i));  else    fprintf(File_Tecplot_id,"%f ",Theta_Critical(i));  endend%输出位于单元中的临界Phi角for i=1:Elem_num  if i==Elem_num    fprintf(File_Tecplot_id,"%f\n",Phi_Critical(i));  else    fprintf(File_Tecplot_id,"%f ",Phi_Critical(i));  endend%输出单元节点构成信息for i=1:Elem_num  for j=2:5    if j==5      fprintf(File_Tecplot_id,"%d\n",Elem_eval_connect_new(i,j));    else      fprintf(File_Tecplot_id,"%d ",Elem_eval_connect_new(i,j));    end  endendfclose(File_Tecplot_id);%**************************************************************************
    来源:FEM and FEA
    Abaqus疲劳Tecplot
    著作权归作者所有,欢迎分享,未经许可,不得转载
    首次发布时间:2023-05-30
    最近编辑:11月前
    追逐繁星的Mono
    硕士 签名征集中
    获赞 41粉丝 61文章 59课程 0
    点赞
    收藏
    未登录
    还没有评论

    课程
    培训
    服务
    行家

    VIP会员 学习 福利任务 兑换礼品
    下载APP
    联系我们
    帮助与反馈