固体力学
大学院工学研究科機械工学専攻
固体力学(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];
}
}
}
}
© Copyright 2026 Paperzz