5 skyline 法 - sml.k.u-tokyo.ac.jp · ン1...

152
291 5 skyline ?? Gauss , を対 した あった. それに対して られる マトリックス , に対角 まわりだけに データが まる帯 ある. ここ Gauss コード よく いられる skyline する. 5.1 Gauss の消去法の合理化 skyline するが, ここ skyline いるマトリックス して Gauss . ?? たように fortran C 1 してあつかわれる , ループ インデックス よって がかわり, まったく じ演 あるに かかわらず,2 いた マトリックス Gauss マトリックス 角を うか, 角を パフォーマンスが変わった. また, マトリックスが対 うに して 角か りる 2 いてマトリックス 体を する . いろいろ えられるが, ここ すよう いるこ が多く, メーカーから される ライブラリーに , している ある. 1 意する. A 11 から に以 ように して いく.

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