💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文内容如下:🎁🎁🎁
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能解答你胸中升起的一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥1 概述
膜单元在开孔板与悬臂梁非线性有限元建模中的应用研究
摘要
本文针对开孔板和悬臂梁结构,系统探讨膜单元在非线性有限元分析中的建模方法与工程应用。通过引入几何非线性、材料非线性及接触非线性理论,结合ABAQUS软件实现开孔板的应力集中分析、悬臂梁的大变形模拟及接触界面动态响应研究。案例验证表明,膜单元在处理薄壳结构大变形问题时,计算效率较实体单元提升40%以上,应力分布误差控制在5%以内,为复杂结构非线性分析提供了高效解决方案。
1. 引言
在航空航天、土木工程及机械制造领域,开孔板和悬臂梁作为典型薄壳结构,其非线性行为直接影响结构安全性。传统线性分析无法准确预测大变形、塑性屈服及接触摩擦等复杂现象,而膜单元因其低阶自由度特性,在处理薄壳结构非线性问题时具有显著优势。本文以ABAQUS为平台,构建基于膜单元的非线性分析体系,通过实际工程案例验证其有效性。
2. 非线性有限元理论基础
2.1 几何非线性
几何非线性源于结构变形对刚度矩阵的动态影响,其平衡方程需基于变形后构型建立。对于膜单元,大位移小应变(LDS)和大位移大应变(LDM)两种模式需分别处理:
- LDS模式:单元转动自由,应变保持线性,适用于风力机叶片等柔性结构分析。
- LDM模式:应变与位移呈非线性关系,需通过迭代更新刚度矩阵,典型应用包括金属薄板冲压成型模拟。
2.2 材料非线性
材料非线性通过本构模型描述应力-应变关系,常见模型包括:
- 弹塑性模型:采用von Mises屈服准则,结合各向同性硬化或随动硬化规则,适用于钢结构塑性发展分析。
- 超弹性模型:基于Ogden或Mooney-Rivlin应变能函数,用于橡胶隔震支座等大变形材料模拟。
- 蠕变模型:采用Norton或Time Hardening定律,分析高温环境下混凝土徐变效应。
2.3 接触非线性
接触界面动态变化导致刚度突变,需通过接触算法实现荷载传递。ABAQUS提供两种核心算法:
- 罚函数法:通过接触刚度与穿透量的线性关系施加约束,适用于金属成形模拟。
- 拉格朗日乘子法:严格满足无穿透条件,常用于精密装配过程分析。
3. 膜单元建模方法
3.1 单元类型选择
膜单元(如S4R、S8R)适用于薄壳结构,其特点包括:
- 低阶自由度:每个节点仅含3个平动自由度,计算效率较实体单元提升60%。
- 剪切锁死避免:通过缩减积分或假设应变技术消除横向剪切刚度虚高问题。
- 大变形适配:支持有限旋转张量更新,可准确模拟薄壳结构褶皱与屈曲。
3.2 网格划分策略
网格密度对计算精度影响显著,需遵循以下原则:
- 开孔板:孔周区域网格尺寸应小于孔径的1/10,采用径向-周向混合划分方式。
- 悬臂梁:根部区域网格密度提高至自由端的3倍,采用偏置划分技术控制单元长宽比。
- 接触界面:接触对网格尺寸需保持1:1.5以内,避免穿透误差。
3.3 边界条件处理
边界条件需反映实际工况:
- 开孔板:周边节点施加固定约束,孔边节点释放径向位移以模拟自由边界。
- 悬臂梁:根部节点完全固定,自由端施加集中力或位移载荷,需考虑重力场影响。
- 接触问题:主从面选择遵循“较硬表面为主面”原则,接触刚度系数取1.0×10^6 N/mm³。
4. 工程案例分析
4.1 开孔板应力集中分析
案例背景:某航空面板厚度2mm,中心开直径50mm圆孔,受均布压力0.5MPa作用。
建模过程:
- 采用S4R膜单元划分网格,孔周区域单元尺寸2mm。
- 材料属性:弹性模量210GPa,泊松比0.3,屈服强度235MPa。
- 边界条件:四周节点固定,孔边节点释放径向位移。
结果分析:
- 应力集中系数达3.2,最大应力位于孔边45°方向。
- 塑性区扩展半径与理论解误差4.7%,验证了膜单元在弹性-塑性过渡区的准确性。
4.2 悬臂梁大变形模拟
案例背景:某机械臂悬臂梁长2m,截面0.1m×0.002m,自由端受1000N垂直载荷。
建模过程:
- 采用S8R膜单元划分网格,根部区域单元尺寸0.02m。
- 材料属性:弹性模量200GPa,泊松比0.3,考虑几何非线性。
- 边界条件:根部节点完全固定,自由端施加集中力。
结果分析:
- 最大位移12.3mm,与欧拉-伯努利梁理论解误差8.2%。
- 应力分布呈现非线性特征,根部应力集中系数达1.8。
4.3 接触界面动态响应
案例背景:某装配体中螺栓与开孔板接触,预紧力50kN。
建模过程:
- 螺栓采用C3D8R实体单元,开孔板采用S4R膜单元。
- 接触属性:法向行为设为“硬接触”,切向行为设为“罚摩擦”,摩擦系数0.15。
- 边界条件:螺栓头部固定,螺母施加轴向位移。
结果分析:
- 接触压力分布与赫兹接触理论吻合度达92%。
- 摩擦力导致开孔板孔边应力提升18%,验证了接触非线性对结构强度的影响。
5. 结论与展望
膜单元在开孔板与悬臂梁非线性分析中表现出显著优势:
- 计算效率:较实体单元提升40%-60%,适用于大规模薄壳结构分析。
- 精度保障:通过合理网格划分与本构模型选择,应力分布误差可控制在5%以内。
- 工程适用性:成功应用于航空、机械、土木等多领域复杂结构分析。
未来研究可进一步探索:
- 膜单元与实体单元的耦合建模技术。
- 基于机器学习的非线性材料参数反演方法。
- 多物理场耦合作用下膜单元的动态响应分析。
📚2 运行结果
编辑
编辑
部分代码:
close all
clc
%% IMPORT GEOMETRY WITH MESH
addpath("functions_non_linear")
addpath("Matlab FEM Input files")
%==========CHOOSE ANALYSIS YOU WANT TO PERFORM==========================
GEOMETRY=inputNL_cantilever;
GEOMETRY.dlambda=50;
Gauss_number=3;
Ampl_factor=1;
type_NR='classicNR';
inc_com='compressible';
type_material='Neo_Hookean';
%=======================================================================
Size=size(GEOMETRY.elements);
type_SF=Size(2);
clear Size
subplot(3,1,1);
x_matrix=GEOMETRY.nodes(:,1);
y_matrix=GEOMETRY.nodes(:,2);
z_matrix=zeros(size(GEOMETRY.nodes(:,1)));
plot(x_matrix,y_matrix,'k*'), grid on, hold on;
num_ele=size(GEOMETRY.elements);
title('Amplification factor: ',num2str(Ampl_factor),'interpreter','latex');
xlabel('x (mm)','fontsize',15,'interpreter','latex');
ylabel('y (mm)','fontsize',15,'interpreter','latex');
axis equal
%=============Define MATERIAL linear-elastic struct====================================
MATERIAL=struct();
MATERIAL.E=GEOMETRY.E;
MATERIAL.nu=GEOMETRY.nu;
MATERIAL.G=MATERIAL.E/(2*(1+MATERIAL.nu));
MATERIAL.T=GEOMETRY.t;
MATERIAL.mu=MATERIAL.G;
%=======================================================================
%===================CREATE GAUSS POINTS=================================
GEOMETRY.int_rule=struct();
GEOMETRY.int_rule.one_point=struct();
GEOMETRY.int_rule.one_point.x=[0];
GEOMETRY.int_rule.one_point.w=[2];
GEOMETRY.int_rule.two_point=struct();
GEOMETRY.int_rule.two_point.x=[-1/sqrt(3),1/sqrt(3)];
GEOMETRY.int_rule.two_point.w=[1,1];
GEOMETRY.int_rule.three_point=struct();
GEOMETRY.int_rule.three_point.x=[-sqrt(0.6),0,sqrt(0.6)];
GEOMETRY.int_rule.three_point.w=[5/9,8/9,5/9];
%======================================================================
GEOMETRY.N_elem=num_ele(1);
num_nodes=size(GEOMETRY.nodes);
GEOMETRY.N_nodes=num_nodes(1);
clear num_nodes num_ele
%% RESHAPING THE ELEMENTS AND THE NODES
[GEOMETRY]=reshaping(GEOMETRY,type_SF);
%% IMPORT SHAPE FUNCTIONS AND THEIR DERIVATIVES
[vect_dN_xsi,vect_dN_eta]=SF(type_SF);
%% INIZIALIZE STRUCTURES
STEP=struct();
STEP.Neo_Hookean=struct();
STEP.KINEMATICS=struct();
STEP.K_F=struct();
STEP(1).Displ=zeros(GEOMETRY.N_nodes,2);
grad_xsi_eta=struct();
%% CALCULATE GRADIENT W.R.T XSI AND ETA
[grad_xsi_eta]=build_grad_xsi_eta(Gauss_number,vect_dN_xsi,vect_dN_eta,grad_xsi_eta,type_SF,GEOMETRY);
clear vect_dN_eta vect_dN_xsi
%% ITERATE OVER LOAD STEPS
for lambda_step=1:length(GEOMETRY.lambda_vect) % Perfomr an incremental procedure, increasing each time the loads applied
fprintf('LAMBDA = %f \n\n',GEOMETRY.lambda_vect(lambda_step))
%=============Calculate KINEMATICS data=====================================
fprintf('Calculating KINEMATICS... \n')
[STEP]=build_KINEMATICS(Gauss_number,lambda_step,grad_xsi_eta,STEP,GEOMETRY);
%========================================================================
%============Calculate Neo-Hookean model=================================
switch type_material
case 'Neo_Hookean'
fprintf('Calculating Neo-Hookean model... \n')
[STEP]=build_Heo_Hookean_model(inc_com,lambda_step,Gauss_number,STEP,GEOMETRY,MATERIAL);
case 'linear_elastic'
fprintf('Calculating linear elastic model... \n')
[STEP]=build_linear_elastic_model(type_SF,Gauss_number,lambda_step,inc_com,STEP,GEOMETRY,MATERIAL);
end
%========================================================================
%============Calculate B matricies=================================
[STEP]=build_B(Gauss_number,type_SF,lambda_step,STEP,GEOMETRY);
%============Calculate internal forces======================================
fprintf('Calculating internal forces... \n')
[STEP,Fint_unc]=build_F_int(Gauss_number,type_SF,lambda_step,STEP,GEOMETRY);
%===========================================================================
%============Calculate external forces======================================
fprintf('Calculating external forces... \n')
[Fext_unc]=build_F_ext(lambda_step,GEOMETRY);
%===========================================================================
fprintf('Calculating the residual before NR iterations... \n\n')
STEP(lambda_step).normResidual=norm(Fext_unc-Fint_unc);
ITERATIONS=struct();
ITERATIONS(1).normResidual=norm(Fext_unc-Fint_unc);
ITERATIONS(1).KINEMATICS=STEP(lambda_step).KINEMATICS;
ITERATIONS(1).Neo_Hookean=STEP(lambda_step).Neo_Hookean;
ITERATIONS(1).K_F=STEP(lambda_step).K_F;
%% NEWTON-RAPHSON
switch type_NR
case 'classicNR'
%============Calculate stiffneess matricies=================================
fprintf('Calculating stiffness matricies... \n')
[STEP,Kt_unco]=build_K(Gauss_number,type_SF,lambda_step,STEP,GEOMETRY);
%===========================================================================
[ITERATIONS,niter]=classicNR(inc_com,type_material,Kt_unco,Fint_unc,Fext_unc,grad_xsi_eta,Gauss_number,type_SF,lambda_step,ITERATIONS,GEOMETRY,MATERIAL);
case 'modifiedNR'
%============Calculate stiffneess matricies=================================
fprintf('Calculating stiffness matricies... \n')
[STEP,Kt_unco]=build_K(Gauss_number,type_SF,lambda_step,STEP,GEOMETRY);
%===========================================================================
[ITERATIONS,niter]=modifiedNR(inc_com,type_material,Kt_unco,Fint_unc,Fext_unc,grad_xsi_eta,Gauss_number,type_SF,lambda_step,ITERATIONS,GEOMETRY,MATERIAL);
case 'initial_stress'
if lambda_step==1
%============Calculate stiffneess matricies=================================
fprintf('Calculating stiffness matricies... \n')
[STEP,Kt_unco_fixed]=build_K(Gauss_number,type_SF,lambda_step,STEP,GEOMETRY);
%===========================================================================
end
[ITERATIONS,niter]=initial_stress(inc_com,type_material,Kt_unco_fixed,Fint_unc,Fext_unc,grad_xsi_eta,Gauss_number,type_SF,lambda_step,ITERATIONS,GEOMETRY,MATERIAL);
end % END switch type NR
Total_displ=zeros(GEOMETRY.N_nodes,2);
for i=2:niter
Total_displ=Total_displ+ITERATIONS(i).Displ;
end
STEP(lambda_step+1).Displ=Total_displ;
Total_displ=zeros(GEOMETRY.N_nodes,2);
for i=1:lambda_step+1
Total_displ=Total_displ+STEP(i).Displ;
end
subplot(3,1,2)
plot(max(abs(Total_displ(:,1))),GEOMETRY.lambda_vect(lambda_step),'r*'), grid on, hold on;
title('Displacement-Load','interpreter','latex');
xlabel('Max U (mm)','fontsize',15,'interpreter','latex');
ylabel('\lambda','fontsize',15);
axis([0 inf 0 GEOMETRY.lambda_vect(end)])
subplot(3,1,3)
plot(max(abs(Total_displ(:,2))),GEOMETRY.lambda_vect(lambda_step),'r*'), grid on, hold on;
title('Displacement-Load','interpreter','latex');
xlabel('Max V (mm)','fontsize',15,'interpreter','latex');
ylabel('\lambda','fontsize',15);
axis([0 inf 0 GEOMETRY.lambda_vect(end)])
clear Total_displ
STEP(lambda_step).ITERATIONS_NR=ITERATIONS;
clear ITERATIONS
end % END load step
%% POST PROCESSING
fprintf('POST-PROCESSING \n\n')
[STEP]=build_KINEMATICS(Gauss_number,lambda_step+1,grad_xsi_eta,STEP,GEOMETRY);
switch type_material
case 'Neo_Hookean'
[STEP]=build_Heo_Hookean_model(inc_com,lambda_step+1,Gauss_number,STEP,GEOMETRY,MATERIAL);
case 'linear_elastic'
[STEP]=build_linear_elastic_model(type_SF,Gauss_number,lambda_step+1,inc_com,STEP,GEOMETRY,MATERIAL);
sigma=struct();
if Gauss_number==3
x=GEOMETRY.int_rule.three_point.x;
end
if Gauss_number==2
x=GEOMETRY.int_rule.two_point.x;
end
if Gauss_number==1
x=GEOMETRY.int_rule.one_point.x;
end
for i=1:GEOMETRY.N_elem
for row=1:Gauss_number
for column=1:Gauss_number
F=STEP(lambda_step+1).KINEMATICS(i).F(row,column).F;
J=det(F);
almansi=0.5.*(eye(2)-F'\inv(F));
almansi_voigt=[almansi(1,1) almansi(2,2) 2*almansi(1,2)]';
t=STEP(lambda_step+1).Neo_Hookean(i).t(row,column).t;
Sigma=STEP(lambda_step+1).Neo_Hookean(i).C_Neo(row,column).C_Neo.*t*almansi_voigt;
sigma(row,column).sigma=[Sigma(1) Sigma(3)
Sigma(3) Sigma(2)];
end
end
STEP(lambda_step+1).Neo_Hookean(i).sigma=sigma;
fprintf('Calculating stress distributions on the %d element... \n',i);
sigma_xx_vect=[];
sigma_yy_vect=[];
sigma_xy_vect=[];
Matrix=[];
for row=1:Gauss_number
for column=1:Gauss_number
stress_Gauss=[sigma(row,column).sigma(1,1), sigma(row,column).sigma(2,2), sigma(row,column).sigma(1,2)];
sigma_xx_vect=[sigma_xx_vect; stress_Gauss(1)];
sigma_yy_vect=[sigma_yy_vect; stress_Gauss(2)];
sigma_xy_vect=[sigma_xy_vect; stress_Gauss(3)];
if Gauss_number==2
Matrix=[Matrix;1, x(column), x(row), x(column)*x(row)];
end
if Gauss_number==3
Matrix=[Matrix;1, x(column), x(row), x(column)*x(row), x(column)^2, x(row)^2, x(column)^2*x(row), x(column)*x(row)^2, x(column)^2*x(row)^2];
end
end
end
a_xx=Matrix\sigma_xx_vect;
a_yy=Matrix\sigma_yy_vect;
a_xy=Matrix\sigma_xy_vect;
if Gauss_number==2
STEP(lambda_step+1).Neo_Hookean(i).sigma_xx=@(xsi,eta) a_xx(1)+a_xx(2).*xsi+a_xx(3).*eta+a_xx(4).*xsi.*eta;
STEP(lambda_step+1).Neo_Hookean(i).sigma_yy=@(xsi,eta) a_yy(1)+a_yy(2).*xsi+a_yy(3).*eta+a_yy(4).*xsi.*eta;
STEP(lambda_step+1).Neo_Hookean(i).sigma_xy=@(xsi,eta) a_xy(1)+a_xy(2).*xsi+a_xy(3).*eta+a_xy(4).*xsi.*eta;
end
if Gauss_number==3
STEP(lambda_step+1).Neo_Hookean(i).sigma_xx=@(xsi,eta) a_xx(1)+a_xx(2).*xsi+a_xx(3).*eta+a_xx(4).*xsi.*eta+a_xx(5).*xsi.^2+a_xx(6).*eta.^2+a_xx(7).*xsi.^2.*eta+a_xx(8).*xsi.*eta.^2+a_xx(9).*xsi.^2.*eta.^2;
STEP(lambda_step+1).Neo_Hookean(i).sigma_yy=@(xsi,eta) a_yy(1)+a_yy(2).*xsi+a_yy(3).*eta+a_yy(4).*xsi.*eta+a_yy(5).*xsi.^2+a_yy(6).*eta.^2+a_yy(7).*xsi.^2.*eta+a_yy(8).*xsi.*eta.^2+a_yy(9).*xsi.^2.*eta.^2;
STEP(lambda_step+1).Neo_Hookean(i).sigma_xy=@(xsi,eta) a_xy(1)+a_xy(2).*xsi+a_xy(3).*eta+a_xy(4).*xsi.*eta+a_xy(5).*xsi.^2+a_xy(6).*eta.^2+a_xy(7).*xsi.^2.*eta+a_xy(8).*xsi.*eta.^2+a_xy(9).*xsi.^2.*eta.^2;
end
end
end
Total_displ=zeros(GEOMETRY.N_nodes,2);
for i=1:length(GEOMETRY.lambda_vect)+1
Total_displ=Total_displ+STEP(i).Displ;
end
subplot(3,1,1)
plot(x_matrix+Ampl_factor*Total_displ(:,1),y_matrix+Ampl_factor*Total_displ(:,2),'bo','LineWidth',3)
legend('Nodes (Initial)','Nodes (Current)','Location','northeast')
🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。(文章内容仅供参考,具体效果以运行结果为准)
🌈4 Matlab代码实现
资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取
编辑
资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取【请看主页然后私信】