- 积分
- 0
- 注册时间
- 2007-5-13
- 仿真币
-
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2008-2-28 15:29:17
|
显示全部楼层
来自 湖北武汉
Q:地震结构动力响应程序[Newmark法]
% 定义全局变量
% gNode:节点坐标; gElemen:t单元定义; gMaterial:材料性质;gBC1:第一类约束条件;
% gK:整体刚度矩阵;gDeltaT:时间步长;gTimeEnd:计算结束时刻; gDisp:位移时程响应;
% gVelo:速度时程响应;gAcce:加速度时程响应;
% 该函数求解有限元模型,过程如下
% 1. 计算单元的刚度和质量矩阵,集成整体刚度和质量矩阵
% 2. 求解特征值问题
% 3. 用Newmark法计算时程响应
function SolveModel
global gNode gElement gMaterial gBC1 gBC2 gK gM gDeltaT gTimeEnd gDisp gVelo ...
gA gAcce gLoad gEigValue gEigVector C
% step1. 定义整体刚度矩阵和节点力向量
[node_number,dummy] = size( gNode ) ;
gK = sparse( node_number * 3, node_number * 3 ) ;
gM = sparse( node_number * 3, node_number * 3 ) ;
% step2. 计算单元刚度和质量矩阵,并集成到整体刚度和质量矩阵中
[element_number,dummy] = size( gElement ) ;
for ie=1:1:element_number
k = StiffnessMatrix( ie ) ;
m = MassMatrix( ie ) ;
AssembleGlobalMatrix( ie, k, m ) ;
end
% step3. 处理第一类约束条件,修改刚度矩阵和质量矩阵。(采用划行划列法)
[bc1_number,dummy] = size( gBC1 ) ;
w1max = max( diag(gK)./diag(gM) ) ;
for ibc=1:1:bc1_number
n = gBC1(ibc, 1 ) ;
d = gBC1(ibc, 2 ) ;
m = (n-1)*3 + d ;
gK(:,m ) = zeros( node_number*3, 1 ) ;
gK(m,: ) = zeros( 1, node_number*3 ) ;
gK(m,m ) = 1;
gM(:,m ) = zeros( node_number*3, 1 ) ;
gM(m,: ) = zeros( 1, node_number*3 ) ;
gM(m,m) = gK(m,m)/w1max/1e10 ;
end
% step4. 求解特征值问题
% step4.1为了使刚度矩阵和质量矩阵对称(在计算时可能引入舍入误差)
for i=1:node_number*3
for j=i:node_number*3
gK(j,i) = gK(i,j) ;
gM(j,i) = gM(i,j) ;
end
end
% step4.2 计算前6阶特征值和特征向量
[gEigVector, gEigValue] = eigs(gK, gM, 3, 'SM' )
% step4.3 修改特征向量中受约束的自由度
for ibc=1:1:bc1_number
n = gBC1(ibc, 1 ) ;
d = gBC1(ibc, 2 ) ;
m = (n-1)*3 + d ;
gEigVector(m,: ) = gBC1(ibc,3) ;
end
% step5. 计算时程响应(Newmark法)
% step5.1. 定义整体刚度矩阵和节点力向量
[node_number,dummy] = size( gNode ) ;
gK = sparse( node_number * 3, node_number * 3 ) ;
gM = sparse( node_number * 3, node_number * 3 ) ;
C = sparse( node_number * 3, node_number * 3 ) ;
% step5.2. 计算单元刚度和质量矩阵,并集成到整体刚度和质量矩阵中
[element_number,dummy] = size( gElement ) ;
for ie=1:1:element_number
k = StiffnessMatrix( ie ) ;
m = MassMatrix( ie ) ;
AssembleGlobalMatrix( ie, k, m ) ;
end
% step5.3 计算阻尼矩阵
fre_number = length(diag(gEigValue)) ;
for i=fre_number:-1:1
freq(fre_number-i+1)= sqrt(gEigValue(i,i))/2/pi;
end
alphad=2*freq(1)*freq(2)*0.05*(freq(2)-freq(1))/(freq(2)*freq(2)-freq(1)*freq(1));
betad=2*0.05*(freq(2)-freq(1))/(freq(2)*freq(2)-freq(1)*freq(1)) ;
C = alphad*gM+betad*gK;
% step5.4 初始计算
[acce_number,dummy] = size( gA) ;
gDeltaT = 0.02 ;
gTimeEnd = acce_number*gDeltaT ; % 计算时间为载荷通过所需时间的两倍
% timestep = floor(gTimeEnd/gDeltaT) ;
timestep = acce_number;
gama = 0.5 ;
beta = 0.25 ;
[N,N] = size( gK ) ;
alpha0 = 1/beta/gDeltaT^2 ;
alpha1 = gama/beta/gDeltaT ;
alpha2 = 1/beta/gDeltaT ;
alpha3 = 1/2/beta - 1 ;
alpha4 = gama/beta - 1 ;
alpha5 = gDeltaT/2*(gama/beta-2) ;
alpha6 = gDeltaT*(1-gama) ;
alpha7 = gama*gDeltaT ;
K1 = gK + alpha0*gM + alpha1*C;
% step5.5 对K1进行边界条件处理
[bc1_number,dummy] = size( gBC1 ) ;
K1im = zeros(N,bc1_number) ;
for ibc=1:1:bc1_number
n = gBC1(ibc, 1 ) ;
d = gBC1(ibc, 2 ) ;
m = (n-1)*3 + d ;
K1im(:,ibc) = K1(:,m) ;
K1(:,m ) = zeros( node_number*3, 1 ) ;
K1(m,: ) = zeros( 1, node_number*3 ) ;
K1(m,m ) = 1.0 ;
end
[KL,KU] = lu(K1) ; % 进行三角分解,节省后面的求解时间
% step5.6 计算地震荷载,初始加速度
[node_number,dummy] = size( gNode ) ;
[acce_number,dummy] = size( gA) ;
gDisp = zeros( node_number*3, timestep ) ;
gVelo = zeros( node_number*3, timestep ) ;
gAcce = zeros( node_number*3, timestep ) ;
gA2 = zeros( node_number*3, timestep ) ;
gDisp(:,1 ) = zeros( node_number*3, 1 ) ;
gVelo(:,1 ) = zeros( node_number*3, 1 ) ;
gLoad = zeros( node_number*3, timestep ) ;
for j=1:1:acce_number
gA2(:,j) = gA(j,1) ;
end
gLoad = gM * gA2;
gAcce(:,1) = gM\(gLoad(:,1) -gK*gDisp(:,1)-C*gVelo(:,1)) ;
% step5.7 对每一个时间步计算
for i=2:1:timestep
if mod(i,100) == 0
fprintf( '当前时间步:%d\n', i ) ;
end
f1 = gLoad( :,i-1) + gM*(alpha0*gDisp(:,i-1)+alpha2*gVelo(:,i-1)+alpha3*gAcce
( :,i-1)) ...
+ C*(alpha1*gDisp(:,i-1)+alpha4*gVelo(:,i-1)+alpha5*gAcce(:,i-
1)) ;
% 对f1进行边界条件处理
[bc1_number,dummy] = size( gBC1 ) ;
for ibc=1:1:bc1_number
n = gBC1(ibc, 1 ) ;
d = gBC1(ibc, 2 ) ;
m = (n-1)*3 + d ;
f1 = f1 - gBC1(ibc,3) * K1im(:,ibc) ;
f1(m) = gBC1(ibc,3) ;
end
y = KL\f1 ;
gDisp( :,i) = KU\y ;
gAcce( :,i) = alpha0*(gDisp(:,i)-gDisp(:,i-1)) - alpha2*gVelo(:,i-1) -
alpha3*gAcce( :,i-1) ;
gVelo( :,i) = gVelo(:,i-1) + alpha6*gAcce(:,i-1) + alpha7*gAcce(:,i) ;
end
return
[ 本帖最后由 whutzll 于 2008-2-28 15:31 编辑 ] |
评分
-
1
查看全部评分
-
|