5 skyline 法 - sml.k.u-tokyo.ac.jp · ン1...
Transcript of 5 skyline 法 - sml.k.u-tokyo.ac.jp · ン1...
291
第5章 skyline 法
第??章でのべた Gaussの消去法は, 正方行列を対象としたものであった. それに対して有
限要素法で得られる剛性マトリックスは, 一般的に対角項のまわりだけに非零のデータが
集まる帯行列である. ここでは Gauss の消去法を合理化し実際の有限要素解析コードで
よく用いられる skyline 法を紹介する.
5.1 Gauss の消去法の合理化
skyline法の詳細は後述するが, ここでは skyline法で用いるマトリックスの記憶法を応
用して Gauss の消去法の加速を行う. 第??章で述べたように fortran でも C でも多次
元配列は内部的には 1次元配列としてあつかわれるので,ループインデックスの回し方に
よって計算効率がかわり, まったく同じ演算量であるにもかかわらず, 2次元配列を用いた
対称マトリックス版の Gaussの消去法ではマトリックスの上三角を使うか, 下三角を使う
かでパフォーマンスが変わった. また, 係数マトリックスが対称ならば三角分解を行うに
しても上三角か下三角の領域で事足りるので 2次元配列を用いてマトリックス全体を記憶
するのは合理的ではない.
三角行列の記憶法にはいろいろなものが考えられるが, 有限要素法ではここで示すよう
な方法を用いることが多く, 計算機メーカーから供給される数値計算ライブラリーには,
この記憶法に直接対応しているものもある.
上三角と下三角用の二つの 1次元配列を用意する. A11 から順に以下のように記憶して
いく.
292 第 5章 skyline 法
上三角 下三角
au(1) = A11 al(1) = A11
au(2) = A22 al(2) = A22
au(3) = A12 al(3) = A21
au(4) = A33 al(4) = A33
au(5) = A23 al(5) = A32
au(6) = A13 al(6) = A31
au(7) = A44 al(7) = A44
......
これは以下のような順で係数マトリックスを記憶したことを意味する. 前述の三角分解
では最も内側のループは Ukj は列を固定, Lik は行を固定してアクセスし内積演算を行う
ので, このように記憶しておけば上三角も下三角も極端にはなれたデータを参照すること
はない.
j
i
1
2
3
3456
6
5
10
9
710 9
8
81112
1314
15
15 14 13 12
係数マトリックスの対角項 A11, A22, A33, A44, A55, . . . は配列 au, al の 1, 2, 4, 7, 11,
. . . 番目に記憶される. コーディングを容易にするためにこの対角項の位置も記憶する
(配列名 i_sky_diagonal, 略称 isd) この配列を用いると上三角の i, j 成分は配列 au の
isd(j)+j-i 番目のデータ, 下三角の j, i 成分は配列 al の isd(j)+j-i 番目のデータと
してアクセスできる. これから分かるように元のマトリクスで対称の位置にある成分は同
5.1. Gauss の消去法の合理化 293
じインデックスを用いてアクセスできるので一次元配列を用いても比較的分かりやすい
コーディングを行うことができる. なお full マトリックスの場合 isd は以下のように計
算される.
isd(i) =(i − 1)i
2+ 1 (i = 1, . . . , n)
j
iAij
Ajj
isd(j)+j-i
isd(j)
upper triangle
j
i
Aij
Ajjisd(j)+j-iisd(j)
lower triangle
skyline バージョン 0 としてこの配列を用いたコーディングを行う. 非対称版と対称版
をそれぞれ作成し , 1000 × 1000 のマトリックスで cpu timeを計測する. Gauss バージョ
ン 1 に比べてかなり高速化できたことがわかるはずである. このように工夫することに
よりパフォーマンスが劇的にかわることが数値計算のおもしろさでもある. fortranでの
コーディング例を示すと以下のようになる.
ただし , サブルーチン init2 は係数マトリックスを au, al に入れ替え isd をセットす
る. asky_ver0 (asymmetrical skyline), ssky_ver0 (symmetrical skyline) がそれぞれ非
対称, 対称版であり, それぞれ gauss_ver3, gauss_ver4,と同じループ構造で二次元配列
a(i,j), a(j,i) をそれぞれ、au(isd(j)+j-i), al(isd(j)+j-i)と置き換えている. (た
だし , i < j)
これをさらに合理化したものが asky_ver01, ssky_ver01である. 具体的な変更内容は,
三角分解の三重ループの内側のインデックスの計算の一部をループの外に出しただけであ
るが, OS やコンパイラーによってはかなり差が出るものもある. これは RISC cpu がも
つスーパースカラーの機能をどれだけ効率よく使えるかにより発生している差であろう.
294 第 5章 skyline 法
asky ver0 :
for k = 1 ∼ i − 1
ki = isd(i) + i − k
kj = isd(j) + j − k
temp u + al(ki)au(kj)
temp l + al(kj)au(ki)
end for
asky ver01 :
ki = isd(i) + i
kj = isd(j) + j
for k = 1 ∼ i − 1
temp u + al(ki-k)au(kj-k)
temp l + al(kj-k)au(ki-k)
end for
上記のループは一般に「内積演算」と呼ばれ, temp_u なら al の isd(i)+1 番目から
isd(i)+i-1 番目までと au の isd(j)+j-i+1 番目から isd(i)+j-1 番目までをそれぞれ
ベクトルと見做してその内積をとっているとみることができる.
(D11U1j
(Di−1i−1Ui−1j
Li1 Lii − 1
isd(i)+i-1 isd(i)+1
isd(j)+j-1
isd(j)+j-i+1
5.1. Gauss の消去法の合理化 295
ループが降順になっているのは au, al は対角項から順に下から上へ, 右から左へ係
数マトリックスを記憶しているのに対して定式化では Σ は 1 から順に, つまり上から
下, 左から右へアクセスするにようになっているからである. これを昇順に変更したのが,
asky_ver02, ssky_ver02である. これにより計算機メーカーなどから供給される BLAS
などに代表される数値演算ライブラリーを活用しやすくなり, また, コンパイラーによっ
ては自動的にライブラリールーチンに置き換えるよう最適化を行うものもある.
asky ver02 :
ki = isd(i) + i − i
kj = isd(j) + j − i
for k = 1 ∼ i − 1
temp u + al(ki+k)au(kj+k)
temp l + al(kj+k)au(ki+k)
end for
c skyline ver. 0 (ver0.f)c by Hiroshi WATANABE (1998 Sep.)c
implicit real*8(a-h,o-z)parameter(n = 1000)dimension a(n,n),b(n),c(n)dimension al(n*(n+1)/2),au(n*(n+1)/2),isd(n)
ccall init(a,b,c,n)call init2(a,n,al,au,isd)
cc write(*,*) ’matrix a’c do i = 1,nc write(*,1000) (a(i,j),j=1,n)c end doc write(*,*) ’vector b’c write(*,1000) (b(i),i=1,n)c write(*,*) ’vector c’
296 第 5章 skyline 法
c write(*,1000) (c(i),i=1,n)c
call asky_ver0(al,au,c,n,isd)c call asky_ver01(al,au,c,n,isd)c call asky_ver02(al,au,c,n,isd)cc call ssky_ver0(al,au,c,n,isd)c call ssky_ver01(al,au,c,n,isd)c call ssky_ver02(al,au,c,n,isd)c
write(*,*) ’solution vector b’write(*,1000) (c(i),i=1,n)
c1000 format(8e10.3)
cstopend
cc#######################################################################
subroutine asky_ver0(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cal(3) = al(3) / au(1)au(3) = au(3) / au(1)
cau(2) = au(2) - al(3) * au(1) * au(3)
cdo j = 3,n
do i = 2, j-1temp_u = 0.d0temp_l = 0.d0do k = 1, i-1
ki = isd(i) + i - kkj = isd(j) + j - ktemp_u = temp_u + al(ki) * au(kj)temp_l = temp_l + al(kj) * au(ki)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_ual(ij) = al(ij) - temp_l
end dodo i = 1,j-1
ij = isd(j) + j-i
5.1. Gauss の消去法の合理化 297
au(ij) = au(ij) / au(isd(i))al(ij) = al(ij) / au(isd(i))
end dotemp = 0.d0do k = 1,j-1
kj = isd(j) + j-ktemp = temp + al(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,ndo j = 1,i-1
ij = isd(i) + i-jb(i) = b(i) - al(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
do j = 1,i-1ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine asky_ver01(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cal(3) = al(3) / au(1)au(3) = au(3) / au(1)
cau(2) = au(2) - al(3) * au(1) * au(3)
cdo j = 3,n
do i = 2, j-1
298 第 5章 skyline 法
temp_u = 0.d0temp_l = 0.d0ki = isd(i) + ikj = isd(j) + jdo k = 1, i-1
temp_u = temp_u + al(ki-k) * au(kj-k)temp_l = temp_l + al(kj-k) * au(ki-k)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_ual(ij) = al(ij) - temp_l
end dodo i = 1,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))al(ij) = al(ij) / au(isd(i))
end dotemp = 0.d0do k = 1,j-1
kj = isd(j) + j-ktemp = temp + al(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,ndo j = 1,i-1
ij = isd(i) + i-jb(i) = b(i) - al(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
do j = 1,i-1ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
5.1. Gauss の消去法の合理化 299
cc#######################################################################
subroutine asky_ver02(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cal(3) = al(3) / au(1)au(3) = au(3) / au(1)
cau(2) = au(2) - al(3) * au(1) * au(3)
cdo j = 3,n
do i = 2, j-1temp_u = 0.d0temp_l = 0.d0ki = isd(i) + i - ikj = isd(j) + j - ido k = 1, i-1
temp_u = temp_u + al(ki+k) * au(kj+k)temp_l = temp_l + al(kj+k) * au(ki+k)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_ual(ij) = al(ij) - temp_l
end dodo i = 1,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))al(ij) = al(ij) / au(isd(i))
end dotemp = 0.d0do k = 1,j-1
kj = isd(j) + j-ktemp = temp + al(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,ndo j = 1,i-1
ij = isd(i) + i-jb(i) = b(i) - al(ij) * b(j)
end doend do
300 第 5章 skyline 法
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
do j = 1,i-1ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine ssky_ver0(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cau(3) = au(3) / au(1)
cau(2) = au(2) - au(3) * au(1) * au(3)
cdo j = 3,n
do i = 2, j-1temp_u = 0.d0do k = 1, i-1
ki = isd(i) + i - kkj = isd(j) + j - ktemp_u = temp_u + au(ki) * au(kj)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_u
end dodo i = 1,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
end dotemp = 0.d0do k = 1,j-1
kj = isd(j) + j-ktemp = temp + au(kj) * au(isd(k)) * au(kj)
end do
5.1. Gauss の消去法の合理化 301
au(isd(j)) = au(isd(j)) - tempend do
cdo i = 2,n
do j = 1,i-1ij = isd(i) + i-jb(i) = b(i) - au(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
do j = 1,i-1ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine ssky_ver01(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cau(3) = au(3) / au(1)
cau(2) = au(2) - au(3) * au(1) * au(3)
cdo j = 3,n
do i = 2, j-1temp_u = 0.d0ki = isd(i) + ikj = isd(j) + jdo k = 1, i-1
temp_u = temp_u + au(ki-k) * au(kj-k)end doij = isd(j) + j-iau(ij) = au(ij) - temp_u
end do
302 第 5章 skyline 法
do i = 1,j-1ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
end dotemp = 0.d0do k = 1,j-1
kj = isd(j) + j-ktemp = temp + au(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,ndo j = 1,i-1
ij = isd(i) + i-jb(i) = b(i) - au(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
do j = 1,i-1ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine ssky_ver02(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cau(3) = au(3) / au(1)
cau(2) = au(2) - au(3) * au(1) * au(3)
cdo j = 3,n
do i = 2, j-1
5.1. Gauss の消去法の合理化 303
temp_u = 0.d0ki = isd(i) + i - ikj = isd(j) + j - ido k = 1, i-1
temp_u = temp_u + au(ki+k) * au(kj+k)end doij = isd(j) + j-iau(ij) = au(ij) - temp_u
end dodo i = 1,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
end dotemp = 0.d0do k = 1,j-1
kj = isd(j) + j-ktemp = temp + au(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,ndo j = 1,i-1
ij = isd(i) + i - jb(i) = b(i) - au(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
do j = 1,i-1ji = isd(i) + i - jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine init2(a,n,al,au,isd)c#######################################################################
304 第 5章 skyline 法
implicit real*8(a-h,o-z)dimension a(*),al(*),au(*),isd(*)
cdo i = 1,n
isd(i) = (i-1)*i/2 + 1end do
cdo j = 1,n
do i = 1,nif (i .ge. j) then
ij = isd(i) + i-jal(ij) = a((j-1)*n+i)
end ifif (j .ge. i) then
ij = isd(j) + j-iau(ij) = a((j-1)*n+i)
end ifend do
end doc
returnend
cc#######################################################################
subroutine init(a,b,c,n)c#######################################################################
implicit real*8(a-h,o-z)dimension a(n,*),b(*),c(*)
cdo i = 1,n
do j = 1,ia(i,j) = dfloat(i)a(j,i) = dfloat(i)
end doend do
cdo i = 1,n
b(i) = dfloat(i)end do
cdo i = 1,n
temp = 0.d0do j = 1,n
temp = temp + a(i,j) * b(j)end do
5.2. skyline法の基礎 305
c(i) = tempend do
creturnend
c
5.2 skyline法の基礎
有限要素法の剛性マトリックスの特徴としては
• 一般に次元数が大きい
• 零の成分が多い (sparse)
• 非零の成分は対角項の近くに集まっている (band form)
• 通常の構造解析の問題では対称となる
• 非対称な剛性マトリックスでも対角項を中心として対称な位置に非零の成分は存在する.
などが挙げられる.
これらの特徴を利用してGaussの消去法を改良したのが以下に述べる skyline法である.
例として以下の剛性マトリックスが得られたとする
K11 K12 0 0 K15 0 0 K18
K21 K22 K23 K24 0 0 0 K28
0 K32 K33 K34 0 0 K37 0
0 K42 K43 K44 0 K46 K47 0
K51 0 0 0 K55 K56 K57 0
0 0 0 K64 K65 K66 K67 0
0 0 K73 K74 K75 K76 K77 K78
K81 K82 0 0 0 0 K87 K88
(5.1)
306 第 5章 skyline 法
各列 (または行)に対して非零の成分が存在する最小の行 (または列)の番号を並べたも
のを mj (j = 1 . . . n) とする. 例えば式 (5.1)では mj = {1, 1, 2, 2, 1, 4, 3, 1}である.
この mj は [K] を LDU分解したときに得られる [L], [U ] についてもかわらない.
実際に式 (5.1) を三角分解すると以下のようになる.
[K(1)
]=
K(1)11 K
(1)12 0 0 K
(1)15 0 0 K
(1)18
K(1)21 K
(1)22 K
(1)23 K
(1)24 0 0 0 K
(1)28
0 K(1)32 K
(1)33 K
(1)34 0 0 K
(1)37 0
0 K(1)42 K
(1)43 K
(1)44 0 K
(1)46 K
(1)47 0
K(1)51 0 0 0 K
(1)55 K
(1)56 K
(1)57 0
0 0 0 K(1)64 K
(1)65 K
(1)66 K
(1)67 0
0 0 K(1)73 K
(1)74 K
(1)75 K
(1)76 K
(1)77 K
(1)78
K(1)81 K
(1)82 0 0 0 0 K
(1)87 K
(1)88
(5.2)
[L−1
1
]=
1 0 0 0 0 0 0 0
−L21 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0
−L51 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0
−L81 0 0 0 0 0 0 1
(5.3)
5.2. skyline法の基礎 307
[K(2)
]=
[L−1
1
] [K(1)
]=
K(2)11 K
(2)12 0 0 K
(2)15 0 0 K
(2)18
0 K(2)22 K
(2)23 K
(2)24 K
(2)25 0 0 K
(2)28
0 K(2)32 K
(2)33 K
(2)34 0 0 K
(2)37 0
0 K(2)42 K
(2)43 K
(2)44 0 K
(2)46 K
(2)47 0
0 K(2)52 0 0 K
(2)55 K
(2)56 K
(2)57 0
0 0 0 K(2)64 K
(2)65 K
(2)66 K
(2)67 0
0 0 K(2)73 K
(2)74 K
(2)75 K
(2)76 K
(2)77 K
(2)78
0 K(2)82 0 0 K
(2)85 0 K
(2)87 K
(2)88
(5.4)
[L−1
2
]=
1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 −L32 1 0 0 0 0 0
0 −L42 0 1 0 0 0 0
0 −L52 0 0 1 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0
0 −L82 0 0 0 0 0 1
(5.5)
[K(3)
]=
[L−1
2
] [K(2)
]=
K(3)11 K
(3)12 0 0 K
(3)15 0 0 K
(3)18
0 K(3)22 K
(3)23 K
(3)24 K
(3)25 0 0 K
(3)28
0 0 K(3)33 K
(3)34 K
(3)35 0 K
(3)37 K
(3)38
0 0 K(3)43 K
(3)44 K
(3)45 K
(3)46 K
(3)47 K
(3)48
0 0 K(3)53 K
(3)54 K
(3)55 K
(3)56 K
(3)57 K
(3)58
0 0 0 K(3)64 K
(3)65 K
(3)66 K
(3)67 0
0 0 K(3)73 K
(3)74 K
(3)75 K
(3)76 K
(3)77 K
(3)78
0 0 K(3)83 K
(3)84 K
(3)85 0 K
(3)87 K
(3)88
(5.6)
308 第 5章 skyline 法
[L−1
3
]=
1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 −L43 1 0 0 0 0
0 0 −L53 0 1 0 0 0
0 0 0 0 0 1 0 0
0 0 −L73 0 0 0 1 0
0 0 −L83 0 0 0 0 1
(5.7)
[K(4)
]=
[L−1
3
] [K(3)
]=
K(4)11 K
(4)12 0 0 K
(4)15 0 0 K
(4)18
0 K(4)22 K
(4)23 K
(4)24 K
(4)25 0 0 K
(4)28
0 0 K(4)33 K
(4)34 K
(4)35 0 K
(4)37 K
(4)38
0 0 0 K(4)44 K
(4)45 K
(4)46 K
(4)47 K
(4)48
0 0 0 K(4)54 K
(4)55 K
(4)56 K
(4)57 K
(4)58
0 0 0 K(4)64 K
(4)65 K
(4)66 K
(4)67 0
0 0 0 K(4)74 K
(4)75 K
(4)76 K
(4)77 K
(4)78
0 0 0 K(4)84 K
(4)85 0 K
(4)87 K
(4)88
(5.8)
[L−1
4
]=
1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 −L54 1 0 0 0
0 0 0 −L64 0 1 0 0
0 0 0 −L74 0 0 1 0
0 0 0 −L84 0 0 0 1
(5.9)
5.2. skyline法の基礎 309
[K(5)
]=
[L−1
4
] [K(4)
]=
K(5)11 K
(5)12 0 0 K
(5)15 0 0 K
(5)18
0 K(5)22 K
(5)23 K
(5)24 K
(5)25 0 0 K
(5)28
0 0 K(5)33 K
(5)34 K
(5)35 0 K
(5)37 K
(5)38
0 0 0 K(5)44 K
(5)45 K
(5)46 K
(5)47 K
(5)48
0 0 0 0 K(5)55 K
(5)56 K
(5)57 K
(5)58
0 0 0 0 K(5)65 K
(5)66 K
(5)67 K
(5)68
0 0 0 0 K(5)75 K
(5)76 K
(5)77 K
(5)78
0 0 0 0 K(5)85 K
(5)86 K
(5)87 K
(5)88
(5.10)
[L−1
5
]=
1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 −L65 1 0 0
0 0 0 0 −L75 0 1 0
0 0 0 0 −L85 0 0 1
(5.11)
[K(6)
]=
[L−1
5
] [K(5)
]=
K(6)11 K
(6)12 0 0 K
(6)15 0 0 K
(6)18
0 K(6)22 K
(6)23 K
(6)24 K
(6)25 0 0 K
(6)28
0 0 K(6)33 K
(6)34 K
(6)35 0 K
(6)37 K
(6)38
0 0 0 K(6)44 K
(6)45 K
(6)46 K
(6)47 K
(6)48
0 0 0 0 K(6)55 K
(6)56 K
(6)57 K
(6)58
0 0 0 0 0 K(6)66 K
(6)67 K
(6)68
0 0 0 0 0 K(6)76 K
(6)77 K
(6)78
0 0 0 0 0 K(6)86 K
(6)87 K
(6)88
(5.12)
310 第 5章 skyline 法
[L−1
6
]=
1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 −L76 1 0
0 0 0 0 0 −L86 0 1
(5.13)
[K(7)
]=
[L−1
6
] [K(6)
]=
K(7)11 K
(7)12 0 0 K
(7)15 0 0 K
(7)18
0 K(7)22 K
(7)23 K
(7)24 K
(7)25 0 0 K
(7)28
0 0 K(7)33 K
(7)34 K
(7)35 0 K
(7)37 K
(7)38
0 0 0 K(7)44 K
(7)45 K
(7)46 K
(7)47 K
(7)48
0 0 0 0 K(7)55 K
(7)56 K
(7)57 K
(7)58
0 0 0 0 0 K(7)66 K
(7)67 K
(7)68
0 0 0 0 0 0 K(7)77 K
(7)78
0 0 0 0 0 0 K(7)87 K
(7)88
(5.14)
[L−1
7
]=
1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 −L87 1
(5.15)
5.2. skyline法の基礎 311
[K(8)
]=
[L−1
7
] [K(7)
]=
K(8)11 K
(8)12 0 0 K
(8)15 0 0 K
(8)18
0 K(8)22 K
(8)23 K
(8)24 K
(8)25 0 0 K
(8)28
0 0 K(8)33 K
(8)34 K
(8)35 0 K
(8)37 K
(8)38
0 0 0 K(8)44 K
(8)45 K
(8)46 K
(8)47 K
(8)48
0 0 0 0 K(8)55 K
(8)56 K
(8)57 K
(8)58
0 0 0 0 0 K(8)66 K
(8)67 K
(8)68
0 0 0 0 0 0 K(8)77 K
(8)78
0 0 0 0 0 0 0 K(8)88
(5.16)
したがって [L]は以下のようになる.
[L] = [L1] [L2] . . . [L7] =
1 0 0 0 0 0 0 0
L21 1 0 0 0 0 0 0
0 L32 1 0 0 0 0 0
0 L42 L43 1 0 0 0 0
L51 L52 L53 L54 1 0 0 0
0 0 0 L64 L65 1 0 0
0 0 L73 L74 L75 L76 1 0
L81 L82 L83 L84 L85 L86 L87 1
(5.17)
[K(8)] = [D][U ]であることを考えれば , [L], [U ]ともに, mj = 1,1,2,2,1,4,3ともとの [K]
の mj と同じであることが分かる. しかしながら, mj より対角項に近い成分, たとえば
K25, K35, K45, K38, K48, K58, K68 については, 三角分解により一般には非零の値になる.
この性質を用いて Gauss の消去法の合理化を図る. この例について [L], [U ] は以下の
ようになる.
312 第 5章 skyline 法
[L] =
1 0 0 0 0 0 0 0
L21 1 0 0 0 0 0 0
0 L32 1 0 0 0 0 0
0 L42 L43 1 0 0 0 0
L51 L52 L53 L54 1 0 0 0
0 0 0 L64 L65 1 0 0
0 0 L73 L74 L75 L76 1 0
L81 L82 L83 L84 L85 L86 L87 1
(5.18)
[U ] =
1 U12 0 0 U15 0 0 U18
0 1 U23 U24 U25 0 0 U28
0 0 1 U34 U35 0 U37 U38
0 0 0 1 U45 U46 U47 U48
0 0 0 0 1 U56 U57 U58
0 0 0 0 0 1 U67 U68
0 0 0 0 0 0 1 U78
0 0 0 0 0 0 0 1
(5.19)
この [L], [U ] を用いて [K] = [L][D][U ] を改めて計算すると以下のようになる.
1, 2, 3 列
D11 D11U12 0
L21D11 L21D11U12 + D22 D22U23
0 L32D22 L32D22U23 + D33
0 L42D22 L42D22U23 + L43D33
L51D11 L51D11U12 + L52D22 L52D22U23 + L53D33
0 0 0
0 0 L73D33
L81D11 L81D11U12 + L82D22 L82D22U23 + L83D33
(5.20)
5.2. skyline法の基礎 313
4, 5 列
D11U15 0
L21D11U15 + D22U25 0
L32D22U25 + D33U35 0
L42D22U25 + L43D33U35 + D44U45 D44U46
L51D11U15 + L52D22U25 + L53D33U35 + L54D44U45 + D55 L54D44U46 + D55U56
L64D44U45 + L65D55 L64D44U46 + L65D55U56 + D66
L73D33U35 + L74D44U45 + L75D55 L74D44U46 + L75D55U56 + L76D66
L81D11U15 + L82D22U25 + L83D33U35 + L84D44U45 + L85D55 L84D44U46 + L85D55U56 + L86D66
(5.21)
7 列
0
0
D33U37
L43D33U27 + D44U47
L53D33U37 + L54D44U47 + D55U57
L64D44U47 + L65D55U57 + D66U67
L73D33U35 + L74D44U45 + L75D55U57 + L76D66U67 + D77
L83D33U37 + L84D44U47 + L85D55U57 + L86D66U67 + L87D77
(5.22)
314 第 5章 skyline 法
8 列
D11U18
L21D11U18 + D22U28
L32D22U28 + D33U38
L42D22U28 + L43D33U38 + D44U48
L51D11U18 + L52D22U28 + L53D33U38 + L52D44U48 + D55U58
L64D44U48 + L65D55U58 + D66U68
L73D33U38 + L74D44U48 + L75D55U58 + L76D66U68 + D77U78
L81D11U18 + L82D22U28 + L83D33U38 + L84D44U48 + L85D55U58 + L86D66U68 + L87D77U78 + D88
(5.23)
これは一般に以下のようにインデックスを用いて表すことができる.
Kij = DiiUij 上三角
Kji = LjiDii 下三角
i = mj
Kij =
i−1∑k=max(mi,mj)
LikDkkUkj + DiiUij 上三角
Kji =
i−1∑k=max(mi,mj)
LjkDkkUki + LjiDii 下三角
i = mj + 1 . . . j − 1
Kjj =
j−1∑k=mj
LjkDkkUkj + Djj 対角項
この関係を用いると, [L], [D], [U ] は以下のように順次計算できる.
5.2. skyline法の基礎 315
for j = 1
D11 = K11
for j = 2
U12 = K12/D11
L21 = K21/D11
D22 = K22 − L21D11U12
for j = 3 ∼ n
for i = mj + 1 ∼ j − 1
for k = max(mi, mj) ∼ i − 1
temp u = temp u + Lik{DkkUkj}temp l = temp l + {LjkDkk}Uki
end for
(DiiUij) = Kij − temp u
(LjiDii) = Kji − temp l
end for
for i = mj ∼ j − 1
Uij = (DiiUij)/Dii
Lji = (LjiDii)/Dii
end for
for k = mj ∼ j − 1
temp = temp + LjkDkkUkj
end for
316 第 5章 skyline 法
Djj = Kjj − temp
end for
以上で得られた三角行列から未知ベクトルを求める. ここでは, 下三角行列は前進代入,
上三角行列は後退消去を用いる. 上下三角行列の対角項は 1であることを考えると, 以下
のコーディングになる.
下三角行列 (前進代入)
for i = 1
y1 = c1
for i = 2 ∼ n
for k = mi ∼ i − 1
temp = temp + Likyk
end for
xi = ci − temp
end for
対角項
for i = 1 ∼ n
yi = xi/Dii
end for
5.3. skyline法のコーディング 317
上三角行列 (後退消去)
fori = n
bn = yn
for i = n ∼ 2step = −1
for j = mi ∼ i − 1
yj = yj − Ujibi
end for
bi−1 = yi−1
end for
有限要素法の剛性マトリックスは対角項付近のみ非零で, 残りの成分が零である場合が
多いため, このような手続きにより大幅に効率化ができる.
5.3 skyline法のコーディング
skyline 法では剛性マトリックスを 1 次元配列に記憶する. 例として式 (5.1) を用いる
と, マトリックスの成分を以下のような順に記憶する.
[K(1)
]=
K(1)11 K
(1)12 0 0 K
(1)15 0 0 K
(1)18
K(1)21 K
(1)22 K
(1)23 K
(1)24 0 0 0 K
(1)28
0 K(1)32 K
(1)33 K
(1)34 0 0 K
(1)37 0
0 K(1)42 K
(1)43 K
(1)44 0 K
(1)46 K
(1)47 0
K(1)51 0 0 0 K
(1)55 K
(1)56 K
(1)57 0
0 0 0 K(1)64 K
(1)65 K
(1)66 K
(1)67 0
0 0 K(1)73 K
(1)74 K
(1)75 K
(1)76 K
(1)77 K
(1)78
K(1)81 K
(1)82 0 0 0 0 K
(1)87 K
(1)88
(5.24)
318 第 5章 skyline 法
au(1),al(1) au(3) au(13) au(29)
al(3) au(2),al(2) au(5) au(8) au(12) au(28)
al(5) au(4),al(4) au(7) au(11) au(21) au(27)
al(8) al(7) au(6),al(6) au(10) au(16) au(20) au(26)
al(13) al(12) al(11) al(10) au(9),al(9) au(15) au(19) au(25)
al(16) al(15) au(14),al(14) au(18) au(24)
al(21) al(20) al(19) al(18) au(17),al(17) au(23)
al(29) al(28) al(27) al(26) al(25) al(24) al(23) au(22),al(22)
(5.25)
記憶すべき非零の部分の形状がビルの輪郭線 (skyline)に見えることから一般に skykine
法と呼ばれている. また skyline と対角項に挟まれた部分をプロファイルと呼ぶ.
係数マトリックスの対角項 K11, K22, . . . は配列 au, al の 1, 2, 4, 6, . . . 番目に記憶さ
れている. そこで対角項の位置を記憶した配列 i_sky_diagonal (略称 isd) を用意する.
j 列目では, Kmjj から Kjj までの j −mj + 1 個の成分を記憶する必要があるので isdは
以下のように定められる.
isd(1) = 1 isd(j+1) = isd(j) + j − mj + 1 (j = 1, . . . , n)
なお, j − mj + 1 を列の高さと呼ぶ. ここで j = 1, . . . , n + 1 としたのは, mn を同じ手続
きで求めるためである. 三角分解などで用いる mj は
mj = j − isd(j+1) + isd(j) + 1
として求められる.
また isd を用いると, 上三角の i, j 成分, 下三角の j, i 成分はそれぞれ au, al の
isd(j)+j-i 番目の要素としてアクセスできる.
課題
以上に説明したことをもとに skylineバージョン 1を作成する. 以下のような m 重対角
行列を係数マトリックスにもつ連立一次方程式を取り上げる. (例では m = 4)
5.3. skyline法のコーディング 319
[K(1)
]=
1 2 3 4 0 0 . . . 0
2 2 3 4 5 0 0
3 3 3 4 5 6 0
4 4 4 4 5 6 0
0 5 5 5 5 6
0 0 6 6 6 6...
. . . 0... n
n
n
0 0 0 0 . . . 0 n n n n
(5.26)
Gauss の消去法バージョン 1と同様に {b} = {1, 2, 3, . . . , n}T として
[A]{b} = {c} (5.27)
により {c}を求める. この {c}を用いて [A]{b} = {c}を解き{b}をもとめ {1, 2, 3, . . . , n}T
となっていることを確認する. そのうえで 1000× 1000のマトリックスに対していくつか
の mについて cpu time を計測する.
isd の計算は以下のようにすると分かりやすい. まず isd(i)に i 列の高さを求めて代
入しておく. この場合であれば以下のようになる.
320 第 5章 skyline 法
fori = 1 ∼ m
isd(i) = i
end for
fori = m + 1 ∼ n
isd(i) = m
end for
それを元に実際の isd を計算する. たとえば以下のようになる.
isd(1) = 1
isd(2) = 2
n previous = isd(2)
for i = 3 ∼ n + 1
n current = isd(i)
isd(i) = isd(i-1) + n previous
n previous = n current
end for
なお有限要素法で用いるメッシュに skyline 法を適用する場合にもここで用いたものと
同様の方法をとる.
??節で示した, asky_ver0, ssky_ver0, asky_ver01, ssky_ver01, asky_ver02, ssky_ver02
をもとにコーディングした例を示す.
c skyline ver. 0 (ver0.f)c by Hiroshi WATANABE (1998 Sep.)c
5.3. skyline法のコーディング 321
implicit real*8(a-h,o-z)parameter(n = 1000)dimension a(n,n),b(n),c(n)dimension al(n*(n+1)/2),au(n*(n+1)/2),isd(n)
ccall init(a,b,c,n)call init2(a,n,al,au,isd)
cc write(*,*) ’matrix a’c do i = 1,nc write(*,1000) (a(i,j),j=1,n)c end doc write(*,*) ’vector b’c write(*,1000) (b(i),i=1,n)c write(*,*) ’vector c’c write(*,1000) (c(i),i=1,n)c
call asky_ver0(al,au,c,n,isd)c call asky_ver01(al,au,c,n,isd)c call asky_ver02(al,au,c,n,isd)cc call ssky_ver0(al,au,c,n,isd)c call ssky_ver01(al,au,c,n,isd)c call ssky_ver02(al,au,c,n,isd)c
write(*,*) ’solution vector b’write(*,1000) (c(i),i=1,n)
c1000 format(8e10.3)
cstopend
cc#######################################################################
subroutine asky_ver0(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cal(3) = al(3) / au(1)au(3) = au(3) / au(1)
cau(2) = au(2) - al(3) * au(1) * au(3)
cdo j = 3,n
322 第 5章 skyline 法
do i = 2, j-1temp_u = 0.d0temp_l = 0.d0do k = 1, i-1
ki = isd(i) + i - kkj = isd(j) + j - ktemp_u = temp_u + al(ki) * au(kj)temp_l = temp_l + al(kj) * au(ki)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_ual(ij) = al(ij) - temp_l
end dodo i = 1,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))al(ij) = al(ij) / au(isd(i))
end dotemp = 0.d0do k = 1,j-1
kj = isd(j) + j-ktemp = temp + al(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,ndo j = 1,i-1
ij = isd(i) + i-jb(i) = b(i) - al(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
do j = 1,i-1ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturn
5.3. skyline法のコーディング 323
endcc#######################################################################
subroutine asky_ver01(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cal(3) = al(3) / au(1)au(3) = au(3) / au(1)
cau(2) = au(2) - al(3) * au(1) * au(3)
cdo j = 3,n
do i = 2, j-1temp_u = 0.d0temp_l = 0.d0ki = isd(i) + ikj = isd(j) + jdo k = 1, i-1
temp_u = temp_u + al(ki-k) * au(kj-k)temp_l = temp_l + al(kj-k) * au(ki-k)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_ual(ij) = al(ij) - temp_l
end dodo i = 1,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))al(ij) = al(ij) / au(isd(i))
end dotemp = 0.d0do k = 1,j-1
kj = isd(j) + j-ktemp = temp + al(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,ndo j = 1,i-1
ij = isd(i) + i-jb(i) = b(i) - al(ij) * b(j)
end do
324 第 5章 skyline 法
end doc
do i = 1,nb(i) = b(i) / au(isd(i))
end doc
do i = n,2,-1do j = 1,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine asky_ver02(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cal(3) = al(3) / au(1)au(3) = au(3) / au(1)
cau(2) = au(2) - al(3) * au(1) * au(3)
cdo j = 3,n
do i = 2, j-1temp_u = 0.d0temp_l = 0.d0ki = isd(i) + i - ikj = isd(j) + j - ido k = 1, i-1
temp_u = temp_u + al(ki+k) * au(kj+k)temp_l = temp_l + al(kj+k) * au(ki+k)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_ual(ij) = al(ij) - temp_l
end dodo i = 1,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))al(ij) = al(ij) / au(isd(i))
5.3. skyline法のコーディング 325
end dotemp = 0.d0do k = 1,j-1
kj = isd(j) + j-ktemp = temp + al(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,ndo j = 1,i-1
ij = isd(i) + i-jb(i) = b(i) - al(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
do j = 1,i-1ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine ssky_ver0(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cau(3) = au(3) / au(1)
cau(2) = au(2) - au(3) * au(1) * au(3)
cdo j = 3,n
do i = 2, j-1temp_u = 0.d0do k = 1, i-1
ki = isd(i) + i - k
326 第 5章 skyline 法
kj = isd(j) + j - ktemp_u = temp_u + au(ki) * au(kj)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_u
end dodo i = 1,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
end dotemp = 0.d0do k = 1,j-1
kj = isd(j) + j-ktemp = temp + au(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,ndo j = 1,i-1
ij = isd(i) + i-jb(i) = b(i) - au(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
do j = 1,i-1ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine ssky_ver01(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
c
5.3. skyline法のコーディング 327
au(3) = au(3) / au(1)c
au(2) = au(2) - au(3) * au(1) * au(3)c
do j = 3,ndo i = 2, j-1
temp_u = 0.d0ki = isd(i) + ikj = isd(j) + jdo k = 1, i-1
temp_u = temp_u + au(ki-k) * au(kj-k)end doij = isd(j) + j-iau(ij) = au(ij) - temp_u
end dodo i = 1,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
end dotemp = 0.d0do k = 1,j-1
kj = isd(j) + j-ktemp = temp + au(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,ndo j = 1,i-1
ij = isd(i) + i-jb(i) = b(i) - au(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
do j = 1,i-1ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
c
328 第 5章 skyline 法
returnend
cc#######################################################################
subroutine ssky_ver02(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cau(3) = au(3) / au(1)
cau(2) = au(2) - au(3) * au(1) * au(3)
cdo j = 3,n
do i = 2, j-1temp_u = 0.d0ki = isd(i) + i - ikj = isd(j) + j - ido k = 1, i-1
temp_u = temp_u + au(ki+k) * au(kj+k)end doij = isd(j) + j-iau(ij) = au(ij) - temp_u
end dodo i = 1,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
end dotemp = 0.d0do k = 1,j-1
kj = isd(j) + j-ktemp = temp + au(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,ndo j = 1,i-1
ij = isd(i) + i - jb(i) = b(i) - au(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))
5.3. skyline法のコーディング 329
end doc
do i = n,2,-1do j = 1,i-1
ji = isd(i) + i - jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine init2(a,n,al,au,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension a(*),al(*),au(*),isd(*)
cdo i = 1,n
isd(i) = (i-1)*i/2 + 1end do
cdo j = 1,n
do i = 1,nif (i .ge. j) then
ij = isd(i) + i-jal(ij) = a((j-1)*n+i)
end ifif (j .ge. i) then
ij = isd(j) + j-iau(ij) = a((j-1)*n+i)
end ifend do
end doc
returnend
cc#######################################################################
subroutine init(a,b,c,n)c#######################################################################
implicit real*8(a-h,o-z)dimension a(n,*),b(*),c(*)
cdo i = 1,n
330 第 5章 skyline 法
do j = 1,ia(i,j) = dfloat(i)a(j,i) = dfloat(i)
end doend do
cdo i = 1,n
b(i) = dfloat(i)end do
cdo i = 1,n
temp = 0.d0do j = 1,n
temp = temp + a(i,j) * b(j)end doc(i) = temp
end doc
returnend
c
5.4 skyline 法の境界条件処理
?? 節で説明した境界条件処理の方法は skyline 法にも適用することができる. ただし
係数マトリックスを上下三角に分割して記憶しているので, そのままの形で実行するこ
とができない. たとえば , 下図のような係数マトリックスの場合, 上三角行列に関しては,
A1j(i) = A2j(i) = . . . = Amj(i)−1j(i) = 0であり記憶されていない. また下三角行列に関して
は, k 行めが mk > j(i) であれば Akj(i) = 0であり記憶されていない.
5.4. skyline 法の境界条件処理 331
j(i)mj(i)
mk ≤ j(i)
mk ≤ j(i)
mk ≤ j(i)
そこでまず, 右辺の修正を行うループ
for i = 1 ∼ m
for k = 1 ∼ n
ck = ck − b̃j(i)Akj(i)
end for
end for
については, 以下のように変更する.
for i = 1 ∼ m
mj(i) = j(i) − isd(j(i) + 1) + isd(j(i)) + 1
for k = mj(i) ∼ j(i)
kj = isd(j(i)) + j(i) − k
ck = ck − b̃j(i)au(kj)
end for
332 第 5章 skyline 法
for k = j(i) + 1 ∼ n
mk = k − isd(k + 1) + isd(k) + 1
if(mk ≤ j(i))then
jk = isd(k) + k − j(i)
ck = ck − b̃j(i)al(jk)
end if
end for
end for
また係数マトリックスを 0, 1に変更するループ
for i = 1 ∼ m
for k = 1 ∼ n
Akj(i) = 0
Aj(i)k = 0
end for
Aj(i)j(i) = 1
cj(i) = 0
end for
については以下のように変更する.
5.4. skyline 法の境界条件処理 333
for i = 1 ∼ m
mj(i) = j(i) − isd(j(i) + 1) + isd(j(i)) + 1
for k = mj(i) ∼ j(i) − 1
kj = isd(j(i)) + j(i) − k
au(kj) = 0
al(kj) = 0
end for
for k = j(i) + 1 ∼ n
mk = k − isd(k + 1) + isd(k) + 1
if(mk ≤ j(i))then
jk = isd(k) + k − j(i)
au(jk) = 0
al(jk) = 0
end if
end for
jj = isd(j(i))
au(jj) = 0
al(jj) = 0
end for
課題??で示したバネ–質点系の問題を skyline 法により解く. fortranでのコーディング
例を示すと以下のようになる.
c skyline ver. 1 with bound operation (ver1b.f)c by Hiroshi WATANABE (1998 Nov.)
334 第 5章 skyline 法
cimplicit real*8(a-h,o-z)parameter(MXDIM = 1000)dimension c(MXDIM)dimension al(MXDIM*(MXDIM+1)/2),1 au(MXDIM*(MXDIM+1)/2),isd(MXDIM+1)dimension i_bc_given(MXDIM),v_bc_given(MXDIM)
cn = 5nk = 4ak = 1.D0
ccall sky_init(n,isd)call stiff(au,al,isd,n,nk,ak)
cc write(*,*) ’matrix a’c do i = 1,isd(n+1)-1c write(*,*) i,au(i),al(i)c end docc call ex1_1(c,n_bc_given,i_bc_given,v_bc_given,n)c call ex2_1(c,n_bc_given,i_bc_given,v_bc_given,n)c call ex3_1(c,n_bc_given,i_bc_given,v_bc_given,n)cc call ex1_2(c,n_bc_given,i_bc_given,v_bc_given,n,c 1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)c call ex2_2(c,n_bc_given,i_bc_given,v_bc_given,n,c 1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)
call ex3_2(c,n_bc_given,i_bc_given,v_bc_given,n,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)
cc call abound1(au,al,c,n,n_bc_given,i_bc_given,v_bc_given,isd)c call sbound1(au,c,n,n_bc_given,i_bc_given,v_bc_given,isd)cc call abound2(au,al,c,n,n_bc_given,i_bc_given,isd,c 1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)
call sbound2(au,c,n,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)
cc write(*,*) ’matrix a’c do i = 1,isd(n+1)-1c write(*,*) i,au(i),al(i)c end docc write(*,*) ’vector c’
5.4. skyline 法の境界条件処理 335
c write(*,1000) (c(i),i=1,n)cc call asky_ver1(al,au,c,n,isd)c call asky_ver11(al,au,c,n,isd)c call asky_ver12(al,au,c,n,isd)c
call ssky_ver1(au,c,n,isd)c call ssky_ver11(au,c,n,isd)c call ssky_ver12(au,c,n,isd)c
write(*,*) ’solution vector b’write(*,1000) (c(i),i=1,n)
c1000 format(10e10.3)
cstopend
cc#######################################################################
subroutine abound1(au,al,c,n,n_bc_given,i_bc_given,v_bc_given,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension au(*),al(*),c(*),i_bc_given(*),v_bc_given(*),isd(*)
cdo i = 1,n_bc_given
mj = i_bc_given(i) - isd(i_bc_given(i)+1)1 + isd(i_bc_given(i)) + 1
do k = mj,i_bc_given(i)kj = isd(i_bc_given(i)) + i_bc_given(i) - kc(k) = c(k) - v_bc_given(i) * au(kj)
end dodo k = i_bc_given(i)+1,n
mk = k - isd(k+1) + isd(k) + 1if (mk .le. i_bc_given(i)) then
jk = isd(k) + k - i_bc_given(i)c(k) = c(k) - v_bc_given(i) * al(jk)
end ifend do
end doc
do i = 1,n_bc_givenc(i_bc_given(i)) = v_bc_given(i)
end doc
do i = 1,n_bc_given
336 第 5章 skyline 法
mj = i_bc_given(i) - isd(i_bc_given(i)+1)1 + isd(i_bc_given(i)) + 1
do k = mj,i_bc_given(i)kj = isd(i_bc_given(i)) + i_bc_given(i) - kau(kj) = 0.D0al(kj) = 0.D0
end dodo k = i_bc_given(i)+1,n
mk = k - isd(k+1) + isd(k) + 1if (mk .le. i_bc_given(i)) then
jk = isd(k) + k - i_bc_given(i)au(jk) = 0.D0al(jk) = 0.D0
end ifend dojj = isd(i_bc_given(i))au(jj) = 1.D0al(jj) = 1.D0
end doc
returnend
cc#######################################################################
subroutine sbound1(au,c,n,n_bc_given,i_bc_given,v_bc_given,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension au(*),c(*),i_bc_given(*),v_bc_given(*),isd(*)
cdo i = 1,n_bc_given
mj = i_bc_given(i) - isd(i_bc_given(i)+1)1 + isd(i_bc_given(i)) + 1
do k = mj,i_bc_given(i)kj = isd(i_bc_given(i)) + i_bc_given(i) - kc(k) = c(k) - v_bc_given(i) * au(kj)
end dodo k = i_bc_given(i)+1,n
mk = k - isd(k+1) + isd(k) + 1if (mk .le. i_bc_given(i)) then
jk = isd(k) + k - i_bc_given(i)c(k) = c(k) - v_bc_given(i) * au(jk)
end ifend do
end doc
5.4. skyline 法の境界条件処理 337
do i = 1,n_bc_givenc(i_bc_given(i)) = v_bc_given(i)
end doc
do i = 1,n_bc_givenmj = i_bc_given(i) - isd(i_bc_given(i)+1)
1 + isd(i_bc_given(i)) + 1do k = mj,i_bc_given(i)
kj = isd(i_bc_given(i)) + i_bc_given(i) - kau(kj) = 0.D0
end dodo k = i_bc_given(i)+1,n
mk = k - isd(k+1) + isd(k) + 1if (mk .le. i_bc_given(i)) then
jk = isd(k) + k - i_bc_given(i)au(jk) = 0.D0
end ifend dojj = isd(i_bc_given(i))au(jj) = 1.D0
end doc
returnend
cc#######################################################################
subroutine abound2(au,al,c,n,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)
c#######################################################################implicit real*8(a-h,o-z)dimension au(*),al(*),c(*),i_bc_given(*),isd(*),1 i_bc_nonzero(*),v_bc_nonzero(*)
cdo i = 1,n_bc_nonzero
mj = i_bc_nonzero(i) - isd(i_bc_nonzero(i)+1)1 + isd(i_bc_nonzero(i)) + 1
do k = mj,i_bc_nonzero(i)kj = isd(i_bc_nonzero(i)) + i_bc_nonzero(i) - kc(k) = c(k) - v_bc_nonzero(i) * au(kj)
end dodo k = i_bc_nonzero(i)+1,n
mk = k - isd(k+1) + isd(k) + 1if (mk .le. i_bc_nonzero(i)) then
jk = isd(k) + k - i_bc_nonzero(i)c(k) = c(k) - v_bc_nonzero(i) * al(jk)
338 第 5章 skyline 法
end ifend do
end doc
do i = 1,n_bc_givenc(i_bc_given(i)) = 0.D0
end doc
do i = 1,n_bc_nonzeroc(i_bc_nonzero(i)) = v_bc_nonzero(i)
end doc
do i = 1,n_bc_givenmj = i_bc_given(i) - isd(i_bc_given(i)+1)
1 + isd(i_bc_given(i)) + 1do k = mj,i_bc_given(i)
kj = isd(i_bc_given(i)) + i_bc_given(i) - kau(kj) = 0.D0al(kj) = 0.D0
end dodo k = i_bc_given(i)+1,n
mk = k - isd(k+1) + isd(k) + 1if (mk .le. i_bc_given(i)) then
jk = isd(k) + k - i_bc_given(i)au(jk) = 0.D0al(jk) = 0.D0
end ifend dojj = isd(i_bc_given(i))au(jj) = 1.D0al(jj) = 1.D0
end doc
returnend
cc#######################################################################
subroutine sbound2(au,c,n,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)
c#######################################################################implicit real*8(a-h,o-z)dimension au(*),c(*),i_bc_given(*),isd(*),1 i_bc_nonzero(*),v_bc_nonzero(*)
cdo i = 1,n_bc_nonzero
5.4. skyline 法の境界条件処理 339
mj = i_bc_nonzero(i) - isd(i_bc_nonzero(i)+1)1 + isd(i_bc_nonzero(i)) + 1
do k = mj,i_bc_nonzero(i)kj = isd(i_bc_nonzero(i)) + i_bc_nonzero(i) - kc(k) = c(k) - v_bc_nonzero(i) * au(kj)
end dodo k = i_bc_nonzero(i)+1,n
mk = k - isd(k+1) + isd(k) + 1if (mk .le. i_bc_nonzero(i)) then
jk = isd(k) + k - i_bc_nonzero(i)c(k) = c(k) - v_bc_nonzero(i) * au(jk)
end ifend do
end doc
do i = 1,n_bc_givenc(i_bc_given(i)) = 0.D0
end doc
do i = 1,n_bc_nonzeroc(i_bc_nonzero(i)) = v_bc_nonzero(i)
end doc
do i = 1,n_bc_givenmj = i_bc_given(i) - isd(i_bc_given(i)+1)
1 + isd(i_bc_given(i)) + 1do k = mj,i_bc_given(i)
kj = isd(i_bc_given(i)) + i_bc_given(i) - kau(kj) = 0.D0
end dodo k = i_bc_given(i)+1,n
mk = k - isd(k+1) + isd(k) + 1if (mk .le. i_bc_given(i)) then
jk = isd(k) + k - i_bc_given(i)au(jk) = 0.D0
end ifend dojj = isd(i_bc_given(i))au(jj) = 1.D0
end doc
returnend
cc#######################################################################
340 第 5章 skyline 法
subroutine ex1_1(c,n_bc_given,i_bc_given,v_bc_given,n)c#######################################################################
implicit real*8(a-h,o-z)dimension c(*),i_bc_given(*),v_bc_given(*)
cdo i = 1,n
c(i) = 0.D0end doc(n) = 1.D0
cn_bc_given = 1i_bc_given(1) = 1v_bc_given(1) = 0.D0
creturnend
cc#######################################################################
subroutine ex2_1(c,n_bc_given,i_bc_given,v_bc_given,n)c#######################################################################
implicit real*8(a-h,o-z)dimension c(*),i_bc_given(*),v_bc_given(*)
cdo i = 1,n
c(i) = 0.D0end doc(3) = 1.D0
cn_bc_given = 2i_bc_given(1) = 1i_bc_given(2) = 5v_bc_given(1) = 0.D0v_bc_given(2) = 0.D0
creturnend
cc#######################################################################
subroutine ex3_1(c,n_bc_given,i_bc_given,v_bc_given,n)c#######################################################################
implicit real*8(a-h,o-z)dimension c(*),i_bc_given(*),v_bc_given(*)
cdo i = 1,n
c(i) = 0.D0
5.4. skyline 法の境界条件処理 341
end doc
n_bc_given = 3i_bc_given(1) = 1i_bc_given(2) = 3i_bc_given(3) = 5v_bc_given(1) = 0.D0v_bc_given(2) = 1.D0v_bc_given(3) = 0.D0
creturnend
cc#######################################################################
subroutine ex1_2(c,n_bc_given,i_bc_given,v_bc_given,n,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)
c#######################################################################implicit real*8(a-h,o-z)dimension c(*),i_bc_given(*),v_bc_given(*),1 i_bc_nonzero(*),v_bc_nonzero(*)
cdo i = 1,n
c(i) = 0.D0end doc(n) = 1.D0
cn_bc_given = 1i_bc_given(1) = 1v_bc_given(1) = 0.D0
cn_bc_nonzero = 0
creturnend
cc#######################################################################
subroutine ex2_2(c,n_bc_given,i_bc_given,v_bc_given,n,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)
c#######################################################################implicit real*8(a-h,o-z)dimension c(*),i_bc_given(*),v_bc_given(*),1 i_bc_nonzero(*),v_bc_nonzero(*)
cdo i = 1,n
c(i) = 0.D0
342 第 5章 skyline 法
end doc(3) = 1.D0
cn_bc_given = 2i_bc_given(1) = 1i_bc_given(2) = 5v_bc_given(1) = 0.D0v_bc_given(2) = 0.D0
cn_bc_nonzero = 0
creturnend
cc#######################################################################
subroutine ex3_2(c,n_bc_given,i_bc_given,v_bc_given,n,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)
c#######################################################################implicit real*8(a-h,o-z)dimension c(*),i_bc_given(*),v_bc_given(*),1 i_bc_nonzero(*),v_bc_nonzero(*)
cdo i = 1,n
c(i) = 0.D0end do
cn_bc_given = 3i_bc_given(1) = 1i_bc_given(2) = 3i_bc_given(3) = 5v_bc_given(1) = 0.D0v_bc_given(2) = 1.D0v_bc_given(3) = 0.D0
cn_bc_nonzero = 1i_bc_nonzero(1) = 3v_bc_nonzero(1) = 1.D0
creturnend
cc#######################################################################
subroutine stiff(au,al,isd,n,nk,ak)c#######################################################################
implicit real*8(a-h,o-z)
5.4. skyline 法の境界条件処理 343
dimension au(*),al(*),isd(*)dimension a(2,2)
cdo i = 1,isd(n+1)-1
au(i) = 0.D0al(i) = 0.D0
end doc
a(1,1) = aka(1,2) = -aka(2,1) = -aka(2,2) = ak
cdo ielem = 1,nk
i1 = ielemi2 = ielem+1i11 = isd(i1)i12 = isd(i2) + i2 - i1i22 = isd(i2)au(i11) = au(i11) + a(1,1)au(i12) = au(i12) + a(1,2)au(i22) = au(i22) + a(2,2)al(i11) = al(i11) + a(1,1)al(i12) = al(i12) + a(2,1)al(i22) = al(i22) + a(2,2)
end doc
returnend
cc#######################################################################
subroutine sky_init(n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension isd(*)
cisd(1) = 1do i = 2,n+1
isd(i) = 2end do
cn_previous = isd(2)isd(1) = 1isd(2) = 2do i = 3,n+1
344 第 5章 skyline 法
n_current = isd(i)isd(i) = isd(i-1) + n_previousn_previous = n_current
end doc
returnend
cc#######################################################################
subroutine asky_ver1(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cal(3) = al(3) / au(1)au(3) = au(3) / au(1)
cau(2) = au(2) - al(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0temp_l = 0.d0do k = max(mi,mj), i-1
ki = isd(i) + i - kkj = isd(j) + j - ktemp_u = temp_u + al(ki) * au(kj)temp_l = temp_l + al(kj) * au(ki)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_ual(ij) = al(ij) - temp_l
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))al(ij) = al(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + al(kj) * au(isd(k)) * au(kj)
end do
5.4. skyline 法の境界条件処理 345
au(isd(j)) = au(isd(j)) - tempend do
cdo i = 2,n
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - al(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine asky_ver11(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cal(3) = al(3) / au(1)au(3) = au(3) / au(1)
cau(2) = au(2) - al(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0temp_l = 0.d0ki = isd(i) + ikj = isd(j) + j
346 第 5章 skyline 法
do k = max(mi,mj), i-1temp_u = temp_u + al(ki-k) * au(kj-k)temp_l = temp_l + al(kj-k) * au(ki-k)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_ual(ij) = al(ij) - temp_l
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))al(ij) = al(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + al(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - al(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
5.4. skyline 法の境界条件処理 347
subroutine asky_ver12(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cal(3) = al(3) / au(1)au(3) = au(3) / au(1)
cau(2) = au(2) - al(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0temp_l = 0.d0ki = isd(i) + i - ikj = isd(j) + j - ido k = 1,i-max(mi,mj)
temp_u = temp_u + al(ki+k) * au(kj+k)temp_l = temp_l + al(kj+k) * au(ki+k)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_ual(ij) = al(ij) - temp_l
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))al(ij) = al(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + al(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - al(ij) * b(j)
end do
348 第 5章 skyline 法
end doc
do i = 1,nb(i) = b(i) / au(isd(i))
end doc
do i = n,2,-1mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine ssky_ver1(au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension au(*),b(*),isd(*)
cau(3) = au(3) / au(1)
cau(2) = au(2) - au(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0do k = max(mi,mj), i-1
ki = isd(i) + i - kkj = isd(j) + j - ktemp_u = temp_u + au(ki) * au(kj)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_u
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
end dotemp = 0.d0
5.4. skyline 法の境界条件処理 349
do k = mj,j-1kj = isd(j) + j-ktemp = temp + au(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - au(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine ssky_ver11(au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension au(*),b(*),isd(*)
cau(3) = au(3) / au(1)
cau(2) = au(2) - au(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0
350 第 5章 skyline 法
ki = isd(i) + ikj = isd(j) + jdo k = max(mi,mj), i-1
temp_u = temp_u + au(ki-k) * au(kj-k)end doij = isd(j) + j-iau(ij) = au(ij) - temp_u
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + au(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - au(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine ssky_ver12(au,b,n,isd)
5.4. skyline 法の境界条件処理 351
c#######################################################################implicit real*8(a-h,o-z)dimension au(*),b(*),isd(*)
cau(3) = au(3) / au(1)
cau(2) = au(2) - au(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0ki = isd(i) + i - ikj = isd(j) + j - ido k = 1, i-max(mi,mj)
temp_u = temp_u + au(ki+k) * au(kj+k)end doij = isd(j) + j-iau(ij) = au(ij) - temp_u
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + au(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i - jb(i) = b(i) - au(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
c
352 第 5章 skyline 法
do i = n,2,-1mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i - jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
c
5.5 skyline 法の有限要素法への適用 (1)
以上に説明した skyline 法を実際の有限要素解析コードに適用するには (i) isd を計算
する, (ii) merge を skylineに対応させる, 必要がある.
isdは各列の非零成分の最小行番号を求めれば構成できる. 下図のようなメッシュが与
えられたとする. ただし簡単のために各節点の自由度は 1 とする.
10 20 30
110 120 130
210 220 230
図 5.1: メッシュの例
ここで節点 120について考える. この節点は (10, 20, 120, 110), (20, 30, 130, 120), (110,
120, 220, 210), (120, 130, 230, 220) の四つの要素に含まれており, これ以外の要素には含
まれていない. まず, (10, 20, 120, 110)の要素剛性マトリックスの 16成分は全体剛性マト
5.5. skyline 法の有限要素法への適用 (1) 353
リックスの (10, 10), (10, 20), (10, 120), (10, 110), (20, 10), (20, 20), (20, 120), (20, 110),
(120, 10), (120, 20), (120, 120), (120, 110), (110, 10), (110, 20), (110, 120), (110, 110) 成
分に重ね合わされる. 120 列に注目すると (10, 120), (20, 120), (120, 120), (110, 120) の
4成分であるがこのうちで行番号が最小の成分は, (10, 120)である. 同様に (20, 30, 130,
120), (110, 120, 220, 210), (120, 130, 230, 220) の要素についても 120 列の行番号最小の
成分を求めると, それぞれ (20, 120), (110, 120), (120, 120)である.
以上から m120 = 10 であることがわかる. この作業は一般化でき, mj は自由度 j を含
むすべての要素に含まれる自由度のうち最小のものであることがわかる.
mj を効率よくすべての自由度 j について求めるためのアルゴリズムの一例を示す.
要素 1における最小自由度は, 要素 iに含まれるすべての自由度 j について mj の候補
であり,したがって列の高さの候補も n_height = j − mj + 1 で得られる. そこでまず要
素 iに含まれるすべての自由度について isd(j)に列の高さの候補 n_heightを代入する.
要素 2 についても同様に n_height を求めることができるが, 要素 2 に含まれる自由
度には要素 1に含まれる自由度が存在する可能性がある. そこで isd(j)に代入されてい
る値と, 要素 2で得られた n_heightを比較して, 要素 2で得られた n_height のほうが
大きかった場合のみ isd(j) を要素 2で得られた n_heightに更新する.
以下同様にすべての要素についてこれを行えば , 最終的に得られた isdには各自由度の
列の高さが代入されている. これを元に isd(j) を構成する.
この手続きをインデックスを用いて表すと以下のようになる.
総節点数 : npoin (number of point)
総要素数 : nelem (number of element)
1節点あたりの自由度数 : ndofn (number of dof of node)
要素結合条件 : lnods (link of nodes)
各要素あたりの節点数 : ntnoel
全自由度 : ntotdf = ndofn × npoin
354 第 5章 skyline 法
1201
10
20
120
230
0
n 0
記憶する
記憶しない
記憶しない
対角項
im
il
ip
ip
図 5.2: 剛性マトリックスの様子
for i = 1 ∼ ntotdf + 1
isd(i) = 1
end for
for ielem = 1 ∼ nelem
minnode = lnods(1, ielem)
for inode = 2~mnode
if (lnods(inode, ielem) < min node)
min node = lnods(i, ielem)
end if
end for
5.5. skyline 法の有限要素法への適用 (1) 355
mj = (min node − 1) × ndofn + 1
for inode = 1~ntnoel(ielem)
for idof = 1~ndofn
j = (lnods(i, ielem) − 1) × ndofn + idof
n height = j − mj + 1
if (isd(j) < n height)
isd(j) = n height
end if
end for
end for
end for
n previous = isd(2)
isd(1) = 1
isd(2) = 2
for i = 3~ntotdf + 1
n current = isd(i)
isd(i) = isd(i − 1) + n previous
n previous = n current
end for
4.1 節で導入した merge を skyline 法に対応させるには, 全体剛性で上三角部分すなわ
ち Kij で i ≤ j であるような成分の場合は上三角用の配列に, 下三角部分すなわち Kij で
i ≥ j であるような成分の場合は下三角用の配列にmerge する必要がある.
これをふまえてインデックスで表すと以下のようになる.
356 第 5章 skyline 法
for inode = 1, ntnoel(ielem)
for idof = 1, ndofn
ip((inode − 1) ∗ ndofn + idof) = (lnods(inode, ielem) − 1) ∗ ndofn + idof
end for
end for
for i = 1, ntnoel(ielem) × ndofn
for j = 1, ntnoel(ielem) × ndofn
if (ip(i) ≤ ip(j))then
ij = isd(ip(j)) + ip(j) − ip(i)
au(ij) = au(ij) + astiff(i, j)
end if
if (ip(i) ≥ ip(j))then
ij = isd(ip(i)) + ip(i) − ip(j)
al(ij) = al(ij) + astiff(i, j)
end if
end for
end for
一般に有限要素法で構造解析を行う場合, 剛性マトリックスは対称になり, この性質を
いかして剛性マトリックスは上下三角のうち片側のみを記憶する. 当然ながら要素剛性マ
トリックスも対称なので, これも上下三角のうち片側だけを計算する場合が多い. この時
要素剛性マトリックスは上三角行列あるいは下三角行列になる.
たとえば 4 節点, 各節点あたりの自由度 1 コネクティビティ (4, 1, 2, 3) の要素剛性マ
トリックス A の上三角部分のみを求めたとする. このとき A の各成分が全体剛性 K の
5.5. skyline 法の有限要素法への適用 (1) 357
どの成分に対応するかを示すと以下のようになる.
A11 = K44 A12 = K41 A13 = K42 A14 = K43
0 A22 = K11 A23 = K12 A24 = K13
0 0 A33 = K22 A34 = K23
0 0 0 A44 = K33
(5.28)
一方全体剛性は以下のようになっている.
A11 A12 A13 A14
0 A22 A23 A24 . . .
0 0 A33 A34
0 0 0 A44
.... . .
(5.29)
これからわかるように, A22, A23, A24, A33, A34, A44, A11については, K11, K12, K13, K22, K23, K33, K44
としてmerge される際の行き先があるが, A12, A13, A14 については全体剛性マトリックス
では下三角になるため行き先がない. これらは対称性を考慮してK14, K24, K34 に merge
する. 即ち全体剛性で下三角に対応する成分については対称な位置に merge する. これを
インデックスで書くと以下のようになる.
for inode = 1, ntnoel(ielem)
for idof = 1, ndofn
ip((inode − 1) × ndofn + idof) = (lnods(inode, ielem) − 1) ∗ ndofn + idof
end for
end for
358 第 5章 skyline 法
for i = 1, ntnoel(ielem) × ndofn
for j = i, ntnoel(ielem) × ndofn
if(ip(i) ≤ ip(j))then
ij = isd(ip(j)) + ip(j) − ip(i)
else
ij = isd(ip(i)) + ip(i) − ip(j)
end if
au(ij) = au(ij) + astiff(i, j)
end for
end for
課題線形弾性体の例題を skyline 法に取り替える. この時のコーディング例を示すと以
下のようになる.
入力データ例 1:1 要素単純引っ張り (外力)
## degree of freedom, order of Gauss integration3 2## total nodes8## node data## node number, coordinate (x1, x2, x3), boundary condition 0:free,1:given1 0.000000D0 0.000000D0 0.000000D0 1 1 12 1.000000D0 0.000000D0 0.000000D0 0 1 13 0.000000D0 1.000000D0 0.000000D0 1 0 14 1.000000D0 1.000000D0 0.000000D0 0 0 15 0.000000D0 0.000000D0 1.000000D0 1 1 06 1.000000D0 0.000000D0 1.000000D0 0 1 07 0.000000D0 1.000000D0 1.000000D0 1 0 08 1.000000D0 1.000000D0 1.000000D0 0 0 0
## total elements1## element data## element number, number of nodes in an element, connectivity1 8 1 2 4 3 5 6 8 7
5.5. skyline 法の有限要素法への適用 (1) 359
## external load data## number of load data4## node, direction, value5 3 0.25D06 3 0.25D07 3 0.25D08 3 0.25D0
## displacement boundary condition data## number of prescribed displacement0## node, direction, value
入力データ例 2:1 要素単純引っ張り (強制変位)
## degree of freedom, order of Gauss integration3 2## total nodes8## node data## node number, coordinate (x1, x2, x3), boundary condition 0:free,1:given1 0.000000D0 0.000000D0 0.000000D0 1 1 12 1.000000D0 0.000000D0 0.000000D0 0 1 13 0.000000D0 1.000000D0 0.000000D0 1 0 14 1.000000D0 1.000000D0 0.000000D0 0 0 15 0.000000D0 0.000000D0 1.000000D0 1 1 16 1.000000D0 0.000000D0 1.000000D0 0 1 17 0.000000D0 1.000000D0 1.000000D0 1 0 18 1.000000D0 1.000000D0 1.000000D0 0 0 1
## total elements1## element data## element number, number of nodes in an element, connectivity1 8 1 2 4 3 5 6 8 7
## external load data## number of load data0## node, direction, value## displacement boundary condition data## number of prescribed displacement4## node, direction, value
360 第 5章 skyline 法
5 3 1.D06 3 1.D07 3 1.D08 3 1.D0
入力データ例 3:8 要素単純引っ張り (外力)
## degree of freedom, order of Gauss integration3 2## total nodes27## node data## node number, coordinate (x1, x2, x3), boundary condition 0:free,1:given
1 0.000000D0 0.000000D0 0.000000D0 1 1 12 0.500000D0 0.000000D0 0.000000D0 0 1 13 1.000000D0 0.000000D0 0.000000D0 0 1 14 0.000000D0 0.500000D0 0.000000D0 1 0 15 0.500000D0 0.500000D0 0.000000D0 0 0 16 1.000000D0 0.500000D0 0.000000D0 0 0 17 0.000000D0 1.000000D0 0.000000D0 1 0 18 0.500000D0 1.000000D0 0.000000D0 0 0 19 1.000000D0 1.000000D0 0.000000D0 0 0 110 0.000000D0 0.000000D0 0.500000D0 1 1 011 0.500000D0 0.000000D0 0.500000D0 0 1 012 1.000000D0 0.000000D0 0.500000D0 0 1 013 0.000000D0 0.500000D0 0.500000D0 1 0 014 0.500000D0 0.500000D0 0.500000D0 0 0 015 1.000000D0 0.500000D0 0.500000D0 0 0 016 0.000000D0 1.000000D0 0.500000D0 1 0 017 0.500000D0 1.000000D0 0.500000D0 0 0 018 1.000000D0 1.000000D0 0.500000D0 0 0 019 0.000000D0 0.000000D0 1.000000D0 1 1 020 0.500000D0 0.000000D0 1.000000D0 0 1 021 1.000000D0 0.000000D0 1.000000D0 0 1 022 0.000000D0 0.500000D0 1.000000D0 1 0 023 0.500000D0 0.500000D0 1.000000D0 0 0 024 1.000000D0 0.500000D0 1.000000D0 0 0 025 0.000000D0 1.000000D0 1.000000D0 1 0 026 0.500000D0 1.000000D0 1.000000D0 0 0 027 1.000000D0 1.000000D0 1.000000D0 0 0 0
## total elements8
5.5. skyline 法の有限要素法への適用 (1) 361
## element data## element number, number of nodes in an element, connectivity
1 8 1 2 5 4 10 11 14 132 8 2 3 6 5 11 12 15 143 8 4 5 8 7 13 14 17 164 8 5 6 9 8 14 15 18 175 8 10 11 14 13 19 20 23 226 8 11 12 15 14 20 21 24 237 8 13 14 17 16 22 23 26 258 8 14 15 18 17 23 24 27 26
## external load data## number of load data9## node, direction, value19 3 0.0625D020 3 0.125D021 3 0.0625D022 3 0.125D023 3 0.25D024 3 0.125D025 3 0.0625D026 3 0.125D027 3 0.0625D0
## displacement boundary condition data## number of prescribed displacement0## node, direction, value
入力データ例 4:8 要素単純引っ張り (強制変位)
## degree of freedom, order of Gauss integration3 2## total nodes27## node data## node number, coordinate (x1, x2, x3), boundary condition 0:free,1:given
1 0.000000D0 0.000000D0 0.000000D0 1 1 12 0.500000D0 0.000000D0 0.000000D0 0 1 13 1.000000D0 0.000000D0 0.000000D0 0 1 14 0.000000D0 0.500000D0 0.000000D0 1 0 15 0.500000D0 0.500000D0 0.000000D0 0 0 16 1.000000D0 0.500000D0 0.000000D0 0 0 17 0.000000D0 1.000000D0 0.000000D0 1 0 18 0.500000D0 1.000000D0 0.000000D0 0 0 19 1.000000D0 1.000000D0 0.000000D0 0 0 110 0.000000D0 0.000000D0 0.500000D0 1 1 0
362 第 5章 skyline 法
11 0.500000D0 0.000000D0 0.500000D0 0 1 012 1.000000D0 0.000000D0 0.500000D0 0 1 013 0.000000D0 0.500000D0 0.500000D0 1 0 014 0.500000D0 0.500000D0 0.500000D0 0 0 015 1.000000D0 0.500000D0 0.500000D0 0 0 016 0.000000D0 1.000000D0 0.500000D0 1 0 017 0.500000D0 1.000000D0 0.500000D0 0 0 018 1.000000D0 1.000000D0 0.500000D0 0 0 019 0.000000D0 0.000000D0 1.000000D0 1 1 120 0.500000D0 0.000000D0 1.000000D0 0 1 121 1.000000D0 0.000000D0 1.000000D0 0 1 122 0.000000D0 0.500000D0 1.000000D0 1 0 123 0.500000D0 0.500000D0 1.000000D0 0 0 124 1.000000D0 0.500000D0 1.000000D0 0 0 125 0.000000D0 1.000000D0 1.000000D0 1 0 126 0.500000D0 1.000000D0 1.000000D0 0 0 127 1.000000D0 1.000000D0 1.000000D0 0 0 1
## total elements8## element data## element number, number of nodes in an element, connectivity
1 8 1 2 5 4 10 11 14 132 8 2 3 6 5 11 12 15 143 8 4 5 8 7 13 14 17 164 8 5 6 9 8 14 15 18 175 8 10 11 14 13 19 20 23 226 8 11 12 15 14 20 21 24 237 8 13 14 17 16 22 23 26 258 8 14 15 18 17 23 24 27 26
## external load data## number of load data0## node, direction, value## displacement boundary condition data## number of prescribed displacement9## node, direction, value19 3 1.D020 3 1.D021 3 1.D022 3 1.D023 3 1.D024 3 1.D025 3 1.D026 3 1.D0
5.5. skyline 法の有限要素法への適用 (1) 363
27 3 1.D0
シェルスクリプトの例
grep -v ’##’ $1.dat > temp.dattime ver1e
プログラム入力データ例: grep を実行した結果
3 281 0.000000D0 0.000000D0 0.000000D0 1 1 12 1.000000D0 0.000000D0 0.000000D0 0 1 13 0.000000D0 1.000000D0 0.000000D0 1 0 14 1.000000D0 1.000000D0 0.000000D0 0 0 15 0.000000D0 0.000000D0 1.000000D0 1 1 06 1.000000D0 0.000000D0 1.000000D0 0 1 07 0.000000D0 1.000000D0 1.000000D0 1 0 08 1.000000D0 1.000000D0 1.000000D0 0 0 0
11 8 1 2 4 3 5 6 8 7
45 3 0.25D06 3 0.25D07 3 0.25D08 3 0.25D0
0
make ルール:
FC = g77F_OPT = -O
OBJ_F = main1.o element.o sky1.o
TARGET = ver1e
$(TARGET):$(OBJ_F)$(FC) $(F_OPT) -o $(TARGET) $(OBJ_F)
.f.o:$(FC) -c $(F_OPT) $<
364 第 5章 skyline 法
プログラム:main1.f
c skyline ver. 1 with linear elastic finite element (ver1e main1.f)c by Hiroshi WATANABE (1998 Nov.)c
implicit real*8(a-h,o-z)parameter (MXNODE = 100)parameter (MXELEM = 100)parameter (MXDOFN = 3)parameter (MXNOEL = 8)parameter (MXBCGIVEN = 100)parameter (MXBCNONZERO = 100)parameter (MXLOAD = 100)parameter (MXSKY = 10000)dimension coords(MXDOFN,MXNODE),lnods(MXNOEL,MXELEM)dimension ntnoel(MXELEM)dimension astiff(MXDOFN*MXNOEL,MXDOFN*MXNOEL)dimension au(MXSKY),al(MXSKY),isd(MXNODE*MXDOFN+1)dimension udisp(MXNODE*MXDOFN)dimension i_bc_load(MXLOAD),v_bc_load(MXLOAD)dimension i_bc_given(MXBCGIVEN)dimension i_bc_nonzero(MXBCNONZERO),v_bc_nonzero(MXBCNONZERO)
cif_sym = 1
ccall datain(ndofn,nint,npoin,coords,MXDOFN,1 n_bc_given,i_bc_given,1 nelem,lnods,MXNOEL,ntnoel,1 n_bc_load,i_bc_load,v_bc_load,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)yo = 1.D0po = 0.3D0
cntotdf = npoin * ndofn
ccall sky1_init(ntotdf,isd,nelem,lnods,MXNOEL,ntnoel,ndofn)write(*,*) ’aaa’if (MXSKY .lt. isd(ntotdf+1)-1) then
write(*,*) ’MXSKY is insufficient’stop
end ifc
do i = 1,isd(ntotdf+1)-1au(i) = 0.D0al(i) = 0.D0
end do
5.5. skyline 法の有限要素法への適用 (1) 365
write(*,*) ntotdfc
do ielem = 1,nelemcall element(coords,MXDOFN,lnods(1,ielem),nint,ntnoel(ielem),
1 ndofn,astiff,yo,po)if (if_sym .eq. 0) then
call asky1_merge(au,al,lnods(1,ielem),astiff,1 ntnoel(ielem),ndofn,isd)
elsecall ssky1_merge(au,lnods(1,ielem),astiff,
1 ntnoel(ielem),ndofn,isd)end if
end doc
do i = 1,ntotdfudisp(i) = 0.D0
end dodo i = 1,n_bc_load
udisp(i_bc_load(i)) = v_bc_load(i)end do
cif (if_sym .eq. 0) then
call asky1(au,al,udisp,ntotdf,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)else
call ssky1(au,udisp,ntotdf,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)end if
cdo i = 1,npoin
write(*,1000) i,(udisp((i-1)*ndofn+j),j=1,3)end do
c1000 format(i6,2x,e13.6,2x,e13.6,2x,e13.6)
cstopend
cc#######################################################################
subroutine datain(ndofn,nint,npoin,coords,MXDOFN,1 n_bc_given,i_bc_given,1 nelem,lnods,MXNOEL,ntnoel,1 n_bc_load,i_bc_load,v_bc_load,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)
c#######################################################################
366 第 5章 skyline 法
implicit real*8(a-h,o-z)dimension coords(MXDOFN,*),i_bc_given(*),lnods(MXNOEL,*),1 ntnoel(*),i_bc_load(*),v_bc_load(*),1 i_bc_nonzero(*),v_bc_nonzero(*)dimension ibctemp(3)
copen(10,file=’temp.dat’)
cread(10,*) ndofn,nintread(10,*) npoinn_bc_given = 0do i = 1, npoin
read(10,*) itemp, (coords(j,i),j=1,ndofn),1 (ibctemp(j),j=1,ndofn)
do j = 1,ndofnif (ibctemp(j) .eq. 1) then
n_bc_given = n_bc_given + 1i_bc_given(n_bc_given) = (i-1)*ndofn+j
end ifend do
end doc
read(10,*) nelemdo i = 1,nelem
read(10,*) itemp, ntnoel(i),(lnods(j,i),j=1,ntnoel(i))end do
cread(10,*) n_bc_loaddo i = 1,n_bc_load
read(10,*) inode,idof,v_bc_load(i)i_bc_load(i) = (inode-1)*ndofn+idof
end doc
read(10,*) n_bc_nonzerodo i = 1,n_bc_nonzero
read(10,*) inode,idof,v_bc_nonzero(i)i_bc_nonzero(i) = (inode-1)*ndofn+idof
end doc
returnend
c
プログラム:element.f
c#######################################################################
5.5. skyline 法の有限要素法への適用 (1) 367
subroutine element(coords,MXDOFN,lnods,nint,ntnoel,ndofn,1 astiff,yo,po)
c#######################################################################implicit real*8(a-h,o-z)dimension coords(MXDOFN,*),lnods(*)dimension gsp(4,4),wgh(4,4),dndx(3,8),astiff(ntnoel*ndofn,*)dimension dmat(6,6),bmat(6,24)
cdata gsp / 0.D0 , 0.D0 , 0.D0, 0.D0,1 -0.577350269189626D0, 0.577350269189626D0, 0.D0,0.D0,1 -0.774596669241483D0, 0.D0, 0.774596669241483D0,0.D0,1 -0.861136311594053D0,-0.339981043584856D0,1 0.339981043584856D0, 0.861136311594053D0 /data wgh / 2.D0 , 0.D0 , 0.D0, 0.D0,1 1.D0 , 1.D0 , 0.D0, 0.D0,1 0.555555555555556D0, 0.888888888888889D0,1 0.555555555555556D0, 0.D0,1 0.347854845137454D0, 0.652145154862546D0,1 0.652145154862546D0, 0.347854845137454D0 /
cmatsize = ntnoel*ndofndo j = 1,matsize
do i = 1,matsizeastiff(i,j) = 0.D0
end doend do
cvol = 0.D0
ccall cal_dmat(yo,po,dmat)
cdo ir1 = 1,nintdo ir2 = 1,nintdo ir3 = 1,nint
cr1 = gsp(ir1,nint)r2 = gsp(ir2,nint)r3 = gsp(ir3,nint)
ccall shap3d(r1,r2,r3,coords,MXDOFN,lnods,detjac,dndx)
ccall blu3d(dndx,bmat)
cdetwei= detjac*wgh(ir1,nint)*wgh(ir2,nint)*wgh(ir3,nint)vol = vol + detwei
368 第 5章 skyline 法
ccall kuu3d(astiff,dmat,bmat,detwei)
cend doend doend do
cc write(*,*) volc
returnend
cC#######################################################################
subroutine shap3d(r1,r2,r3,coords,MXDOFN,lnods,detjac,dndx)C#######################################################################
implicit real*8(a-h,o-z)dimension coords(MXDOFN,*),lnods(*)dimension ajacob(3,3),dndr(3,8)dimension dndx(3,*),ajainv(3,3)
cdndr(1,1) = -0.125D0 * (1.D0 - r2) * (1.D0 - r3)dndr(2,1) = -0.125D0 * (1.D0 - r1) * (1.D0 - r3)dndr(3,1) = -0.125D0 * (1.D0 - r1) * (1.D0 - r2)
cdndr(1,2) = 0.125D0 * (1.D0 - r2) * (1.D0 - r3)dndr(2,2) = -0.125D0 * (1.D0 + r1) * (1.D0 - r3)dndr(3,2) = -0.125D0 * (1.D0 + r1) * (1.D0 - r2)
cdndr(1,3) = 0.125D0 * (1.D0 + r2) * (1.D0 - r3)dndr(2,3) = 0.125D0 * (1.D0 + r1) * (1.D0 - r3)dndr(3,3) = -0.125D0 * (1.D0 + r1) * (1.D0 + r2)
cdndr(1,4) = -0.125D0 * (1.D0 + r2) * (1.D0 - r3)dndr(2,4) = 0.125D0 * (1.D0 - r1) * (1.D0 - r3)dndr(3,4) = -0.125D0 * (1.D0 - r1) * (1.D0 + r2)
cdndr(1,5) = -0.125D0 * (1.D0 - r2) * (1.D0 + r3)dndr(2,5) = -0.125D0 * (1.D0 - r1) * (1.D0 + r3)dndr(3,5) = 0.125D0 * (1.D0 - r1) * (1.D0 - r2)
cdndr(1,6) = 0.125D0 * (1.D0 - r2) * (1.D0 + r3)dndr(2,6) = -0.125D0 * (1.D0 + r1) * (1.D0 + r3)dndr(3,6) = 0.125D0 * (1.D0 + r1) * (1.D0 - r2)
cdndr(1,7) = 0.125D0 * (1.D0 + r2) * (1.D0 + r3)
5.5. skyline 法の有限要素法への適用 (1) 369
dndr(2,7) = 0.125D0 * (1.D0 + r1) * (1.D0 + r3)dndr(3,7) = 0.125D0 * (1.D0 + r1) * (1.D0 + r2)
cdndr(1,8) = -0.125D0 * (1.D0 + r2) * (1.D0 + r3)dndr(2,8) = 0.125D0 * (1.D0 - r1) * (1.D0 + r3)dndr(3,8) = 0.125D0 * (1.D0 - r1) * (1.D0 + r2)
ccall jacb3d(dndr,coords,MXDOFN,lnods,ajacob,detjac,ajainv)
cdo i = 1,8
do j = 1, 3temp = 0.D0do k = 1,3
temp = temp + ajainv(j,k) * dndr(k,i)end dodndx(j,i) = temp
end doend do
creturnend
cC#######################################################################
subroutine jacb3d(dndr,coords,MXDOFN,lnods,ajacob,detjac,ajainv)C#######################################################################
implicit real*8 (a-h,o-z)dimension ajacob(3,*),ajainv(3,*)dimension dndr(3,*)dimension coords(MXDOFN,*),lnods(*)
Cdo i=1,3
do j=1,3ajacob(i,j) = 0.D0
end doend do
Cdo ki=1,8
do i = 1,3do j = 1,3
ajacob(j,i)=ajacob(j,i)+dndr(j,ki)*coords(i,lnods(ki))end do
end doend do
Cdetjac = ajacob(1,1)*ajacob(2,2)*ajacob(3,3)
370 第 5章 skyline 法
1 + ajacob(2,1)*ajacob(3,2)*ajacob(1,3)1 + ajacob(3,1)*ajacob(1,2)*ajacob(2,3)1 - ajacob(1,1)*ajacob(3,2)*ajacob(2,3)1 - ajacob(3,1)*ajacob(2,2)*ajacob(1,3)1 - ajacob(2,1)*ajacob(1,2)*ajacob(3,3)
Cdeta = 1.D0 / detjac
cajainv(1,1) =1 ( ajacob(2,2)*ajacob(3,3)-ajacob(2,3)*ajacob(3,2) ) *detaajainv(2,1) =1 - ( ajacob(2,1)*ajacob(3,3)-ajacob(2,3)*ajacob(3,1) ) *detaajainv(3,1) =1 ( ajacob(2,1)*ajacob(3,2)-ajacob(2,2)*ajacob(3,1) ) *deta
Cajainv(1,2) =1 - ( ajacob(1,2)*ajacob(3,3)-ajacob(1,3)*ajacob(3,2) ) *detaajainv(2,2) =1 ( ajacob(1,1)*ajacob(3,3)-ajacob(1,3)*ajacob(3,1) ) *detaajainv(3,2) =1 - ( ajacob(1,1)*ajacob(3,2)-ajacob(1,2)*ajacob(3,1) ) *deta
Cajainv(1,3) =1 ( ajacob(1,2)*ajacob(2,3)-ajacob(1,3)*ajacob(2,2) ) *detaajainv(2,3) =1 - ( ajacob(1,1)*ajacob(2,3)-ajacob(1,3)*ajacob(2,1) ) *detaajainv(3,3) =1 ( ajacob(1,1)*ajacob(2,2)-ajacob(1,2)*ajacob(2,1) ) *deta
Creturnend
cC#######################################################################
subroutine cal_dmat(yo,po,dmat)C#######################################################################
implicit real*8(a-h,o-z)dimension dmat(6,*)
cdo i = 1,6
do j = 1,6dmat(i,j) = 0.D0
end doend do
cakappa = yo/3.D0/(1.D0-2.D0*po)
5.5. skyline 法の有限要素法への適用 (1) 371
g = yo/2.D0/(1.D0+po)c
do i = 1,3do j = 1,3
dmat(i,j) = akappa-2.D0/3.D0 * gend dodmat(i,i) = akappa + 4.D0/3.D0 * gdmat(i+3,i+3) = g
end doc
returnend
cC#######################################################################
subroutine kuu3d(astiff,dmat,bmat,detwei)C#######################################################################
implicit real*8(a-h,o-z)dimension bmat(6,*),dmat(6,*)dimension astiff(3*8,*)dimension tmpwrk(6,24)
cdo i = 1,6
do k = 1,24temp = 0.D0do j = 1,6
temp = temp + dmat(i,j) * bmat(j,k)end dotmpwrk(i,k) = temp
end doend do
cdo i = 1,24
do k = 1,24temp = 0.D0do j = 1,6
temp = temp + bmat(j,i) * tmpwrk(j,k)end doastiff(i,k) = astiff(i,k) + detwei*temp
end doend do
creturnend
cC#######################################################################
372 第 5章 skyline 法
subroutine blu3d(dndx,bmat)C#######################################################################
implicit real*8(a-h,o-z)dimension dndx(3,*)dimension bmat(6,*)
cdo i = 1, 3*8
do j = 1,6bmat(j,i) = 0.D0
end doend do
cdo i = 1,8
i1 = 1 + (i-1) * 3i2 = 2 + (i-1) * 3i3 = 3 + (i-1) * 3
cbmat(1,i1) = dndx(1,i)bmat(2,i2) = dndx(2,i)bmat(3,i3) = dndx(3,i)bmat(4,i1) = dndx(2,i)bmat(4,i2) = dndx(1,i)bmat(5,i2) = dndx(3,i)bmat(5,i3) = dndx(2,i)bmat(6,i1) = dndx(3,i)bmat(6,i3) = dndx(1,i)
end doc
returnend
c
プログラム:sky1.f
c skyline ver. 1 with linear elastic finite element (ver1e sky1.f)c by Hiroshi WATANABE (1998 Nov.)cc#######################################################################
subroutine asky1(au,al,udisp,ntotdf,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)
c#######################################################################implicit real*8(a-h,o-z)dimension au(*),al(*),udisp(*),i_bc_given(*),isd(*),1 i_bc_nonzero(*),v_bc_nonzero(*)
c
5.5. skyline 法の有限要素法への適用 (1) 373
call asky1_bound(au,al,udisp,ntotdf,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)
ccall asky_ver1(al,au,udisp,ntotdf,isd)
c call asky_ver11(al,au,udisp,ntotdf,isd)c call asky_ver12(al,au,udisp,ntotdf,isd)c
returnend
cc#######################################################################
subroutine ssky1(au,udisp,ntotdf,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)
c#######################################################################implicit real*8(a-h,o-z)dimension au(*),udisp(*),i_bc_given(*),isd(*),1 i_bc_nonzero(*),v_bc_nonzero(*)
ccall ssky1_bound(au,udisp,ntotdf,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)
ccall ssky_ver1(au,udisp,ntotdf,isd)
c call ssky_ver11(au,udisp,ntotdf,isd)c call ssky_ver12(au,udisp,ntotdf,isd)c
returnend
cc#######################################################################
subroutine sky1_init(ntotdf,isd,nelem,lnods,MXNOEL,ntnoel,ndofn)c#######################################################################
implicit real*8(a-h,o-z)dimension isd(*),lnods(MXNOEL,*),ntnoel(*)
cdo i = 1,ntotdf+1
isd(i) = 1end do
cdo ielem = 1,nelem
min_node = lnods(1,ielem)do inode = 2,ntnoel(ielem)
if (lnods(inode,ielem) .lt. min_node) thenmin_node = lnods(inode,ielem)
end ifend do
374 第 5章 skyline 法
mj = (min_node-1)*ndofn+1do inode = 1,ntnoel(ielem)
do idof = 1,ndofnj = (lnods(inode,ielem)-1)*ndofn+idofn_height = j - mj + 1if (isd(j) .lt. n_height) then
isd(j) = n_heightend if
end doend do
end doc
n_previous = isd(2)isd(1) = 1isd(2) = 2do i = 3,ntotdf+1
n_current = isd(i)isd(i) = isd(i-1) + n_previousn_previous = n_current
end doc
returnend
cc#######################################################################
subroutine asky1_merge(au,al,lnods,astiff,ntnoel,ndofn,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension au(*),al(*),lnods(*),astiff(ntnoel*ndofn,*),isd(*)dimension ip(100)
cif (ntnoel * ndofn .gt. 100) then
write(*,*) ’dimension of index in merge is insufficient’stop
end ifc
do inode = 1,ntnoeldo idof = 1, ndofn
ip((inode-1)*ndofn+idof) = (lnods(inode)-1)*ndofn + idofend do
end doc
do i = 1,ntnoel*ndofndo j = 1,ntnoel*ndofn
if (ip(i) .le. ip(j)) then
5.5. skyline 法の有限要素法への適用 (1) 375
ij = isd(ip(j)) + ip(j) - ip(i)au(ij) = au(ij) + astiff(i,j)
end ifif (ip(i) .ge. ip(j)) then
ij = isd(ip(i)) + ip(i) - ip(j)al(ij) = al(ij) + astiff(i,j)
end ifend do
end doc
returnend
cc#######################################################################
subroutine ssky1_merge(au,lnods,astiff,ntnoel,ndofn,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension au(*),lnods(*),astiff(ntnoel*ndofn,*),isd(*)dimension ip(100)
cif (ntnoel * ndofn .gt. 100) then
write(*,*) ’dimension of index in merge is insufficient’stop
end ifc
do inode = 1,ntnoeldo idof = 1, ndofn
ip((inode-1)*ndofn+idof) = (lnods(inode)-1)*ndofn + idofend do
end doc
do i = 1,ntnoel*ndofndo j = i,ntnoel*ndofn
if (ip(i) .le. ip(j)) thenij = isd(ip(j)) + ip(j) - ip(i)
elseij = isd(ip(i)) + ip(i) - ip(j)
end ifau(ij) = au(ij) + astiff(i,j)
end doend do
creturnend
c
376 第 5章 skyline 法
c#######################################################################subroutine asky1_bound(au,al,c,n,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)
c#######################################################################implicit real*8(a-h,o-z)dimension au(*),al(*),c(*),i_bc_given(*),isd(*),1 i_bc_nonzero(*),v_bc_nonzero(*)
cdo i = 1,n_bc_nonzero
mj = i_bc_nonzero(i) - isd(i_bc_nonzero(i)+1)1 + isd(i_bc_nonzero(i)) + 1
do k = mj,i_bc_nonzero(i)kj = isd(i_bc_nonzero(i)) + i_bc_nonzero(i) - kc(k) = c(k) - v_bc_nonzero(i) * au(kj)
end dodo k = i_bc_nonzero(i)+1,n
mk = k - isd(k+1) + isd(k) + 1if (mk .le. i_bc_nonzero(i)) then
jk = isd(k) + k - i_bc_nonzero(i)c(k) = c(k) - v_bc_nonzero(i) * al(jk)
end ifend do
end doc
do i = 1,n_bc_givenc(i_bc_given(i)) = 0.D0
end doc
do i = 1,n_bc_nonzeroc(i_bc_nonzero(i)) = v_bc_nonzero(i)
end doc
do i = 1,n_bc_givenmj = i_bc_given(i) - isd(i_bc_given(i)+1)
1 + isd(i_bc_given(i)) + 1do k = mj,i_bc_given(i)
kj = isd(i_bc_given(i)) + i_bc_given(i) - kau(kj) = 0.D0al(kj) = 0.D0
end dodo k = i_bc_given(i)+1,n
mk = k - isd(k+1) + isd(k) + 1if (mk .le. i_bc_given(i)) then
jk = isd(k) + k - i_bc_given(i)au(jk) = 0.D0
5.5. skyline 法の有限要素法への適用 (1) 377
al(jk) = 0.D0end if
end dojj = isd(i_bc_given(i))au(jj) = 1.D0al(jj) = 1.D0
end doc
returnend
cc#######################################################################
subroutine ssky1_bound(au,c,n,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero)
c#######################################################################implicit real*8(a-h,o-z)dimension au(*),c(*),i_bc_given(*),isd(*),1 i_bc_nonzero(*),v_bc_nonzero(*)
cdo i = 1,n_bc_nonzero
mj = i_bc_nonzero(i) - isd(i_bc_nonzero(i)+1)1 + isd(i_bc_nonzero(i)) + 1
do k = mj,i_bc_nonzero(i)kj = isd(i_bc_nonzero(i)) + i_bc_nonzero(i) - kc(k) = c(k) - v_bc_nonzero(i) * au(kj)
end dodo k = i_bc_nonzero(i)+1,n
mk = k - isd(k+1) + isd(k) + 1if (mk .le. i_bc_nonzero(i)) then
jk = isd(k) + k - i_bc_nonzero(i)c(k) = c(k) - v_bc_nonzero(i) * au(jk)
end ifend do
end doc
do i = 1,n_bc_givenc(i_bc_given(i)) = 0.D0
end doc
do i = 1,n_bc_nonzeroc(i_bc_nonzero(i)) = v_bc_nonzero(i)
end doc
do i = 1,n_bc_givenmj = i_bc_given(i) - isd(i_bc_given(i)+1)
378 第 5章 skyline 法
1 + isd(i_bc_given(i)) + 1do k = mj,i_bc_given(i)
kj = isd(i_bc_given(i)) + i_bc_given(i) - kau(kj) = 0.D0
end dodo k = i_bc_given(i)+1,n
mk = k - isd(k+1) + isd(k) + 1if (mk .le. i_bc_given(i)) then
jk = isd(k) + k - i_bc_given(i)au(jk) = 0.D0
end ifend dojj = isd(i_bc_given(i))au(jj) = 1.D0
end doc
returnend
cc#######################################################################
subroutine asky_ver1(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cal(3) = al(3) / au(1)au(3) = au(3) / au(1)
cau(2) = au(2) - al(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0temp_l = 0.d0do k = max(mi,mj), i-1
ki = isd(i) + i - kkj = isd(j) + j - ktemp_u = temp_u + al(ki) * au(kj)temp_l = temp_l + al(kj) * au(ki)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_ual(ij) = al(ij) - temp_l
5.5. skyline 法の有限要素法への適用 (1) 379
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))al(ij) = al(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + al(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - al(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine asky_ver11(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cal(3) = al(3) / au(1)au(3) = au(3) / au(1)
380 第 5章 skyline 法
cau(2) = au(2) - al(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0temp_l = 0.d0ki = isd(i) + ikj = isd(j) + jdo k = max(mi,mj), i-1
temp_u = temp_u + al(ki-k) * au(kj-k)temp_l = temp_l + al(kj-k) * au(ki-k)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_ual(ij) = al(ij) - temp_l
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))al(ij) = al(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + al(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - al(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
5.5. skyline 法の有限要素法への適用 (1) 381
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine asky_ver12(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cal(3) = al(3) / au(1)au(3) = au(3) / au(1)
cau(2) = au(2) - al(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0temp_l = 0.d0ki = isd(i) + i - ikj = isd(j) + j - ido k = 1,i-max(mi,mj)
temp_u = temp_u + al(ki+k) * au(kj+k)temp_l = temp_l + al(kj+k) * au(ki+k)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_ual(ij) = al(ij) - temp_l
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))al(ij) = al(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-k
382 第 5章 skyline 法
temp = temp + al(kj) * au(isd(k)) * au(kj)end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - al(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine ssky_ver1(au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension au(*),b(*),isd(*)
cau(3) = au(3) / au(1)
cau(2) = au(2) - au(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0do k = max(mi,mj), i-1
ki = isd(i) + i - k
5.5. skyline 法の有限要素法への適用 (1) 383
kj = isd(j) + j - ktemp_u = temp_u + au(ki) * au(kj)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_u
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + au(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - au(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine ssky_ver11(au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)
384 第 5章 skyline 法
dimension au(*),b(*),isd(*)c
au(3) = au(3) / au(1)c
au(2) = au(2) - au(3) * au(1) * au(3)c
do j = 3,nmj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0ki = isd(i) + ikj = isd(j) + jdo k = max(mi,mj), i-1
temp_u = temp_u + au(ki-k) * au(kj-k)end doij = isd(j) + j-iau(ij) = au(ij) - temp_u
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + au(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - au(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
mi = i - isd(i+1) + isd(i) + 1
5.5. skyline 法の有限要素法への適用 (1) 385
do j = mi,i-1ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine ssky_ver12(au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension au(*),b(*),isd(*)
cau(3) = au(3) / au(1)
cau(2) = au(2) - au(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0ki = isd(i) + i - ikj = isd(j) + j - ido k = 1, i-max(mi,mj)
temp_u = temp_u + au(ki+k) * au(kj+k)end doij = isd(j) + j-iau(ij) = au(ij) - temp_u
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + au(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,n
386 第 5章 skyline 法
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i - jb(i) = b(i) - au(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i - jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
c
5.6 skyline 法の有限要素法への適用 (2)
たとえば非圧縮性固体を変位 / 不定静水圧の混合型有限要素定式化を行うと, 変位が 1
節点あたり 3 自由度であるのに対して不定静水圧は 1 自由度である. あるいは接触解析を
Lagrange未定乗数法により行う時には,接触している節点は通常の自由度に加え Lagrange
未定乗数の自由度が追加されるが離れれば元の通常の自由度に戻る. また, シェル要素や
梁要素とソリッド要素を混在させて解析を行う場合には, それぞれの節点あたりの自由度
は異なっている. このように有限要素解析では節点ごとに自由度が異なることは多い.
このような状況への対応としては, 1 節点あたりの自由度として最大のものを用い必要
のない自由度は変位境界条件で固定にするという方法がある. たとえば非圧縮性物質の混
合型有限要素定式化ならすべての節点を 3 自由度に設定し , 不定静水圧にあたる節点は 3
自由度のうち冗長な二つの自由度を固定にすれば良い. しかしながらこの方法だと, 1 節
点あたり 18 自由度の配管要素と 3 自由度のソリッド要素を混在させる場合, 無駄な自由
5.6. skyline 法の有限要素法への適用 (2) 387
度が多くなり過ぎる.
そこでここでは一連の skyline の手続きのなかで自由度番号をつけ直すことによりこれ
に対応する. まず配列 ndofn2(1:npoin)を用意し各節点の自由度を記憶する. たとえば ,
非圧縮性物質の混合型有限要素定式化なら以下のようになる.
ndofn2(i) =
3 変位節点
1 不定静水圧節点
次に配列 i sky renumbering(1:ntotdf) (略称:isr)を用意し元の自由度番号と新しい自
由度番号の対応付をする. 新しい自由度番号は不定静水圧節点の冗長な 2 自由度を縮退
させることにより得られる. isrはもとの自由度番号をインデックスとして新しい自由度
番号を代入しておく. ただし縮退される自由度については区別のため 0にしておく. 縮退
前後の自由度と isr の関係を下図に示す.
縮退前後の全自由度数は以下のようになる.
縮退前の全自由度 ntotdf = ndofn× npoin
縮退後の全自由度 nskydf =
npoin∑i=1
ndofn2(i)
この手続きをインデックスで表すと, 以下のようになる. 6.5節で示したものとの違いは
まず最初に isrをつくること, 次に列の高さなどの計算において用いる自由度番号を isr
を用いて変換していることである.
388 第 5章 skyline 法
節点 isr(i)自由度縮退前の 縮退後の
自由度
12345×6×7891011×12×131415
1234567891011
12340056780091011
1
2
3
4
5 変位
圧力
変位
変位
圧力
npoinntotdf
nskydf
ntotdfnskydf
図 5.3: iskyidの例
for i = 1, ntotdf
isr(i) = 0
end do
nskydf = 0
for inode = 1, npoin
for idof = 1, ndofn2(inode)
nskydf = nskydf + 1
isr((inode − 1) ∗ ndofn + idof) = nskydf
end do
end do
for i = 1, ntotdf + 1
isd(i) = 1
end do
for ielem = 1, nelem
5.6. skyline 法の有限要素法への適用 (2) 389
これに伴って mergeも変更することになる. 変更点は, 全体剛性マトリックス中での行
番号, 列番号を表す配列 ip をつくるときに縮退した自由度に番号をつけ変えること, お
よび冗長な自由度については skip することである. 具体的な手続きを示すと以下のよう
になる.
[非対称版]
for inode = 1, ntnoel
for idof = 1, ndofn
ip((inode − 1) ∗ ndofn + idof) = isr((lnods(inode) − 1) ∗ ndofn + idof)
end for
end for
for i = 1, ntnoel ∗ ndofn
if (ip(i).ne.0)then
for j = 1, ntnoel ∗ ndofn
if (ip(j).ne.0)then
if (ip(i).le.ip(j))then
ij = isd(ip(j)) + ip(j) − ip(i)
au(ij) = au(ij) + astiff(i, j)
end if
if (ip(i).ge.ip(j))then
ij = isd(ip(i)) + ip(i) − ip(j)
al(ij) = al(ij) + astiff(i, j)
end if
end if
end for
390 第 5章 skyline 法
end if
end for
[対称版]
for inode = 1, ntnoel
for idof = 1, ndofn
ip((inode − 1) ∗ ndofn + idof) = isr((lnods(inode) − 1) ∗ ndofn + idof)
end for
end for
for i = 1, ntnoel ∗ ndofn
if (ip(i).ne.0)then
for j = i, ntnoel ∗ ndofn
if (ip(j).ne.0)then
if (ip(i).le.ip(j))then
ij = isd(ip(j)) + ip(j) − ip(i)
else
ij = isd(ip(i)) + ip(i) − ip(j)
end if
au(ij) = au(ij) + astiff(i, j)
end if
end for
end if
end for
5.6. skyline 法の有限要素法への適用 (2) 391
課題線形弾性体の例題を skyline 法に取り替える. この時のコーディング例を示すと以
下のようになる.
入力データ例 1:1 要素単純引っ張り (外力)
## degree of freedom, order of Gauss integration3 2## total nodes8## node data## node number, coordinate (x1, x2, x3), boundary condition 0:free,1:given
1 3 0.000000D0 0.000000D0 0.000000D0 1 1 12 3 1.000000D0 0.000000D0 0.000000D0 0 1 13 3 0.000000D0 1.000000D0 0.000000D0 1 0 14 3 1.000000D0 1.000000D0 0.000000D0 0 0 15 3 0.000000D0 0.000000D0 1.000000D0 1 1 06 3 1.000000D0 0.000000D0 1.000000D0 0 1 07 3 0.000000D0 1.000000D0 1.000000D0 1 0 08 3 1.000000D0 1.000000D0 1.000000D0 0 0 0
## total elements1## element data## element number, number of nodes in an element, connectivity1 8 1 2 4 3 5 6 8 7
## external load data## number of load data4## node, direction, value5 3 0.25D06 3 0.25D07 3 0.25D08 3 0.25D0
## displacement boundary condition data## number of prescribed displacement0## node, direction, value
入力データ例 2:1 要素単純引っ張り (強制変位)
## degree of freedom, order of Gauss integration3 2## total nodes
392 第 5章 skyline 法
8## node data## node number, coordinate (x1, x2, x3), boundary condition 0:free,1:given
1 3 0.000000D0 0.000000D0 0.000000D0 1 1 12 3 1.000000D0 0.000000D0 0.000000D0 0 1 13 3 0.000000D0 1.000000D0 0.000000D0 1 0 14 3 1.000000D0 1.000000D0 0.000000D0 0 0 15 3 0.000000D0 0.000000D0 1.000000D0 1 1 16 3 1.000000D0 0.000000D0 1.000000D0 0 1 17 3 0.000000D0 1.000000D0 1.000000D0 1 0 18 3 1.000000D0 1.000000D0 1.000000D0 0 0 1
## total elements1## element data## element number, number of nodes in an element, connectivity1 8 1 2 4 3 5 6 8 7
## external load data## number of load data0## node, direction, value## displacement boundary condition data## number of prescribed displacement4## node, direction, value5 3 1.D06 3 1.D07 3 1.D08 3 1.D0
入力データ例 3:8 要素単純引っ張り (外力)
## degree of freedom, order of Gauss integration3 2## total nodes27## node data## node number, coordinate (x1, x2, x3), boundary condition 0:free,1:given
1 3 0.000000D0 0.000000D0 0.000000D0 1 1 12 3 0.500000D0 0.000000D0 0.000000D0 0 1 13 3 1.000000D0 0.000000D0 0.000000D0 0 1 14 3 0.000000D0 0.500000D0 0.000000D0 1 0 15 3 0.500000D0 0.500000D0 0.000000D0 0 0 1
5.6. skyline 法の有限要素法への適用 (2) 393
6 3 1.000000D0 0.500000D0 0.000000D0 0 0 17 3 0.000000D0 1.000000D0 0.000000D0 1 0 18 3 0.500000D0 1.000000D0 0.000000D0 0 0 19 3 1.000000D0 1.000000D0 0.000000D0 0 0 110 3 0.000000D0 0.000000D0 0.500000D0 1 1 011 3 0.500000D0 0.000000D0 0.500000D0 0 1 012 3 1.000000D0 0.000000D0 0.500000D0 0 1 013 3 0.000000D0 0.500000D0 0.500000D0 1 0 014 3 0.500000D0 0.500000D0 0.500000D0 0 0 015 3 1.000000D0 0.500000D0 0.500000D0 0 0 016 3 0.000000D0 1.000000D0 0.500000D0 1 0 017 3 0.500000D0 1.000000D0 0.500000D0 0 0 018 3 1.000000D0 1.000000D0 0.500000D0 0 0 019 3 0.000000D0 0.000000D0 1.000000D0 1 1 020 3 0.500000D0 0.000000D0 1.000000D0 0 1 021 3 1.000000D0 0.000000D0 1.000000D0 0 1 022 3 0.000000D0 0.500000D0 1.000000D0 1 0 023 3 0.500000D0 0.500000D0 1.000000D0 0 0 024 3 1.000000D0 0.500000D0 1.000000D0 0 0 025 3 0.000000D0 1.000000D0 1.000000D0 1 0 026 3 0.500000D0 1.000000D0 1.000000D0 0 0 027 3 1.000000D0 1.000000D0 1.000000D0 0 0 0
## total elements8## element data## element number, number of nodes in an element, connectivity
1 8 1 2 5 4 10 11 14 132 8 2 3 6 5 11 12 15 143 8 4 5 8 7 13 14 17 164 8 5 6 9 8 14 15 18 175 8 10 11 14 13 19 20 23 226 8 11 12 15 14 20 21 24 237 8 13 14 17 16 22 23 26 258 8 14 15 18 17 23 24 27 26
## external load data## number of load data9## node, direction, value19 3 0.0625D020 3 0.125D021 3 0.0625D022 3 0.125D023 3 0.25D024 3 0.125D025 3 0.0625D0
394 第 5章 skyline 法
26 3 0.125D027 3 0.0625D0
## displacement boundary condition data## number of prescribed displacement0## node, direction, value
入力データ例 4:8 要素単純引っ張り (強制変位)
## degree of freedom, order of Gauss integration3 2## total nodes27## node data## node number, coordinate (x1, x2, x3), boundary condition 0:free,1:given
1 3 0.000000D0 0.000000D0 0.000000D0 1 1 12 3 0.500000D0 0.000000D0 0.000000D0 0 1 13 3 1.000000D0 0.000000D0 0.000000D0 0 1 14 3 0.000000D0 0.500000D0 0.000000D0 1 0 15 3 0.500000D0 0.500000D0 0.000000D0 0 0 16 3 1.000000D0 0.500000D0 0.000000D0 0 0 17 3 0.000000D0 1.000000D0 0.000000D0 1 0 18 3 0.500000D0 1.000000D0 0.000000D0 0 0 19 3 1.000000D0 1.000000D0 0.000000D0 0 0 110 3 0.000000D0 0.000000D0 0.500000D0 1 1 011 3 0.500000D0 0.000000D0 0.500000D0 0 1 012 3 1.000000D0 0.000000D0 0.500000D0 0 1 013 3 0.000000D0 0.500000D0 0.500000D0 1 0 014 3 0.500000D0 0.500000D0 0.500000D0 0 0 015 3 1.000000D0 0.500000D0 0.500000D0 0 0 016 3 0.000000D0 1.000000D0 0.500000D0 1 0 017 3 0.500000D0 1.000000D0 0.500000D0 0 0 018 3 1.000000D0 1.000000D0 0.500000D0 0 0 019 3 0.000000D0 0.000000D0 1.000000D0 1 1 120 3 0.500000D0 0.000000D0 1.000000D0 0 1 121 3 1.000000D0 0.000000D0 1.000000D0 0 1 122 3 0.000000D0 0.500000D0 1.000000D0 1 0 123 3 0.500000D0 0.500000D0 1.000000D0 0 0 124 3 1.000000D0 0.500000D0 1.000000D0 0 0 125 3 0.000000D0 1.000000D0 1.000000D0 1 0 126 3 0.500000D0 1.000000D0 1.000000D0 0 0 127 3 1.000000D0 1.000000D0 1.000000D0 0 0 1
## total elements8## element data## element number, number of nodes in an element, connectivity
5.6. skyline 法の有限要素法への適用 (2) 395
1 8 1 2 5 4 10 11 14 132 8 2 3 6 5 11 12 15 143 8 4 5 8 7 13 14 17 164 8 5 6 9 8 14 15 18 175 8 10 11 14 13 19 20 23 226 8 11 12 15 14 20 21 24 237 8 13 14 17 16 22 23 26 258 8 14 15 18 17 23 24 27 26
## external load data## number of load data0## node, direction, value## displacement boundary condition data## number of prescribed displacement9## node, direction, value19 3 1.D020 3 1.D021 3 1.D022 3 1.D023 3 1.D024 3 1.D025 3 1.D026 3 1.D027 3 1.D0
プログラム入力データ例: シェルスクリプトで grep を実行した結果
3 28
1 3 0.000000D0 0.000000D0 0.000000D0 1 1 12 3 1.000000D0 0.000000D0 0.000000D0 0 1 13 3 0.000000D0 1.000000D0 0.000000D0 1 0 14 3 1.000000D0 1.000000D0 0.000000D0 0 0 15 3 0.000000D0 0.000000D0 1.000000D0 1 1 16 3 1.000000D0 0.000000D0 1.000000D0 0 1 17 3 0.000000D0 1.000000D0 1.000000D0 1 0 18 3 1.000000D0 1.000000D0 1.000000D0 0 0 1
11 8 1 2 4 3 5 6 8 7
045 3 1.D06 3 1.D07 3 1.D0
396 第 5章 skyline 法
8 3 1.D0
make ルール:
FC = g77F_OPT = -O
OBJ_F = main2.o dbg.o element.o sky2.o
TARGET = ver2
$(TARGET):$(OBJ_F)$(FC) $(F_OPT) -o $(TARGET) $(OBJ_F)
.f.o:$(FC) -c $(F_OPT) $<
プログラム:main2.f
c skyline ver. 2 with linear elastic finite element (ver2 main2.f)c by Hiroshi WATANABE (1998 Nov.)c
implicit real*8(a-h,o-z)parameter (MXNODE = 100)parameter (MXELEM = 100)parameter (MXDOFN = 3)parameter (MXNOEL = 8)parameter (MXBCGIVEN = 100)parameter (MXBCNONZERO = 100)parameter (MXLOAD = 100)parameter (MXSKY = 10000)dimension coords(MXDOFN,MXNODE),lnods(MXNOEL,MXELEM)dimension ntnoel(MXELEM)dimension astiff(MXDOFN*MXNOEL,MXDOFN*MXNOEL)dimension au(MXSKY),al(MXSKY),isd(MXNODE*MXDOFN+1)dimension udisp(MXNODE*MXDOFN)dimension i_bc_load(MXLOAD),v_bc_load(MXLOAD)dimension i_bc_given(MXBCGIVEN)dimension i_bc_nonzero(MXBCNONZERO),v_bc_nonzero(MXBCNONZERO)dimension ndofn2(MXNODE),isr(MXNODE*MXDOFN)
c
5.6. skyline 法の有限要素法への適用 (2) 397
dimension a_dbg(32,32)c
if_sym = 1if_dbg = 1
ccall datain(ndofn,nint,npoin,coords,MXDOFN,1 n_bc_given,i_bc_given,1 nelem,lnods,MXNOEL,ntnoel,1 n_bc_load,i_bc_load,v_bc_load,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,ndofn2)
cyo = 1.D0po = 0.3D0
cntotdf = npoin * ndofn
cif (if_dbg .eq. 1) then
call set_dbg_data(ndofn,ndofn_dbg,ntotdf,npoin,1 n_bc_load,i_bc_load,n_bc_given,i_bc_given,1 n_bc_nonzero,i_bc_nonzero)end if
cif (if_dbg .ne. 1) then
call sky2_init(ntotdf,isd,nelem,lnods,MXNOEL,ntnoel,1 ndofn,npoin,ndofn2,isr,nskydf)else
call sky2_init(ntotdf,isd,nelem,lnods,MXNOEL,ntnoel,1 ndofn_dbg,npoin,ndofn2,isr,nskydf)end if
cif (MXSKY .lt. isd(nskydf+1)-1) then
write(*,*) ’MXSKY is insufficient’stop
end ifc
do i = 1,isd(nskydf+1)-1au(i) = 0.D0al(i) = 0.D0
end doc
do ielem = 1,nelemcall element(coords,MXDOFN,lnods(1,ielem),nint,ntnoel(ielem),
1 ndofn,astiff,yo,po)if (if_dbg .ne. 1) then
if (if_sym .eq. 0) then
398 第 5章 skyline 法
call asky2_merge(au,al,lnods(1,ielem),astiff,1 ntnoel(ielem),ndofn,isd,isr)
elsecall ssky2_merge(au,lnods(1,ielem),astiff,
1 ntnoel(ielem),ndofn,isd,isr)end if
elsecall set_dbg_matrix(ndofn,ndofn_dbg,ntnoel,ielem,
1 astiff,a_dbg)if (if_sym .eq. 0) then
call asky2_merge(au,al,lnods(1,ielem),a_dbg,1 ntnoel(ielem),ndofn_dbg,isd,isr)
elsecall ssky2_merge(au,lnods(1,ielem),a_dbg,
1 ntnoel(ielem),ndofn_dbg,isd,isr)end if
end ifend do
cdo i = 1,ntotdf
udisp(i) = 0.D0end dodo i = 1,n_bc_load
udisp(i_bc_load(i)) = v_bc_load(i)end do
cif (if_sym .eq. 0) then
call asky2(au,al,udisp,ntotdf,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,nskydf,isr)else
call ssky2(au,udisp,ntotdf,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,nskydf,isr)end if
cif (if_dbg .ne. 1) then
do i = 1,npoinwrite(*,1000) i,(udisp((i-1)*ndofn+j),j=1,ndofn)
end doelse
do i = 1,npoinwrite(*,1000) i,(udisp((i-1)*ndofn_dbg+j),j=1,ndofn_dbg)
end doend if
c1000 format(i6,2x,e13.6,2x,e13.6,2x,e13.6,2x,e13.6)
5.6. skyline 法の有限要素法への適用 (2) 399
2000 format(10e10.3)c
stopend
cc#######################################################################
subroutine datain(ndofn,nint,npoin,coords,MXDOFN,1 n_bc_given,i_bc_given,1 nelem,lnods,MXNOEL,ntnoel,1 n_bc_load,i_bc_load,v_bc_load,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,ndofn2)
c#######################################################################implicit real*8(a-h,o-z)dimension coords(MXDOFN,*),i_bc_given(*),lnods(MXNOEL,*),1 ntnoel(*),i_bc_load(*),v_bc_load(*),1 i_bc_nonzero(*),v_bc_nonzero(*),ndofn2(*)dimension ibctemp(3)
copen(10,file=’temp.dat’)
cread(10,*) ndofn,nintread(10,*) npoinn_bc_given = 0do i = 1, npoin
read(10,*) itemp, ndofn2(i),(coords(j,i),j=1,ndofn),1 (ibctemp(j),j=1,ndofn)
do j = 1,ndofnif (ibctemp(j) .eq. 1) then
n_bc_given = n_bc_given + 1i_bc_given(n_bc_given) = (i-1)*ndofn+j
end ifend do
end doc
read(10,*) nelemdo i = 1,nelem
read(10,*) itemp, ntnoel(i),(lnods(j,i),j=1,ntnoel(i))end do
cread(10,*) n_bc_loaddo i = 1,n_bc_load
read(10,*) inode,idof,v_bc_load(i)i_bc_load(i) = (inode-1)*ndofn+idof
end doc
400 第 5章 skyline 法
read(10,*) n_bc_nonzerodo i = 1,n_bc_nonzero
read(10,*) inode,idof,v_bc_nonzero(i)i_bc_nonzero(i) = (inode-1)*ndofn+idof
end doc
returnend
c
プログラム:dbg.f
c#######################################################################subroutine set_dbg_data(ndofn,ndofn_dbg,ntotdf,npoin,1 n_bc_load,i_bc_load,n_bc_given,i_bc_given,1 n_bc_nonzero,i_bc_nonzero)
c#######################################################################implicit real*8(a-h,o-z)dimension i_bc_load(*),i_bc_given(*),i_bc_nonzero(*)
ndofn_dbg = 4ntotdf = npoin * ndofn_dbg
cdo i = 1,n_bc_load
idof = mod(i_bc_load(i),ndofn)if (idof .eq. 0) idof = 3inode = (i_bc_load(i)-idof) / ndofn + 1i_bc_load(i) = (inode-1)*ndofn_dbg + idof
end doc
do i = 1,n_bc_givenidof = mod(i_bc_given(i),ndofn)if (idof .eq. 0) idof = 3inode = (i_bc_given(i)-idof) / ndofn + 1i_bc_given(i) = (inode-1)*ndofn_dbg + idof
end doc
do i = 1,n_bc_nonzeroidof = mod(i_bc_nonzero(i),ndofn)if (idof .eq. 0) idof = 3inode = (i_bc_nonzero(i)-idof) / ndofn + 1i_bc_nonzero(i) = (inode-1)*ndofn_dbg + idof
end doc
returnend
5.6. skyline 法の有限要素法への適用 (2) 401
cc#######################################################################
subroutine set_dbg_matrix(ndofn,ndofn_dbg,ntnoel,ielem,1 astiff,a_dbg)
c#######################################################################implicit real*8(a-h,o-z)dimension ntnoel(*),astiff(24,*),a_dbg(32,*)
cdo i = 1,ntnoel(ielem)*ndofn_dbg
do j = 1,1,ntnoel(ielem)*ndofn_dbga_dbg(i,j) = 0.D0
end doend do
cdo inode = 1,ntnoel(ielem)
do idof = 1,ndofndo jnode = 1,ntnoel(ielem)
do jdof = 1,ndofni1 = (inode-1)*ndofn + idofj1 = (jnode-1)*ndofn + jdofi2 = (inode-1)*ndofn_dbg + idofj2 = (jnode-1)*ndofn_dbg + jdofa_dbg(i2,j2) = astiff(i1,j1)
end doend do
end doend do
creturnend
c
プログラム:sky2.f
c skyline ver. 2 with linear elastic finite element (ver2 sky2.f)c by Hiroshi WATANABE (1998 Nov.)cc#######################################################################
subroutine asky2(au,al,udisp,ntotdf,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,nskydf,isr)
c#######################################################################implicit real*8(a-h,o-z)dimension au(*),al(*),udisp(*),i_bc_given(*),isd(*),1 i_bc_nonzero(*),v_bc_nonzero(*),isr(*)
cdo i = 1,ntotdf
402 第 5章 skyline 法
if (isr(i) .ne. 0) udisp(isr(i)) = udisp(i)end do
ccall asky2_bound(au,al,udisp,nskydf,1 n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,isr)
ccall asky_ver1(al,au,udisp,nskydf,isd)
c call asky_ver11(al,au,udisp,nskydf,isd)c call asky_ver12(al,au,udisp,nskydf,isd)c
do i = ntotdf,1,-1if (isr(i) .ne. 0 ) then
udisp(i) = udisp(isr(i))else
udisp(i) = 0.D0end if
end doc
returnend
cc#######################################################################
subroutine ssky2(au,udisp,ntotdf,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,nskydf,isr)
c#######################################################################implicit real*8(a-h,o-z)dimension au(*),udisp(*),i_bc_given(*),isd(*),1 i_bc_nonzero(*),v_bc_nonzero(*),isr(*)
do i = 1,ntotdfif (isr(i) .ne. 0) udisp(isr(i)) = udisp(i)
end doc
call ssky2_bound(au,udisp,nskydf,1 n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,isr)
ccall ssky_ver1(au,udisp,nskydf,isd)
c call ssky_ver11(au,udisp,nskydf,isd)c call ssky_ver12(au,udisp,nskydf,isd)c
do i = ntotdf,1,-1if (isr(i) .ne. 0 ) then
udisp(i) = udisp(isr(i))
5.6. skyline 法の有限要素法への適用 (2) 403
elseudisp(i) = 0.D0
end ifend do
creturnend
cc#######################################################################
subroutine sky2_init(ntotdf,isd,nelem,lnods,MXNOEL,ntnoel,ndofn,1 npoin,ndofn2,isr,nskydf)
c#######################################################################implicit real*8(a-h,o-z)dimension isd(*),lnods(MXNOEL,*),ntnoel(*),ndofn2(*),isr(*)
cdo i = 1,ntotdf
isr(i) = 0end do
cnskydf = 0do inode = 1,npoin
do idof = 1,ndofn2(inode)nskydf = nskydf + 1isr((inode-1)*ndofn+idof) = nskydf
end doend do
cdo i = 1,ntotdf+1
isd(i) = 1end do
cdo ielem = 1,nelem
min_node = lnods(1,ielem)do inode = 2,ntnoel(ielem)
if (lnods(inode,ielem) .lt. min_node) thenmin_node = lnods(inode,ielem)
end ifend domj = isr((min_node-1)*ndofn+1)do inode = 1,ntnoel(ielem)
do idof = 1,ndofnj = isr((lnods(inode,ielem)-1)*ndofn+idof)n_height = j - mj + 1if (isd(j) .lt. n_height) then
isd(j) = n_height
404 第 5章 skyline 法
end ifend do
end doend do
cn_previous = isd(2)isd(1) = 1isd(2) = 2do i = 3,ntotdf+1
n_current = isd(i)isd(i) = isd(i-1) + n_previousn_previous = n_current
end doc
returnend
cc#######################################################################
subroutine asky2_merge(au,al,lnods,astiff,ntnoel,ndofn,isd,isr)c#######################################################################
implicit real*8(a-h,o-z)dimension au(*),al(*),lnods(*),astiff(ntnoel*ndofn,*),isd(*),1 isr(*)dimension ip(100)
cif (ntnoel * ndofn .gt. 100) then
write(*,*) ’dimension of index in merge is insufficient’stop
end ifc
do inode = 1,ntnoeldo idof = 1, ndofn
ip((inode-1)*ndofn+idof) =1 isr((lnods(inode)-1)*ndofn + idof)
end doend do
cc do i = 1,ntnoel*ndofnc write(*,*) i,ip(i)c end doc
do i = 1,ntnoel*ndofnif (ip(i) .ne. 0) then
do j = 1,ntnoel*ndofnif (ip(j) .ne. 0) then
5.6. skyline 法の有限要素法への適用 (2) 405
if (ip(i) .le. ip(j)) thenij = isd(ip(j)) + ip(j) - ip(i)au(ij) = au(ij) + astiff(i,j)
end ifif (ip(i) .ge. ip(j)) then
ij = isd(ip(i)) + ip(i) - ip(j)al(ij) = al(ij) + astiff(i,j)
end ifend if
end doend if
end doc
returnend
cc#######################################################################
subroutine ssky2_merge(au,lnods,astiff,ntnoel,ndofn,isd,isr)c#######################################################################
implicit real*8(a-h,o-z)dimension au(*),lnods(*),astiff(ntnoel*ndofn,*),isd(*),isr(*)dimension ip(100)
cif (ntnoel * ndofn .gt. 100) then
write(*,*) ’dimension of index in merge is insufficient’stop
end ifc
do inode = 1,ntnoeldo idof = 1, ndofn
ip((inode-1)*ndofn+idof) =1 isr((lnods(inode)-1)*ndofn + idof)
end doend do
cdo i = 1,ntnoel*ndofn
if (ip(i) .ne. 0) thendo j = i,ntnoel*ndofn
if (ip(j) .ne. 0) thenif (ip(i) .le. ip(j)) then
ij = isd(ip(j)) + ip(j) - ip(i)else
ij = isd(ip(i)) + ip(i) - ip(j)end ifau(ij) = au(ij) + astiff(i,j)
406 第 5章 skyline 法
end ifend do
end ifend do
creturnend
cc#######################################################################
subroutine asky2_bound(au,al,c,n,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,isr)
c#######################################################################implicit real*8(a-h,o-z)dimension au(*),al(*),c(*),i_bc_given(*),isd(*),1 i_bc_nonzero(*),v_bc_nonzero(*),isr(*)
cdo i = 1,n_bc_nonzero
j = isr(i_bc_nonzero(i))mj = j - isd(j+1) + isd(j) + 1do k = mj,j
kj = isd(j) + j - kc(k) = c(k) - v_bc_nonzero(i) * au(kj)
end dodo k = j+1,n
mk = k - isd(k+1) + isd(k) + 1if (mk .le. j) then
jk = isd(k) + k - jc(k) = c(k) - v_bc_nonzero(i) * al(jk)
end ifend do
end doc
do i = 1,n_bc_givenc(isr(i_bc_given(i))) = 0.D0
end doc
do i = 1,n_bc_nonzeroc(isr(i_bc_nonzero(i))) = v_bc_nonzero(i)
end doc
do i = 1,n_bc_givenj = isr(i_bc_given(i))mj = j - isd(j+1) + isd(j) + 1do k = mj,j
kj = isd(j) + j - k
5.6. skyline 法の有限要素法への適用 (2) 407
au(kj) = 0.D0al(kj) = 0.D0
end dodo k = j+1,n
mk = k - isd(k+1) + isd(k) + 1if (mk .le. j) then
jk = isd(k) + k - jau(jk) = 0.D0al(jk) = 0.D0
end ifend dojj = isd(j)au(jj) = 1.D0al(jj) = 1.D0
end doc
returnend
cc#######################################################################
subroutine ssky2_bound(au,c,n,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,isr)
c#######################################################################implicit real*8(a-h,o-z)dimension au(*),c(*),i_bc_given(*),isd(*),1 i_bc_nonzero(*),v_bc_nonzero(*),isr(*)
cdo i = 1,n_bc_nonzero
j = isr(i_bc_nonzero(i))mj = j - isd(j+1) + isd(j) + 1do k = mj,j
kj = isd(j) + j - kc(k) = c(k) - v_bc_nonzero(i) * au(kj)
end dodo k = j+1,n
mk = k - isd(k+1) + isd(k) + 1if (mk .le. j) then
jk = isd(k) + k - jc(k) = c(k) - v_bc_nonzero(i) * au(jk)
end ifend do
end doc
do i = 1,n_bc_givenc(isr(i_bc_given(i))) = 0.D0
408 第 5章 skyline 法
end doc
do i = 1,n_bc_nonzeroc(isr(i_bc_nonzero(i))) = v_bc_nonzero(i)
end doc
do i = 1,n_bc_givenj = isr(i_bc_given(i))mj = j - isd(j+1) + isd(j) + 1do k = mj,j
kj = isd(j) + j - kau(kj) = 0.D0
end dodo k = j+1,n
mk = k - isd(k+1) + isd(k) + 1if (mk .le. j) then
jk = isd(k) + k - jau(jk) = 0.D0
end ifend dojj = isd(j)au(jj) = 1.D0
end doc
returnend
cc#######################################################################
subroutine asky_ver1(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cal(3) = al(3) / au(1)au(3) = au(3) / au(1)
cau(2) = au(2) - al(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0temp_l = 0.d0do k = max(mi,mj), i-1
5.6. skyline 法の有限要素法への適用 (2) 409
ki = isd(i) + i - kkj = isd(j) + j - ktemp_u = temp_u + al(ki) * au(kj)temp_l = temp_l + al(kj) * au(ki)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_ual(ij) = al(ij) - temp_l
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))al(ij) = al(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + al(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - al(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
c
410 第 5章 skyline 法
c#######################################################################subroutine asky_ver11(al,au,b,n,isd)
c#######################################################################implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cal(3) = al(3) / au(1)au(3) = au(3) / au(1)
cau(2) = au(2) - al(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0temp_l = 0.d0ki = isd(i) + ikj = isd(j) + jdo k = max(mi,mj), i-1
temp_u = temp_u + al(ki-k) * au(kj-k)temp_l = temp_l + al(kj-k) * au(ki-k)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_ual(ij) = al(ij) - temp_l
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))al(ij) = al(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + al(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - al(ij) * b(j)
5.6. skyline 法の有限要素法への適用 (2) 411
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine asky_ver12(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cal(3) = al(3) / au(1)au(3) = au(3) / au(1)
cau(2) = au(2) - al(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0temp_l = 0.d0ki = isd(i) + i - ikj = isd(j) + j - ido k = 1,i-max(mi,mj)
temp_u = temp_u + al(ki+k) * au(kj+k)temp_l = temp_l + al(kj+k) * au(ki+k)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_ual(ij) = al(ij) - temp_l
end do
412 第 5章 skyline 法
do i = mj,j-1ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))al(ij) = al(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + al(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - al(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine ssky_ver1(au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension au(*),b(*),isd(*)
cau(3) = au(3) / au(1)
cau(2) = au(2) - au(3) * au(1) * au(3)
5.6. skyline 法の有限要素法への適用 (2) 413
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0do k = max(mi,mj), i-1
ki = isd(i) + i - kkj = isd(j) + j - ktemp_u = temp_u + au(ki) * au(kj)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_u
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + au(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - au(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
414 第 5章 skyline 法
creturnend
cc#######################################################################
subroutine ssky_ver11(au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension au(*),b(*),isd(*)
cau(3) = au(3) / au(1)
cau(2) = au(2) - au(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0ki = isd(i) + ikj = isd(j) + jdo k = max(mi,mj), i-1
temp_u = temp_u + au(ki-k) * au(kj-k)end doij = isd(j) + j-iau(ij) = au(ij) - temp_u
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + au(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - au(ij) * b(j)
end do
5.6. skyline 法の有限要素法への適用 (2) 415
end doc
do i = 1,nb(i) = b(i) / au(isd(i))
end doc
do i = n,2,-1mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine ssky_ver12(au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension au(*),b(*),isd(*)
cau(3) = au(3) / au(1)
cau(2) = au(2) - au(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0ki = isd(i) + i - ikj = isd(j) + j - ido k = 1, i-max(mi,mj)
temp_u = temp_u + au(ki+k) * au(kj+k)end doij = isd(j) + j-iau(ij) = au(ij) - temp_u
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
end dotemp = 0.d0
416 第 5章 skyline 法
do k = mj,j-1kj = isd(j) + j-ktemp = temp + au(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i - jb(i) = b(i) - au(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i - jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
c
5.7 sskyline 法の有限要素法への適用 (3)
下図に示すような 1 要素の単純引っ張りの解析を考える. 節点 5, 6, 7, 8 の x3 方向に
外力を作用させるとする. 全体で 24 自由度あるので解くべき連立一次方程式の数は 24
であるが, 実際には変位境界条件処理により, 節点 1 の x1, x2, x3 方向節点 2 の x2, x3 方
向, 節点 3の x3 方向, 節点 4の x1, x3 方向, 節点 5 の x1, x2 方向節点 6の x2 方向, 節点
8 の x1 方向の合計して 12 自由度は自明な方程式になっている. また節点 5, 6, 7, 8の x3
方向に強制変位を与える場合なら先の 12 自由度に加え, 4 自由度が自明な方程式になる.
5.7. sskyline 法の有限要素法への適用 (3) 417
1 2
435 6
78
x1
x2
x3
図 5.4: 1 要素の単純引っ張り
そこでここでは, 前説で導入した自由度番号の並べ替えをさらに進めて (i) 変位境界条
件が与えられておらす, 連立一次方程式を解く必要のある自由度, (ii) 強制変位が与えら
れ, 連立一次方程式を解く必要はないが , 右辺の計算に必要なため剛性マトリックスは記
憶する必要がある自由度, (iii) 変位が零に固定されているため skipして良い自由度の順
に並べ替える.
自由度番号並べ替えのための配列 isr を求める手続きをインデックスで示すと以下の
ようになる.
418 第 5章 skyline 法
for i = 1, ntotdf
isr(i) = 0
end for
for i = 1, n bc given
isr(i bc given(i)) = −1
end for
nskydf = 0
for inode = 1, npoin
for idof = 1, ndofn2(inode)
if (isr((inode − 1) ∗ ndofn + idof).eq.0)then
nskydf = nskydf + 1
isr((inode − 1) ∗ ndofn + idof) = nskydf
end if
end for
end for
for i = 1, n bc nonzero
nskydf = nskydf + 1
isr(i bc nonzero(i)) = nskydf
end for
for inode = 1, npoin
for idof = 1, ndofn2(inode)
if (isr((inode − 1) ∗ ndofn + idof).eq. − 1)then
nskydf = nskydf + 1
isr((inode − 1) ∗ ndofn + idof) = nskydf
end if
end for
end for
5.7. sskyline 法の有限要素法への適用 (3) 419
isdをもとめる手続きではこれまでは各要素でもっとも小さい節点番号の第一自由度が
最小自由度であったのに対して,ここでは自由度の並べ替えによりこの関係が成立しない.
そこで以下のような手続きにより直接最小自由度を求め isd を求める.
420 第 5章 skyline 法
for i = 1, ntotdf + 1
isd(i) = 1
end for
for ielem = 1, nelem
mj = ntotdf
for inode = 1, ntnoel(ielem)
for idof = 1, ndofn2(lnods(inode, ielem))
mj temp = isr((lnods(inode, ielem) − 1) ∗ ndofn + idof)
if (mj temp < mj)mj = mj temp
end for
end for
for inode = 1, ntnoel(ielem)
for idof = 1, ndofn
j = isr((lnods(inode, ielem) − 1) ∗ ndofn + idof)
n height = j − mj + 1
if (isd(j) < n height)then
isd(j) = n height
end if
end for
end for
end for
n previous = isd(2)
isd(1) = 1
isd(2) = 2
for i = 3, ntotdf + 1
n current = isd(i)
isd(i) = isd(i − 1) + n previous
n previous = n current
end for
5.7. sskyline 法の有限要素法への適用 (3) 421
merge の変更点は固定されている自由度は剛性マトリックスを記憶しないことである
が, もし何らかの理由で記憶する必要があるならば,バージョン 2の mergeと同じである.
[非対称版]
422 第 5章 skyline 法
n active = nskydf − n bc given + n bc nonzero
for inode = 1, ntnoel
for idof = 1, ndofn
ip((inode − 1) ∗ ndofn + idof) = isr((lnods(inode) − 1) ∗ ndofn + idof)
end for
end for
for i = 1, ntnoel ∗ ndofn
if (ip(i) �= 0&ip(i) ≤ n active)then
for j = 1, ntnoel ∗ ndofn
if (ip(j) �= 0&ip(j) ≤ n active)then
if (ip(i) ≤ ip(j))then
ij = isd(ip(j)) + ip(j) − ip(i)
au(ij) = au(ij) + astiff(i, j)
end if
if (ip(i) ≥ ip(j))then
ij = isd(ip(i)) + ip(i) − ip(j)
al(ij) = al(ij) + astiff(i, j)
end if
end if
end for
end if
end for
5.7. sskyline 法の有限要素法への適用 (3) 423
[対称版]
n active = nskydf − n bc given + n bc nonzero
for inode = 1, ntnoel
for idof = 1, ndofn
ip((inode − 1) ∗ ndofn + idof) = isr((lnods(inode) − 1) ∗ ndofn + idof)
end for
end for
for i = 1, ntnoel ∗ ndofn
if (ip(i) �= 0&ip(i) ≤ n active)then
for j = i, ntnoel ∗ ndofn
if (ip(j) �= 0&ip(j) ≤ n active)then
if (ip(i) ≤ ip(j))then
ij = isd(ip(j)) + ip(j) − ip(i)
else
ij = isd(ip(i)) + ip(i) − ip(j)
end if
au(ij) = au(ij) + astiff(i, j)
end if
end for
end if
end for
課題線形弾性体の例題を skyline 法に取り替える. この時のコーディング例を示すと以
下のようになる.
424 第 5章 skyline 法
make ルール:
FC = g77F_OPT = -O
OBJ_F = main3.o dbg.o element.o sky3.o
TARGET = ver3
$(TARGET):$(OBJ_F)$(FC) $(F_OPT) -o $(TARGET) $(OBJ_F)
.f.o:$(FC) -c $(F_OPT) $<
プログラム:main3.f
c skyline ver. 3 with linear elastic finite element (ver3 main3.f)c by Hiroshi WATANABE (1998 Nov.)c
implicit real*8(a-h,o-z)parameter (MXNODE = 100)parameter (MXELEM = 100)parameter (MXDOFN = 3)parameter (MXNOEL = 8)parameter (MXBCGIVEN = 100)parameter (MXBCNONZERO = 100)parameter (MXLOAD = 100)parameter (MXSKY = 10000)dimension coords(MXDOFN,MXNODE),lnods(MXNOEL,MXELEM)dimension ntnoel(MXELEM)dimension astiff(MXDOFN*MXNOEL,MXDOFN*MXNOEL)dimension au(MXSKY),al(MXSKY),isd(MXNODE*MXDOFN+1)dimension udisp(MXNODE*MXDOFN)dimension i_bc_load(MXLOAD),v_bc_load(MXLOAD)dimension i_bc_given(MXBCGIVEN)dimension i_bc_nonzero(MXBCNONZERO),v_bc_nonzero(MXBCNONZERO)dimension ndofn2(MXNODE),isr(MXNODE*MXDOFN)dimension sky_temp(MXNODE*MXDOFN)
cdimension a_dbg(32,32)
cif_sym = 1if_dbg = 1
ccall datain(ndofn,nint,npoin,coords,MXDOFN,
5.7. sskyline 法の有限要素法への適用 (3) 425
1 n_bc_given,i_bc_given,1 nelem,lnods,MXNOEL,ntnoel,1 n_bc_load,i_bc_load,v_bc_load,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,ndofn2)
cyo = 1.D0po = 0.3D0
cntotdf = npoin * ndofn
cif (if_dbg .eq. 1) then
call set_dbg_data(ndofn,ndofn_dbg,ntotdf,npoin,1 n_bc_load,i_bc_load,n_bc_given,i_bc_given,1 n_bc_nonzero,i_bc_nonzero)end if
cif (if_dbg .ne. 1) then
call sky3_init(ntotdf,isd,nelem,lnods,MXNOEL,ntnoel,1 ndofn,npoin,ndofn2,isr,nskydf,1 n_bc_given,i_bc_given,n_bc_nonzero,i_bc_nonzero)else
call sky3_init(ntotdf,isd,nelem,lnods,MXNOEL,ntnoel,1 ndofn_dbg,npoin,ndofn2,isr,nskydf,1 n_bc_given,i_bc_given,n_bc_nonzero,i_bc_nonzero)end if
cn_active = nskydf - nbcg + nbcnznstif = isd(n_active+1)-1write(*,*) ’nstif = ’,nstifif (MXSKY .lt. nstif) then
write(*,*) ’MXSKY is insufficient’stop
end ifc
do i = 1,nstifau(i) = 0.D0al(i) = 0.D0
end doc
do ielem = 1,nelemcall element(coords,MXDOFN,lnods(1,ielem),nint,ntnoel(ielem),
1 ndofn,astiff,yo,po)if (if_dbg .ne. 1) then
if (if_sym .eq. 0) thencall asky3_merge(au,al,lnods(1,ielem),astiff,
426 第 5章 skyline 法
1 ntnoel(ielem),ndofn,isd,isr,1 nskydf,n_bc_given,n_bc_nonzero)
elsecall ssky3_merge(au,lnods(1,ielem),astiff,
1 ntnoel(ielem),ndofn,isd,isr,1 nskydf,n_bc_given,n_bc_nonzero)
end ifelse
call set_dbg_matrix(ndofn,ndofn_dbg,ntnoel,ielem,1 astiff,a_dbg)
if (if_sym .eq. 0) thencall asky3_merge(au,al,lnods(1,ielem),a_dbg,
1 ntnoel(ielem),ndofn_dbg,isd,isr,1 nskydf,n_bc_given,n_bc_nonzero)
elsecall ssky3_merge(au,lnods(1,ielem),a_dbg,
1 ntnoel(ielem),ndofn_dbg,isd,isr,1 nskydf,n_bc_given,n_bc_nonzero)
end ifend if
end doc
do i = 1,ntotdfudisp(i) = 0.D0
end dodo i = 1,n_bc_load
udisp(i_bc_load(i)) = v_bc_load(i)end do
cif (if_sym .eq. 0) then
call asky3(au,al,udisp,ntotdf,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,nskydf,isr,1 sky_temp)else
call ssky3(au,udisp,ntotdf,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,nskydf,isr,1 sky_temp)end if
cif (if_dbg .ne. 1) then
do i = 1,npoinwrite(*,1000) i,(udisp((i-1)*ndofn+j),j=1,ndofn)
end doelse
do i = 1,npoin
5.7. sskyline 法の有限要素法への適用 (3) 427
write(*,1000) i,(udisp((i-1)*ndofn_dbg+j),j=1,ndofn_dbg)end do
end ifc1000 format(i6,2x,e13.6,2x,e13.6,2x,e13.6,2x,e13.6)2000 format(10e10.3)
cstopend
cc#######################################################################
subroutine datain(ndofn,nint,npoin,coords,MXDOFN,1 n_bc_given,i_bc_given,1 nelem,lnods,MXNOEL,ntnoel,1 n_bc_load,i_bc_load,v_bc_load,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,ndofn2)
c#######################################################################implicit real*8(a-h,o-z)dimension coords(MXDOFN,*),i_bc_given(*),lnods(MXNOEL,*),1 ntnoel(*),i_bc_load(*),v_bc_load(*),1 i_bc_nonzero(*),v_bc_nonzero(*),ndofn2(*)dimension ibctemp(3)
copen(10,file=’temp.dat’)
cread(10,*) ndofn,nintread(10,*) npoinn_bc_given = 0do i = 1, npoin
read(10,*) itemp, ndofn2(i),(coords(j,i),j=1,ndofn),1 (ibctemp(j),j=1,ndofn)
do j = 1,ndofnif (ibctemp(j) .eq. 1) then
n_bc_given = n_bc_given + 1i_bc_given(n_bc_given) = (i-1)*ndofn+j
end ifend do
end doc
read(10,*) nelemdo i = 1,nelem
read(10,*) itemp, ntnoel(i),(lnods(j,i),j=1,ntnoel(i))end do
cread(10,*) n_bc_load
428 第 5章 skyline 法
do i = 1,n_bc_loadread(10,*) inode,idof,v_bc_load(i)i_bc_load(i) = (inode-1)*ndofn+idof
end doc
read(10,*) n_bc_nonzerodo i = 1,n_bc_nonzero
read(10,*) inode,idof,v_bc_nonzero(i)i_bc_nonzero(i) = (inode-1)*ndofn+idof
end doc
returnend
c
プログラム:sky3.f
c skyline ver. 3 with linear elastic finite element (ver3 sky3.f)c by Hiroshi WATANABE (1998 Nov.)cc#######################################################################
subroutine asky3(au,al,udisp,ntotdf,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,nskydf,isr,1 sky_temp)
c#######################################################################implicit real*8(a-h,o-z)dimension au(*),al(*),udisp(*),i_bc_given(*),isd(*),1 i_bc_nonzero(*),v_bc_nonzero(*),isr(*),sky_temp(*)
cdo i = 1,ntotdf
if (isr(i) .ne. 0) sky_temp(isr(i)) = udisp(i)end do
cn_active = nskydf - n_bc_given
ccall asky3_bound(au,al,sky_temp,n_active,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,isr)
ccall asky_ver1(al,au,sky_temp,n_active,isd)
c call asky_ver11(al,au,sky_temp,n_active,isd)c call asky_ver12(al,au,sky_temp,n_active,isd)c
do i = 1,n_bc_givensky_temp(isr(i_bc_given(i))) = 0.D0
end doc
5.7. sskyline 法の有限要素法への適用 (3) 429
do i = 1,n_bc_nonzerosky_temp(isr(i_bc_nonzero(i))) = v_bc_nonzero(i)
end doc
do i = ntotdf,1,-1if (isr(i) .ne. 0 ) then
udisp(i) = sky_temp(isr(i))else
udisp(i) = 0.D0end if
end doc
returnend
cc#######################################################################
subroutine ssky3(au,udisp,ntotdf,n_bc_given,i_bc_given,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,nskydf,isr,1 sky_temp)
c#######################################################################implicit real*8(a-h,o-z)dimension au(*),udisp(*),i_bc_given(*),isd(*),1 i_bc_nonzero(*),v_bc_nonzero(*),isr(*),sky_temp(*)
cdo i = 1,ntotdf
if (isr(i) .ne. 0) sky_temp(isr(i)) = udisp(i)end do
cn_active = nskydf - n_bc_given
ccall ssky3_bound(au,sky_temp,n_active,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,isr)
ccall ssky_ver1(au,sky_temp,n_active,isd)
c call ssky_ver11(au,sky_temp,n_active,isd)c call ssky_ver12(au,sky_temp,n_active,isd)c
do i = 1,n_bc_givensky_temp(isr(i_bc_given(i))) = 0.D0
end doc
do i = 1,n_bc_nonzerosky_temp(isr(i_bc_nonzero(i))) = v_bc_nonzero(i)
end doc
430 第 5章 skyline 法
do i = ntotdf,1,-1if (isr(i) .ne. 0 ) then
udisp(i) = sky_temp(isr(i))else
udisp(i) = 0.D0end if
end doc
returnend
cc#######################################################################
subroutine sky3_init(ntotdf,isd,nelem,lnods,MXNOEL,ntnoel,ndofn,1 npoin,ndofn2,isr,nskydf,1 n_bc_given,i_bc_given,n_bc_nonzero,i_bc_nonzero)
c#######################################################################implicit real*8(a-h,o-z)dimension isd(*),lnods(MXNOEL,*),ntnoel(*),ndofn2(*),isr(*),1 i_bc_given(*),i_bc_nonzero(*)
cdo i = 1,ntotdf
isr(i) = 0end do
cdo i = 1,n_bc_given
isr(i_bc_given(i)) = -1end do
cnskydf = 0do inode = 1,npoin
do idof = 1,ndofn2(inode)if (isr((inode-1)*ndofn+idof) .eq. 0)then
nskydf = nskydf + 1isr((inode-1)*ndofn+idof) = nskydf
end ifend do
end dodo i = 1,n_bc_nonzero
nskydf = nskydf + 1isr(i_bc_nonzero(i)) = nskydf
end dodo inode = 1,npoin
do idof = 1,ndofn2(inode)if (isr((inode-1)*ndofn+idof) .eq. -1)then
nskydf = nskydf + 1
5.7. sskyline 法の有限要素法への適用 (3) 431
isr((inode-1)*ndofn+idof) = nskydfend if
end doend do
cdo i = 1,ntotdf+1
isd(i) = 1end do
cdo ielem = 1,nelem
mj = ntotdfdo inode = 1,ntnoel(ielem)
do idof = 1,ndofn2(lnods(inode,ielem))mj_temp = isr((lnods(inode,ielem)-1)*ndofn+idof)if (mj_temp .lt. mj) mj = mj_temp
end doend dodo inode = 1,ntnoel(ielem)
do idof = 1,ndofnj = isr((lnods(inode,ielem)-1)*ndofn+idof)n_height = j - mj + 1if (isd(j) .lt. n_height) then
isd(j) = n_heightend if
end doend do
end doc
n_previous = isd(2)isd(1) = 1isd(2) = 2do i = 3,ntotdf+1
n_current = isd(i)isd(i) = isd(i-1) + n_previousn_previous = n_current
end doc
returnend
cc#######################################################################
subroutine asky3_merge(au,al,lnods,astiff,ntnoel,ndofn,isd,isr,1 nskydf,n_bc_given,n_bc_nonzero)
c#######################################################################implicit real*8(a-h,o-z)
432 第 5章 skyline 法
dimension au(*),al(*),lnods(*),astiff(ntnoel*ndofn,*),isd(*),1 isr(*)dimension ip(100)
cif (ntnoel * ndofn .gt. 100) then
write(*,*) ’dimension of index in merge is insufficient’stop
end ifc
n_active = nskydf - n_bc_given + n_bc_nonzeroc
do inode = 1,ntnoeldo idof = 1, ndofn
ip((inode-1)*ndofn+idof) =1 isr((lnods(inode)-1)*ndofn + idof)
end doend do
cdo i = 1,ntnoel*ndofn
if (ip(i) .ne. 0 .and. ip(i) .le. n_active) thendo j = 1,ntnoel*ndofn
if (ip(j) .ne. 0 .and. ip(j) .le. n_active) thenif (ip(i) .le. ip(j)) then
ij = isd(ip(j)) + ip(j) - ip(i)au(ij) = au(ij) + astiff(i,j)
end ifif (ip(i) .ge. ip(j)) then
ij = isd(ip(i)) + ip(i) - ip(j)al(ij) = al(ij) + astiff(i,j)
end ifend if
end doend if
end doc
returnend
cc#######################################################################
subroutine ssky3_merge(au,lnods,astiff,ntnoel,ndofn,isd,isr,1 nskydf,n_bc_given,n_bc_nonzero)
c#######################################################################implicit real*8(a-h,o-z)dimension au(*),lnods(*),astiff(ntnoel*ndofn,*),isd(*),isr(*)dimension ip(100)
5.7. sskyline 法の有限要素法への適用 (3) 433
cif (ntnoel * ndofn .gt. 100) then
write(*,*) ’dimension of index in merge is insufficient’stop
end ifc
n_active = nskydf - n_bc_given + n_bc_nonzeroc
do inode = 1,ntnoeldo idof = 1, ndofn
ip((inode-1)*ndofn+idof) =1 isr((lnods(inode)-1)*ndofn + idof)
end doend do
cdo i = 1,ntnoel*ndofn
if (ip(i) .ne. 0 .and. ip(i) .le. n_active) thendo j = i,ntnoel*ndofn
if (ip(j) .ne. 0 .and. ip(j) .le. n_active) thenif (ip(i) .le. ip(j)) then
ij = isd(ip(j)) + ip(j) - ip(i)else
ij = isd(ip(i)) + ip(i) - ip(j)end ifau(ij) = au(ij) + astiff(i,j)
end ifend do
end ifend do
creturnend
cc#######################################################################
subroutine asky3_bound(au,al,c,n,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,isr)
c#######################################################################implicit real*8(a-h,o-z)dimension au(*),al(*),c(*),isd(*),1 i_bc_nonzero(*),v_bc_nonzero(*),isr(*)
cdo i = 1,n_bc_nonzero
j = isr(i_bc_nonzero(i))mj = j - isd(j+1) + isd(j) + 1do k = mj,j
434 第 5章 skyline 法
kj = isd(j) + j - kc(k) = c(k) - v_bc_nonzero(i) * au(kj)
end dodo k = j+1,n
mk = k - isd(k+1) + isd(k) + 1if (mk .le. j) then
jk = isd(k) + k - jc(k) = c(k) - v_bc_nonzero(i) * al(jk)
end ifend do
end doc
returnend
cc#######################################################################
subroutine ssky3_bound(au,c,n,isd,1 n_bc_nonzero,i_bc_nonzero,v_bc_nonzero,isr)
c#######################################################################implicit real*8(a-h,o-z)dimension au(*),c(*),isd(*),1 i_bc_nonzero(*),v_bc_nonzero(*),isr(*)
cdo i = 1,n_bc_nonzero
j = isr(i_bc_nonzero(i))mj = j - isd(j+1) + isd(j) + 1do k = mj,j
kj = isd(j) + j - kc(k) = c(k) - v_bc_nonzero(i) * au(kj)
end dodo k = j+1,n
mk = k - isd(k+1) + isd(k) + 1if (mk .le. j) then
jk = isd(k) + k - jc(k) = c(k) - v_bc_nonzero(i) * au(jk)
end ifend do
end doc
returnend
cc#######################################################################
subroutine asky_ver1(al,au,b,n,isd)c#######################################################################
5.7. sskyline 法の有限要素法への適用 (3) 435
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cal(3) = al(3) / au(1)au(3) = au(3) / au(1)
cau(2) = au(2) - al(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0temp_l = 0.d0do k = max(mi,mj), i-1
ki = isd(i) + i - kkj = isd(j) + j - ktemp_u = temp_u + al(ki) * au(kj)temp_l = temp_l + al(kj) * au(ki)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_ual(ij) = al(ij) - temp_l
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))al(ij) = al(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + al(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - al(ij) * b(j)
end doend do
c
436 第 5章 skyline 法
do i = 1,nb(i) = b(i) / au(isd(i))
end doc
do i = n,2,-1mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine asky_ver11(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cal(3) = al(3) / au(1)au(3) = au(3) / au(1)
cau(2) = au(2) - al(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0temp_l = 0.d0ki = isd(i) + ikj = isd(j) + jdo k = max(mi,mj), i-1
temp_u = temp_u + al(ki-k) * au(kj-k)temp_l = temp_l + al(kj-k) * au(ki-k)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_ual(ij) = al(ij) - temp_l
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
5.7. sskyline 法の有限要素法への適用 (3) 437
al(ij) = al(ij) / au(isd(i))end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + al(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - al(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine asky_ver12(al,au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension al(*),au(*),b(*),isd(*)
cal(3) = al(3) / au(1)au(3) = au(3) / au(1)
cau(2) = au(2) - al(3) * au(1) * au(3)
cdo j = 3,n
438 第 5章 skyline 法
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0temp_l = 0.d0ki = isd(i) + i - ikj = isd(j) + j - ido k = 1,i-max(mi,mj)
temp_u = temp_u + al(ki+k) * au(kj+k)temp_l = temp_l + al(kj+k) * au(ki+k)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_ual(ij) = al(ij) - temp_l
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))al(ij) = al(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + al(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - al(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
5.7. sskyline 法の有限要素法への適用 (3) 439
end doend do
creturnend
cc#######################################################################
subroutine ssky_ver1(au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension au(*),b(*),isd(*)
cau(3) = au(3) / au(1)
cau(2) = au(2) - au(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0do k = max(mi,mj), i-1
ki = isd(i) + i - kkj = isd(j) + j - ktemp_u = temp_u + au(ki) * au(kj)
end doij = isd(j) + j-iau(ij) = au(ij) - temp_u
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + au(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-j
440 第 5章 skyline 法
b(i) = b(i) - au(ij) * b(j)end do
end doc
do i = 1,nb(i) = b(i) / au(isd(i))
end doc
do i = n,2,-1mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine ssky_ver11(au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension au(*),b(*),isd(*)
cau(3) = au(3) / au(1)
cau(2) = au(2) - au(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0ki = isd(i) + ikj = isd(j) + jdo k = max(mi,mj), i-1
temp_u = temp_u + au(ki-k) * au(kj-k)end doij = isd(j) + j-iau(ij) = au(ij) - temp_u
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
5.7. sskyline 法の有限要素法への適用 (3) 441
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + au(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i-jb(i) = b(i) - au(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i-jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
cc#######################################################################
subroutine ssky_ver12(au,b,n,isd)c#######################################################################
implicit real*8(a-h,o-z)dimension au(*),b(*),isd(*)
cau(3) = au(3) / au(1)
cau(2) = au(2) - au(3) * au(1) * au(3)
cdo j = 3,n
mj = j - isd(j+1) + isd(j) + 1do i = mj+1, j-1
442 第 5章 skyline 法
mi = i - isd(i+1) + isd(i) + 1temp_u = 0.d0ki = isd(i) + i - ikj = isd(j) + j - ido k = 1, i-max(mi,mj)
temp_u = temp_u + au(ki+k) * au(kj+k)end doij = isd(j) + j-iau(ij) = au(ij) - temp_u
end dodo i = mj,j-1
ij = isd(j) + j-iau(ij) = au(ij) / au(isd(i))
end dotemp = 0.d0do k = mj,j-1
kj = isd(j) + j-ktemp = temp + au(kj) * au(isd(k)) * au(kj)
end doau(isd(j)) = au(isd(j)) - temp
end doc
do i = 2,nmi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ij = isd(i) + i - jb(i) = b(i) - au(ij) * b(j)
end doend do
cdo i = 1,n
b(i) = b(i) / au(isd(i))end do
cdo i = n,2,-1
mi = i - isd(i+1) + isd(i) + 1do j = mi,i-1
ji = isd(i) + i - jb(j) = b(j) - au(ji) * b(i)
end doend do
creturnend
c