一、接触问题有限元求解原理及算法(Part1)
本章节内容笔者在《计算不收敛?接触问题有限元Matlab编程求解攻略(上)》已经介绍,今天给大家继续讲第二部分内容。见下文:
二、Matlab编程实现接触问题的有限元求解(Part2)
根据第一节介绍的接触问题有限元算法,本节利用Matlab对接触问题有限元求解算法进行实现。本文以图1所示的两物体接触的平面应力问题为对象介绍接触问题的有限元Matlab编程求解过程。图1中上部块体上表面受均布荷载作用,左图为Matlab计算结果,有图为abaqus模拟结果,经比较,二者应力分布形式基本一致,但因采用算法的不同计算结果略有差异。本文的接触问题的有限元算法在计算精度方面还有待提高,但作为接触问题有限元编程入门来讲还是有一定借鉴意义,姑且抛砖引玉吧,欢迎大家批评指正!
本程序基于四节点平面应力单元的代码进行开发,四节点平面应力单元相关的理论介绍和代码实现可参考文章《四节点八节点四边形单元悬臂梁的Matlab有限元编程》或仿真秀视频教程《Matlab有限元编程从入门到精通20讲》中对应的四节点四边形单元的课程。
1、主程序main.m
Main.m是主程序,部分代码展示如下。由于接触问题是两个独立的物体相互接触的过程,所以主程序对于两物体的节点单元信息、边界条件以及各自的弹性刚度矩阵都是分开定义。其中Geometry()返回节点单元信息(P,E)、荷载施加节点(q0_node)和边界约束施加节点(Boundary),通过Patch=1或2分别定义上下物体的上述信息;然后主程序通过while循环,分100个荷载步逐步施加荷载,并计算每个荷载步对应的节点位移d,然后通过d_final=d_final+d与上一步计算的节点位移d叠加。节点位移的计算也是通过Kd=F求得,而这里的K即本篇part1中提到的切线刚度矩阵,包含了两物体各自的弹性刚度和接触刚度两部分。两物体各自的弹性刚度矩阵通过Linear_Elasticity()函数得到,接触刚度矩阵通过Contact_Formualtion()。Linear_Elasticity()函数可参考文章《四节点八节点四边形单元悬臂梁的Matlab有限元编程》或仿真秀视频教程《Matlab有限元编程从入门到精通20讲》中对应的四节点四边形单元的课程。本篇重点讲一下,接触刚度矩阵的编程求解方法。
Patch=1;%底部块体
[P1,E1,q0_node1,Boundary1] = Geometry(Patch, 0, 0);
Patch=2;%上部块体
[P2,E2,q0_node2,Boundary2] = Geometry(Patch, 0, 0);
%定义节点和单元
Node=[P1;P2];
Element=[E1;E2+size(P1,1)];
time=1;
d_final=zeros(2*size(Node,1),1);
while(time <100)
%建立下部块体刚度阵
Patch=1;
[K_Patch_1, F_Patch_1] = Linear_Elasticity(P1, E1, q0_node1,Boundary1,Patch);
%建立上部块体刚度阵
Patch=2;
[K_Patch_2, F_Patch_2] = Linear_Elasticity(P2, E2,q0_node2,Boundary2, Patch);
%将两个全局patch的刚度矩阵和荷载矩阵组装为一体
K_Global=[K_Patch_1,zeros(size(K_Patch_1,1),size(K_Patch_2,2)) ;zeros(size(K_Patch_2, 1),size(K_Patch_1,2)) ,K_Patch_2];
F_Global=[F_Patch_1; F_Patch_2];
%考虑接触约束
Penalty=1e7;%惩罚因子
[K_Contact RC_force] = Contact_Formualtion(P1, P2,E1,E2, Penalty, dis_1, dis_2);
K_Global=K_Global+K_Contact;
d=linsolve(K_Global, F_Global);
d_final=d_final+d;
time=time+1;
end
function [K_Contact RC_force] = Contact_Formualtion(P1, P2, E1,E2,Penalty, dis_1, dis_2)
K_Contact=zeros(2*(size(P1,1)+size(P2,1))); %initialize the Output;
SD=2;%空间维度
%slave接触面的节点及对应的全局索引
[ P_s, patch_s, Global_DOF_ID_s]= Contact_Geometry(0, dis_1, dis_2);
[ P_m, patch_m, Global_DOF_ID_m]= Contact_Geometry( 1, dis_1, dis_2);
RC_force=zeros(size(P_s,1)+size(P_m,1),2);
nnd_s=size(P_s,1);%节点数
ne_s=nnd_s-1;%单元数
nnd_m=size(P_m,1);%节点数
ne_m=nnd_m-1;%单元数
%对接触面进行搜索得到node-to-segement接触对
for n_i=1:nnd_s %从面节点进行循环node
ID_s=Global_DOF_ID_s(2*n_i-1:2*n_i);
for e_i=1:ne_m %主面segement进行循环
ID_m1= Global_DOF_ID_m(2*e_i-1:2*e_i);
ID_m2= Global_DOF_ID_m(2*(e_i+1)-1:2*(e_i+1));
iDof=[ID_s,ID_m1,ID_m2];
xs=P_s(n_i,1);
ys=P_s(n_i,2);
x1=P_m(e_i,1);
x2=P_m(e_i+1,1);
y1=P_m(e_i,2);
y2=P_m(e_i+1,2);
ELXY=[xs,x1,x2;ys,y1,y2];
[FORCE, STIFF] = cntelm2d(Penalty, ELXY);%返回接触刚度矩阵和接触力
if isempty(STIFF)
continue;
end
for row=1:size(STIFF,1)
for col=1:size(STIFF,2)
r=iDof(row);
c=iDof(col);
K_Contact(r,c)=K_Contact(r,c)+STIFF(row,col);
end
end
RC_force(n_i,:)=FORCE(1:2);
RC_force(5+e_i,:)=FORCE(3:4);
RC_force(5+e_i+1,:)=FORCE(5:6);
end
end
end
(20)
将接触对的接触力卸载一起可以得到整体接触对的接触力向量为
(21)
function [FORCE, STIFF] = cntelm2d(OMEGAN, ELXY)
%***********************************************************************
% SEARCH CONTACT POINT AND RETURN STIFFNESS AND RESIDUAL FORCE
% IF CONTACTED FOR NORMAL CONTACT
%***********************************************************************
%
ZERO = 0.D0; ONE = 1.D0; EPS = 1.E-6; P05 = 0.05; FORCE=[]; STIFF=[];
XT = ELXY(:,3)-ELXY(:,2); %切向量
XLEN = norm(XT);%x1 x2的距离
if XLEN < EPS, return; end
%
% UNIT NORMAL AND TANGENTIAL VECTOR
XT = XT/XLEN;
XN = [-XT(2); XT(1)];
%
% NORMAL GAP FUNCTION Gn = (X_s - X_1).N
GAPN = (ELXY(:,1)-ELXY(:,2))'*XN;%公式3
%
% CHECK IMPENETRATION CONDITION
if (GAPN >= ZERO) || (GAPN <= -XLEN), return; end
%
% NATURAL COORDINATE AT CONTACT POINT
ALPHA = (ELXY(:,1) - ELXY(:,2))'*XT/XLEN;%公式11
%
% OUT OF SEGMENT
if (ALPHA > ONE+P05) || (ALPHA < -P05), return; end
%
% CONTACT OCCURS IN THIS SEGMENT
XLAMBN = -OMEGAN*GAPN; %公式
%
% DEFINE VECTORS
NN = [XN; -(ONE-ALPHA)*XN; -ALPHA*XN];%2*3 公式16
% TT = [XT; -(ONE-ALPHA)*XT; -ALPHA*XT];
% PP = [ZERO; ZERO; -XN; XN];
% QQ = [ZERO; ZERO; -XT; XT];
CN = NN;%去掉-之后的差别不大
% CN = NN - GAPN*QQ/XLEN;
% CT = TT + GAPN*PP/XLEN;
%
% CONTACT FORCE
FORCE = XLAMBN*CN;
% FORM STIFFNESS
STIFF = OMEGAN*(CN*CN');
end
参考文献: