function SolveModel % 求解有限元模型 % 该函数求解有限元模型,过程如下 % 1. 计算单元刚度矩阵,集成整体刚度矩阵 % 2. 计算单元的等效节点力,集成整体节点力向量 % 3. 处理约束条件,修改整体刚度矩阵和节点力向量 % 4. 求解方程组,得到整体节点位移向量 % 5. 计算单元应力和节点应力 global gNode gElement gMaterial gBC1 gK gDelta gNodeStress gElementStress gDF % step 1. 定义整体刚度矩阵和节点力向量 [node_number,dummy] = size( gNode ) ; gK = sparse( node_number * 2, node_number * 2 ) ; f = sparse( node_number * 2, 1 ) ; % step 2. 计算单元刚度矩阵,并集成到整体刚度矩阵中 [element_number, dunmmy] = size( gElement ) ; for ie=1:1:element_number k = StiffnessMatrix( ie ) ; AssembleStiffnessMatrix( ie, k ) ; end % step 3. 计算地面超载产生的等效节点力 [df_number,dummy] = size( gDF ) ; for idf = 1:1:df_number enf = EquivalentNodeForce( gDF(idf,1), gDF(idf,2), gDF(idf,3), gDF(idf,4) ) ; i = gElement( gDF(idf,1), 1 ) ; j = gElement( gDF(idf,1), 2 ) ; m = gElement( gDF(idf,1), 3 ) ; f( (i-1)*2+1 : (i-1)*2+2 ) = f( (i-1)*2+1 : (i-1)*2+2 ) + enf( 1:2 ) ; f( (j-1)*2+1 : (j-1)*2+2 ) = f( (j-1)*2+1 : (j-1)*2+2 ) + enf( 3:4 ) ; f( (m-1)*2+1 : (m-1)*2+2 ) = f( (m-1)*2+1 : (m-1)*2+2 ) + enf( 5:6 ) ; end % step 4. 处理约束条件,修改刚度矩阵和节点力向量。采用乘大数法 [bc_number,dummy] = size( gBC1 ) ; for ibc=1:1:bc_number n = gBC1(ibc, 1 ) ; d = gBC1(ibc, 2 ) ; m = (n-1)*2 + d ; f(m) = gBC1(ibc, 3)* gK(m,m) * 1e20 ; gK(m,m) = gK(m,m) * 1e20 ; end % step 5. 求解方程组,得到节点位移向量 gDelta = gK \ f ; % step 6. 计算单元应力 gElementStress = zeros( element_number, 6) ; for ie=1:element_number es = ElementStress( ie ) ; gElementStress( ie, : ) = es ; end % % step 7. 计算节点应力(采用绕节点加权平均) gNodeStress = zeros( node_number, 6 ) ; for i=1:node_number S = zeros( 1, 3 ) ; A = 0 ; for ie=1:1:element_number for k=1:1:3 if i == gElement( ie, k ) area= ElementArea( ie ) ; S = S + gElementStress(ie,1:3 ) * area ; A = A + area ; break ; end end end gNodeStress(i,1:3) = S / A ; gNodeStress(i,6) = 0.5*sqrt( (gNodeStress(i,1)-gNodeStress(i,2))^2 + 4*gNodeStress(i,3)^2 ) ; gNodeStress(i,4) = 0.5*(gNodeStress(i,1)+gNodeStress(i,2)) + gNodeStress(i,6) ; gNodeStress(i,5) = 0.5*(gNodeStress(i,1)+gNodeStress(i,2)) - gNodeStress(i,6) ; end return