Comments
Description
Transcript
RS2行列
固体力学
大学院工学研究科機械工学専攻
固体力学(2単位)
004D
有限要素法(要素マトリックス計算プログラム)
構成
シミュレーション
計算機としてのPC
シミュレーションのための計算機環境
ハードウエア
ソフトウエア
シミュレーションのための計算法
有限要素法
メッシュ
連立一次方程式の解法
可視化
参考書
有限要素法概説
有限要素法
O.C.Zienkiewicz and K.Morgan, Dover
Finite Element Implementation
矢川元基・吉村忍著,培風館
Finite Elements & Approximation
菊地文雄著,サイエンス社
Y.K.Cheung, S.H.Lo, A.Y.T.Leung, Blackwell
Numerical Computation
C.W.Ueberhuber, Springer
シミュレーションのための計算法
有限要素法
1.2次元定常熱伝導問題
2.2次元応力解析
3.数値積分法
有限要素法(入力データ1)
(2.0, 2.0, 2.0)
25
26
27
y
x
23
22
z
24
19
20
5
21
18
6
15
10
11
1
12
2
9
6
1
(0.0, 0.0, 0.0)
2
3
要素数:8
節点数:27
有限要素法(入力データ2)
13
10
14
1
11
1
14
11
10
20
14
11
11
21
14
13
23
26
23
17
14
9
6
26
7
15
5
25
15
18
4
8
5
22
12
17
14
4
24
6
17
3
6
23
20
16
13
3
23
5
12
2
22
19
2
5
2
15
14
27
8
24
18
15
有限要素法(入力データ3)
要素データ
1
2
3
4
5
6
7
8
8
8
8
8
8
8
8
8
1
1
1
1
1
1
1
1
1 2 5
2 3 6
4 5 8
5 6 9
10 11
11 12
13 14
14 15
4 10 11 14 13
5 11 12 15 14
7 13 14 17 16
8 14 15 18 17
14 13 19 20 23
15 14 20 21 24
17 16 22 23 26
18 17 23 24 27
22
23
25
26
各行の構成
要素番号,要素タイプ,材料番号,節点番号xN
有限要素法(入力データ4)
節点データ
1 0.0 0.0 0.0
2 1.0 0.0 0.0
3 2.0 0.0 0.0
4 0.0 1.0 0.0
5 1.0 1.0 0.0
6 2.0 1.0 0.0
・・・・・・・
25 0.0 2.0 2.0
26 1.0 2.0 2.0
27 2.0 2.0 2.0
各行の構成
節点番号,x座標,y座標,z座標
有限要素法(入力データ5)
材料データ
1 1 2.0e11 0.3
2 1 7.0e10 0.35
各行の構成
材料物性番号,材料タイプ,縦弾性係数,ポアソン比
要素マトリックス計算コード
8
6面体1次要素
7
5
1
N , , 1 i 1 i 1 i
8
e
i
6
1
節点数:8
要素あたり自由度:24
要素マトリックス:24x24
3
2
要素マトリックス計算(全体フロー)
入力データ読み込み,変数(配列)初期化
形状(基底)関数値(微分)計算
積
分
点
ル
ー
プ
Bマトリックス算出
DBマトリックス算出
BDBマトリックス算出
要素マトリックスにBDBを加算
終了
要素マトリックス計算(入出力データ)
void elmlib_03_Dynamic(
element_data element,
node_data *node,
mate_data mate,
double **esm,
int ngauss,
double *gc,
double *gw,
int nfpn)
{
1節点あたりの自由度
(入力データ)
要素を構成する節点の番号を格納した
1次元配列(入力データ)
全節点の座標を格納した1次元配列
(入力データ)
要素の物性値を格納した1次元配列
(入力データ)
要素マトリックス(演算結果)を格納
する2次元配列(出力データ)
ガウス積分の1軸あたり積分点数
(入力データ)
ガウス積分の座標値(gc)および重
み(gw)を格納した1次元配列(入力
データ)
要素マトリックス計算(変数・配列)
int
i,j,k,ii,jj,kk,counter,necm=6,
ndeg=8,
nnpe=8,
kdim=24;
double e,v,ro,th,ee,coord[8][3],
ja[3][3],
invja[3][3],
d[6][6],
s,t,u,ra,
rs,sa,ss,ua,us,n[8][7],
b[6][24],
db[6][24],
dtmp01,
ra2,rs2,
ssus,ssua,saus,saua,
det,invdet;
Dマトリックスのサイズ
要素あたり節点数
要素あたり自由度
節点座標
ヤコビアン行列および
その逆行列
Dマトリックス
基底関数(微分値)
Bマトリックス
DBマトリックス
ヤコビアン行列の行列式
およびその逆数
要素マトリックス計算(配列初期化)
for(i=0;i<nnpe;i++){
ii = element.node[i];
for(j=0;j<nfpn;j++)
coord[i][j] = node[ii].f[j];
}
e
v
= mate.d[0];
= mate.d[1];
for(i=0;i<6;i++)
for(j=0;j<24;j++) b[i][j] = 0.0;
for(i=0;i<6;i++)
for(j=0;j<6;j++) d[i][j] = 0.0;
for(ii=0;ii<kdim;ii++){
for(jj=0;jj<kdim;jj++)
esm[ii][jj] = 0.0;
節点番号
全節点の座標値配列node
から当該要素8節点の座標
値をcoordにコピー
縦弾性係数
ポアソン比
Bマトリックス初期化
(ゼロクリア)
Dマトリックス初期化
(ゼロクリア)
要素マトリックス初期化
(ゼロクリア)
要素マトリックス計算(Dマトリックス)
ee = e*(1.0 - v)/(1.0 + v)/(1.0 - 2.0*v);
d[0][0]
d[1][1]
d[2][2]
d[3][3]
d[4][4]
d[5][5]
=
=
=
=
=
=
ee;
ee;
ee;
ee*(1.0 - 2.0*v)/2.0/(1.0 - v);
d[3][3];
d[3][3];
1 v
d[0][1] = ee*v/(1.0 - v);
v
d[0][2] = d[0][1];
v
d[1][2] = d[0][1];
E
0
d[1][0] = d[0][1];
1 v 1 2v
d[2][0] = d[0][2];
0
d[2][1] = d[1][2];
0
Dマトリックス設定
v
v
0
0
v
0
v
1 v
0
0
0
0
0
1 2v
2
0
0
0
1 2v
2
0
0
0
0
1 v
0
0
0
0
0
0
1 2v
2
要素マトリックス計算(積分点ループ)
for(i=0;i<ngauss;i++){
s = gc[i];
for(j=0;j<ngauss;j++){
t = gc[j];
for(k=0;k<ngauss;k++){
u = gc[k];
ra
rs
sa
ss
ua
us
=
=
=
=
=
=
ssus
saus
ssua
saua
(1.0
(1.0
(1.0
(1.0
(1.0
(1.0
=
=
=
=
+
+
+
-
s)*0.5;
s)*0.5;
t)*0.5;
t)*0.5;
u)*0.5;
u)*0.5;
ss*us;
sa*us;
ss*ua;
sa*ua;
積分点ループ
s, t , u , ,
1
ra 1
2
1
us 1
2
1
saus 1 1
4
要素マトリックス計算(基底関数の微分値
1)
n[0][0] = -0.5*ssus;
n[1][0] = 0.5*ssus;
n[2][0] = 0.5*saus;
n[3][0] = -0.5*saus;
n[4][0] = -0.5*ssua;
n[5][0] = 0.5*ssua;
n[6][0] = 0.5*saua;
n[7][0] = -0.5*saua;
rs2 = 0.5*rs;
ra2 = 0.5*ra;
n[0][1] = -rs2*us;
n[1][1] = -ra2*us;
n[2][1] = ra2*us;
n[3][1] = rs2*us;
n[4][1] = -rs2*ua;
n[5][1] = -ra2*ua;
n[6][1] = ra2*ua;
n[7][1] = rs2*ua;
N i
N i
N1 , ,
1
1 1 1
8
N1 , ,
1
1 1
8
N1 , ,
1
1 1
8
N1 , ,
1
1 1
8
要素マトリックス計算(基底関数の微分値
2)
n[0][2]
n[1][2]
n[2][2]
n[3][2]
n[4][2]
n[5][2]
n[6][2]
n[7][2]
=
=
=
=
=
=
=
=
-rs2*ss;
-ra2*ss;
-ra2*sa;
-rs2*sa;
rs2*ss;
ra2*ss;
ra2*sa;
rs2*sa;
n[0][6]
n[1][6]
n[2][6]
n[3][6]
n[4][6]
n[5][6]
n[6][6]
n[7][6]
=
=
=
=
=
=
=
=
rs*ssus;
ra*ssus;
ra*saus;
rs*saus;
rs*ssua;
ra*ssua;
ra*saua;
rs*saua;
N i
N1 , ,
1
1 1
8
1
N1 , , 1 1 1
8
Ni
要素マトリックス計算(ヤコビアン行列)
for(ii=0;ii<nfpn;ii++){
for(jj=0;jj<nfpn;jj++){
ja[ii][jj] = 0.0;
for(kk=0;kk<ndeg;kk++)
ja[ii][jj] += n[kk][ii]*coord[kk][jj];
}
}
x
x
J
x
y
y
y
z N i xi
z N i xi
z N i xi
N i yi
N i yi
N i yi
N i zi N
i
xi
N i zi
N
i xi
N i zi N i
xi
N i
yi
N i
yi
N i
yi
N i
zi
N i
zi
N i
zi
要素マトリックス計算(ヤコビアン行列式)
det =
+
+
-
ja[0][0]*ja[1][1]*ja[2][2]
ja[0][1]*ja[1][2]*ja[2][0]
ja[0][2]*ja[1][0]*ja[2][1]
ja[0][0]*ja[1][2]*ja[2][1]
ja[0][1]*ja[1][0]*ja[2][2]
ja[0][2]*ja[1][1]*ja[2][0] ;
invdet = 1.0/det ;
a b
c
d
e
f a
g
h
i
e
f
h
i
d
b c
h i
g
b
c
e
f
要素マトリックス計算(行列式)
a11 a1n
sgn P a1 p1 a2 p2 a3 p3 anpn
an1 ann
P
1 2 n
P
pn
p1 p2
1
sgn P
1
P : even permutatio n
P : odd permutatio n
要素マトリックス計算(ヤコビアン逆行列)
invja[0][0]
invja[0][1]
invja[0][2]
invja[1][0]
invja[1][1]
invja[1][2]
invja[2][0]
invja[2][1]
invja[2][2]
=
=
=
=
=
=
=
=
=
(ja[1][1]*ja[2][2]
(ja[0][2]*ja[2][1]
(ja[0][1]*ja[1][2]
(ja[1][2]*ja[2][0]
(ja[0][0]*ja[2][2]
(ja[1][0]*ja[0][2]
(ja[1][0]*ja[2][1]
(ja[0][1]*ja[2][0]
(ja[0][0]*ja[1][1]
A
1
i, j
-
1
ja[1][2]*ja[2][1])*invdet;
ja[0][1]*ja[2][2])*invdet;
ja[1][1]*ja[0][2])*invdet;
ja[1][0]*ja[2][2])*invdet;
ja[0][2]*ja[2][0])*invdet;
ja[0][0]*ja[1][2])*invdet;
ja[1][1]*ja[2][0])*invdet;
ja[0][0]*ja[2][1])*invdet;
ja[0][1]*ja[1][0])*invdet;
i j
A
~
A j ,i
要素マトリックス計算(逆行列)
a11 a1n
A
a a
nn
n1
余因子
i j
a~ij 1 Dij
余因子行列
a11
a
i 1,1
Dij
ai 1,1
a
n ,1
a~11 a~21 a~n1
~
~
~
an 2
~ a12 a22
A
~
~
a~
a
a
2n
nn
1n
a1, j 1
a1, j 1
ai 1, j 1
ai 1, j 1
ai 1, j 1
ai 1, j 1
an , j 1
an , j 1
a1n
ai 1,n
ai 1,n
an ,n
1 ~
A
A
A
1
要素マトリックス計算(基底関数の微分値)
for(ii=0;ii<ndeg;ii++){
n[ii][3] = 0.0;
n[ii][4] = 0.0;
n[ii][5] = 0.0;
for(jj=0;jj<3;jj++){
n[ii][3] += invja[0][jj]*n[ii][jj];
n[ii][4] += invja[1][jj]*n[ii][jj];
n[ii][5] += invja[2][jj]*n[ii][jj];
}
}
N i x
N i x
N
i x
N i y N i z N i x
x y z
N i y N i z N i x
x y z
N i y N i z N i x
x y z
y
y
y
N ii
n[ii][3]
x
N ii
n[ii][4]
y
N ii
n[ii][5]
z
z N i
N i
x
x
z N i
N i
J
y
y
N
z N i
i
z
z
要素マトリックス計算(Bマトリックス)
for(ii=0;ii<ndeg;ii++)
jj = ii*nfpn;
b[0][jj]
= n[ii][3];
b[1][1+jj] = n[ii][4];
b[2][2+jj] = n[ii][5];
b[3][jj]
b[3][1+jj]
b[4][1+jj]
b[4][2+jj]
b[5][jj]
b[5][2+jj]
}
=
=
=
=
=
=
n[ii][4];
n[ii][3];
n[ii][5];
n[ii][4];
n[ii][5];
n[ii][3];
x
0
0
B
y
0
z
0
y
0
x
z
0
0
0
N
0
N8 0
0
1 0
z 0 N
0
0
N
0
1
8
0 0
0 N1
0
0 N 8
N 8
y N1
0
0
0
x
x
N 8
N1
x 0
0 0
y
y
N1
0
0
0
0
z
N N
N 8 N 8
1
1
0
y
x
y
x
N 8
N1 N1
0
0
z
y
z
N1
N 8
N1
0
0
x
z
z
0
0
N 8
z
0
N 8
y
N 8
x
要素マトリックス計算(DBマトリックス)
for(ii=0;ii<necm;ii++){
for(jj=0;jj<kdim;jj++){
db[ii][jj] = 0.0;
for(kk=0;kk<necm;kk++)
db[ii][jj] += d[ii][kk]*b[kk][jj];
}
}
1 v
v
v
E
0
D
1 v 1 2v
0
0
v
v
0
0
v
0
v
1 v
0
0
0
0
0
1 2v
2
0
0
0
1 2v
2
0
0
0
0
1 v
0
0
0
0
0
0
1 2v
2
N1
x
0
0
B N
1
y
0
N1
z
0
0
N1
y
0
0
N1
x
N1
z
0
N1
z
0
N 8
x
0
0
N 8
y
0
0
N 8
y
N 8
x
N 8
z
N1
0
y
N 8
N1
x
z
0
0
0
N 8
z
0
N 8
y
N 8
x
要素マトリックス計算(ガウス積分の重み)
dtmp01 = gw[i]*gw[j]*gw[k]*det;
X
(1,1)
f x, y dv
1 1
f , J dd
1 1
f , , ddd f , , H
1
1
1
n
m
l
i
j
k
i
i 1 j 1 k 1
e
e
1 1 1
Y
(1,1)
H j Hk
要素マトリックス計算(要素マトリックス)
for(ii=0;ii<kdim;ii++){
for(jj=0;jj<kdim;jj++){
for(kk=0;kk<necm;kk++)
esm[ii][jj]+=b[kk][ii]*db[kk][jj]*dtmp01;
}
}
e
e
e
N1
x
0
t
BDBd e
N pe
x
0
0
N
y
e
1
0
N pe
y
N1
y e
N
N1e 1
x
x
D 0
e
N p
N1e
y
N pe y
x
N pe
0
N
y
N1e
x
e
1
x
0
N pe
y
0
e
N p
d
y
N pe
x
全体剛性マトリックス構築
for(ii=0;ii<nnpe;ii++){
ig = element.node[ii] ;
for(jj=0;jj<nnpe;jj++){
jg = element.node[jj] ;
for(i=0;i<nfpn;i++){
for(j=0;j<nfpn;j++){
gsm[ig*nfpn+i][jg*nfpn+j] += esm[ii*nfpn+i][jj*nfpn+j];
}
}
}
}