非構造格子

ようやく非構造格子の取り扱いがわかってきたような、そうでないような。
まず非構造格子の場合に必要なデータをまとめておくと。。2次元の場合には次のような感じになるだろうか。基本的にポインタも構造体も使わない。データ構造としては扱いにくいものとなるが、その分並列化やベクトル化も可能となる。

  1. 節点を取り囲む要素の番号とその個数
  2. 節点を取り囲む節点の番号とその個数
  3. ある節点を端点に持つ辺のもう一方の節点番号と辺の総数
  4. 要素を構築する辺番号

1・2の時には、節点を取り囲む要素あるいは節点の個数の収め方がキーポイントになる。例えば次のような格子を考える。

7-----8-----9-----11
| (3) | (4) | (5) |
4-----3-----6-----10
| (1) | (2) |
1-----2-----5
コネクティビティ
(1) : 1,2,3,4
(2) : 2,5,6,3
(3) : 4,3,8,7
(4) : 3,6,9,8
(5) : 6,10,11,9

この場合に次のような配列を考える。

esup1(1:nelem) = 0 1   3       8              nmax
esup2(1:nmax)  =   1 1 2 1 2 3 4 1 3 ........ 5

1番の節点の隣接要素は1であるから、esup2(2)には1と入れておく。同様に2番の節点の隣接要素は1,2であるから、esup2(2)から1,2を格納する。そしてesup1(1:nelem)には隣接節点の合計を格納しておけば、例えば3番の要素の隣接節点が欲しい場合にはesup2(n)のesup1(3)+1からesup1(4)までが3番の節点の隣接要素と判明する。節点に対しても同様の配列を用意することで、隣接節点が判明する。
ただし、隣接節点の場合には、この後辺を考えるため特に四辺形要素の場合対角線の端点を”隣接”と判断しないような処理が必要となる。ここは三角形要素の方が楽かな。ちなみに、今回は2次元をとりあえず考えているため、四辺形要素のコネクティビティを次のような順番で考えた。

4-----3
|     |
1-----2

従ってコネクティビティの1番目の周りの隣接節点を考える場合、コネクティビティの3番が入ったらスルー、2番について考えた時に4番目はスルーというようなアルゴリズムを考えて対応した。8節点六面体要素の場合にはまた別な方法を考えねばならないだろうな。。。
ここまでできてしまえば、後は隣接節点の情報から辺の総数と辺の両端点のノード番号は比較的簡単に求められる。
また要素を構築する辺番号に関しては、コネクティビティの情報から要素を構築するノード番号と辺の両端点のノード番号とを参照して、一致するものを順に並べていけばよい。このとき、コネクティビティ情報は最も小さい番号が頭にくるようにソーティングしておくと比較的ループを構築しやすい。
当然、3次元の場合には辺のほかに面の情報なども必要になるだろう。これはまた後で考える。とりあえず三角形を何とかする。

と、ここまで構築するのに結構時間を費やしてしまった。さて、もうちょっとがんばろう。